Daily updates from Odoo
Saturday, April 25, 2026
101 changes
46 changes
Resolved issues and error corrections
This update eliminates a misleading confirmation dialog that appeared when using the barcode app to add non-stockable products to delivery orders. The fix streamlines the process by leveraging existing data checks, ensuring a smoother user experience for all product types. This improves usability and prevents unnecessary interruptions.
Original PR description
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P…
### Steps to reproduce: - In the settings: Enable Multi-Steps Routes - Create a non-storable product P - Go to the barcode app > Operations > Delivery Order > New - Click on "Add Product" > select P as product > Confirm #### > A confirmation dialog appears: Oops! It seems that this product is not located in WH/Stock. Do you confirm you picked from there? ### Expected behavior: Since the product is not storable it should not trigger the dialog ### Cause of the issue: The `is_storable` value of the `product.product` is not part of the data that can be used to check if we should check the quantity available in location since only the product id and name are directly available: https://github.com/odoo/enterprise/blob/77d3cc81be8aeb9f2e8bf57fb561fcae80f23b04/stock_barcode/static/src/js/stock_barcode_sml_form.js#L40-L70 However, since an rpc is already performed in order to determine the `qty_available` of the product, we might as well use that same rpc to recover the information and also avoid the dialog in case it is irrelevant. opw-6110655 Forward-Port-Of: odoo/enterprise#114173
This update fixes an issue where draft stock moves were incorrectly flagged as unavailable, even when sufficient stock existed. The fix adjusts how availability is calculated to accurately reflect available quantities, ensuring accurate forecasting and preventing fulfillment delays. This improves the reliability of stock management.
Original PR description
Steps to reproduce: - Create a storable product "P1" - Update on-hand quantity to 2 units - Create a delivery with 2 units of P1 and keep it in draft state Problem: The forecast availability is…
Steps to reproduce: - Create a storable product "P1" - Update on-hand quantity to 2 units - Create a delivery with 2 units of P1 and keep it in draft state Problem: The forecast availability is displayed in red (not available), even though the stock is sufficient to fulfill the move. Explication: For draft consuming moves, the forecast availability is computed as: `virtual_available - move.product_qty` In the case where stock exactly matches the demand, this results in 0. However, on the JS side, availability is evaluated with: `forecast_availability >= product_qty` So with forecast_availability = 0 and product_qty = 2, the condition evaluates to False, incorrectly marking the move as not available. https://github.com/odoo/odoo/blob/c7fede7f44c668ccc0a094d8341c3cae8879a7f1/addons/stock/static/src/widgets/forecast_widget.js#L31 Solution: When the available quantity is sufficient to cover the move (using float_compare), set forecast_availability to the full available quantity instead of subtracting the move quantity. This ensures the JS condition correctly evaluates to True and the move is marked as available. opw-5159142 Forward-Port-Of: odoo/odoo#260489 Forward-Port-Of: odoo/odoo#257354
This update resolves an issue where downloading attachments from Odoo's mobile app was failing due to incorrect URL formatting. The fix ensures that attachment URLs are properly handled, allowing users to download files from the chatter feature without errors. This improves the mobile user experience.
Original PR description
In Odoo 18.4+, downloading attachments from the chatter is broken.
See: https://github.com/odoo/odoo/pull/200099
The `onClickDownload` function now passes an absolute URL to `downloadFile`.
The download function is implemented natively in the mobile apps.
The Android implementation always prefixes the provided URL with the
database origin (i.e.: `https://example.odoo.com`).
`download({url: "https://example.odoo.com/web/content"})` will try to
download `https://example.odoo.comhttps://example.odoo.com/web/content`.
This results in an UnknownHostException.
We can remove the origin from the url before calling the native method.
By doing this on the JS side, there is no need to update the Android app.
opw-6033150
Forward-Port-Of: odoo/enterprise#114832This update corrects an error that prevented reading demo user data when demo companies were archived. The fix replaces the demo user with a standard user that's always accessible, ensuring demo invoices function correctly. This resolves a display issue within the demo environment.
Original PR description
Steps to reproduce: ------------------- 1. Create a new trial DB with demo data and French localization 2. Archive Marc Demo if you create the DB locally (this happens automatically on Odoo.com…
Steps to reproduce: ------------------- 1. Create a new trial DB with demo data and French localization 2. Archive Marc Demo if you create the DB locally (this happens automatically on Odoo.com trials due to the user seat limit probably) 3. Select the demo company only (unselect the main one) 4. Open Accounting and click the Sales journal from the dashboard Access Error about reading Marc Demo. Unarchiving him would work around this issue. Why the bug ----------- The sales demo invoices set invoice_user_id to Marc Demo (base.user_demo). Marc Demo belongs to the main company and can't be read from another company when archived. On 19.0 this did not break because the avatar widget only needed display_name (read with sudo). Commit https://github.com/odoo/odoo/commit/3732ca85b03bea9eabfb05cc306ce0bf5bac88d4 added write_date to it for cache busting, so now the read is real and the rule fails. The fix ------- Use base.user_admin instead: it's never archived, so it stays readable from any company. opw-6106870 Forward-Port-Of: odoo/odoo#259365
This update fixes an issue preventing access to demo data within Odoo trial instances. The problem stemmed from demo user accounts being archived, which caused errors when accessing demo records in separate companies. The fix changes the demo user account used for generating invoices and bills to a standard, always-accessible account, ensuring consistent demo data access.
Original PR description
Steps to reproduce: ------------------- 1. Create a new trial DB with demo data and French localization 2. Archive Marc Demo if you create the DB locally (this happens automatically on Odoo.com…
Steps to reproduce: ------------------- 1. Create a new trial DB with demo data and French localization 2. Archive Marc Demo if you create the DB locally (this happens automatically on Odoo.com trials due to the user seat limit probably) 3. Select the demo company only (unselect the main one) 4. Open Accounting and click the Purchases journal from the dashboard Access Error about reading Marc Demo. Unarchiving him would work around this issue. Why the bug ----------- demo_invoice_deferred and demo_bill_deferred set invoice_user_id to Marc Demo (base.user_demo). Marc Demo belongs to the main company and can't be read from another company when archived. On 19.0 these records only existed in the main company, where Marc Demo is accessible. Commit 9aed0c0135d7b084dee544c6566fad96c62ec1fd migrated the demo to `template`, so now they are created in every company. Still, it only breaks because of commit [3732ca85b03b](https://github.com/odoo/odoo/commit/3732ca85b03b), which added write_date to the avatar widget for cache busting. Before, the widget only needed display_name (read with sudo), so the rule was not checked. The fix ------- Use base.user_admin for demo_invoice_deferred (never archived, stays readable from any company), and False for demo_bill_deferred (a bill has no salesperson). opw-6106870 Forward-Port-Of: odoo/enterprise#113946
This update fixes an issue where signatures added to documents caused a loss of original PDF structure and settings. Now, the system duplicates the original document before applying signatures, ensuring the full document layout, bookmarks, and metadata are preserved. This improves the reliability and usability of signed documents.
Original PR description
Instead of rebuilding the PDF by copying content, metadata, and bookmarks, we now duplicate the original document first and then apply the signature overlays. This ensures the full structure and settings are preserved without loss. task-6083291 Forward-Port-Of: odoo/enterprise#114618
This update fixes an issue where chatter message highlights were appearing unexpectedly on the employee form in the HR Payroll module. The change restricts highlights to only the 'review_state' field, ensuring a cleaner and more focused user experience. This improves usability and reduces visual clutter.
Original PR description
The dropdown_selection_badge widget was triggering chatter message highlights on hover for all its usages (e.g. Dimona). Add an opt-in highlight_chatter attribute so only the review_state field on the employee form triggers this behavior. task-6131035 Forward-Port-Of: odoo/enterprise#114138
This update addresses a technical issue related to Odoo's integration with Peppol, a European network for electronic invoicing. By adding a new field to track the status of Peppol transactions, the system can now accurately determine if invoices were sent through Peppol. This enhancement ensures compatibility with evolving Peppol standards and future support for additional response types.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users). Forward-Port-Of: odoo/odoo#259064 Forward-Port-Of: odoo/odoo#258598
This update corrects an issue where lead conversions sometimes created duplicate company entries in the customer hierarchy, leading to data inconsistencies. The fix ensures that company creation is handled correctly using existing processes, preventing this duplication and maintaining accurate customer records.
Original PR description
**Issue:** When converting a lead with both `contact_name` and `partner_name`, the created contact end up with a duplicate company hierarchy, producing an invalid chain like: Person A < Company < Company **Cause:** `_create_customer()` was creating a company from `partner_name` in addition to the normal `parent_name` flow already handled by `res.partner.create()`, so the same company name was effectively used twice. **Fix:** Remove the extra company creation and let the existing `parent_name` behavior create the company once, then attach the contact to it directly. Task-6105653 Forward-Port-Of: odoo/odoo#259300
This pull request updates the translations for Odoo's SaaS version 19.3. It includes modifications to the core translation files (.weblate.json) and copies translations from the previous version (19.2) for various languages, ensuring accurate and localized user experiences across the accounting module and other affected areas.
Original PR description
Related: https://github.com/odoo/enterprise/pull/111141 Forward-Port-Of: odoo/odoo#257723 Forward-Port-Of: odoo/odoo#254667
This pull request updates the translations for Odoo Enterprise's SaaS version 19.3. It involves updating the core translation files (.weblate.json) and copying translations from the previous version (19.2) to ensure all languages are accurately supported. This ensures consistent and correct user experiences across all supported languages.
Original PR description
Related: https://github.com/odoo/odoo/pull/254667 Forward-Port-Of: odoo/enterprise#113055 Forward-Port-Of: odoo/enterprise#111141
This update fixes a calculation error related to early payment discounts on invoices. Previously, the untaxed amount was incorrectly displayed. The fix ensures accurate calculation by correctly identifying discount amounts as tax-excluded, leading to correct financial reporting.
Original PR description
Steps to produce: --- - Install the `Sales` module. - Go to `Invoicing > Configuration > Payment Terms`. - Open `Immediate Payment` and enable Early Discount. - Set `Reduced Tax` to `Always (upon…
Steps to produce: --- - Install the `Sales` module. - Go to `Invoicing > Configuration > Payment Terms`. - Open `Immediate Payment` and enable Early Discount. - Set `Reduced Tax` to `Always (upon invoice)`. - Go to Invoicing > Configuration > Taxes. - Create a 21% tax with `Tax included`. - Create a product with a sale price of 7.50 and assign the tax. - Create a Sale Order with this product > Set Immediate Payment as payment term. Issue: --- - The untaxed amount is computed as 6.22 instead of 6.20. Root cause: --- - At [1], in `_add_base_lines_for_early_payment_discount`, the base lines generated for early payment discount were missing the `special_mode='total_excluded'`. - Consequently, the tax engine interpreted these amounts as tax-included and attempted to recompute the untaxed base, resulting in an incorrect untaxed amount. Solution: --- - Add `special_mode='total_excluded'` to the base lines created for early payment discount computation. - This ensures the discount amounts are treated as already tax-excluded. [1]https://github.com/odoo/odoo/blob/a2b4f618328f3ce3f654fd2c1ee4410365706a7e/addons/sale/models/sale_order.py#L515-L550 opw-6023472 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260480 Forward-Port-Of: odoo/odoo#255724
This update ensures that VAT numbers in the VIES summary reports generated for Czech companies are formatted correctly, removing the country code. This is necessary to comply with official VIES XML requirements, preventing potential reporting errors and ensuring accurate data exchange with tax authorities.
Original PR description
**Steps to reproduce:** - Install the `l10n_cz_reports` module and switch to a `CZ Company` - Create an invoice for a customer with a VAT number, add a product, and set the Transaction Code (enable…
**Steps to reproduce:** - Install the `l10n_cz_reports` module and switch to a `CZ Company` - Create an invoice for a customer with a VAT number, add a product, and set the Transaction Code (enable it from the optional columns if needed). - Navigate to Reporting > VIES Summary Report. - Observe the value in the `VAT Number` column (includes country code). - From the dropdown, export the report as XML. **Observation:** In the generated XML file, the `c_vat` field contains the VAT number including the country code (e.g., `CZ12345679`) instead of only the numeric part (`12345679`). **Root cause:** At [1], the VAT number is directly taken from the report lines without removing the country code. **Fix:** This commit ensures that the `c_vat` field contains only the VAT number without the country code, complying with the official VIES XML format requirements. Ref: https://adisspr.mfcr.cz/dpr/adis/idpr_pub/epo2_info/popis_struktury_detail.faces?zkratka=DPHSHV#:~:text=Tax%20identification%20number%20of%20the%20purchaser%20(only%20the%20numeric%20part) [1]: https://github.com/odoo/enterprise/blob/c4f2c3442f30f5ac972dd136a3642acc5bcc6da2/l10n_cz_reports_2025/models/l10n_cz_vies_summary_handler.py#L29-L62 opw-6093259 Forward-Port-Of: odoo/enterprise#114990 Forward-Port-Of: odoo/enterprise#113083
This update resolves an error that occurred when users tried to access ticket links after an attendee was removed from an event. The fix prevents a technical error (IndexError) by gracefully handling empty attendee lists, ensuring ticket links always work correctly.
Original PR description
Currently, an error occurs when accessing the ticket link after the related attendee has been deleted. **Steps to Reproduce:** - Install the **Events** module. - Create a new event. - Create an attendee with a valid email ID. - Make sure the email is sent successfully. - Delete the attendee for the event. - From the received email, try to click on the **"View Tickets"** link. **Error:** `IndexError - tuple index out of range` **Cause:** The controller filters registrations using the provided `registration_ids`, but when the attendee is deleted, the resulting recordset becomes empty. It raises an error when trying to access the first element of an empty recordset. **Fix:** This commit handles empty recordsets by returning early when no registrations are found. sentry-7357927405 Forward-Port-Of: odoo/odoo#256310
This update fixes a technical issue where the Timesheet assistant was storing outdated suggestions in local storage, leading to performance slowdowns. The change automatically removes suggestions older than 30 days, optimizing the application and improving user experience.
Original PR description
In the Timesheets assistant, we store the suggested events taken or dismissed by the user to avoid suggesting them again. However, there is no mechanism to remove them from the localstorage, so it currently grows infinitely. With this PR, we now delete events older than 30 days, to avoid filling the localstorage with useless data. Task-6131640 Forward-Port-Of: odoo/enterprise#114562
This update optimizes the Odoo tracker to minimize unnecessary data collection and reduce the strain on system resources. The tracker was recently updated to use JavaScript, leading to increased tracking events. This fix aims to streamline the tracker's operation and improve performance.
Original PR description
The odoo tracker was [recently reworked to use JS](https://github.com/odoo/odoo/pull/247438) and allow website controllers to use readonly replicas. In the process, we increased the number of tracked events significantly. Since we don't intend to replace plausible/analytics - our tracker is used primarily for functional purposes. This PR aims to reduce calls to the tracking endpoint and ultimately reduce the amount of data in it. Part of Task-4939052
This update resolves a technical issue that prevented the system from correctly mounting components within messages, particularly when searching. The fix ensures that components load successfully, improving the overall stability and reliability of the messaging functionality. This change addresses a reported error and enhances the user experience.
Original PR description
Currently, there is a mounting issue when we have search in messages. As reported below,"cannot mount a component on a detached dom node at App.validateTarget". This commit uses the correct lifecycle hook to mount the component and catch mounting errors. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where styling applied to images (like rounded corners or shadows) was incorrectly carried over when the image was replaced with an icon. Now, the icon will always have a clean style, ensuring consistent appearance and preventing unexpected visual effects. This improves the user experience when switching between images and icons.
Original PR description
### Steps to Reproduce: - Go to the To-do app and create a new task. - Upload an image. - Apply shape styling to the image (e.g., rounded, shadow, img-thumbnail). - Replace the image with an icon. ### Description of the issue/feature this PR addresses: - When an image had shape applied (such as rounded, rounded-circle, shadow, or img-thumbnail) and was replaced with an icon, those classes were carried over to the icon. ### Desired behavior after PR is merged: - Since these classes are specific to image shape styling, they are now removed when an image is replaced with an icon. task-6007631 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259611 Forward-Port-Of: odoo/odoo#258060
This update resolves an issue where role mentions within the full composer weren't working correctly, leading to emails being sent to the wrong addresses or failing to send at all. The fix ensures accurate role mentions are displayed and utilized, improving the reliability of email communication within Odoo. This enhances the user experience and prevents potential communication errors.
Original PR description
There is an issue when tagging a role using the full composer: 1. Emails are sent to the wrong address or sometimes no address at all 2. The displayed URL is not correct This commit fixes the issue by correctly rendering the mention block for roles in the full composer, using the correct configuration. task-6139162 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260750 Forward-Port-Of: odoo/odoo#260094
This update resolves an issue where the employee offer salary wasn't correctly displayed when opening the offer form from the employee record. The fix adds a necessary context to ensure the correct salary amount is populated, improving the employee onboarding process. This ensures accurate salary information is presented to users.
Original PR description
task-5979287 Forward-Port-Of: odoo/enterprise#109067
This update enhances the account reports experience on mobile phones and tablets by ensuring the chatter is always visible and the annotation icon is consistently accessible via touch. Previously, the chatter was hidden on smaller screens, making it difficult to use. This change improves usability and allows users to easily engage with reports on any device.
Original PR description
Previously, the chatter was hidden on device too smalls and the annotation icon was only visible with hover so not visible on touch devices such as phones or tablets. Now, we have the chatter at the bottom when the device is too small and always display the annotation icon on touch devices. task-5106852 Forward-Port-Of: odoo/enterprise#114700 Forward-Port-Of: odoo/enterprise#95737
This update corrects a recent change that removed the currency field from account batch payments. This ensures that monetary amounts are correctly associated with their respective currencies, preventing potential errors in financial reporting and reconciliation. The fix ensures data accuracy for financial transactions.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/301f63597b0c21fef16a1941314ac95602c8f01f removed some currency id field from the account bank statement and so the monetary field didn't have the currency anymore task-6131298 Forward-Port-Of: odoo/enterprise#115017 Forward-Port-Of: odoo/enterprise#114369
This update fixes an issue where Mercado Pago webhooks with invoice references containing slashes (like INV/2026/00001) were not being correctly processed, resulting in 404 errors. The change allows the webhook to handle these references, ensuring accurate processing of Mercado Pago payments. This improves the reliability of payment processing.
Original PR description
Currently, the mercado_pago_webhook http route only takes into consideration 1 url segment. This means that invoices with references like INV/2026/00001 don't match any defined route and the server returns a 404. /payment/mercado_pago/webhook/S00001 => OK /payment/mercado_pago/webhook/INV/2026/00001 => KO This commit allows references with slashes to be matched by the route by capturing the entire remaining url path including the slashes. /payment/mercado_pago/webhook/S00001 => OK /payment/mercado_pago/webhook/INV/2026/00001 => OK opw-6035161 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259933 Forward-Port-Of: odoo/odoo#259378
This update ensures that Brazilian tax documents (EDI) accurately reflect tax amounts as required by Brazilian law. Previously, these approximate tax values were missing, and this fix incorporates them from Avalara's calculations, ensuring compliance and accurate reporting.
Original PR description
All fiscal documents are required by Brazil law to include the approximate value of fed, state, and city taxes that affect it. Avalara already provides back these values in their tax calculation response, we just missed sending it to the EDI. This commit takes the information from that response and adds it to the EDI payload to make sure that it is generated properly into the generated documents. We are required to always show this even if there are no informative taxes as such we combine it with the T&C sent already. task-5478059 Forward-Port-Of: odoo/enterprise#113732
This update ensures service order line display names accurately show the price unit when requested, regardless of a previous display setting. Previously, the display was inconsistent, and this fix corrects that behavior by verifying the 'with_price_unit' context flag. This improves the clarity and accuracy of service order information for users.
Original PR description
Before this commit, when `formatted_display_name` is true in the context, the display name of `sale.order.line` records will always show the partner and the price unit if it contains a service product. The problem is `with_price_unit` is no longer checked in the context to really know if we want to display or not the price unit in the formatted display name. This commit checks `with_price_unit` in the context to display the price unit in the formatted display name if it is truly in the context. Forward-Port-Of: odoo/odoo#259080
This update fixes an issue where invoices incorrectly showed as 'Paid' after a check was voided. The change ensures that the invoice payment state reverts to 'not_paid' when a check is voided, preventing inaccurate payment tracking. This ensures financial reporting accuracy.
Original PR description
Steps to reproduce: 1- Install l10n_ar and l10n_latam_check modules 2- Switch company to (AR) Responsable Inscripto 3- Go to [Accounting -> Configuration -> Journals -> Bank] and make sure 'outstanding payments account' is set in outgoing payments for own checks and manual payment 4- Go to [Accounting -> Vendors -> Bills] and create a new bill 5- Create an own check payment for the full amount 6- Go to the check and void it Description of issue: When you view the invoice after voiding the check, it's payment state will be shown as 'Paid' Expected behavior: Invoice payment state should go back to 'not_paid' Why this happens: When the check is voided, it's `amount_residual` attribute becomes 0. This causes `pay.is_matched` to be True, and as a result `all_payments_matched` attribute is also True. This turns the invoice payment state to paid. opw-6016394 Forward-Port-Of: odoo/odoo#260872 Forward-Port-Of: odoo/odoo#256118
This update resolves an issue where the minimum IS (Insurance Savings) amount was incorrectly calculated in the Swiss payroll module. The change ensures accurate reporting of IS contributions, aligning with Swiss tax regulations. This correction improves the reliability of payroll data for Swiss businesses using Odoo Enterprise.
Original PR description
Forward-Port-Of: odoo/enterprise#114463
This update fixes a confusing error message that appeared when employees changed their contracts and working schedules, particularly when leaves were involved. The fix now includes the original error traceback, providing developers with more information to quickly diagnose and resolve the issue. This improves the overall stability and usability of the HR module.
Original PR description
A validation error is raised if changing employee's contract with a new working schedule on a period with leaves and the new working schedule changes the duration of these leaves in such a way that the employee no longer has the required allocation for them. This adds to the error message the original error traceback for debuggig purposes. Task: 6105516 Forward-Port-Of: odoo/odoo#258280
This update fixes an issue where the system incorrectly calculated available stock when creating procurements through the MTSO method. Specifically, it ensures that stock availability is accurately considered across multiple levels of a product's bill of materials, preventing overestimation of required quantities. This improves the accuracy of purchase order generation and reduces potential stock discrepancies.
Original PR description
When creating a procurement through mtso, if the product has a muti level bom with the same component at multiple levels, it will consider the available quantity multiple times. Steps to reproduce:…
When creating a procurement through mtso, if the product has a muti level bom with the same component at multiple levels, it will consider the available quantity multiple times. Steps to reproduce: ------------------- * Enable MTO and change supply method to: "Take From Stock, if unavailable, Trigger Another Rule" * Create three products : final, semi, component - final: mtso, manufacture - semi: mtso, manufacture - component: mtso, buy, on hand quantity to 4 * Create a bom for final: - 10 components - 1 semi * Create a bom for semi: - 10 components * Create and confirm a MO for 1 "final" -> Issue the purchase order is only for 12 components and not 16. Observation: ------------- When confirming our MO, it will create a manufacture procurement for the products. The procurement will recursively create procurements and stock moves for each of its components. https://github.com/odoo/odoo/blob/b0b8a102153eaa9231321524ec5140cc6d754502/addons/stock/models/stock_move.py#L1563-L1571 Since its a MTSO, it will first check the products if there is available products in stock (free_qty) and create the procurement for the missing quantity: https://github.com/odoo/odoo/blob/b0b8a102153eaa9231321524ec5140cc6d754502/addons/stock/models/stock_move.py#L1646-L1647 https://github.com/odoo/odoo/blob/b0b8a102153eaa9231321524ec5140cc6d754502/addons/stock/models/stock_move.py#L1657-L1663 And each procurement, if it is of the manufacture type, will create corresponding procurements for their components. Once all the procurements and stock moves have been created, the stock move will confirmed and assigned. https://github.com/odoo/odoo/blob/942cbbbf243ff28f84fdaa40ed73b6572e0032a6/addons/stock/models/stock_move.py#L1627-L1629 -> The issue arise because the free_qty will only be updated when the stock moves are assigned which happen after all the procurement quantity are calculated for all the levels. opw-5514788 Forward-Port-Of: odoo/odoo#253958
This update fixes a minor issue in the website editor where the round corners option would disappear when a border wasn't present. The change ensures the round corners option remains visible regardless of border settings, improving the user experience when customizing website blocks. This simplifies the process for users to apply rounded corners.
Original PR description
Steps to reproduce: - Open the website editor. - Select a block with the border configurator and round corners enabled. - Set the border width to 0 px. => The Round Corners option is hidden. Before this commit, the change introduced by [1] hid the option when no border was set. This restriction was not needed because a block can use a border radius without a visible border. After this commit, the option remains visible when round corners are supported, even without a border. [1]: 97e8cc8d664e66ba62e8282a67f069805682ae41 task-6089515 Forward-Port-Of: odoo/odoo#260633
This update corrects a technical issue that was preventing users from accessing the Mobile Menu (QR ordering) or Self-Ordering interface in Odoo Enterprise. The fix involved updating a field name within the POS data loading process, ensuring these key ordering features are now functioning correctly.
Original PR description
## Overview Accessing the Mobile Menu (QR ordering) or Self-Ordering interface crashes after installing `pos_blackbox_be` on SaaS-19.1. The interface fails to load due to a missing field in the POS…
## Overview Accessing the Mobile Menu (QR ordering) or Self-Ordering interface crashes after installing `pos_blackbox_be` on SaaS-19.1. The interface fails to load due to a missing field in the POS data loading flow. ## Steps to Reproduce 1. Install `pos_blackbox_be` 2. Open POS 3. Access the Mobile Menu (QR code) or Self-Ordering page ## Current Behavior - A traceback is raised - The interface does not load ## Root Cause The method `_load_pos_self_data_fields` returns the field: iface_fiscal_data_module However, from SaaS-19.1 this field was renamed to: iot_fdm_be_id This mismatch causes the POS self-ordering data loading to fail. ## Fix Updated the returned field to match the new field name. # Before return fields + ['iface_fiscal_data_module'] # After return fields + ['iot_fdm_be_id'] ## Impact - Restores proper loading of Mobile Menu (QR ordering) - Fixes Self-Ordering interface crash opw-6044883 ## Reproduction Video https://drive.google.com/file/d/1R5TYVIXvtts12YLF5iB4GKZirMZePoGr/view?usp=sharing Forward-Port-Of: odoo/enterprise#114357
This update resolves a visual bug in the Discuss feature where the 'offline' status indicator on avatars was incorrectly positioned in Safari. The fix adjusts how opacity is applied, ensuring the status icon displays correctly. This improves the user experience for all users on Safari.
Original PR description
IM status on avatars in Discuss have been improved to properly mask the image [1]. To do so, this uses SVG and ForeignObject on top of mask, so that it can uses font-awesome icons such as `fa…
IM status on avatars in Discuss have been improved to properly mask the image [1]. To do so, this uses SVG and ForeignObject on top of mask, so that it can uses font-awesome icons such as `fa fa-circle` for online status. This change introduced an accidental regression in Safari, where position of the offline status is wrong. This comes from a bug in Safari where some CSS inside foreignObject resets the position of the element to position 0, 0 on the global SVG [2] [3]. This affects offline status because this IM status has an `opacity-75`, intended to reduce distraction from the offline, but since this changes opacity this introduce the bug in Safari of mis-position. This commit fixes the issue by moving the applied CSS to change opacity from `opacity-X` rules inside foreignObject to the parent `g` tag above `foreignObject`. That way, the element inside `foreignObject` has no change of opacity but instead the `g` has it, which is ok for Safari. Note that this implementation assumes that change of opacity inside `foreignObject` is made only once and with `opacity-X` classnames. [1]: https://github.com/odoo/odoo/pull/246182 [2]: https://github.com/bkrem/react-d3-tree/issues/284 [3]: https://bugs.webkit.org/show_bug.cgi?id=23113 Task-6143646 Before / After <img width="308" height="579" alt="Screenshot 2026-04-21 at 12 51 52" src="https://github.com/user-attachments/assets/41596916-f371-407e-acb1-eb097c497360" /> <img width="310" height="584" alt="Screenshot 2026-04-21 at 12 51 20" src="https://github.com/user-attachments/assets/513df1f5-4cde-4cb7-8769-d6264dfb36a0" /> Forward-Port-Of: odoo/odoo#260341
This update resolves an issue where accounting administrators without Point of Sale access would encounter an error when viewing invoices linked to POS orders. The fix removes unnecessary access restrictions within the Odoo system, allowing authorized users to correctly access and manage invoices.
Original PR description
An accounting administrator without Point of Sale access would get an AccessError when opening a customer invoice linked to a POS order. The `edi_show_cancel_button` computed field calls `_get_move_applicability()`, which in turn calls `_move_has_settle_or_deposit_pos_order()`. That method was reading `invoice.pos_order_ids.lines` without `sudo()`, causing the ORM to enforce access rights on `pos.order` for the current user. Users who only have accounting rights (no "Point of Sale/User" or "Inventory/User" group) would therefore get an AccessError. opw-6044860 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258772 Forward-Port-Of: odoo/odoo#254905
This update corrects a misleading issue in the Z report generated with date ranges. Previously, the report header incorrectly displayed information from a single session even when multiple sessions with completed orders were included. Now, the report header accurately reflects the sessions contributing to the report data, ensuring a more precise and reliable report.
Original PR description
Before this commit: - When generating a Z report via date range (config_ids, no session_ids), the header's session name was derived from the closed-session if there was exactly one, which excludes open sessions (stop_at IS NULL). - If an open session had completed orders (state='done') within the date range, those orders were included in the report body while the session itself was absent from the sessions list. - This caused the header to display the closed session's name and title the report as a single-session Z report, even though it contained data from multiple sessions. opw-6123054 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259900
This update fixes an issue where combo products weren't calculating prices correctly when multiple items were purchased. Specifically, the system was misinterpreting quantities, leading to inaccurate pricing for items within the combo. This ensures accurate pricing and prevents overcharging for multiple items.
Original PR description
When buying more than one unit of a combo product, the free-item quota (qty_free) was not scaled by the parent quantity, causing child lines with qty > 1 to be partially mis-classified as extra. This meant the same line was processed by both the free and extra loops, with the extra loop overwriting the correct price. Additionally, the proportional price_unit for free child lines used the unscaled original_total (which already includes the parent qty factor) against a per-unit parent_lst_price, resulting in a price that was too low by exactly the parent qty factor. opw-6045562 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261222 Forward-Port-Of: odoo/odoo#258753
This update resolves an issue where deleting a project stage caused unexpected view navigation and the display of archived tasks. The fix ensures the original view remains active, the stage is properly deleted, and the user's intended task list is presented without disruption. This improves the user experience when managing project stages.
Original PR description
# Steps to reproduce 1. Create a project 2. Create a stage 4. Remove the stage # Current behavior Instead of remaining in the project tasks view, it switches to the tasks view filtered with the current project. Additionally, it displays archived tasks because no filter is selected, thereby discarding original ones. This also applies to stage deletion in other views (e.g., My Tasks), where the search filters are completely discarded. # Expected behavior The dialog should be closed, the stage should be deleted, and the original view should remain active. This is done through a soft-reload of the page, ensuring the original view is kept, together with original breadcrumbs, and the stage is visually disappearing. task-5498274 Forward-Port-Of: odoo/odoo#260213 Forward-Port-Of: odoo/odoo#246935
This update ensures that the default website correctly reflects the latest sequence order, even in incognito browsing sessions. Previously, changes to website sequence didn't update the default website selection. This fix resolves an issue where the lowest sequence website wasn't consistently being served as the default.
Original PR description
**Problem:** Changing the order of websites does not update which website is shown as the default when visiting from an incognito window (no domain match). **Steps to reproduce:** 1. Create two…
**Problem:** Changing the order of websites does not update which website is shown as the default when visiting from an incognito window (no domain match). **Steps to reproduce:** 1. Create two websites with no domain set 2. Change their sequence order via the handle widget in the backend 3. Open an incognito window 4. The default website shown is still the old one **Current behavior:** The default website does not change after reordering. **Expected behavior:** The website with the lowest sequence should be served as the default. **Cause of the issue:** Commit d6f4af2790a0 replaced `models.Model` with `models.CachedModel` and removed the blanket `self.env.registry.clear_cache()` from the top of `write()`. CachedModel only auto-clears caches for fields listed in `_cached_data_fields`, but `sequence` is not in that list. As a result, `_get_current_website_id` (decorated with `@tools.ormcache`) keeps returning the stale cached website ID after a sequence change. https://github.com/odoo/odoo/commit/d6f4af2790a0abacba6e616b00d999eddc30edc9#diff-5e92e473fa4d3da6db7ef727fb217dad51ef6c2383913edca73fe040a23e82c2L339-L341 **Fix:** Restoring `clear_cache()` scoped to the existing sequence/company_id check ensures the ormcache is invalidated only when relevant fields change, rather than on every write as before. opw-6102426 Forward-Port-Of: odoo/odoo#257913
This update resolves an issue where loading sale orders from the point-of-sale (POS) system would fail if the order contained archived products. Now, sale orders can successfully include products that have been archived, improving the flexibility and usability of the POS system. This change was made to address a reported bug (opw-6116760) and ensures a smoother user experience.
Original PR description
Before this commit, loading a sale order from pos would raise an error if the order contained a product that had been archived. opw-6116760 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260638
This update resolves a technical issue that was limiting the efficiency of WhatsApp marketing automation. Previously, the system wasn't processing all relevant messages at once, leading to slower performance. This change ensures that all necessary steps are executed, resulting in faster and more reliable automation for WhatsApp marketing campaigns.
Original PR description
Forward-Port-Of: odoo/enterprise#114570
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation, particularly when dealing with batch transfers and wave operations, improving data reliability.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#114998
Forward-Port-Of: odoo/enterprise#110241This update corrects a bug where sales orders were incorrectly linked to manufacturing orders, and vice versa, even when the orders were unrelated. The fix ensures that manufacturing orders only link to sales orders, and purchase orders only link to the sales order they originate from, improving data accuracy and streamlining workflows.
Original PR description
**Steps to reproduce:** * Install modules: *mrp*, *purchase*, *sale_management*. * Go to *Settings* and enable: * *Multi-Step Routes* * *Replenish on Order (MTO)* * *Dropshipping* * Create a…
**Steps to reproduce:**
* Install modules: *mrp*, *purchase*, *sale_management*.
* Go to *Settings* and enable:
* *Multi-Step Routes*
* *Replenish on Order (MTO)*
* *Dropshipping*
* Create a *Dropship* product:
* Set route to *Dropship*.
* Add a vendor under the *Purchase* tab.
* Create an *MTO* product:
* Set route to *Replenish on Order (MTO)*.
* Configure a *Bill of Materials (BoM)*.
* Create a *Sales Order*:
* Add both products.
* Confirm the order.
* Open the Sales Order:
* Observe smart buttons for *Delivery*, *Purchase*, and *Manufacturing*.
* Open the linked *Purchase Order* and *Manufacturing Order*.
**Observed behavior:**
* The *Purchase Order* shows a smart button linking to a *Manufacturing Order*.
* The *Manufacturing Order* shows a smart button linking to a *Purchase Order*, even when unrelated.
**Expected behavior:**
* The *Purchase Order* should only show a smart button linking to the *Sales Order*.
* The *Manufacturing Order* should only show a smart button linking to the *Sales Order*.
* No cross-link between unrelated PO and MO should be displayed.
**Cause:**
* The SO pushes the `stock.reference` into procurement values: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/sale_stock/models/sale_order_line.py#L289
* The same reference is propagated to:
* Purchase Orders: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/purchase_stock/models/stock_rule.py#L355
* Manufacturing Orders: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/mrp/models/stock_rule.py#L184
* Opening the *Purchase Order* form triggers `_compute_mrp_production_count`.
* This compute calls `_get_mrp_productions()`: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/purchase_mrp/models/purchase.py#L21
* That method returns `self.reference_ids.production_ids`.
* Since the MO shares the same sale reference, the PO incorrectly fetches that MO and shows the *Manufacturing* smart button.
* Similarly, opening the *Manufacturing Order* form triggers `_compute_purchase_order_count`.
* This compute calls `_get_purchase_orders()`, which returns `self.reference_ids.purchase_ids`.
* Since the dropship PO shares the same sale reference, the MO incorrectly fetches that PO and shows the *Purchase* smart button.
**Fix:**
* Stop relying on shared `reference_ids` to compute links.
* Instead, follow the actual stock and procurement chain:
* For *MO → PO*:
* Use raw material moves to find related purchase lines: `self.move_raw_ids.created_purchase_line_ids.order_id | self.move_raw_ids.purchase_line_id.order_id`
* For *PO → MO*:
* Use stock move destinations to identify consuming productions.
* This ensures:
* MOs link only to POs supplying their raw materials.
* POs link only to MOs they actually replenish.
* Unrelated documents sharing the same sale reference remain isolated.
---
opw-6008943
---
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#254292This update resolves an issue where deferred invoice moves weren't consistently linked to the correct customer partner. The change ensures that the partner ID is taken directly from the original invoice line, improving data accuracy and preventing discrepancies in financial reporting. This enhances the reliability of deferred accounting processes.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#115026 Forward-Port-Of: odoo/enterprise#114439
This update resolves a crash in the website's video embedding feature that occurred when a video source (URL) was missing. The change simplifies the video placeholder to prevent errors during loading and ensures the feature functions reliably regardless of whether a video URL is provided. This improves the overall stability and user experience for video content on our website.
Original PR description
Commit[^1] reworked the `s_video` snippet placeholder into a plain SVG, dropping the inner `<iframe>` and the `data-oe-expression` attribute that carried the video URL. The `.media_iframe_video` class was kept, so the `MediaVideo` interaction still binds to the placeholder and calls `generateVideoIframe`, which then reads `dataset.oeExpression || dataset.src` (undefined) and crashes on `.match()`. The same crash hits the `DOMContentLoaded` fallback on the frontend for any saved page that ends up with a `src-less` placeholder. To prevent the issue, we exit the interaction early if no `src` is saved and leave the existing children in place. Nothing changes if the video has a valid URL already. [^1]: https://github.com/odoo/odoo/commit/db91ddd861b13694fe0e0b8d9cce23e02f487a6a task-6158263 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261184
This update resolves an issue where creating a filter with invalid data in Odoo views would cause the application to crash. While the fix prevents the crash, it also means the filter isn't active. This change improves stability and prevents disruptions to user workflows when creating filters.
Original PR description
On some view, create and edit a filter, but put something unparseable by JS in the `context` field eg: `{123}`.
Go back to the view.
Before this commit there was a crash, because the python parser in JS crashed.
After this commit, there is no crash, the filter is visible but not activable.
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#260999
Forward-Port-Of: odoo/odoo#260612This update fixes an issue where upgrade scripts within Odoo modules weren't properly organized, leading to potential logging and warning problems. Now, these scripts are correctly associated with the core upgrade package, ensuring cleaner operation and more reliable script execution. This improves the stability and predictability of Odoo updates.
Original PR description
The resulting modules should be bound to the `odoo.upgrade` package. Side effects: - the loggers created inside the upgrade scripts are now in the `odoo.upgrade` namespace. - warnings raised by bad usages in upgrade scripts are now correctly filtered. Forward-Port-Of: odoo/odoo#261050 Forward-Port-Of: odoo/odoo#258025
This update corrects a critical issue where the DIAN web service was incorrectly overwriting customer contact information (names and emails) with fiscal data, leading to data loss and incorrect invoice delivery. The fix now intelligently handles email differences, creating a separate invoicing contact if needed and giving users control over their existing data.
Original PR description
The DIAN web service was overwriting partner names and emails with fiscal data, causing data loss for CRM contacts. The fiscal email often differs from the commercial one, and the overwrite broke the sales flow by sending invoices to the wrong address. Users had no standard workaround short of manually re-entering emails after every invoice generation. Instead of blindly overwriting, only update empty fields and create a child invoicing contact when the DIAN email differs from the existing one. Also remove the automatic onchange and periodic re-fetch triggers to leave existing data under user control. task-5912005 Forward-Port-Of: odoo/enterprise#115018 Forward-Port-Of: odoo/enterprise#114017
27 changes
Resolved issues and error corrections
This update resolves a crash in the POS order details dialog that occurred when the database language was not English. The fix ensures the system correctly compares field labels to their translated versions, preventing errors and improving usability for users in different languages. This enhances the overall user experience for international Odoo users.
Original PR description
**Before this commit** When attempting to open up the "Details" of a POS order, when the database is not in English, we would crash here because there wouldn't be any fields that match the string "Served By" exactly. For example, in Spanish, this field is labeled "Atendido por". **After this commit** Compare the field labels to the database's language-translated string, "Served By". opw-6145087
This update ensures that product prices in the Point of Sale (POS) system accurately reflect currency conversions when using pricelists with different currencies. Previously, discounts and surcharges were incorrectly applied without considering the currency difference. This fix corrects a calculation error, ensuring accurate pricing for international POS operations.
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#260195 Forward-Port-Of: odoo/odoo#255357
This update fixes a missing field in the contact form for Czech companies (l10n_cz). The 'City' field was absent, which is a required data point for Czech tax reporting. This change ensures accurate data collection and compliance with local regulations.
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
This update significantly reduces the time it takes to load timesheets, particularly in systems with many projects. The change optimizes the search process to avoid unnecessary database queries, resulting in a faster and more responsive user experience. This improves efficiency for users managing their timesheets.
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
This update ensures service order line display names accurately show the price unit when requested, regardless of context. Previously, the display name was incorrectly formatted, leading to inconsistent information. This fix corrects a bug related to how the price unit is displayed for service products.
Original PR description
Before this commit, when `formatted_display_name` is true in the context, the display name of `sale.order.line` records will always show the partner and the price unit if it contains a service product. The problem is `with_price_unit` is no longer checked in the context to really know if we want to display or not the price unit in the formatted display name. This commit checks `with_price_unit` in the context to display the price unit in the formatted display name if it is truly in the context. Forward-Port-Of: odoo/odoo#259080
This update resolves an issue where the minimum IS (Insurance Savings) amount was incorrectly calculated in the Swiss payroll module. The fix ensures accurate IS calculations, aligning with Swiss tax regulations and improving payroll accuracy for Swiss businesses using Odoo Enterprise. This update impacts the l10n_ch_hr_payroll module.
Original PR description
Forward-Port-Of: odoo/enterprise#114463
This update resolves a crash issue affecting the Self-Ordering and Mobile Menu (QR ordering) interfaces in Odoo Enterprise SaaS-19.2. The problem stemmed from an outdated field name within the POS data loading process, which has now been corrected to ensure these key features function correctly.
Original PR description
## Overview Accessing the Mobile Menu (QR ordering) or Self-Ordering interface crashes after installing `pos_blackbox_be` on SaaS-19.1. The interface fails to load due to a missing field in the POS…
## Overview Accessing the Mobile Menu (QR ordering) or Self-Ordering interface crashes after installing `pos_blackbox_be` on SaaS-19.1. The interface fails to load due to a missing field in the POS data loading flow. ## Steps to Reproduce 1. Install `pos_blackbox_be` 2. Open POS 3. Access the Mobile Menu (QR code) or Self-Ordering page ## Current Behavior - A traceback is raised - The interface does not load ## Root Cause The method `_load_pos_self_data_fields` returns the field: iface_fiscal_data_module However, from SaaS-19.1 this field was renamed to: iot_fdm_be_id This mismatch causes the POS self-ordering data loading to fail. ## Fix Updated the returned field to match the new field name. # Before return fields + ['iface_fiscal_data_module'] # After return fields + ['iot_fdm_be_id'] ## Impact - Restores proper loading of Mobile Menu (QR ordering) - Fixes Self-Ordering interface crash opw-6044883 ## Reproduction Video https://drive.google.com/file/d/1R5TYVIXvtts12YLF5iB4GKZirMZePoGr/view?usp=sharing Forward-Port-Of: odoo/enterprise#114357
This update fixes a test failure caused by a delay in processing the final click on a discard button during an Odoo tour. The fix ensures all tour popups are fully closed before the tour concludes, preventing data inconsistencies and improving test reliability. This resolves a potential issue that could impact the stability of the MRP Workorder module.
Original PR description
**Issue** Currently, there is an async issue with the test `test_shop_floor_disable_serial_create`that may fail with the following error: "Tour finished with a dirty form view being open. Dirty form views are automatically saved when the page is closed, which leads to stray network requests and inconsistencies." **Cause** Although the tour explicitly closes all popups, the last click on the discard button may not be processed before the tour ends: https://github.com/odoo/enterprise/blob/859e65e8c267701bb19dbff9d24a8c80774dbaa6/mrp_workorder/static/tests/tours/tour_shopfloor.js#L332-L333 runbot-242504 Forward-Port-Of: odoo/enterprise#114367
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 price list datasets much faster and avoids timeouts. This results in quicker calculations and a smoother user experience.
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#259310This update corrects a misleading issue in the Z report generated from date ranges. Previously, the report header incorrectly displayed information from a single session even when multiple sessions with completed orders were included. This change ensures the report header accurately reflects the sessions contributing to the report data, providing a more reliable view of sales performance.
Original PR description
Before this commit: - When generating a Z report via date range (config_ids, no session_ids), the header's session name was derived from the closed-session if there was exactly one, which excludes open sessions (stop_at IS NULL). - If an open session had completed orders (state='done') within the date range, those orders were included in the report body while the session itself was absent from the sessions list. - This caused the header to display the closed session's name and title the report as a single-session Z report, even though it contained data from multiple sessions. opw-6123054 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259900
This update fixes an issue where combo product pricing was incorrectly calculated when customers purchased more than one unit. The previous system misapplied discounts and prices, leading to inaccurate totals. This change ensures accurate pricing and calculations for combo products, regardless of quantity purchased.
Original PR description
When buying more than one unit of a combo product, the free-item quota (qty_free) was not scaled by the parent quantity, causing child lines with qty > 1 to be partially mis-classified as extra. This meant the same line was processed by both the free and extra loops, with the extra loop overwriting the correct price. Additionally, the proportional price_unit for free child lines used the unscaled original_total (which already includes the parent qty factor) against a per-unit parent_lst_price, resulting in a price that was too low by exactly the parent qty factor. opw-6045562 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261222 Forward-Port-Of: odoo/odoo#258753
This update fixes an issue where employees weren't automatically added to channels when their department was set to 'Administration'. Now, the system correctly subscribes users to the channel once the department update is saved, ensuring consistent channel membership based on employee roles.
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#261268 Forward-Port-Of: odoo/odoo#241617
This update resolves an issue where deleting a project stage incorrectly navigated users to a different view and displayed archived tasks. The fix ensures the original view remains active, the stage is properly deleted, and the user's intended task list is displayed without unexpected filters.
Original PR description
# Steps to reproduce 1. Create a project 2. Create a stage 4. Remove the stage # Current behavior Instead of remaining in the project tasks view, it switches to the tasks view filtered with the current project. Additionally, it displays archived tasks because no filter is selected, thereby discarding original ones. This also applies to stage deletion in other views (e.g., My Tasks), where the search filters are completely discarded. # Expected behavior The dialog should be closed, the stage should be deleted, and the original view should remain active. This is done through a soft-reload of the page, ensuring the original view is kept, together with original breadcrumbs, and the stage is visually disappearing. task-5498274 Forward-Port-Of: odoo/odoo#260213 Forward-Port-Of: odoo/odoo#246935
This update resolves an issue where product category images weren't showing on website B when configured with a different domain. The fix ensures category images use absolute URLs, bypassing domain-based access restrictions and ensuring consistent display across all websites.
Original PR description
Scenario: - set two website A and B with different domain - create an eCommerce category Y - create and publish a product with category Y, website B - drop category list widget in a page in website B - set in /odoo/system-parameters web.base.url to domain of website A - open the page in website B while being logged out of website A Result: the category Y image is dead. Cause: category images are using domain of "web.base.url", so if that corresponds to a website where the category is not shown (because of the access rule "Hide empty eCommerce categories to public/portal users") then the image will not be shown (unless we are a logged in internal user on the domain of "web.base.url"). Fix: use absolute URL without domain for category image, the same way it is done for other dynamic snippets (eg. Products). opw-6118004 Forward-Port-Of: odoo/odoo#260124
This update ensures that the default website correctly updates when the sequence order is changed, particularly in incognito browsing sessions. Previously, changes to website sequence didn't reliably update the default website selection. This fix corrects a caching issue to guarantee the lowest sequence website is always served as the default.
Original PR description
**Problem:** Changing the order of websites does not update which website is shown as the default when visiting from an incognito window (no domain match). **Steps to reproduce:** 1. Create two…
**Problem:** Changing the order of websites does not update which website is shown as the default when visiting from an incognito window (no domain match). **Steps to reproduce:** 1. Create two websites with no domain set 2. Change their sequence order via the handle widget in the backend 3. Open an incognito window 4. The default website shown is still the old one **Current behavior:** The default website does not change after reordering. **Expected behavior:** The website with the lowest sequence should be served as the default. **Cause of the issue:** Commit d6f4af2790a0 replaced `models.Model` with `models.CachedModel` and removed the blanket `self.env.registry.clear_cache()` from the top of `write()`. CachedModel only auto-clears caches for fields listed in `_cached_data_fields`, but `sequence` is not in that list. As a result, `_get_current_website_id` (decorated with `@tools.ormcache`) keeps returning the stale cached website ID after a sequence change. https://github.com/odoo/odoo/commit/d6f4af2790a0abacba6e616b00d999eddc30edc9#diff-5e92e473fa4d3da6db7ef727fb217dad51ef6c2383913edca73fe040a23e82c2L339-L341 **Fix:** Restoring `clear_cache()` scoped to the existing sequence/company_id check ensures the ormcache is invalidated only when relevant fields change, rather than on every write as before. opw-6102426 Forward-Port-Of: odoo/odoo#257913
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 the Kanban view functions correctly without crashes.
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 creating a filter with invalid data in the system would cause a crash. Now, the system gracefully handles these errors, preventing the application from stopping. While the filter isn't active, the system no longer crashes, improving stability.
Original PR description
On some view, create and edit a filter, but put something unparseable by JS in the `context` field eg: `{123}`.
Go back to the view.
Before this commit there was a crash, because the python parser in JS crashed.
After this commit, there is no crash, the filter is visible but not activable.
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#260999
Forward-Port-Of: odoo/odoo#260612This update resolves an issue where the website's video placeholder would crash when a video URL wasn't provided. The code has been updated to gracefully handle missing URLs, preventing errors and ensuring video placeholders function correctly across all saved website pages. This improves the user experience and prevents website disruptions.
Original PR description
Commit[^1] reworked the `s_video` snippet placeholder into a plain SVG, dropping the inner `<iframe>` and the `data-oe-expression` attribute that carried the video URL. The `.media_iframe_video` class was kept, so the `MediaVideo` interaction still binds to the placeholder and calls `generateVideoIframe`, which then reads `dataset.oeExpression || dataset.src` (undefined) and crashes on `.match()`. The same crash hits the `DOMContentLoaded` fallback on the frontend for any saved page that ends up with a `src-less` placeholder. To prevent the issue, we exit the interaction early if no `src` is saved and leave the existing children in place. Nothing changes if the video has a valid URL already. [^1]: https://github.com/odoo/odoo/commit/db91ddd861b13694fe0e0b8d9cce23e02f487a6a task-6158263 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261184
This update resolves a technical issue that was limiting the efficiency of WhatsApp marketing automation. Previously, the system wasn't processing all relevant messages at once, leading to slower performance. This fix ensures that WhatsApp automation runs more effectively, improving the speed and reliability of marketing campaigns.
Original PR description
Forward-Port-Of: odoo/enterprise#114570
This update resolves an issue where opening a restaurant order with an active Fiskaly transaction on a second device would cause duplicate transaction attempts and errors. The fix ensures that transaction state information is properly persisted, preventing these errors and improving the reliability of the POS system when syncing with Fiskaly.
Original PR description
In a restaurant POS, when an order with an active Fiskaly transaction is opened on a second device, `transactionState` and `tx_revision` were not available (uiState is not persisted to the server), causing the new device to attempt creating a duplicate transaction with a stale revision, which resulted in a Fiskaly API error. opw-6147654 Forward-Port-Of: odoo/enterprise#115170 Forward-Port-Of: odoo/enterprise#114599
This update fixes an issue where deferred invoice moves weren't consistently linked to the correct customer partner. The change ensures that the `partner_id` is taken directly from the original invoice line, maintaining data accuracy and preventing discrepancies in financial reporting. This improves the reliability of deferred accounting processes.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#115026 Forward-Port-Of: odoo/enterprise#114439
This update ensures the AI chat window opens in full-screen mode when initiated from the system tray or command palette. Previously, the chat opened in the background, creating a less efficient user experience. This change improves usability and allows users to fully utilize the AI chat functionality.
Original PR description
Prior to this commit, when opening the chat with an agent from the systray button, the chat window was opened in the background. This commit fixes the issue by adding a call to `channel.open` which opens the chat when in full-screen mode. This commit also fixes an issue where the chat window wasn't properly opened when done from the command palette. task-5172978 Forward-Port-Of: odoo/enterprise#114840 Forward-Port-Of: odoo/enterprise#114598
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity calculations during internal transfer processes, preventing discrepancies in inventory reporting. This improves the reliability of stock management operations.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#114998
Forward-Port-Of: odoo/enterprise#110241This update corrects a bug where Purchase Orders and Manufacturing Orders were incorrectly linked to each other, even when unrelated to a Sales Order. The fix ensures that POs only link to Sales Orders, and MOs only link to Sales Orders, preventing confusion and streamlining the procurement process. This improves data accuracy and simplifies workflows.
Original PR description
**Steps to reproduce:** * Install modules: *mrp*, *purchase*, *sale_management*. * Go to *Settings* and enable: * *Multi-Step Routes* * *Replenish on Order (MTO)* * *Dropshipping* * Create a…
**Steps to reproduce:**
* Install modules: *mrp*, *purchase*, *sale_management*.
* Go to *Settings* and enable:
* *Multi-Step Routes*
* *Replenish on Order (MTO)*
* *Dropshipping*
* Create a *Dropship* product:
* Set route to *Dropship*.
* Add a vendor under the *Purchase* tab.
* Create an *MTO* product:
* Set route to *Replenish on Order (MTO)*.
* Configure a *Bill of Materials (BoM)*.
* Create a *Sales Order*:
* Add both products.
* Confirm the order.
* Open the Sales Order:
* Observe smart buttons for *Delivery*, *Purchase*, and *Manufacturing*.
* Open the linked *Purchase Order* and *Manufacturing Order*.
**Observed behavior:**
* The *Purchase Order* shows a smart button linking to a *Manufacturing Order*.
* The *Manufacturing Order* shows a smart button linking to a *Purchase Order*, even when unrelated.
**Expected behavior:**
* The *Purchase Order* should only show a smart button linking to the *Sales Order*.
* The *Manufacturing Order* should only show a smart button linking to the *Sales Order*.
* No cross-link between unrelated PO and MO should be displayed.
**Cause:**
* The SO pushes the `stock.reference` into procurement values: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/sale_stock/models/sale_order_line.py#L289
* The same reference is propagated to:
* Purchase Orders: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/purchase_stock/models/stock_rule.py#L355
* Manufacturing Orders: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/mrp/models/stock_rule.py#L184
* Opening the *Purchase Order* form triggers `_compute_mrp_production_count`.
* This compute calls `_get_mrp_productions()`: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/purchase_mrp/models/purchase.py#L21
* That method returns `self.reference_ids.production_ids`.
* Since the MO shares the same sale reference, the PO incorrectly fetches that MO and shows the *Manufacturing* smart button.
* Similarly, opening the *Manufacturing Order* form triggers `_compute_purchase_order_count`.
* This compute calls `_get_purchase_orders()`, which returns `self.reference_ids.purchase_ids`.
* Since the dropship PO shares the same sale reference, the MO incorrectly fetches that PO and shows the *Purchase* smart button.
**Fix:**
* Stop relying on shared `reference_ids` to compute links.
* Instead, follow the actual stock and procurement chain:
* For *MO → PO*:
* Use raw material moves to find related purchase lines: `self.move_raw_ids.created_purchase_line_ids.order_id | self.move_raw_ids.purchase_line_id.order_id`
* For *PO → MO*:
* Use stock move destinations to identify consuming productions.
* This ensures:
* MOs link only to POs supplying their raw materials.
* POs link only to MOs they actually replenish.
* Unrelated documents sharing the same sale reference remain isolated.
---
opw-6008943
---
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#254292This update resolves an issue where a duplicate close button was appearing in the Odoo Discussions interface. The fix restricts the button's visibility to the meeting view, ensuring a cleaner and more consistent user experience. This improves usability and prevents confusion for users.
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
This update streamlines the data sent to the self-order POS frontend by removing unnecessary fields. This optimization reduces data transfer, potentially improving performance and responsiveness for users. The change was a small fix to enhance the user experience.
Original PR description
Fix _generate_return_values to remove some fields that are not needed on the frontend Forward-Port-Of: odoo/odoo#260016 Forward-Port-Of: odoo/odoo#259915
This update fixes an issue where upgrade scripts within Odoo modules weren't properly organized, leading to potential logging and warning problems. Now, these scripts are correctly associated with the core upgrade package, ensuring better stability and error handling during updates. This improves the reliability of Odoo updates.
Original PR description
The resulting modules should be bound to the `odoo.upgrade` package. Side effects: - the loggers created inside the upgrade scripts are now in the `odoo.upgrade` namespace. - warnings raised by bad usages in upgrade scripts are now correctly filtered. Forward-Port-Of: odoo/odoo#261050 Forward-Port-Of: odoo/odoo#258025
11 changes
Resolved issues and error corrections
This update resolves an issue where the 'is_company' field in several Latin American localizations (AR, BR, EC, CO, PE,UY) was incorrectly configured after a recent system change. The fix ensures accurate company detection, improving data integrity and functionality for users in these regions. It's a general fix impacting multiple localization modules.
Original PR description
*: l10n_{ar,br,ec}
In 19.1 we changed the `is_company` field to a computed
stored field.
This change needs to be reflected correctly in many localisations
where the default computed value is too naive.
This commit is introducing a generic fix for most l10n that depends
on the module `l10n_latam_base`.
Improve the test coverage for the computation.
Note: This is not strictly necessary for this fix
on Enterprise side, since we removed the invisibility
condition but in case of some customization relying
on it it's safer if we can deduce it correctly.
Enterprise: https://github.com/odoo/enterprise/pull/114403
Related: https://github.com/odoo/odoo/pull/211043
task-6141307This update resolves an issue where Peruvian identifiers (like driver licenses) were not displaying correctly in Odoo 19.1 due to a change in how company information was stored. The update removes a restriction on displaying these identifiers, ensuring accurate reporting and data visibility for Peruvian users. This fix also includes a related update to the Community version of the code.
Original PR description
In 19.1 we changed the `is_company` field to a computed stored field. That change broke the visibility for some Peruvian identifiers (driver license, etc). This commit removes the visibility condition on those fields to be displayed all the time. Note: we still add the correct compute on related Community commit for sake of correctness and completeness. Community: https://github.com/odoo/odoo/pull/260224 Related: https://github.com/odoo/odoo/pull/211043 task-6141307
This update resolves a technical issue where the website's video placeholder would crash when a video URL wasn't provided. The code was simplified by removing the problematic iframe element, preventing errors and ensuring video placeholders function correctly across all saved website pages. This improves the overall user experience for video content.
Original PR description
Commit[^1] reworked the `s_video` snippet placeholder into a plain SVG, dropping the inner `<iframe>` and the `data-oe-expression` attribute that carried the video URL. The `.media_iframe_video` class was kept, so the `MediaVideo` interaction still binds to the placeholder and calls `generateVideoIframe`, which then reads `dataset.oeExpression || dataset.src` (undefined) and crashes on `.match()`. The same crash hits the `DOMContentLoaded` fallback on the frontend for any saved page that ends up with a `src-less` placeholder. To prevent the issue, we exit the interaction early if no `src` is saved and leave the existing children in place. Nothing changes if the video has a valid URL already. [^1]: https://github.com/odoo/odoo/commit/db91ddd861b13694fe0e0b8d9cce23e02f487a6a task-6158263 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#261184
This update resolves a technical issue that was limiting the efficiency of WhatsApp marketing automation. Previously, the system wasn't processing all relevant messages at once, leading to slower performance. This fix ensures that all necessary steps are executed, resulting in a smoother and more reliable marketing automation experience.
Original PR description
Forward-Port-Of: odoo/enterprise#114570
This update fixes a technical issue that caused errors when a restaurant order with an active Fiskaly transaction was opened on multiple devices. Previously, the system didn't properly share transaction details, leading to duplicate transaction attempts and API errors. This change ensures consistent transaction data is shared, improving the reliability of the restaurant POS system.
Original PR description
In a restaurant POS, when an order with an active Fiskaly transaction is opened on a second device, `transactionState` and `tx_revision` were not available (uiState is not persisted to the server), causing the new device to attempt creating a duplicate transaction with a stale revision, which resulted in a Fiskaly API error. opw-6147654 Forward-Port-Of: odoo/enterprise#115170 Forward-Port-Of: odoo/enterprise#114599
This update fixes an issue where deferred invoice moves weren't consistently linked to the original invoice partner. The change ensures that the `partner_id` is correctly taken from the invoice line, maintaining data accuracy and preventing discrepancies in financial reporting. This improves the reliability of deferred accounting processes.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#115026 Forward-Port-Of: odoo/enterprise#114439
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation in the barcode interface, preventing discrepancies in inventory tracking. This improves data reliability for internal transfers.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#114998
Forward-Port-Of: odoo/enterprise#110241This update corrects a bug where Purchase Orders and Manufacturing Orders were incorrectly linked to each other, even when unrelated to a Sales Order. The fix ensures that POs only link to Sales Orders, and MOs only link to Sales Orders, improving data accuracy and streamlining the manufacturing process.
Original PR description
**Steps to reproduce:** * Install modules: *mrp*, *purchase*, *sale_management*. * Go to *Settings* and enable: * *Multi-Step Routes* * *Replenish on Order (MTO)* * *Dropshipping* * Create a…
**Steps to reproduce:**
* Install modules: *mrp*, *purchase*, *sale_management*.
* Go to *Settings* and enable:
* *Multi-Step Routes*
* *Replenish on Order (MTO)*
* *Dropshipping*
* Create a *Dropship* product:
* Set route to *Dropship*.
* Add a vendor under the *Purchase* tab.
* Create an *MTO* product:
* Set route to *Replenish on Order (MTO)*.
* Configure a *Bill of Materials (BoM)*.
* Create a *Sales Order*:
* Add both products.
* Confirm the order.
* Open the Sales Order:
* Observe smart buttons for *Delivery*, *Purchase*, and *Manufacturing*.
* Open the linked *Purchase Order* and *Manufacturing Order*.
**Observed behavior:**
* The *Purchase Order* shows a smart button linking to a *Manufacturing Order*.
* The *Manufacturing Order* shows a smart button linking to a *Purchase Order*, even when unrelated.
**Expected behavior:**
* The *Purchase Order* should only show a smart button linking to the *Sales Order*.
* The *Manufacturing Order* should only show a smart button linking to the *Sales Order*.
* No cross-link between unrelated PO and MO should be displayed.
**Cause:**
* The SO pushes the `stock.reference` into procurement values: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/sale_stock/models/sale_order_line.py#L289
* The same reference is propagated to:
* Purchase Orders: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/purchase_stock/models/stock_rule.py#L355
* Manufacturing Orders: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/mrp/models/stock_rule.py#L184
* Opening the *Purchase Order* form triggers `_compute_mrp_production_count`.
* This compute calls `_get_mrp_productions()`: https://github.com/odoo/odoo/blob/8a871a120b75f7c09c70dbf07530239244dbb5d6/addons/purchase_mrp/models/purchase.py#L21
* That method returns `self.reference_ids.production_ids`.
* Since the MO shares the same sale reference, the PO incorrectly fetches that MO and shows the *Manufacturing* smart button.
* Similarly, opening the *Manufacturing Order* form triggers `_compute_purchase_order_count`.
* This compute calls `_get_purchase_orders()`, which returns `self.reference_ids.purchase_ids`.
* Since the dropship PO shares the same sale reference, the MO incorrectly fetches that PO and shows the *Purchase* smart button.
**Fix:**
* Stop relying on shared `reference_ids` to compute links.
* Instead, follow the actual stock and procurement chain:
* For *MO → PO*:
* Use raw material moves to find related purchase lines: `self.move_raw_ids.created_purchase_line_ids.order_id | self.move_raw_ids.purchase_line_id.order_id`
* For *PO → MO*:
* Use stock move destinations to identify consuming productions.
* This ensures:
* MOs link only to POs supplying their raw materials.
* POs link only to MOs they actually replenish.
* Unrelated documents sharing the same sale reference remain isolated.
---
opw-6008943
---
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#254292This update fixes a problem where Wise recipient matches were failing due to slight differences in data (like spacing or casing) between Odoo and Wise. The change now uses only financial details like account numbers and routing numbers for matching, ensuring accurate and reliable direct deposit processing. This improves the process for US direct deposits.
Original PR description
Previously, _generate_wise_key included partner name and email in the matching key. If these differed between Odoo and Wise (e.g. trailing spaces, casing), the match would fail and a duplicate recipient was created. Use only financial identifiers (account type, routing number, account number) which are the actual unique identifiers for bank accounts. This is for example important with IBAN accounts as the won't have an email stored in Wise. From this we combine IBAN and SWIFT recipients into one non-US group. Forward-Port-Of: odoo/enterprise#113234
This update fixes an issue where upgrade scripts within Odoo modules weren't properly organized. Now, these scripts are correctly associated with the core upgrade package, leading to better logging and filtering of potential errors. This ensures smoother and more reliable Odoo updates.
Original PR description
The resulting modules should be bound to the `odoo.upgrade` package. Side effects: - the loggers created inside the upgrade scripts are now in the `odoo.upgrade` namespace. - warnings raised by bad usages in upgrade scripts are now correctly filtered. Forward-Port-Of: odoo/odoo#261050 Forward-Port-Of: odoo/odoo#258025
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 title attribute and custom data-tooltip attributes, ensuring a cleaner and more consistent user experience. This improves usability and avoids confusing visual clutter.
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
1 change
Resolved issues and error corrections
This update fixes an issue where deferred invoice moves weren't consistently linked to the correct customer. The change ensures that the `partner_id` is taken directly from the original invoice line, maintaining accurate data and preventing discrepancies in financial reporting. This improves data integrity for deferred accounting processes.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#115026 Forward-Port-Of: odoo/enterprise#114439
3 changes
Resolved issues and error corrections
This update corrects a bug where the DIAN web service was incorrectly overwriting customer contact information (names and emails) with fiscal data, leading to lost sales data. The fix now intelligently handles email differences, creating a backup contact and giving users control over their CRM data, preventing incorrect invoice delivery.
Original PR description
The DIAN web service was overwriting partner names and emails with fiscal data, causing data loss for CRM contacts. The fiscal email often differs from the commercial one, and the overwrite broke the sales flow by sending invoices to the wrong address. Users had no standard workaround short of manually re-entering emails after every invoice generation. Instead of blindly overwriting, only update empty fields and create a child invoicing contact when the DIAN email differs from the existing one. Also remove the automatic onchange and periodic re-fetch triggers to leave existing data under user control. task-5912005 Forward-Port-Of: odoo/enterprise#114017
This update resolves an issue where the minimum IS (Investment Savings) amount was incorrectly calculated in the Swiss payroll module. The fix ensures accurate reporting and compliance with Swiss tax regulations, preventing potential discrepancies in employee payments. This update impacts the l10n_ch_hr_payroll_elm_transmission module.
Original PR description
Forward-Port-Of: odoo/enterprise#114463
This update fixes an issue where the 'Hide lines at 0' setting caused the Trial Balance report to omit its report-level 'Total' line when printed. The change ensures that all report totals are consistently displayed, regardless of this setting, improving report accuracy and clarity for users.
Original PR description
When "Hide lines at 0" is enabled, printing e.g. the Trial Balance will drop the report-level "Total" line when printing. This commit fixes that. The issue was introduced in this commit[^1], which didn't consider total lines without a parent (i.e. root total lines). [^1]: https://github.com/odoo/enterprise/commit/7fec18b99eb2aa5ebc357dcad5f95f234db5b7d8 Forward-Port-Of: odoo/enterprise#114084
5 changes
Resolved issues and error corrections
This update streamlines the process of marking projects as 'Unreachable' within Odoo. Instead of a dynamic creation method, a pre-defined XML record is now used, leading to more reliable and efficient synchronization. The change removes an older, less efficient method and updates associated tests.
Original PR description
Replace dynamic creation of the "Unreachable" tag with a static XML record `project_tag_db_unreachable` and use `env.ref()`. Remove the old helper method `_get_unreachable_tag_id()` and update tests accordingly. Forward-Port-Of: odoo/enterprise#115009
This update resolves an issue where users were repeatedly prompted with a zero-demand warning when validating immediate receipts created using the barcode module. The change bypasses this warning for immediate transfers, streamlining the process and preventing unnecessary interruptions. This ensures accurate receipt validation without manual intervention.
Original PR description
Issue before this commit: ========================= When validating an immediate receipt, the user gets a zero-demand warning wizard, even though quantities are actually being received. Steps to…
Issue before this commit: ========================= When validating an immediate receipt, the user gets a zero-demand warning wizard, even though quantities are actually being received. Steps to Reproduce: ========================= - Install the stock_barcode module - Create an immediate receipt. - Validate it. - The zero-demand warning wizard appears. Cause of the issue: ========================= This behaviour was introduced in a [PR](https://github.com/odoo/odoo/pull/241646/changes/0238ff2cdd58524da1d7fccb411a94d2bce73094) to warn users when confirming/validating a picking with zero-demand moves. However, for immediate transfers, demand (product_uom_qty) is always 0, so the condition is always true and the wizard is always shown, even when quantities are being processed. With This Commit: ========================= Avoid showing the zero-demand warning wizard when validating an immediate picking from the barcode interface. Forward-Port-Of: odoo/enterprise#114867
This update resolves an issue where the minimum IS (Investment Savings) amount was incorrectly calculated in the Swiss payroll module. The fix ensures accurate reporting and compliance with Swiss tax regulations, preventing potential discrepancies in employee payments. This update impacts the accuracy of payroll calculations for Swiss employees.
Original PR description
Forward-Port-Of: odoo/enterprise#114463
This update resolves a technical issue that was limiting the efficiency of WhatsApp marketing automation. Previously, the system wasn't processing all relevant messages at once, leading to slower performance. This fix ensures that WhatsApp automation runs more effectively by processing message sets in a timely manner, improving the overall user experience.
Original PR description
Forward-Port-Of: odoo/enterprise#114570
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation, particularly when dealing with batch transfers and wave operations, improving data reliability.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#114998
Forward-Port-Of: odoo/enterprise#1102416 changes
Resolved issues and error corrections
This update fixes a problem where Wise payments were failing due to slight differences in recipient information (like spacing or casing). Now, the system uses only bank account details (like account number and routing number) to match recipients, ensuring accurate payments. This also consolidates IBAN and SWIFT recipients into a single group.
Original PR description
Previously, _generate_wise_key included partner name and email in the matching key. If these differed between Odoo and Wise (e.g. trailing spaces, casing), the match would fail and a duplicate recipient was created. Use only financial identifiers (account type, routing number, account number) which are the actual unique identifiers for bank accounts. This is for example important with IBAN accounts as the won't have an email stored in Wise. From this we combine IBAN and SWIFT recipients into one non-US group.
This update corrects a visual issue where adding a new shift sometimes resulted in duplicate employee names appearing in Gantt views. The fix ensures that employee displays are correctly updated when shifts are added or reordered, maintaining accurate representation of staff assignments. This improves the clarity and usability of the Gantt view.
Original PR description
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An…
Sometimes, when adding a new shift (with an employee) in a gantt view that uses `PlanningEmployeeAvatar`, we can have twice the same employee. It can happens on groupby/filtering/reordering/etc.. An exemple could be to have a gantt view with Shift1 User1 we have: ``` +--------------+ | Shift1 User1 | +--------------+ ``` Add another shift (Shift 2) with User2. We'll have: ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User1 | +--------------+ ``` instead of ``` +--------------+ | Shift1 User1 | +--------------+ | Shift2 User2 | +--------------+ ``` Because in this case, when we add Shift2, the view will append Shift1 and after it will rename the old Shift1 to Shift2, but in our case, the renaming is not done and so, it retains the old value. This is because in the `PlanningAvatarAction` setup we use `setupDisplayName`. The purpose of this function is to split the displayName contained in a `span` into two `span` elements using a `useEffect`. For example, `<span>Employee (Department)</span>` will be replaced by ```html <span>Employee</span><span class="..">(Department)</span> ``` in order to apply a “muted” style to the department. But to do this, the function will replace the original first span and overwrite it, ```xml <span t-if=“props.displayName” class="text-truncate flex-grow-1" t-esc=“props.displayName”/> ``` since it contains a `t-esc`, which allows Owl to remain “subscribed” to this element and notify components when to update if the displayName ever changes; however, by overwriting it, Owl is no longer aware of the change. Therefore, whenever a component's value changes (in our case, Shift1 becomes Shift2), it is never updated. In fact, manually manipulating the DOM in a useEffect, as `setupDisplayName` does, is not a good solution. To fix this flow, this commit adds a new `t-key` attribute to the original span with a value of `this.props.displayName`, which ensures that when the `t-key` changes value because `displayName` is updated, Owl will recognize that a change has occurred and will re-render. opw-6128168 Forward-Port-Of: odoo/enterprise#115061
This update corrects a bug in the web studio interface where the 'My Activities' filter was incorrectly combined with other filters using OR instead of AND. This meant that records with activities across different time periods were incorrectly displayed when filtering for 'Late Activities'. The fix ensures accurate filtering based on activity dates.
Original PR description
Follow-up of 475a9efe0bde7515c9d5bf6ec6c8aefd4c71975e Steps to reproduce ================== - Create an app with studio and use_mail - Create three records, one with an activity in the past, one today and one in the future - Click on the clock status icon in the top right - There should be a section with the new model - Click on 1 Late => every records is displayed The filters "My Activities" is combined with "Late Activities" with and OR. It should use the AND operator. Solution ======== Add a separator after the "My Activities" filter. The same is done in xml for standard models. opw-6069150 Forward-Port-Of: odoo/enterprise#114347
This update resolves an issue where opening a restaurant order with an active Fiskaly transaction on a second device would cause duplicate transaction attempts and errors. The fix ensures that transaction state information is properly saved and shared between devices, preventing these errors and improving the reliability of the restaurant POS system.
Original PR description
In a restaurant POS, when an order with an active Fiskaly transaction is opened on a second device, `transactionState` and `tx_revision` were not available (uiState is not persisted to the server), causing the new device to attempt creating a duplicate transaction with a stale revision, which resulted in a Fiskaly API error. opw-6147654 Forward-Port-Of: odoo/enterprise#114911 Forward-Port-Of: odoo/enterprise#114599
This update fixes an issue where deferred invoice moves weren't consistently linked to the original invoice partner. The change ensures the `partner_id` is taken directly from the invoice line, maintaining accurate data and preventing discrepancies in deferred accounting. This improves the reliability of financial reporting.
Original PR description
When creating deferred move lines, the `partner_id` could be incorrectly influenced by the `default_partner_id` context key (e.g., when generating an invoice from a Sales Order). This led to inconsistencies where the deferred move lines did not match the partner on the original invoice line. This commit ensures the `partner_id` is explicitly taken from the source invoice line, guaranteeing data integrity across all deferred move lines. Steps: - Create a sale order for partner X, receive and confirm it - Create the invoice from the SO - Change partner to Y but keep X as delivery partner (not essential to reproduce bthough) - Set a deferred start date and a deferred end date on the invoice line, covering two full months - Confirm the invoice and open deferred moves via the smart button -> Note that one deferred move's lines get the partner id from the SO instead of the invoice opw-6095711 Forward-Port-Of: odoo/enterprise#115026 Forward-Port-Of: odoo/enterprise#114439
This update resolves an issue where barcode quantities were displayed with slight rounding errors due to how JavaScript handles decimal numbers. The fix ensures accurate quantity representation, particularly when dealing with batch transfers and wave operations, improving data reliability.
Original PR description
**Steps to reproduce:** * Install `stock` module. * Go to Settings and enable: * Storage Locations (Warehouse). * Batch, Wave & Cluster Transfers. * Create a Product and set its on-hand quantity to…
**Steps to reproduce:**
* Install `stock` module.
* Go to Settings and enable:
* Storage Locations (Warehouse).
* Batch, Wave & Cluster Transfers.
* Create a Product and set its on-hand quantity to 60.
* Go to Inventory → Configuration → Operation Types and create a new operation type:
* Set Type of Operation to Internal Transfer.
* In the Barcode App tab, enable Group batch lines.
* Go to Inventory → Operations → Internal Transfers and create a new transfer:
* Select the newly created Operation Type.
* Add the created Product with quantity 4.4.
* Mark the transfer as To Do.
* Create another Internal Transfer with the same configuration:
* Select the same Operation Type.
* Add the same Product with quantity 48.8.
* Mark the transfer as To Do.
* Open the Internal Transfers list view.
* Select both created transfers.
* Click Action → Add to Wave Transfer.
* Choose A new Wave Transfer and confirm.
* In the popup, select both transfers and add them to the wave.
* Open the Barcode application.
* Open the created operation and select the Batch on the right side
to open the wave transfer in the barcode interface.
**Observed behavior:**
- The grouped line quantity is displayed as 53.99999996 instead of
the expected value(53.2).
**Cause:**
- When the Barcode app loads data,` _createState()` is executed,
which calls `groupLines()`.
- Inside this method, quantities are aggregated using standard
JavaScript floating-point addition:
https://github.com/odoo/enterprise/blob/08d0a7f480046bb489ca69e7b3535e99cb20eee5/stock_barcode_picking_batch/static/src/models/barcode_picking_batch_model.js#L204-L205
- Since JavaScript stores numbers as binary floating-point values,
decimals like 4.4 and 48.8 cannot be represented exactly.
Repeated additions accumulate precision errors, producing results
like 53.99999996 instead of 53.2.
**Fix:**
- Aggregate quantities using `formatFloat` with the barcode precision
before converting them back to floats
- `formatFloat` rounds the value according to the configured precision
of the barcode model, ensuring the intermediate result is normalized
after each addition. Converting the formatted value back with
`parseFloat` guarantees the stored number respects the expected
decimal precision and prevents floating-point accumulation errors.
---
opw-5932329
Forward-Port-Of: odoo/enterprise#114998
Forward-Port-Of: odoo/enterprise#1102411 change
Resolved issues and error corrections
This update fixes an issue where German invoice reports were incorrectly applying a change intended for all invoices. The commit now correctly filters the application of this change, ensuring that child contact display names are accurately shown on German invoices only. This resolves a previous bug impacting invoice reporting accuracy.
Original PR description
https://github.com/odoo-dev/odoo/commit/0ef4c1d06fdf999ad5cdad696069aec8f2f943c5 wasn't filtering non german invoices, therefore the change applied for all invoice reports. This commit overrides the template, this way we can conditionally add the context key to german invoices only [Ticket link](https://www.odoo.com/odoo/project.task/5900567) opw-5900567