Daily updates from Odoo
Monday, April 27, 2026
53 changes · saas-19.3
Enhancements to existing features
This update optimizes how Odoo handles price list calculations, addressing a potential performance bottleneck. By using a more efficient graph-based approach, the system now processes large datasets of price lists much faster, preventing timeouts and improving overall system responsiveness. This change focuses on internal technical improvements to enhance performance.
Original PR description
The _check_pricelist_recursion constraint could cause performance issues when iterating over full recordsets or repeatedly querying large datasets.
Refactor the recursion logic to traverse pricelists as a graph (DFS on pricelist pairs) and replace item-level iteration with a targeted _read_group query to fetch only relevant pricelist-based rules:
- pricelist_id
- base = 'pricelist'
Avoid redundant path evaluations by tracking visited pricelist pairs.
This ensures that only necessary records are fetched and processed, significantly reducing memory usage and avoiding timeout issues on large datasets.
opw-6099182
Forward-Port-Of: odoo/odoo#259310Resolved issues and error corrections
This update optimizes the performance of the project list view, making it significantly faster. Previously, the system was slow rendering large lists of projects due to inefficient calculations. Now, the system only checks for company differences once, dramatically reducing loading times.
Original PR description
Before this commit, to render the table, the project list view computed the list of selected records once for each cell, and then iterated over that selection to check whether selected projects were all associated with the same company (to set the stage_id field readonly if not). However, computing the selection requires to iterate over all records, so the rendering was O(n^2). As a consequence, the rendering of (not so) large tables was very slow (~1s for 80 records). With this commit, we compute only once for the whole table whether the selection contains records from different companies. Forward-Port-Of: odoo/odoo#260752
This update corrects a technical issue preventing invoices sent to Chorus Pro via Peppol in France from being processed correctly. The fix removes spaces from SIRET numbers, ensuring they meet the required 14-character length and resolving a rejection error. This ensures seamless invoice delivery to Chorus Pro.
Original PR description
### Issue: When sending invoices to Chorus Pro via Peppol in France, SIRET numbers may contain spaces, causing the document to be silently rejected ### Cause: SIRET values must be exactly 14…
### Issue: When sending invoices to Chorus Pro via Peppol in France, SIRET numbers may contain spaces, causing the document to be silently rejected ### Cause: SIRET values must be exactly 14 characters long However, spaces were not removed when generating the XML, leading to invalid values in: `<cbc:ID schemeID="0009">` and `<cbc:CompanyID schemeID="0009">` This issue can occur for both the company and the customer SIRET, as both rely on `company_registry` As a result, Chorus Pro rejects the document due to invalid SIRET length ### Steps to reproduce: - Install `l10n_fr_facturx_chorus_pro` and switch to `FR Company` - Enable and Activate Peppol in Settings - Go in Settings > Users & Companies > Companies and open the `FR Company` - Add spaces in the Company ID: 968 515 7590 5808 - Create a Customer (Country: France, VAT: FR23334175221, Company ID/Siret: 123 456 7890 1234) - In the customer's Invoicing Tab (Invoice sending: by Peppol, eInvoice format: EU Standard (Peppol Bis 3.0), France SIRET: 11000201100044) - Create and Send an invoice via Peppol (Your Customer, any line with a tax) - Open the XML - Check the IDs and CompanyIDs in the document Before the fix, there is missing spaces opw-6047840 Forward-Port-Of: odoo/odoo#260578
This update resolves an issue where live chat notifications could be missed or unnecessarily processed, leading to performance problems. By establishing a clear starting point for notification streams, the system now efficiently delivers notifications and avoids consuming excessive server resources. This ensures a smoother and more reliable live chat experience for users.
Original PR description
When the client subscribes to new channels, it passes its last known notification id as the starting point of the stream. For the very first connection, the last id defaults to 0. In this case, the…
When the client subscribes to new channels, it passes its last known notification id as the starting point of the stream. For the very first connection, the last id defaults to 0. In this case, the server replays notifications from the last 50 seconds. This heuristic can lead to missed notifications (e.g. if the WebSocket fails to connect and retries exceed the window). When the last_id is outdated, the server may dispatch a large number of notifications which can consume memory and CPU for nothing (e.g. when reconnecting after a long period of inactivity). This commit fixes both issues by providing an explicit starting point for the bus service. The server includes the latest bus id in the session information at page load. This ensures that no old notifications are fetched, and none are missed: initial data is fetched after page load, and any notifications emitted between that moment and the successful WebSocket connection are delivered, since the subscription starts from the server provided last id. task-6144132 https://github.com/odoo/enterprise/pull/115105
This update resolves an issue where exporting bills from the print function only included records visible on the current page. Now, when you select all bills, including those not displayed on the current page, they are correctly included in the export. This ensures a complete and accurate bill export process.
Original PR description
Right now when selecting all the records in the current page from bills list view and there are some other records not displayed in this page then click on "select all X" where X is all the records either displayed in the current page or not it shows "selected X", however when trying to export them through the print button it only exports the ones that are in the current page, this PR fixes this bug. opw-6129628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261058
This update resolves a technical issue that caused the payroll system to crash when employee bank account information was incomplete. The fix ensures the system handles missing data gracefully, preventing errors and maintaining accurate payroll processing. This improves system stability and reliability.
Original PR description
Accessing the employee bank accounts using index [0] raised an IndexError when no accounts were defined. Additionally, computing the CLABE flag using len() caused a TypeError when the account number was missing. This change uses a safe recordset slice to avoid accessing empty records and guards the length check to only evaluate when a value is present. It prevents crashes while keeping the original behavior unchanged and avoids sending invalid empty values in the CFDI. Forward-Port-Of: odoo/enterprise#114073 Forward-Port-Of: odoo/enterprise#113987
This update significantly reduces the time it takes to load timesheets, particularly in systems with many projects. The change optimizes a search process to avoid unnecessary database calls, resulting in a faster and more responsive user experience. This improves efficiency for users managing their time.
Original PR description
The loading time of timesheets was extremely high (around 4 seconds) for databases with many projects and tasks. This commit aims to resolve the time required to load by setting `count_limit` on the search for project suggestions to avoid calling `search_count` as it is uneccesary. task-6128133 Forward-Port-Of: odoo/enterprise#114697
This update fixes an issue where custom background colors in mailings weren't consistently applied, particularly with rounded text blocks. The change ensures that the Content Background color picker correctly reflects the background color of mailings, resolving a visual inconsistency. This improves the overall appearance and usability of the mailing feature.
Original PR description
The `o_mail_wrapper_td` element in the `ThemeWrapper` template had a hardcoded `bg-white` class. The intent was for the wrapper background to default to white, but doing it this way meant the color…
The `o_mail_wrapper_td` element in the `ThemeWrapper` template had a hardcoded `bg-white` class. The intent was for the wrapper background to default to white, but doing it this way meant the color didn't participate in the CSS variable system. Whenever a user set a custom Content Background color and a border-radius on a text block, the corners would reveal white underneath instead of the actual Content Background color. Removed the `bg-white` class from the template and set white as the proper default for the `--wrapper-background-color` variable instead, so the wrapper is still white by default but correctly responds to the Content Background color picker. Steps to reproduce: 1. Create a new Mailing 2. Set the Content Background color to something other than white 3. Add a Text block 4. Set a border-radius value on the block => white shows behind the rounded corners instead of the Content Background Ticket [link](https://www.odoo.com/odoo/project.task/5868955) opw-5868955 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247808
This update resolves an error that prevented users from grouping depreciation schedules by analytic plans. The issue stemmed from an incorrect formatting of data within the database query, specifically with how analytic account IDs were being handled. Removing unnecessary parentheses corrected the query and allows users to successfully group by analytic plans.
Original PR description
Currently, an error occurs when user tries to group by an analytic plan on depreciation schedule. Steps to replicate: - Install `accountant` with demo, turn on `Analytic Accounting` from settings. -…
Currently, an error occurs when user tries to group by an analytic plan on depreciation schedule.
Steps to replicate:
- Install `accountant` with demo, turn on `Analytic Accounting` from settings.
- Open `Accounting > Review > Depreciation Schedule`.
- Click `Analytic` > Add a `Plan`.
Error:
```
psycopg2.errors.UndefinedFunction: operator does not exist: text = record
LINE 12: WHERE key IN (('7', '16', '8', '15', '6', '9', '...
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
```
Cause:
- At line [1], we pass a tuple of `analytic_account_ids`, which is then wrapped again in parentheses at line [2].
- This results in the IDs being enclosed in double parentheses, e.g. `(('7', '16', '8', '15', '6'))`.
- When the `IN` clause is used with this double-parenthesized tuple, PostgreSQL treats it as a list containing a single record. It then tries to compare `key` (a text value) with that record `('7', '16', '8', '15', '6')`, effectively resulting in a `text = record` comparison, which is invalid and causes error.
Solution:
- Removed the extra parentheses from the query.
[1]: https://github.com/odoo/enterprise/blob/847b5be291adbfa315f8f74ab7a6dd3d1fb7d518/account_asset/models/account_assets_report.py#L124
[2]: https://github.com/odoo/enterprise/blob/847b5be291adbfa315f8f74ab7a6dd3d1fb7d518/account_asset/models/account_assets_report.py#L121
sentry-7423121981
Forward-Port-Of: odoo/enterprise#114334This update fixes an issue where the TicketBai QR code was missing when reprinting paid orders after reloading the POS. The fix ensures the QR code source is correctly set during order loading, guaranteeing accurate QR codes are generated for all paid orders. This improves the accuracy of order fulfillment for our Spanish customers.
Original PR description
When printing a paid order after reloading the POS, the TicketBai QR code was missing. The QR source (l10n_es_pos_tbai_qrsrc) was only set during _postPushOrderResolve after payment, but not when loading historical orders from the backend. opw-6068076 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261102 Forward-Port-Of: odoo/odoo#259372
This update streamlines the data sent to the self-order POS mobile app by removing unnecessary fields. This optimization improves app performance and reduces data transfer, leading to a smoother user experience. The change was implemented as a minor fix to enhance the mobile POS functionality.
Original PR description
Fix _generate_return_values to remove some fields that are not needed on the frontend Forward-Port-Of: odoo/odoo#260243 Forward-Port-Of: odoo/odoo#259915
This update resolves an issue where CODA bank files with an incremented detail sequence (3.2) were causing import errors. The fix adjusts the parsing process to accommodate these changes, ensuring smoother integration with bank statements. This improves the reliability of importing bank data into Odoo.
Original PR description
### Issue: Some banks provide CODA files that do not strictly follow the specification, and increment the detail sequence on 3.2…
### Issue: Some banks provide CODA files that do not strictly follow the specification, and increment the detail sequence on 3.2 https://febelfin.be/media/pages/publicaties/2023/febelfin-standaarden-voor-online-bankieren/5607daeda5-1754302976/standard-coda-2.7-en.pdf Importing such files raises an error: `Error R3004: CODA parsing error on information data record 3.2, seq 00020002! Please report this issue via your Odoo support channel.` ### Cause: The parser compared the full `infoLine['ref']`, while only `infoLine['ref_move']` needs to remain consistent https://github.com/odoo/enterprise/blob/a6efef92b86d95e05245c4ccf26324d37cc153e6/l10n_be_coda/models/account_journal.py#L683-L698 The `infoLine['ref_move_detail']` (3.2 sequence) change should not block import when incremented and should not trigger an error ### Steps to reproduce: - Install `l10n_be_coda` and switch to the `BE company` - Import a CODA file with incremented 3.2 detail sequence (e.g., files available in related tickets or test data) Before the fix, the error is trigger opw-6071761 Forward-Port-Of: odoo/enterprise#113904
This update corrects an issue where the SEPA payment files generated for employees with multiple bank accounts (Salary Allocation) contained duplicate <InstrId> tags. The fix adds a unique identifier to each transaction, ensuring compliance with ISO 20022 standards and preventing potential errors during bank processing. This ensures accurate and reliable SEPA file generation.
Original PR description
### Issue: If a payslip is split into multiple bank accounts (Salary Allocation), the generated SEPA file contains duplicate <InstrId> tags ### Cause: The `_get_payments_vals` method, `InstrId` is…
### Issue: If a payslip is split into multiple bank accounts (Salary Allocation), the generated SEPA file contains duplicate <InstrId> tags ### Cause: The `_get_payments_vals` method, `InstrId` is based on the payslip ID When a single payslip generates multiple transaction blocks, this ID is duplicated, violating the ISO 20022 requirement for unique instruction identifiers https://knowledge.xmldation.com/support/iso20022/general_rules/instrid This commit adds a unique suffix with the bank_account.id (slip.id-ba.id) to the `InstrId` for each transaction generated to ensure technical uniqueness This is the part of the code that use the payment name: https://github.com/odoo/enterprise/blob/194a8d35ef3e9b47ff566479b0c35c0f963fb42d/account_iso20022/models/account_journal.py#L294-L299 ### Steps to reproduce: - Install `hr_payroll_account_iso20022` with demo data - On the Bank Journal, set a valid IBAN (e.g. BE04957751619131) for `Bank Account Number` - Open the Employee page for Abigail Peterson - In the Personal tab, add 2 Bank Accounts (Send Money: True, Account Number: any) - Click on Salary Allocation and Save (You'll have a 50/50 ratio) - Create a new Pay Run (for Abigail Peterson) - Open the last PaySlip and Validate - Create Payment Report (Export Format: SEPA) - Download the Payment Report and check the <InstrId> tags opw-6069670 Forward-Port-Of: odoo/enterprise#114325 Forward-Port-Of: odoo/enterprise#113113
This update resolves an issue where menu links containing spaces didn't correctly point to newly created pages. The fix ensures that menu URLs with or without leading slashes are properly linked, preventing 404 errors. A warning is now displayed in the menu editor when a URL contains spaces to avoid confusion.
Original PR description
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a…
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a 404. **Steps to reproduce**: 1. Create a menu item with a URL containing spaces and no leading slash (e.g., "some url"). 2. Click the menu item -> a 404 page is displayed (expected). 3. Click "Create Page" -> the page is created and saved. 4. Click the menu item again -> it still returns a 404 (unexpected). **Issue**: During page creation, the path is slugified (e.g., "some url" -> "/some-url"). The controller then tries to link the menu to the new page by setting `page_id`. However, `pagenew()` only searches for menu URLs with a leading slash, so a menu saved as "some url" is not found when searching for "/some url". As a result, `page_id` is never set, and `_clean_url()` keeps resolving the menu to "/some url" instead of the page's actual URL "/some-url". Menus without spaces (e.g., "mypage") have the same issue where `page_id` is not set, but since `_clean_url()` prepends "/" and renders "/mypage", which matches the new page URL, the menu still resolves correctly. **Fix**: Match both URL formats (with and without leading slash) when linking a menu to a newly created page. Additionally, a warning is now shown in the menu editor when a URL contains spaces, since spaces are slugified during page creation, which could cause confusion. (Note: this is only a warning - URLs with spaces are still allowed.) task-[5095646](https://www.odoo.com/odoo/project/974/tasks/5095646) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261208 Forward-Port-Of: odoo/odoo#248967
This update resolves a problem where mobile money transactions using DPO Pay were frequently declined due to an error in the transaction ID (sourceId). The fix ensures the sourceId is limited to 15 characters, aligning with DPO Pay's requirements and preventing transaction failures. This improves the reliability of mobile money payments.
Original PR description
Steps to reproduce: = - Configure a payment method with DPO Pay (Mobile Money). - Open POS. - Add a product and initiate a transaction using the DPO Pay mobile money method. - Process the transaction on the terminal device. Issue: = - Transaction is declined with error: - "Data mismatch in one of the fields - OriginatorSourceID exceeds maximum length of 15 characters." Fix: = - Updated `sourceId` generation logic for mobile money transactions. - Ensured `sourceId` complies with DPO Pay constraints (maximum 15 alphanumeric characters), as enforced in recent DPO Pay updates. - Prevented transaction failures caused by oversized `sourceId`. task-6143491 Forward-Port-Of: odoo/odoo#260553
This update fixes a problem where the Point of Sale system wasn't correctly identifying available printers. The fix combines printer options, ensuring the system can now reliably connect to the correct printer for receipts or preparation tasks. This improves the overall functionality and reliability of the Point of Sale module.
Original PR description
We were looping over non existing `config.printer_ids`. It's either `config.receipt_printer_ids` or `config.preparation_printer_ids`. We now loop over a set containing values of both. Forward-Port-Of: odoo/odoo#259681
This update resolves a technical error preventing the IoT printer test button from functioning correctly. The fix corrects a mistake in how the system identified the printer, ensuring the test print button now operates as intended. This improves the reliability of the IoT printer testing process.
Original PR description
In the refactoring in odoo/enterprise#113545, a mistake was made where the `printer.iot_device_id` was used instead of `printer.iot_device_id.id`, causing an error when calling `searchRead`. This commit fixes the issue by restoring `.id`.
This update corrects a bug where DIAN invoices were incorrectly marked as 'failed' due to expected status update failures. The system now properly handles multiple DIAN document updates, ensuring invoices are correctly marked as accepted by DIAN and preventing issues like QR code generation. This improves the accuracy of DIAN invoice processing.
Original PR description
Before this commit, the logic that computes the invoice's DIAN state would rely solely on the state of the most recent document. The problem with that approach is that we will regularly send status…
Before this commit, the logic that computes the invoice's DIAN state would rely solely on the state of the most recent document. The problem with that approach is that we will regularly send status updates to DIAN after the invoice was successfully submitted via the status cron here: https://github.com/odoo/enterprise/blob/19.0/l10n_co_dian/models/account_move.py#L484 Those status updates are expected to fail a certain number of times (typically when no commercial status information is available, or in other terms when `l10n_co_dian_commercial_state` is still in `'pending'`). As a result, an invoice successfully transmitted to DIAN could still end up with a `l10n_co_dian_state` not set to `'invoice_accepted'`. This leads, among other things to a QR code that cannot be reprinted as the logic here: https://github.com/odoo/enterprise/blob/19.0/l10n_co_dian/models/account_move.py#L225 determines which template to render based on that state. The issue cannot be easily reproduced or tested as `l10n_co_dian.document` are generated almost only in prod scenarios. The most common setup where the error happens is for invoices that have 2 DIAN documents: 1. the first (oldest, bottom-most) one reflects acceptance of the invoice sending by DIAN (`state = 'invoice_accepted'`) 2. the second one (most recent, top-most), which reflects the latest query for commercial status update by the cron and which failed (`state = 'invoice_rejected'` and the error message reflects the lack of commercial events) opw-6108318 opw-5931442 opw-6034035 Forward-Port-Of: odoo/enterprise#113929
This update fixes an issue where approving overtime on one attendance record would reset previously approved overtime entries in the same week. The change ensures that approved overtime remains approved, preventing users from needing to re-approve the same hours repeatedly. This improves the efficiency of the attendance management process.
Original PR description
Creating or updating an attendance record resets previously approved overtime entries in the same week back to the 'to_approve' status. ### **Steps to reproduce:** 1) Install Attendance with demo…
Creating or updating an attendance record resets previously approved overtime entries in the same week back to the 'to_approve' status. ### **Steps to reproduce:** 1) Install Attendance with demo data. 2) Set 'Extra Hours Validation' to 'Approved by Manager' in settings. 3) Ensure an overtime rule is set for the Admin user. 4) Create an attendance for Admin with some overtime. 5) Navigate to management and approve overtime. 6) Create another attendance with overtime for Admin in the same week. 7) Navigate back to management. ### **Observed Behavior:** Previously approved overtime reappears in the list, requiring approval again. ### **Expected Behavior:** Previous overtime should remain in the 'approved' status, provided its calculated duration has not changed. ### **Root Cause:** When an attendance is added or modified, the [_get_overtimes_to_update_domain](https://github.com/odoo/odoo/blob/3891dd471d64629634644c0b022a171bbaa65b49/addons/hr_attendance/models/hr_attendance.py#L268-L286) method evaluates the entire week regardless of the ruleset. This means any daily attendance update wipes and recreates the entire week. ### **Fix:** Check the ruleset of the employee. If no rule has `quantity_period` set to **'week'**, restrict the domain to the specific days of the attendances being modified, rather than the entire week. **opw-6054497** Forward-Port-Of: odoo/odoo#260723 Forward-Port-Of: odoo/odoo#256281
This update fixes an issue where employees assigned to the 'Administration' department weren't automatically added to relevant discussion channels. Now, the system correctly subscribes users to channels when their department is updated, ensuring consistent communication and channel membership based on role.
Original PR description
**Steps to reproduce:** navigate to 'Discuss' > 'Channels' create a new channel and set 'Auto Subscribe Departments' to 'Administration' create a new user and a corresponding employee record go to 'Employees' > locate the employee set the employee's department to 'Administration' **Current behavior before PR:** The user is not automatically added to the channel. This occurs because the auto-subscription logic is triggered before the department change is committed to the database. **Desired behavior after PR is merged:** The user is correctly auto-subscribed to the channel once the department update is saved. task-5448649 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261338 Forward-Port-Of: odoo/odoo#241617
This update fixes an issue where Google Reserve slots incorrectly showed resources as available due to missing leave information. The team also removed unnecessary code related to schedule hours, which is not relevant for pre-built Google Reserve slots. This ensures accurate availability for appointments.
Original PR description
Resources on leave were still showing as available in BatchAvailabilityLookup responses because unavailabilities were not checked. Also remove the min_schedule_hours offset copied from the frontend logic. It is not relevant for Google Reserve as slots are pre-built in the feeds. Task-6150788 Forward-Port-Of: odoo/enterprise#114793
This update resolves an issue where a duplicate 'close' button was appearing in the Discuss ActionPanel, causing confusion for users. The fix restricts the button's visibility to the meeting view, ensuring a cleaner and more intuitive user experience. This improves usability and consistency within the Discuss feature.
Original PR description
ActionPanel components (e.g. invitation panel, delete thread dialog) displayed an extra close (X) button in Discuss. The close button was shown when not in a chat window, causing duplication with the existing close button. This commit restricts the button visibility to the meeting view only, preventing the extra close button. Task-[6054963](https://www.odoo.com/odoo/project/1519/tasks/6054963) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255822
This update fixes a misclassification of French accounting accounts 657 and 757, introduced as part of the PCG 2025 reform. Previously, Odoo incorrectly categorized these accounts as 'exceptional items,' leading to inaccuracies in financial reports. This change ensures accurate P&L reporting in accordance with French accounting standards.
Original PR description
…tions As part of the PCG 2025 reform in France, accounts 657 and 757 were introduced to handle capital gains and losses on the disposal of tangible and intangible assets related to normal, current activities. Previously, Odoo incorrectly categorized these under exceptional items which led to mismatches in the P&L. Source: https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/Plans%20comptables/PCG--1er-janvier-2025.pdf Relevant excerpts: <img width="630" height="372" alt="image" src="https://github.com/user-attachments/assets/88a66dac-1cc0-4a33-a902-edb6b626f18f" /> <img width="631" height="318" alt="image" src="https://github.com/user-attachments/assets/403b65dc-20ba-447e-937d-20575f1f45ab" /> opw-6105764 Forward-Port-Of: odoo/enterprise#115054 Forward-Port-Of: odoo/enterprise#114837
This update ensures that product prices displayed in the Point of Sale (POS) system accurately reflect currency conversions when using different company and POS currencies. The fix corrects a previous issue where surcharge and discount rules weren't applied correctly, leading to inaccurate pricing. This ensures consistent and reliable pricing for all POS transactions.
Original PR description
Steps to reproduce: ------------------- 1. Set up a POS with a currency different from the company currency (e.g. company in USD, POS in SSP). 2. Create a USD pricelist with a surcharge rule (e.g.…
Steps to reproduce: ------------------- 1. Set up a POS with a currency different from the company currency (e.g. company in USD, POS in SSP). 2. Create a USD pricelist with a surcharge rule (e.g. +10 USD on list_price). 3. Create an SSP pricelist that references the USD pricelist as its base (base = "pricelist"), with an additional discount rule. 4. Assign the SSP pricelist to the POS and add a product. -> The displayed price ignores the currency conversion between the two pricelists: surcharges/discounts are applied as if both pricelists share the same currency. What's happening: ----------------- The POS pre-converts product prices from company currency to POS currency in `_load_pos_data_read`. However, `getPrice` in JS never converts between the POS currency and the pricelist's own currency before applying the rule's formula (surcharge, discount, etc.). The fix: -------- In `getPrice`, convert the price from POS currency to pricelist currency before applying the rule, then convert back afterward. Note that we have changed the loading order of the models for `pos_self_order`, such as 'res.currency' records are loaded after 'product.pricelist' ones, because now the loaded currencies depend on the loaded pricelists. opw-6013513 Forward-Port-Of: odoo/odoo#260797 Forward-Port-Of: odoo/odoo#255357
This update resolves an issue where users were seeing duplicate tooltips appear when hovering over certain fields in event lists. The fix addresses a conflict between Odoo's built-in tooltips and custom tooltips, ensuring a cleaner and more consistent user experience. This improves usability and avoids confusion.
Original PR description
…oltip How to reproduce: go on an event in communication tab. You will see two tooltips on communication reminders (see task for more details and picture). When hovering a readonly many2one/reference field in a list, two tooltips appeared simultaneously: a native browser tooltip from the `title` attribute on the inner `<span>` (set by `web.Many2One`), and the Odoo custom tooltip from the `data-tooltip` attribute on the parent `<td>` (set by the list renderer for many2one/reference/char fields). Issue come from Odoo management of nested titles, especially when having both data-tooltips and title. For stable, a local solution is to limit usage of title and use better-managed tooltips for many2one. Task-6147434 Forward-Port-Of: odoo/odoo#261057
This update fixes an issue where the unit cost of tracked products with consigned quantities was incorrectly calculated. The change ensures that consigned quantities are excluded when determining the average cost, resulting in accurate unit cost calculations for both stock views and quantity views. This improves the reliability of inventory valuation.
Original PR description
edit : the issue was fixed by https://github.com/odoo/odoo/pull/257103 So this commit only contains these use cases tests **Steps to reproduce:** - enable consignement setting - create a tracked avco…
edit : the issue was fixed by https://github.com/odoo/odoo/pull/257103 So this commit only contains these use cases tests **Steps to reproduce:** - enable consignement setting - create a tracked avco product with a cost of 10 - click on the quantities smart button and then "update quantity" to open the quants view - create one line with a quantity of 1 and no owner - create one line with a quantity of 1 and an owner outside the company **Current behavior:** problem A: open the 'stock' view and look for your product, the unit cost is 5 problem B: navigate back to the quants view of the product, unhide the value column, the value is 5 for the non consigned quant **Expected behavior:** problem A: the unit cost should be 10 (because consigned product shouldn't be taken into account when computing the unit cost) problem B: the non consigned quant value should be 10 for the same reason **Cause of the issue:** problem A: Inside _compute_value(), to compute total_value_by_company_id, we use _with_valuation_context() https://github.com/odoo/odoo/blob/6c107cd70e2228d3428e53cf8095aba17f678d8a/addons/stock_account/models/product.py#L196-L203 which excludes consigned products https://github.com/odoo/odoo/blob/6c107cd70e2228d3428e53cf8095aba17f678d8a/addons/stock_account/models/product.py#L362-L364 So when we iterate through 'products' and fetch qty_available for our product the value is going to be 1. But when computing avg_cost at the end of the method, we iterate through 'self', so we don't have this context anymore and the value of qty_available is 2. https://github.com/odoo/odoo/blob/6c107cd70e2228d3428e53cf8095aba17f678d8a/addons/stock_account/models/product.py#L271-L273 That's because qty_available is computed with _compute_quantities() which depends on context (including owner_id) https://github.com/odoo/odoo/blob/53f7d1dd2f972921ba91f6083a49f50749a3f503/addons/stock/models/product.py#L148-L152 problem B: when computing the value of the quant, there is no context specifying that the consigned quantities should be excluded https://github.com/odoo/odoo/blob/53f7d1dd2f972921ba91f6083a49f50749a3f503/addons/stock_account/models/stock_quant.py#L61-L62 opw-6049413 Forward-Port-Of: odoo/odoo#260392 Forward-Port-Of: odoo/odoo#257013
This update addresses visual issues within the attendance system, specifically aligning elements and removing distracting lines. Additionally, a change allows for more flexible control over the attendance dropdown, preserving the default behavior while offering greater customization for related modules.
Original PR description
# [FIX] hr_attendance: alignment This commits revamps the attendance systray by aligning items and removing horizontal lines between attendance entries. # [FIX] hr_attendance: allow not to close systray based on condition This commits allows components inheriting from the attendance menu to conditionally close the systray. By default, the dropdown will be closed on check-in and check-out to preserve the original behaviour. See odoo/enterprise#113189 task-6088779 Forward-Port-Of: odoo/odoo#257930
This pull request addresses several usability issues within the timesheet functionality, including improved systray behavior, enhanced inline forms, and fixes related to data pre-filling. These changes streamline the timesheet process and ensure accurate record-keeping.
Original PR description
*: timesheet_grid,timesheet_grid_hr_attendance,helpdesk_timesheet # [FIX] timesheet_grid_hr_attendance: open timesheet systray on check-in Before this commit, the user had to re-open the systray in…
*: timesheet_grid,timesheet_grid_hr_attendance,helpdesk_timesheet # [FIX] timesheet_grid_hr_attendance: open timesheet systray on check-in Before this commit, the user had to re-open the systray in order to open the timesheet systray. Now, it is directly showed to the user upon check-in, without having the systray being closed automatically. # [FIX] web_enterprise: required project is not underlined bolder when hovered In this commit, we ensure that the border under the project in the timesheet inline form is bolder when hovered. # [FIX] timesheet_grid,helpdesk_timesheet: prefill timesheets in systray In this commit, we enable timesheets in the systray to be prefilled with project, tasks, and helpdesk tickets if the user opens the systray from any of these views, provided that the fields were empty. Further, say a project is already set, then any opened task from that project will also be populated upon opening the systray under the condition that both projects match. The same reasoning applies to helpdek tickets. # [FIX] sale_timesheet_enterprise: conditionnal class on timesheet timer After closing the systray, the 'billable' radio button ended up on a new line because the class on the timer was not correctly removed. With this commit, the button will remain on the same line as the timer, even after closing and re-opening the systray. # [FIX] sale_timesheet_enterprise: hide assistant button This commit adds conditions to display the button opening the timesheet assistant. Prior to this, the button was displayed even if the setting is not active on the user. See odoo/odoo#257930 task-6088779 Forward-Port-Of: odoo/enterprise#113189
This update resolves an issue where users migrating to the ESG module experienced problems due to an automatic installation of a related dependency (survey). By adding survey as a required auto-install, the system now only installs survey when users already have the necessary data, preventing migration disruptions and ensuring a smoother upgrade process.
Original PR description
Description of the issue this commit addresses: As survey is a dependency but not an auto_install requirement of esg_csrd only from 19.0, when migrating to that version, users that don't have survey installed but do have esg will auto_install survey and pull a new computed stored field, ResUsers.karma which causes migrations issues as no script was made to account for that scenario. --- Desired behavior after this commit is merged: This commit adds survey in the auto_install requirements for the module so only instances that already have ResUsers.karma can auto_install esg_csrd --- runbot-238524 Forward-Port-Of: odoo/enterprise#113905
This update ensures that payrun steps are correctly marked as 'valid' when the user proceeds after encountering an error. Previously, errors could linger, making it appear that key data wasn't processed. This change provides a more reliable indication of payrun completion, improving data accuracy.
Original PR description
Before: - Clicking Continue moved the payrun to the next step, but the previous step could remain in `error` if anomalies were still present. - This made explicitly passed steps (version/time/attendance) look unresolved. After: - Continue marks the passed step as `valid`. - because if the user willfully ignore an error, then it's ok to put it as validated. - This is applied consistently for all payrun step state points. Task-6053982
This update resolves an issue preventing the creation of webhooks for companies with non-alphanumeric characters in their names. The fix utilizes a regular expression to sanitize webhook names, ensuring compatibility and allowing authorized users to successfully set up webhooks for the payment process. This improves the reliability of the payment authorization feature.
Original PR description
Issue: --- Due to this issue, if the company name has non-alphanumeric chars, `authorize` doesn't allow us to create a webhook. ### Steps to reproduce: 1- Create a company with a non-alphanumeric char (_ is allowed so something else such as `company - 1`) 2- Setup `Authorize` payment. 3- Generate webhook. Fix: --- We can remove it using regular expression. `\w` matches characters from a to Z, digits from 0-9, and the underscore `_` character. https://www.w3schools.com/python/python_regex.asp#:~:text=%5Cw,%2C%20and%20the%20underscore%20_%20character opw-6152999
This update fixes an issue where profit and loss accounts were incorrectly appearing in balance sheet reports. The change prevents grouping at the report level, ensuring that balance sheets only display the intended asset and liability information. This improves the accuracy and reliability of financial reporting.
Original PR description
…er unfolded Since the groupby at report level, lines such as "Current Year Unallocated Earnings" were displaying profit and loss accounts in the balance sheet, which is not a desired behavior. task-6152675
This update fixes an issue where MyInvois consolidation documents incorrectly combined invoices with gaps in their sequence numbers. The change now accurately splits the batch into multiple XML lines when invoices are missing, ensuring correct invoice generation. This improves the reliability of the MyInvois process.
Original PR description
When generating a consolidated MyInvois document, the system must split the batch into multiple XML lines if there are gaps in the sequence (e.g., if an invoice in the middle of the range was already sent individually) The previous logic attempted to detect these gaps by searching the database(`account.move`) for any invoices that fell within the sequence range and lacked a EDI document. Because this search would find the "missing" invoices, it would fill the gap and fail to detect it and produce a single consolidated line. This commit replaces the search and relies only on the selected recordset, along with the addition of sorted `sequence_number` for gap detection and adds test for handling consolidation of broken sequences. Task: [6057214](https://www.odoo.com/odoo/project.task/6057214) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261150
This update fixes a potential issue where users could falsely validate signatures in draw mode using Firefox and similar browsers. Now, a signature field requires a visible drawing before validation, ensuring signatures are only confirmed when a genuine signature is present. This improves the accuracy and reliability of our document signing process.
Original PR description
On Firefox and similar browsers, it was possible in some cases to validate a signature field in draw mode without actually drawing a signature, allowing the document signature to be confirmed with an empty signature. This change ensures that a signature field in draw mode can only be validated when the signer has effectively drawn a visible signature. task-6117312 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#259100
This update fixes a reporting issue for Hong Kong payroll taxes. It adds adjustments to the calculations for IR56B/F/G reports, ensuring that global reimbursements and deductions are accurately reflected in the taxable income totals. This improves the accuracy of tax reporting for Hong Kong businesses.
Original PR description
Added GLOBAL_REIMBURSEMENT and GLOBAL_DEDUCTION to the AmtOfSalary calculation for IR56B/F/G reports. This ensures adjustments are properly reflected in taxable income totals. task-6126661 Forward-Port-Of: odoo/enterprise#115228 Forward-Port-Of: odoo/enterprise#114041
This update fixes an issue where invoices in the l10n_mx module were incorrectly rounding tax amounts. The change reverts to the standard mixed rounding mode, ensuring accurate tax calculations on invoices with both 16% and 53% taxes. This improves financial reporting accuracy for Mexican businesses using the Odoo system.
Original PR description
**STEP TO REPRODUCE** 1. Install l10n_mx. 2. Change the included in price settings to 'Tax included' for a 16% tax and a 53% tax. 3. Create a invoice with a product with a unit price of 360, add the 53% tax and then the 16% tax. 4. Notice the total of the invoice is 360.01 instead of 360. The issue was discussed with (las), l10n_mx_edi should no longer require to override the rounding mode for taxes. opw-5963855 Forward-Port-Of: odoo/odoo#255574
This update corrects a bug that was disrupting tests within the l10n_mx_edi module, specifically related to rounding calculations for Mexican tax invoices. The change reverted the rounding mode to 'mixed,' resolving the test failure and ensuring accurate tax reporting. This fix maintains the functionality of the Mexican tax processing features.
Original PR description
https://github.com/odoo/odoo/pull/255574 change the rounding mode back to mixed. This break the test modified in this PR. opw-5963855 Forward-Port-Of: odoo/enterprise#114321 Forward-Port-Of: odoo/enterprise#114081
This update fixes a minor display issue in the Helpdesk app's performance dashboard. Previously, the 7-day average rating was shown as a percentage, which was confusing for users. Now, the rating is displayed as a score out of 5, providing a clearer and more intuitive understanding of performance.
Original PR description
Steps to reproduce: - Open the Helpdesk app with demo data. - Check the "My Performance" section of the dashboard. Current behavior: - "Avg Last 7 days" is shown as "3.50 %". Expected behavior: - "Avg Last 7 days" is shown as "3.5 / 5". Issue: The backend already computes `7days.rating` as a 0-to-5 average, but the frontend dashboard template appends a "%" suffix. Solution: Update the Helpdesk dashboard template to display the 7-day average as a score out of 5 instead of as a percentage. task-5998903 Forward-Port-Of: odoo/enterprise#109804
This update corrects a bug where users received duplicate notifications when submitting the email reminder form for event talks. The fix ensures that notifications are displayed correctly and prevents unwanted redirects to talk pages, improving the user experience for event registration.
Original PR description
This PR fixes the email reminder form with multiple commits: - Commit 1 fixes the notifications displayed when the email form is submitted as the messages of those notifications are redundant. - Commit 2 inserts the form inside the HTML body instead of the interaction's HTML since the surrounding HTML of this last one may cause display issues as with the <a> tag redirecting the users on the talks page when they click on the form which should not happen. Task-5347538 Forward-Port-Of: odoo/odoo#251468
This update resolves a crash that occurred when assigning recruiters in the Odoo Recruitment Kanban view. The issue stemmed from an unnecessary cache parameter in avatar image URLs, which caused errors due to missing data. Removing this parameter ensures stable operation and correct avatar display.
Original PR description
**Steps to Reproduce:** 1. Open Recruitments 2. Find a job position without a recruiter in the kanban view. 3. Clicking on the assign recruiter widget produces a traceback. **Bug Cause:** The…
**Steps to Reproduce:** 1. Open Recruitments 2. Find a job position without a recruiter in the kanban view. 3. Clicking on the assign recruiter widget produces a traceback. **Bug Cause:** The ?unique= cache related parameter was added to the avatar image URL in the autoCompleteItem slot of KanbanMany2OneAvatarEmployeeField. This parameter relies on write_date being available on the autocomplete suggestion record. However, web_name_search only returns id and display_name, so write_date is undefined on autocomplete suggestion records, causing a crash when accessing autoCompleteItemScope.record.data.write_date.ts. **Bug Solution:** Remove the ?unique= parameter from the avatar image URL in the autoCompleteItem slot, reverting it to its original form. Cache is unnecessary for autocomplete suggestion avatars as they are only visible for the duration of the dropdown interaction. **Task:** 6092768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261040
This update resolves an issue where CFDI (Mexican tax) generation for payslips failed due to discrepancies in decimal precision. The fix ensures payroll calculations are rounded to the required 2 decimal places, aligning with CFDI formatting standards and preventing errors. This improves the reliability of payroll reporting for Mexican businesses.
Original PR description
Currently, if the company is configured with a 4-decimal currency, the CFDI generation for payslips might fail with NOM111 and CFDI40119 errors. This occurs because the calculation of totals and subtotals uses the raw unrounded floats, which can cause penny differences when the XML template formats the individual lines to 2 decimal places. This commit forces all payroll concept amounts to be explicitly rounded to 2 decimal places before accumulating the totals. This ensures that the sum of the formatted XML nodes precisely matches the total and subtotal values reported in the CFDI. Accounting might require a higher decimal precision for the company's currency (e.g., 4 decimals for inventory). However, payroll CFDI stamping strictly requires 2 decimal precision. This fix isolates the payroll CFDI calculations from the company's currency settings. Forward-Port-Of: odoo/enterprise#114936
This update resolves a scrollbar flickering issue in the Gantt chart, ensuring a smoother and more reliable user experience. The fix corrects a calculation error that caused grid elements to intermittently disappear, and now utilizes a more robust approach to accommodate progress bars and adjust row heights for different screen sizes.
Original PR description
This commit fixes an issue where the scrollbar would flicker uncontrollably at certain scroll positions. This occurred because grid elements were constantly appearing and disappearing at the edge of the viewport on every animation frame. The root cause was a discrepancy in row height computations introduced in https://github.com/odoo/enterprise/pull/101732. The virtual grid was receiving row heights 8px smaller than the actually rendered rows, leading to miscalculations in visibility. To fix this, the problematic 8px change is reverted. The original design requirement (fitting the progress bar) is instead fulfilled by explicitly adding height to group rows, and providing additional space to regular rows on smaller screens.
A minor fix was implemented to correct a naming inconsistency within the Odoo website code. The resource name was updated, but a subsequent addition to the website functionality didn't reflect this change. This ensures consistent resource naming for improved website stability.
Original PR description
The resource `on_replaced_media_handlers` was renamed `on_media_replaced_handlers` with [b966432], but commit [909341c] added a use case without updating the name. [b966432]: https://github.com/odoo/odoo/commit/b966432e85a7e19c0e4e4bfbb34f673b64fc84e6 [909341c]: https://github.com/odoo/odoo/commit/909341c3ae601a83358a4ed4a0a4b6965bfef332
This update corrects a previous issue where certain users without attendance access were unable to view attendance records with overtime. The fix involved adding specific user groups to the 'Overtime Details' section, ensuring only authorized personnel can access this data. This improves data security and usability for all users.
Original PR description
Steps to Reproduce: - Log in as user which has no access of attendance - Try to open attendance record with overtime Issue: - As users below Self Attendance edit and hr administrator does not have access to rule_ids Fix: - Added groups on 'Overtime Details' section as other user does not have access to read. task-5886324 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250567
This update resolves an issue where the holiday selection process was inaccurate. The change corrects a domain filter used to retrieve holiday data, ensuring employees are correctly identified for holiday entitlements. This improves the reliability of holiday calculations and reporting.
Original PR description
Forward-Port-Of: odoo/odoo#261250
This update fixes a missing field in the Czech Republic (CZ) version of Odoo. The 'City' field was absent from contact forms, preventing accurate address data entry for CZ customers. This change ensures compliance with Czech tax regulations and improves the accuracy of customer information.
Original PR description
Steps to reproduce: 1- Install Contacts and l10n_cz 2- Switch to CZ company 3- Open any contact Issue: `City` field is missing in address section Expected behavior: Should have the `City` field opw-6123084 Forward-Port-Of: odoo/odoo#259433
This update fixes an issue where increasing the quantity of a service product on a sales order incorrectly generated a purchase order with an inflated quantity. The fix ensures the quantity is consistently calculated in the sales order's unit of measure, preventing double-counting and inaccurate purchase order generation. This improves the reliability of sales order processing for service products.
Original PR description
Steps to reproduce the bug: - Create a service product "P1": - In the Purchase tab: - Vendor: Azure Interior - Subcontract Service: True - UoM: dozen - Purchase UoM: unit - Create a sales order with…
Steps to reproduce the bug:
- Create a service product "P1":
- In the Purchase tab:
- Vendor: Azure Interior
- Subcontract Service: True
- UoM: dozen
- Purchase UoM: unit
- Create a sales order with 1 dozen of P1
- Confirm -> a purchase order with 12 units of P1 is generated
- Confirm the purchase order
- Go back to the sales order:
- Update the quantity from 1 to 2 dozen
Problem:
A new purchase order is generated, but with 144 units instead of 12
units. The quantity difference between the old SO quantity and the new
one is computed twice in the purchase order line UoM, in both
`_purchase_increase_ordered_qty` and `_purchase_service_prepare_line_values`:
https://github.com/odoo/odoo/blob/17.0/addons/sale_purchase/models/sale_order_line.py#L186
Solution:
The `quantity` parameter must be expressed in the SO line UoM, as
described in the documentation of the function `_purchase_service_prepare_line_values`.
https://github.com/odoo/odoo/blob/17.0/addons/sale_purchase/models/sale_order_line.py#L178
opw-6049106
Forward-Port-Of: odoo/odoo#261199
Forward-Port-Of: odoo/odoo#255478This update resolves an issue where changing the account on bank reconciliation lines with analytic distributions would cause errors and data inconsistencies. The fix ensures accurate account updates by properly managing analytic line links during editing, preventing orphaned analytic lines and improving the bank reconciliation process.
Original PR description
Before this commit, editing a line with an analytic distribution caused inconsistent behavior when changing the account. When an analytic distribution was present, editing the line created analytic…
Before this commit, editing a line with an analytic distribution caused inconsistent behavior when changing the account. When an analytic distribution was present, editing the line created analytic lines linked to the move line. However, changing the account from the form view in the bank reconciliation widget triggered _inverse_account_id, which in turn called _inverse_analytic_distribution. This resulted in unlinking the analytic_line_ids from the move line, preventing the account change from being applied. On a second attempt, the account could be modified because there were no longer any analytic lines to unlink. This led to orphaned analytic lines not linked to any journal item. To fix this, the inverse method is now disabled while editing the line in the form view. Upon saving, the analytic_line_ids are explicitly unlinked, and _create_analytic_lines is triggered during the update to correctly recreate the analytic lines. opw-6107329 Forward-Port-Of: odoo/enterprise#114863
Features or functions removed from Odoo
This update removes a field in the Odoo email server configuration that was no longer used. The change simplifies the system by relying solely on ICP parameters for email size limits, improving internal processes. This is a routine maintenance update.
Original PR description
In odoo/odoo#256685, we remove the use of ir.mail_server max_email_size field by making the method _get_max_email_size only rely on the ICP parameter and not any more on that field. We remove that field as it is now useless. Task-5912830
This update removes the outdated signature display from the sales portal. Previously, the portal showed signatures even for older versions of sales orders. This change ensures consistency by only displaying the current, signed signature, improving the accuracy of sales documents.
Original PR description
In https://github.com/odoo/odoo/pull/245198, we improved a Sales Order signature integrity by ensuring the signature only prints on the specific PDF generated at the exact time of signing, rather than on any subsequently generated PDFs. To maintain this consistency, this commit removes the signature from the sales portal. Prior to this change, the portal displayed the signature even if the customer had not signed the most recent, current version of the quotation or SO. Follow-up of task-5421716
This update addresses a technical detail within Odoo's email server configuration. The 'max_email_size' field in the ir.mail_server module is now marked as deprecated, signaling its removal in a future version. This change ensures compatibility with upcoming updates and streamlines the email server setup process.
Original PR description
In odoo/odoo#256685, we remove the use of ir.mail_server max_email_size field by making the method _get_max_email_size only rely on the ICP parameter and not any more on that field. As we were too late to remove the field in 19.3, we add a comment to indicate that the field is deprecated and will be removed in 19.4. Task-5912830
This update improves how Odoo stores composer data, moving from using browser storage (localStorage) to a more secure and efficient method called IndexedDB. This change enhances performance and stability of the composer feature within Odoo.
Original PR description
This PR removes the use of localStorage to store composer in favor of IndexedDB. task-5905857
This update removes the `ir.mail_server max_email_size` field, streamlining email handling within Odoo. Because this change couldn't be fully implemented in the 19.3 release, a clear warning has been added to indicate the field is now deprecated and will be removed in a future update. This ensures consistent email size management.
Original PR description
In odoo/odoo#256685, we remove the use of ir.mail_server max_email_size field by making the method _get_max_email_size only rely on the ICP parameter and not any more on that field. As we were too late to remove the field in 19.3, we add a comment to indicate that the field is deprecated and will be removed in 19.4. Task-5912830