Daily updates from Odoo
Thursday, January 15, 2026
28 changes · 18.0
Resolved issues and error corrections
This update corrects a problem that prevented the migration of Odoo from version 16.0 to 18.0 for the Italian accounting module (l10n_it). The fix adds a necessary column to the database, resolving the migration failure. This ensures a smooth upgrade process for Italian businesses using Odoo.
Original PR description
Migration from 16.0 fails because l10n_it_exempt_reason column does not exist Forward-Port-Of: odoo/odoo#240862
This update ensures that pressing the mobile back button closes the chat window, mirroring the functionality of the 'X' button. Previously, the back button caused unexpected navigation. This improves the mobile chat experience and prevents users from losing their place within conversations.
Original PR description
**Current behavior before PR:** - The back button on mobile does not close the open chat window. - Pressing it navigates away from the page instead of closing the chat window. - Only the "X" button can be used to exit a chat. **Desired behavior after PR is merged:** - Pressing the mobile back button will now behave the same as clicking the "X" button. - It will close the current chat window and prevents unwanted navigation in browser history. task-[4563827](https://www.odoo.com/odoo/project/1519/tasks/4563827) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where only the first attachment from an expense was included in the generated journal entry. The change ensures that all attachments associated with approved expenses are now correctly copied, improving the accuracy and completeness of financial records. This prevents data loss and provides a more reliable view of expense details.
Original PR description
**Steps to reproduce:** * Install **hr_expense** and **accounting** modules. * Create two or more expenses, each with **multiple attachments**. * Submit and approve the expenses. * Create the **journal entry** of all approved expenses. * Open the generated journal entry and review its attachments. **Observed behavior:** * Only the **first attachment** from each expense is present on the journal entry. * Additional attachments are missing. **Cause:** * while creating journal entry, the logic of expense iterate on `message_main_attachment_id`. * `message_main_attachment_id` stores only a **single attachment**, so only one file per expense is copied. **Fix:** * Iterate on `attachment_ids` instead of `message_main_attachment_id`. * Ensures **all attachments** from each expense are included in the generated journal entry. opw-5414834 Forward-Port-Of: odoo/odoo#241044
This update ensures that the DDT number is correctly included in the delivery reports sent to customers. Previously, the number was missing because it was generated after the email was sent. This fix resolves a reporting issue, improving the accuracy and completeness of delivery confirmations for Italian businesses using the l10n_it_stock_ddt module.
Original PR description
When validating a delivery, Odoo did not include the DDT number in the report, as it was generated after rendering the PDF/email. This fix changes the order to generate the DDT number before sending…
When validating a delivery, Odoo did not include the DDT number in the report, as it was generated after rendering the PDF/email. This fix changes the order to generate the DDT number before sending the email. Steps to reproduce: - Create a database with an Italian company and the `l10n_it_stock_ddt` module installed - Turn on `Settings > Inventory > Shipping > Email Confirmation` - Under `Settings > General Settings > Companies > Email Templates` click `Review all Templates` - Edit the `Shipping: Send by Email` template - Under the `Settings` tab, you find the `Dynamic reports` field (which is a `many2many`), add the `DDT report`. - Create a SO, validate it - On the top of the SO, you see the delivery button with one delivery, click it, then validate the delivery. - In the chatter you see the message that was sent, with the `DDT report` PDF attached, with `False` instead of the DDT name. - If you open the report, the title of the PDF is also missing the DDT name. Ticket [link](https://www.odoo.com/odoo/project.task/5364265) opw-5364265 Forward-Port-Of: odoo/odoo#243492
This update resolves an issue where pivot tables in the spreadsheet module weren't correctly calculating data. By adding a key to the pivot registry, the system now accurately re-evaluates pivot data, ensuring correct and reliable reporting. This improves the overall accuracy and usability of the spreadsheet feature.
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
This update provides users with more detailed error messages when sending documents to HMRC. By including the specific error code and message from HMRC, users can quickly understand and resolve issues, reducing the need for support. This enhancement improves the user experience and streamlines the document submission process.
Original PR description
Currently, when an error occurs while sending a document to HMRC, the user only receives a generic error message. This change enhances the error feedback by including the error code and message returned by HMRC, giving the user clearer insight into the cause of the failure. This helps users identify issues more easily and reduces unnecessary support requests.
This update fixes a bug where inviter notifications were sent to portal users when they connected for the first time, causing unnecessary alerts. Now, inviter notifications are only triggered for internal users, streamlining the process and improving the user experience. The notification message has also been updated for clarity.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ When a user was invited to Odoo, the inviter received a first-connection notification when the invited…
**Description of the issue this PR addresses:** ------------------------------------------------ When a user was invited to Odoo, the inviter received a first-connection notification when the invited user connected for the first time. This notification was triggered for **all user types**, including portal users. For portal users, this resulted in unnecessary toast notifications and chat window pop-ups. **Current behavior before PR:** --------------------------------- - The inviter is notified when any invited user connects for the first time. - This includes portal users. - Unnecessary notifications and chat pop-ups are shown for portal user connections. **Desired behavior after PR is merged:** ----------------------------------------- - The inviter is notified **only when an internal user** connects for the first time. - Portal users no longer trigger first-connection notifications. - The notification message is updated to: “[Username] just connected for the first time. Wish them luck!” **Task:** [4105780](https://www.odoo.com/odoo/project/1519/tasks/4105780) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a problem where discoverable subfolders accessed via sharing links weren't initially displayed correctly. The fix sends a flag to refresh the document access when a new folder is loaded, ensuring subfolders are immediately visible to users. This improves the user experience when sharing documents.
Original PR description
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) -…
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) - Copy the share link - Login with the portal user in an incognito window - Paste the share link in an incognito browser - Click on "brand 1" folder, result nothing is showing while there should be a folder and a picture - Click on "brand 2" - Click back on "brand 1" and now the folder and picture are visible - If you click on a subfolder of "brand 1" you also get an error **Issue:** Discoverable subfolders accessed using `accessToken` are not available on the first read of a user and this happens for each level of the hierarchy (refresh is needed each time). When using sharing link to display folders with a user, the subfolder document access is created on `/documents/touch/` using `_from_access_token`. But on the js side the call is delayed (with debounce) and occurs after the `web_search_read`. This means that subfolders are only accessible after a refresh or by switching back and forth between folders. Also, even after the folder is displayed, if there are other subfolders in it, going deeper in the hierarchy won't work as well without a refresh due to the `search_panel_select_range` missing the new folder. **Fix:** Not sure on the best way to fix this, the issue will always be related to performance. Current fix checks if a reload is needed by sending a flag in the `/documents/touch/<access_token>` request result when a new document access was created. opw-5156297
This update resolves a potential error that could occur in the accounting system when all possible distribution factors are zero. The change ensures the system handles this specific scenario correctly, preventing a traceback and maintaining accurate accounting calculations. This improves system stability and reliability.
Original PR description
In 614dcf23b89 `_distribute_delta_amount_smoothly` was changed to use a half-up round rather than a ceiling, and incorporate an additional step of distributing any remaining cents. However, the step that distributes any remaining cents relies on the assumption that there are less remaining cents than the number of factors. This assumption generally holds true because most cents are already allocated in the first step which uses the `round` function; except in one edge case, which is if all factors are zero. In that case, the `_normalize_target_factors` method will return an all-zero list of normalized factors, and so no cents will be allocated in the first step. The fix is to change `_normalize_target_factors` so that in this edge case, the list of normalized factors allows most cents to get allocated in the first step. See #240136 task-none
This update fixes an issue where the quantity delivered on sale orders wasn't accurately updated after a partial refund with a 'Ship Later' option. The fix ensures that the delivered quantity reflects the actual items remaining after the refund is processed, improving order accuracy and reporting. This resolves a discrepancy in how the system tracks inventory following a partial refund.
Original PR description
The qty_delivered on sale.order.line was not correctly computed when the original order was refunded with a ship later. Steps to reproduce: ------------------- * Create a sale order for 5 quantities of any product * Confirm the sale order * Settle the order in the PoS * At this point the qty_delivered on the sale order line is 5 * Now go back to the PoS and refund partially the order for 3 quantities and use the "Ship Later" option > Observation: The qty_delivered is 0 instead of 2 Why the fix: ------------ We group the pos.order.line by procurement group and then check if all pickings related to these lines are done before adding the qty to the qty_delivered. We also make sure to include the refund lines in the computation opw-5059560
This pull request enhances message access and search functionality within Odoo by ensuring consistency across read, search, and portal user experiences. Specifically, it addresses issues with document-level access checks, symmetric search results, and portal user domain application, ultimately improving data accuracy and usability.
Original PR description
Message access is notably based on related document, given their (model, res_id) pair. Model may customize the required access on it in order to access their message. For example, you generally need…
Message access is notably based on related document, given their (model, res_id) pair. Model may customize the required access on it in order to access their message. For example, you generally need write access to create a message (post) but on some models you can post when you can read. Calendar events message access depends on calendar privacy settings. This is controlled via '_get_mail_message_access'. However currently it is "globally called", for all documents. It should be done on a per-document basis, as each document could define different access check. Keep code somewhat optimized by doing access checks in batch for a given operation. Make _search and read symmetric. Reading documents should be allowed on search results, and search results should match what is available for reading. Portal users have some specific domains applied when accessing messages, see notably odoo/odoo@9cd9aaaa174ae1f2a0af12143a34eb4682ea6f59 (but also check for 'website_message_ids' domain, mail controllers, ...). However there are still some cases where search and read are not coherent with portal users. This is not really annoying as most messages are accessed using sudo and correctly tailored domains via controllers but let us try to have a more correct code. Fix discuss support of post check capabilities * not taking into account '_get_mail_message_access' to check if user has right to post (generally used to indicate users can post on readonly records, but not limited to that) in 'readonly' computation in frontend and in controllers; * not adding the same check on Activities button as on Send message and Log note. We consider generally that rights should be aligned and UX should match that behavior; * not adding the same check on attachments buttons, currently limited to write access (or always accessible). This is a preliminary work for attachments, further fixes are probably incoming; Mainly a backport of master improvement done at https://github.com/odoo/odoo/pull/214705 . Task-5138368 opw-4785878 Forward-Port-Of: odoo/odoo#233725
This update ensures that EDI identification details used during registration are consistently synchronized across systems, particularly for Peppol integrations. Previously, provided identification numbers could be outdated, leading to potential registration issues. This fix improves data accuracy and reliability for Peppol-related processes.
Original PR description
We introduced for Peppol the possibility to deduce an identification from another one therefore, the provided edi_identification at registration can sometimes not be the one that is actually used when registering to the AP. This commit adds ways to synchronize it to keep it consistent. See https://github.com/odoo/iap-apps/pull/1334 task-none
This update enhances the Point of Sale system by introducing a background queue for 'isUnsyncedPaid' orders. This prevents slowdowns and errors when many orders are being processed simultaneously, ensuring reliable and efficient order synchronization. The system now handles errors gracefully, retrying failed orders to maintain data accuracy.
Original PR description
Implement a background queue system to handle isUnsyncedPaid orders separately from regular order synchronization. This prevents issues when multiple pending orders are being synced simultaneously. Orders are now categorized into three types: - Orders from options.orders: sync normally with await - Non-isUnsyncedPaid pending orders: sync normally - isUnsyncedPaid orders: process sequentially through background queue The queue processing pauses during explicit sync operations and resumes automatically afterward. This prevents race conditions and ensures orders are synced reliably one-by-one. Error handling differentiates between error types: - RPCError: removes order from queue and shows user notification - ConnectionLostError: pauses queue and keeps order at front for retry - Timeout/other errors: moves order to end of queue for retry opw-5111772 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a problem where calendar events synced to Outlook would sometimes create duplicate events in both Odoo and Outlook due to network delays. The fix ensures that Odoo correctly links events created with Microsoft after a timeout, preventing these duplicates from occurring.
Original PR description
When creating an event in Odoo that syncs to Outlook, a timeout or network error during the response from Microsoft can leave the system in an inconsistent state, leading to duplicate events in both…
When creating an event in Odoo that syncs to Outlook, a timeout or network error during the response from Microsoft can leave the system in an inconsistent state, leading to duplicate events in both Odoo and Outlook during subsequent synchronizations.
### Steps to reproduce
1. Create a calendar event in Odoo with Outlook synchronization enabled.
2. Simulate a network timeout (currently set to `3 seconds`) after Microsoft processes the creation request but before Odoo receives the response (e.g., by mocking a timeout in `_microsoft_insert`).
3. Observe that the event exists in Outlook but the Odoo record lacks the `microsoft_id`.
4. Run the synchronization manually.
5. A duplicate event is created in Outlook (due to retry) and/or a duplicate event is created in Odoo (fetched from Outlook as "new").
### Root Cause
The synchronization logic in
`microsoft_calendar/models/microsoft_sync.py` relies on receiving a successful response from the Microsoft Graph API to link the Odoo record with the created Outlook event.
Specifically, in the `_microsoft_insert` method, the call to `microsoft_service.insert` sends the creation request. If Microsoft successfully processes this request and creates the event, but the network connection times out while waiting for the response, the subsequent line `self.write({'microsoft_id': event_id, ...})` is never executed.
At this point, the Odoo record remains with `microsoft_id=False` and `need_sync_m=True`, even though the event actually exists in Outlook.
During the next synchronization:
1. `_sync_odoo2microsoft` identifies the Odoo record as unsynced (`microsoft_id=False`) and sends a new insertion request, creating a second event in Outlook.
2. `_sync_microsoft2odoo` fetches the original event from Outlook. To match Outlook events back to Odoo records, the logic in `MicrosoftEvent._load_odoo_ids_from_db` searches for Odoo records having a matching `microsoft_id` or `ms_universal_event_id` (a global ID provided by Microsoft). Since the Odoo record was never updated with these IDs, the match fails. Odoo treats the incoming event as a new external item and creates a duplicate record in Odoo.
### Fix Rationale
To resolve this, we utilize the `transactionId` property of the Microsoft Event resource. The `transactionId` is an optional, client-provided string that Odoo can attach to an event during creation. This ID is stored by Microsoft and remains accessible in the event's properties, allowing the client to identify the event independently of the server-generated IDs.
1. We now generate a deterministic `transactionId` for each insertion using the format `<database.uuid>_<record.id>`. This ID is unique to the Odoo record and remains stable across synchronization retries.
2. This `transactionId` is included in the payload of the event creation request within the `_microsoft_values` method of the `calendar.event` and `calendar.recurrence` models.
3. The matching logic in `MicrosoftEvent._load_odoo_ids_from_db` is extended with a fallback mechanism. If an incoming Outlook event cannot be matched by its server-generated IDs, the code checks for a `transactionId`. If the `transactionId` matches the current database UUID and contains a valid Odoo record ID, Odoo identifies the record it originally intended to create and links them.
This ensures that if an insertion response was previously lost due to a timeout, Odoo can still find and link the existing Outlook event during the next synchronization instead of creating a duplicate.
opw-5031073This update enhances the reliability of point-of-sale order synchronization by introducing a background queue for 'isUnsyncedPaid' orders. This prevents slowdowns and errors when multiple orders are being processed simultaneously, ensuring orders are synced reliably. The system also includes robust error handling for various issues, improving overall order processing stability.
Original PR description
Implement a background queue system to handle isUnsyncedPaid orders separately from regular order synchronization. This prevents issues when multiple pending orders are being synced simultaneously. Orders are now categorized into three types: - Orders from options.orders: sync normally with await - Non-isUnsyncedPaid pending orders: sync normally - isUnsyncedPaid orders: process sequentially through background queue The queue processing pauses during explicit sync operations and resumes automatically afterward. This prevents race conditions and ensures orders are synced reliably one-by-one. Error handling differentiates between error types: - RPCError: removes order from queue and shows user notification - ConnectionLostError: pauses queue and keeps order at front for retry - Timeout/other errors: moves order to end of queue for retry related pr: https://github.com/odoo/odoo/pull/230815 opw-5111772
This update corrects a technical issue preventing the IoT Box from functioning correctly as a kiosk. The change ensures that browser arguments are properly passed, resolving a memory-related freeze. This improves the stability and reliability of the kiosk functionality.
Original PR description
In odoo/odoo#233676 we switched from `chromium-browser` to `chromium` to adapt to new executable name in raspbian. We also need to update this name in the check to set the arguments of the browser, or they will never be passed. This fixes the issue where the IoT Box freezes when using it for kiosk, as the browser was eating all the memory.
This update corrects a technical issue where invoice XML files generated for EU standard e-invoicing (Peppol Bis 3.0) were incorrectly using the company's VAT number instead of its company registration number. This change ensures invoices comply with Belgian regulations and accurately reflect the company's identification details. The fix prioritizes using the company registry information for key identifiers.
Original PR description
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs:…
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs: An independent invoice example: https://developer.vertexinc.com/einvoicing/docs/belgium-example-documents https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1564-L1566 https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1585 Steps To Reproduce: - Have accounting, account_edi_ubl_cii and contacts installed. - Create a Belgian company and set the VAT, Company ID and Reference (under Sales & Purchase tab). - Create a contact and set his eInvoice format in Accounting tab to EU Standard (Peppol Bis 3.0) and make sure to give him a country. - Go to accounting -> Customers -> Invoices and create an invoice for the contact you created. - Send the invoice to the contact and download the XML from the chatter and inspect it. - PartyIdentification/ID shows the partner's ref field value (e.g., "(odoobe)") instead of the company registration number. - PartyLegalEntity/CompanyID uses the VAT number instead of the company registration number (ondernemingsnummer). Ticket [link](https://www.odoo.com/odoo/project.task/5418190) opw-5418190
This update corrects a bug where loyalty points weren't accurately calculated when re-loading saved Point of Sale (PoS) orders. Previously, changes to the order after saving didn't update the point totals. This fix ensures that points are correctly awarded based on order changes, improving the customer loyalty program experience. This is a critical fix for accurate point tracking.
Original PR description
When an order was saved then reloaded in the PoS, the points awarded for a loyalty program were not computed correctly. Steps to reproduce: ------------------- * Create a loyalty program that gives one point for every € spent * Activate the trusted pos option in the PoS settings * Open a PoS session and create an order * Add 1 product A for a total of €10 * Set a partner * You should get 10 points * Save the order * Reload the saved order * Change the quantity of product A to 2 > Observation: You still have 10 points instead of 20 Why the fix: ------------ When saving the order, it is synced with the backedn and the comboLines are reloaded from the backend when reloading the order. However, it becomes an empty list and the line would be treated as a combo header. This backport a part of this commit : https://github.com/odoo/odoo/pull/220828 opw-5118716 Forward-Port-Of: odoo/odoo#241674
This update prevents users from modifying attached documents or custom fields on locked sales orders. Previously, changes made to product documents within a locked order were not saved, causing confusion. This fix ensures consistency and prevents unintended modifications when a sale order is locked for reporting or other purposes.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Enable the `Lock Confirmed Sales` option from settings 2. Create a new quotation and add a customer 3. Add a product that includes a document that has its…
Versions -------- - 18.0+ Steps ----- 1. Enable the `Lock Confirmed Sales` option from settings 2. Create a new quotation and add a customer 3. Add a product that includes a document that has its visibility set to `Inside quote pdf` 4. Modify which documents (header, product document, etc) are attached to the quotation and their custom fields from the `Quote Builder` tab 5. Confirm the quotation and notice that the sale order is now locked Issue ----- Although the sale order is locked, you are still able to add/remove the documents, and you can also modify the custom fields. Adding/removing the headers and footers work as expected, however if you try to add or remove a product document it will look like your modification has been successful, but if you refresh the page you will discover it hasn't actually been saved. Even though you can't add or remove a product document, you still can modify the custom fields for these product documents. Cause ----- You are allowed to edit the headers, footers, and custom fields because there are no checks to stop you from doing so if the sale order is locked. The reason that adding or removing product documents doesn't work is that these are saved on the sale order line, which becomes read only when the sale order is locked. Solution -------- When the sale order is locked, disable adding/removing documents or modifying custom fields. It is only disabled from the frontend similarly to other fields in the locked sale order. opw-5182258
This update resolves an issue preventing electronic invoices in Latin American countries from correctly generating PDF documents with the expected headers and footers. The fix ensures the invoice templates use the correct country-specific information, addressing a problem with older databases that lacked chart template settings. This ensures accurate invoice generation for Latin American businesses.
Original PR description
This commit fixes a bug introduced here https://github.com/odoo/odoo/commit/3f7d79731fd5e5a751f7f1aeae63379c6211de5c because some old databases do not have set the chart template so it is needed to render the header and footer of the report template layouts taking in consideration the account fiscal country code instead of the chart template. Replicate printing the pdf of a customer electronic invoice on an argentinen company without chart template. Ticket Adhoc side: 105739 Task latam: 1373 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update removes a redundant warning related to credit notes from the GSTR report, streamlining the reporting process. Previously, a warning appeared on invoices when a credit note was confirmed, which has now been corrected to clear only after the credit note is fully posted and checked. This simplifies reporting for users.
Original PR description
This **PR** removes the credit note warning from the GSTR report, as it is not required at the report level. Additionally, when this warning is present on an invoice and the credit note is confirmed, the credit note is set to not checked. The warning will only be cleared once the credit note is posted and checked task-5469000
This update optimizes how Odoo's Point of Sale system interacts with its database, specifically IndexedDB. Previously, syncing large amounts of data, like loyalty card information, could slow down adding products to a cart. This change improves the overall speed and responsiveness of the Point of Sale experience.
Original PR description
Before this commit, if a model had a large number of records, for example, loyalty card, the synchronization of IndexedDB could be slow, leading to performance issues when adding products to the cart. opw-5232087 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a technical issue related to managing user consent for online accounts. The change allows users to more effectively control their data synchronization settings, addressing a potential error that previously prevented consent management. The update also enhances the system's flexibility by allowing it to work with different data providers.
Original PR description
In this commit:https://github.com/odoo/enterprise/commit/bf5b7d03fe8e138ee8bc0246d3d148638db5d620 we introduce a message on the account_online_link to be able to manage the consent. But since manage_consent is not a field of account.online.linki would traceback, we changed the position of the code by popping the value. Also changed the url to use the provider_type to be able to use the route with any provider if needed task-5187621 Forward-Port-Of: odoo/enterprise#102428
This update fixes an issue where custom button snippets weren't consistently shown in the editor interface. The fix ensures that custom buttons are correctly displayed and avoids incorrect wrapping in paragraph tags, improving the usability of the website editor.
Original PR description
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur…
### Issue: When a custom button snippet was dropped next to an existing button wrapped in a `<div>`, it was incorrectly and unconditionally wrapped in a paragraph `<p>` tag. This issue did not occur with standard button snippets or when the buttons were wrapped in a `<p>` tag. ### Steps to reproduce: 1. Drag a standard "Button" snippet next to an existing button (e.g., in the navbar). The structure is correctly `<a/><a/>`. 2. Save a button as a custom snippet. 3. Drag this new custom button snippet next to a button wrapped in a `<div>` (navbar in our example). 4. Observe the structure: `<div><a/><p><a class="s_custom_snippet"/></p></div>`, but it should be like `<div><a/><a class="s_custom_snippet"/></div>`. ### Fix The logic has been corrected to only wrap a button snippet in a paragraph tag if it has no sibling buttons and is not already inside a `<p>`. This ensures consistent behaviour between standard and custom button snippets. A tour test is also added, ensuring the behaviour is correct. Backport of https://github.com/odoo/odoo/commit/3a8f2cc418510c3b91f8b9086bb4a89a1745e40d task-[5032130](https://www.odoo.com/odoo/project/974/tasks/5032130) Forward-Port-Of: odoo/odoo#224476
A technical issue with WebKit was preventing users from properly scanning barcodes on iOS devices. This resulted in a white square obscuring the scanning area. This update resolves the problem by addressing a WebKit bug, ensuring accurate barcode scanning functionality for iOS users.
Original PR description
Issue ----- There is an issue in WebKit with mix-blend-mode https://bugs.webkit.org/show_bug.cgi?id=286619 Because of this issue, in barcode, the user gets a solid white square over the scanning zone, so they don't see the barcode being scanned. ----- Ticket: opw-5386846 Forward-Port-Of: odoo/odoo#243486
This update optimizes the SQL query used to generate the budget report, resulting in significantly faster performance, especially when dealing with large amounts of data. The change avoids a slow query strategy and allows for a more efficient join process, leading to quicker report generation times.
Original PR description
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`.…
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`. Because this condition lacks a strict equality constraint, the planner cannot build a hash table for the join. Consequently, it is forced to fallback to a Nested Loop Join strategy, evaluating the condition as a filter for every row pair. This results in significant performance degradation on large datasets. This commit optimizes the query by splitting the logic into two separate `SELECT` statements combined with a `UNION ALL`: 1. Matches where `company_id` is explicitly equal. 2. Matches where `company_id` is NULL. By separating these conditions, the planner can now prioritize a Hash Join for the equality check and handle the NULL join separately, significantly reducing execution time. References: - Original PR introducing the logic: https://github.com/odoo/enterprise/pull/82955 - Plan Before (Join Filter): https://explain.dalibo.com/plan/a55476hgb73ea7g6#plan - Plan After (Hash Cond): https://explain.dalibo.com/plan/3b9g484569a86efb#plan opw-5460862
Features or functions removed from Odoo
This change removes a reference to an unused test file within the l10n_sa_edi module. This cleanup improves the organization and efficiency of the Odoo codebase. It's a minor technical update that ensures the system remains tidy.
Original PR description
In this [commit], the file name `test_account_move` is removed from `__init__.py`, but the file itself is not deleted. This commit cleans up an unused file reference. [commit]: https://github.com/odoo/odoo/commit/06e21763130d8fcefe9bb62a8b6525fd660874b4#diff-fa673cbfe1fe7ca858fc60e30493a49cc060c245a9a5c9f266ad2e92c9594a8fL6 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Documentation and clarification updates
This pull request confirms the completion of a legal agreement (CLA) for contributions to the Odoo project. It ensures compliance with Odoo's open-source licensing requirements. The change is a standard process update.
Original PR description
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241035