Daily updates from Odoo
Wednesday, March 25, 2026
56 changes · saas-19.2
Resolved issues and error corrections
This update resolves an issue where the Modelo 390 BOE file generated for Spanish tax reports was being rejected by the AEAT portal. The fix ensures a default date format ('00000000') is used when a legal entity's procuration date is not specified, aligning with AEAT's requirements and allowing successful file uploads.
Original PR description
Steps to reproduce: - Install the `l10n_es_reports` module and switch to the `ES company`. - Go to Invoices and create an invoice with taxes, then confirm it. - Navigate to Accounting > Reporting >…
Steps to reproduce: - Install the `l10n_es_reports` module and switch to the `ES company`. - Go to Invoices and create an invoice with taxes, then confirm it. - Navigate to Accounting > Reporting > Tax Report. - From the smart button, select `Report: Tax Report (Mod 390) (ES)` and choose the year as `This Financial Year`. - Download the `BOE` file using the dropdown and fill the wizard fields (e.g., Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345). - Upload the generated .txt file to the AEAT portal. (AEAT credentials are required) **Observation:** AEAT rejects the file with: `Caracteres no válidos '4. Representante - Personas Jurídicas - Represent. 1 - Fecha Poder (DDMMAAAA)'` **Root cause:** At [1], when `judicial_person_procuration_date` is `false`, an empty string is written to the BOE file, resulting in blank spaces in the exported file. This does not comply with AEAT’s required numeric format and causes the file to be rejected. **Fix:** This commit ensures the file contains '00000000' when `judicial_person_procuration_date` is false, complying with AEAT numeric format requirements. [1]: https://github.com/odoo/enterprise/blob/45d3a537c3b2eaccee425d959e89d26229e376cd/l10n_es_reports/models/aeat_tax_reports.py#L1696 opw-5995290 Forward-Port-Of: odoo/enterprise#109652
This update replaces an older method for accessing configuration settings within the currency rate module. Using the recommended `get_str` method ensures consistent and reliable retrieval of settings, improving the stability and performance of the system. This change is a routine maintenance update.
Original PR description
https://github.com/odoo/odoo/pull/223180 removes the `get_param` method from `res.config_parameter`, which was used in the `currency_rate_live` module. This commit replaces it with the `get_str` method, which is the recommended way to retrieve configuration parameters in Odoo. No task ID Forward-Port-Of: odoo/enterprise#110975
This update fixes an issue where payroll attendance calculations were incorrectly high when public holidays were present. The change ensures accurate attendance line amounts by properly accounting for public holiday hours during the calculation process. This improves payroll accuracy and reporting.
Original PR description
Fixes the calculation of the worked day lines amount, in cases where a public holiday is set. The current computation doesn't account for hours of public holiday when calculating the attendance amount; causing it to be higher than expected. This is caused by the calculation of work_time, which comes from the calendar data from _work_intervals_batch. If there is a public holiday, the work interval for that day is being removed from the result, causing it to wrongly calculate a lower work_time than expected and increasing the attendance line amount. task-5979501 Forward-Port-Of: odoo/enterprise#111741
This update resolves two issues preventing new employee creation in the Belgian payroll module. The first prevented saving a new employee with a start date, while the second caused errors when adding a wage. The fix ensures that employee records are created correctly and reliably.
Original PR description
First bug: Steps: - Switch to belgian company - Create new employee - Set contract start date - Click save manually -> boom Cause: in _trigger_l10n_be_next_activities, we create a new mail activity for the created employee which is already created in the default create function leading to duplicate follower records. Fix: in the super.create, pass the context variable mail_create_nosubscribe=True to disable adding the current user as a follower again to the same record Second bug: Steps: - Switch to belgian company - Create new employee - Set contract date - Add a wage then click anywhere -> boom Cause: _trigger_l10n_be_next_activities is called before the record is saved, hence trying to link to a null object Fix: check if the record is created before working on the activities Forward-Port-Of: odoo/enterprise#111780 Forward-Port-Of: odoo/enterprise#109799
This update enhances payroll processing, particularly for employees with changing contracts during a pay period. By layering payslip calculations and introducing new tools for tracking totals, the system now accurately handles contract adjustments, preventing overpayments and ensuring correct contribution calculations, especially in Hong Kong.
Original PR description
This commit aims to provide better support for contract changes that happen in the middle of a pay period. It has a few impacting changes, notably: 1) Payslip calculation sequencing As of now, all…
This commit aims to provide better support for contract changes that happen in the middle of a pay period. It has a few impacting changes, notably: 1) Payslip calculation sequencing As of now, all payslips of a same payrun have their line calculated all at once. While this is better for performances, it has a negative effect when a single employee has multiple payslips in the same payrun. In such cases, we may want or need for the payslips to know what was already calculated in the same payrun to avoid overpaying contributions or allowances that have caps. To solve this issue, we now group payslips by employee, sort them chronologically, and evaluate them in horizontal "layers": - Layer 1: Computes the 1st payslip for ALL employees simultaneously. - Layer 2: Computes the 2nd payslip for the subset of employees who have one, etc 2) More tools in HK payroll to support these cases The payslip rules now have a `l10n_hk_payrun_totals` dict that contains the total amount already reported in previous payslips of a same payruns for a selection of rules that needs it. We also provides a `worked_days_prorata_rate` which gives the ratio of worked days vs unworked days in a month for cases where we need to adjust amounts based on that ratio. 3) Rule updates The last part of the fix requires some updates in a few rules that are fixed amounts/not based on the wage and ends up being counted double in our use case. These rules will now take into account already computed amounts as said above to avoid going over the limit. In most cases it will only affect that specific use case, with a small exception for fixed mpf voluntary contributions, which have been updated to be prorated based on the worked days in the month. Forward-Port-Of: odoo/enterprise#111814 Forward-Port-Of: odoo/enterprise#111570
This update resolves a bug that prevented users accessing documents linked to their employees when using a secondary Odoo domain. The fix ensures that users are correctly directed to the appropriate domain based on their login location, improving document access for all users.
Original PR description
Steps to reproduce:
- Have two domains for your database (".odoo.com" and ".example.com")
- set the ".example.com" domain as your web base url
- login on the ".odoo.com" domain, go on an employee and click the documents smart button
-> you cannot see any documents because you are redirected on the ".example.com" domain on which you are not connected
opw-5857914
Forward-Port-Of: odoo/enterprise#110390
Forward-Port-Of: odoo/enterprise#107384This update fixes an issue where currency rates for businesses in Bulgaria were incorrectly calculated due to a misinterpretation of data from the Bulgarian National Bank (BNB). The change ensures accurate EUR-to-unit and unit-to-EUR conversions, resolving a potential discrepancy in financial reporting. This update improves the reliability of currency calculations for our Bulgarian customers.
Original PR description
Issue: after Bulgaria switched to EUR, currency rate fetching from BNB was incorrectly set to still use reversed currency rates from the fetched XML, resulting in unit-to-EUR and EUR-to-unit rates being flipped in the database. Solution: adjusting the parser to get rate from 'RATE' rather than 'REVERSERATE', as the XML provides both. task-6050519 Forward-Port-Of: odoo/enterprise#111753 Forward-Port-Of: odoo/enterprise#111275
This update fixes a previous issue where users couldn't access worksheet properties within the Quality Check process. The changes now display the relevant worksheet tab and add a simple 'Validate' button, streamlining the workflow and improving the overall user experience. This enhances efficiency and clarity for users managing quality checks.
Original PR description
- Display the Worksheet tab to user in Quality Check and Maintenance Request form views when a worksheet template is set. Previously, the tab was hidden, preventing users from viewing or accessing the worksheet properties. - Added a Validate button in the Quality Check form view for worksheet-based checks, allowing users to validate directly based on worksheet property values Removed the Pass and Fail buttons in this case to streamline the validation flow and reduce user confusion. - Remove the worksheet template title from the Quality Check wizard when displaying worksheet properties to provide a cleaner interface. These changes ensure that users can easily access relevant worksheet properties and improve overall UI clarity. Community PR: [254794](https://github.com/odoo/odoo/pull/254794) Task Id: 5955976
This update ensures that future appraisals automatically disappear when an employee leaves the company. It also removes the employee from appraisal roles and archives their personal goals, streamlining the process and preventing outdated data from appearing.
Original PR description
Currently, when an employee leaves the company, their future appraisals remain active and can still be completed. This fix ensures that, upon employee departure: - all future appraisals are removed - the employee is removed from appraisals where they are an appraiser - all their personal goals are archived - only active (non-archived) appraisals are counted in the employee’s smart button task: 6036427
This update resolves a technical error that prevented users from successfully checking out timesheets within the Enterprise version of Odoo. The issue stemmed from an outdated reference to a renamed function, and this fix ensures a smooth and reliable check-out process. This improves usability for sales teams.
Original PR description
Steps to reproduce: - In the home menu of a database, click on the ActivityMenu at top of page (red dot) - Click check in - Click ActivityMenu (green dot) again and click check out Current behavior: - Traceback saying this.displayAllowBillable is not a function Expected behavior: - No error Note: displayAllowBillable was renamed to displayIsBillable in this commit https://github.com/odoo/enterprise/pull/110708 opw-6061392
This update corrects a rounding error in the US payslip PDF that was causing incorrect overtime rates for very short work durations (like seconds). The fix now calculates the rate directly from the work entry, ensuring accurate overtime pay is displayed. This improves the reliability of payroll reports.
Original PR description
The Rate column on the US payslip PDF is computed as amount / hours, but amount is a Monetary field rounded to 2 decimals. For small hour values (e.g. seconds from the attendance app), the rounding error causes us to compute the wrong rate. For example, working 6 seconds of overtime at an hourly rate of $26 with a 1.5x overtime multiplier results in this calculation: $26/hour * 1.5 * 0.00166667 hour = $0.065 ≈ $0.06 We then attempted to calculate the rate in reverse for the PDF: $0.06 / 0.00166667 hour = $35.9999 ≈ $36.00 Because of the rounding that happened, it doesn't show the expected $39/hour rate ($26 * 1.5). We now compute the rate directly from hourly_wage * multiplier on the work entry type instead. This is a manual forward-port of the work in Odoo 18 [1], to instead use the new amount_rate field on hr.work.entry.type instead. task-6052711 [1] https://github.com/odoo/enterprise/pull/111540 Forward-Port-Of: odoo/enterprise#111733
This update fixes a persistent error that occurred when attempting to activate payments through Odoo. The issue stemmed from discrepancies between payment activation status on the provider side and Odoo, leading to a misleading error message. This change ensures payments are correctly activated within Odoo, improving payment processing reliability.
Original PR description
It may be possible that payments are activated on provider side / odoofin side and not on Odoo side, in that case when we want to activate the payments it leads to an userError but the value is never changed on the db so the error will continue to happen indefinitelly. task-5490817
This update resolves an issue where invoices for foreign customers (e.g., from Colombia) generated by Peruvian companies resulted in errors from SUNAT. The change ensures a default 'schemeID' of '0' is used for the receiver identification type, preventing invalid UBL/QR files and ensuring compliance.
Original PR description
In multi-country databases, a Peruvian company can invoice a foreign customer (e.g., a Colombian company) whose identification type is defined by another localization. Those records typically have an…
In multi-country databases, a Peruvian company can invoice a foreign customer (e.g., a Colombian company) whose identification type is defined by another localization. Those records typically have an empty l10n_pe_vat_code, since there are no cross-country dependencies between LATAM identification types. In that case, the generated UBL leaves the receiver identity type empty and SUNAT returns an error like: ``` 2015/2015 - El XML no contiene el tag o no existe informacion del tipo de documento de identidad del receptor... (missing schemeID value). ``` Odoo already defines schemeID = 0 for some foreign identification types in l10n_pe data, but it cannot cover identification types coming from other countries’ localizations (e.g. Colombia): https://github.com/odoo/odoo/blob/18.0/addons/l10n_pe/data/l10n_latam_identification_type_data.xml#L4 This change ensures that, when the partner is not from Peru and the PE VAT code is missing, we fallback the receiver identification type to "0" in: - PartyIdentification/ID/@schemeID - AccountingCustomerParty/AdditionalAccountID - the QR payload identification type field This prevents generating invalid UBL/QR content for foreign customers in multi-country setups. Forward-Port-Of: odoo/enterprise#110324 Forward-Port-Of: odoo/enterprise#105115
A recent update to Odoo Enterprise prevented new approval rules created through the Studio interface from being properly saved, leading to their deletion from the database. This issue arose during the upgrade from version 18.0 to 19.0 and has now been corrected. The fix ensures that newly created approval rules are correctly managed.
Original PR description
Server and automated actions created by the ORM for the purpose of revoking approval rights are created without `noupdate=True` which leads to said records being removed by the ORM becuase of not being found in the source. Such records created on the fly should have `noupdate=True` to prevent that from happening. This bug can be reproduced by going to Settings > Technical > User Interface > Studio Approval Rules and creating a new record from there and updating `web_studio`. The update will drop the record from the database. Issue originally detected in the upgrade process from 18.0 to 19.0. This fix will be complemented by an upgrade script that fixes erronous records. Forward-Port-Of: odoo/enterprise#110065
This update fixes an issue where project budget totals were incorrectly summing expenses and revenue. The fix adjusts how budget amounts are calculated to ensure accurate totals are displayed on the project dashboard, reflecting the true financial status of the project. This improves reporting accuracy and financial oversight.
Original PR description
### Steps to reproduce: - Create a billable project - Create two budgets one expense and the other revenue or both each for 100$ - Create a vendor bill with the analytic account of the created project - Notice in the project dashboard the two budgets are summed up in the total ### Cause: When calculating the total spent and total allocated we add up the amount whether it is an expense or revenue. https://github.com/odoo/enterprise/blob/1dccb87a48ac44735da4c78594e37d4783789cd6/project_account_budget/models/project.py#L120-L121 ### Fix: Set the expense budget to -ve and the revenue/both to +ve amount when calculating the total spent and total allocated opw-5488131 Forward-Port-Of: odoo/enterprise#106504
This update ensures that document creation times are displayed accurately for users, regardless of their location. Previously, times were inconsistent due to a failure to convert dates from UTC to the user's local timezone. Now, all times are correctly formatted, providing a more reliable and user-friendly experience.
Original PR description
Step to reproduce: 1. Install `documents` 2. Upload a document and open the tree view 3. Compare the field `Created On` and the time from the `Manage Versions` action Issue: - The displayed time is inconsistent between the tree view and the dialog Cause: - The datetime used in Manage Versions is formatted without converting it from UTC to the user’s timezone Solution: - Use timezone-aware datetime helpers so values are converted from UTC to the user’s timezone. Before: <img width="1328" height="81" alt="image" src="https://github.com/user-attachments/assets/2a02f03c-714d-417d-a805-fd0dd7c52753" /> <img width="636" height="297" alt="image" src="https://github.com/user-attachments/assets/c4514469-2f51-493f-8991-32371fb7f338" /> After: <img width="641" height="312" alt="image" src="https://github.com/user-attachments/assets/3979ece8-635a-4b54-9b53-d8b28b3336ec" /> opw-5467782 Forward-Port-Of: odoo/enterprise#104443
This update resolves an issue where reports were failing due to missing account IDs in migrated databases. The fix adds a backup system to automatically use account codes when XMLIDs are unavailable, ensuring reports run smoothly without warnings. This improves the reliability of financial reporting.
Original PR description
Description of the issue this commit addresses: On some migrated BE databases, account template refs a4121/a4521 are missing as XMLIDs. l10n_be_reports then fails to recover partner/reconcile account refs and logs warnings during post-init load. --- Desired behavior after this commit is merged: This commit adds a fallback in BE report chart template data to resolve a4121/a4521 by account code when XMLIDs are missing, preventing recovery warnings while keeping normal XMLID behavior unchanged. --- runbot-[233845](https://runbot.odoo.com/odoo/runbot.build.error/233845) Forward-Port-Of: odoo/enterprise#111325
This update corrects a legal requirement for invoices generated using the l10n_gt_edi module. Previously, essential 'complementos' data were missing from the PDF invoices for specific document types (FCAM, FCAP, FESP), while they were present in the XML files. This ensures compliance with Guatemalan tax regulations.
Original PR description
**PROBLEM** For some documents types, the "complementos" are not present in the pdf while they are present in the xml. It's legally required that they are added in the pdf. **STEP TO REPRODUCE** 1. Install l10n_gt_edi. 2. Create an customer invoice. 3. Set the document type to FCAM, FCAP, or FESP. 4. Send the invoice using the cfdi. 5. download the xml and the pdf, notice the complementos are in the xml, but not in the pdf. opw-5970285 Forward-Port-Of: odoo/enterprise#109061
This update fixes a potential issue where a user could indirectly change an employee's work email through salary configuration. Now, the work_email field is protected and won't be reset if the employee is linked to a user, ensuring data integrity and preventing unintended email updates.
Original PR description
Due to https://github.com/odoo/enterprise/pull/106974,the employee's work_email may be reset to False when creating or updating an offer. This behavior is acceptable if the employee does not have a linked user. However, if the employee is linked to a user, resetting work_email can allow a user to indirectly modify their own work_email through salary confi. To prevent this, we now ensure that work_email never changes if employee has a user linked to it. Steps to reproduce: - Hire an applicant from Recruitment (the employee has no work_email). - Set a random work_email and create a user for the employee. - Open the hired applicant and create a new offer to update the contract. - work_email should not be modified, even after new contract. task: 6033382 Forward-Port-Of: odoo/enterprise#111815 Forward-Port-Of: odoo/enterprise#110810
This update corrects an issue preventing Romanian SAFT reports from passing validation. The team restored a key data element and used a sanitized bank account number, ensuring compliance with Romanian tax regulations. This resolves a technical problem that could have impacted report accuracy and processing.
Original PR description
Problem --------- In odoo/odoo#184131 and odoo/enterprise#72206, UOM's categories where removed. Along side the removal, the Description tag in the Romanian SAFT UOM table tag. However, without this node, the SAFT is flagged as invalid by validator in Romanian. Furthermore, in the RO SAF-T, we use the bank account number and not the sanitized one, which may lead to some spaces in the document. Spaces that are not accepted either. Solution --------- Add back the Description node and use the UOM name instead of category. Use the sanitized account number. opw-5956277 Forward-Port-Of: odoo/enterprise#111664
This update resolves a bug where custom snippets created in the website builder didn't correctly display their dynamic content in the preview. The fix ensures that dynamic content is properly reflected when previewing custom snippets, addressing a previous issue related to the website builder refactor. This improves the user experience when creating and testing dynamic website content.
Original PR description
The interaction for filling the dynamic content of dynamic snippets did not run inside the iframe to preview the snippet to add. This is not an issue for the initial dynamic snippet, as they are…
The interaction for filling the dynamic content of dynamic snippets did not run inside the iframe to preview the snippet to add. This is not an issue for the initial dynamic snippet, as they are filled with fake content. But when saving a custom snippet, the dynamic content is cleared, and they seem empty when previewed. This is the case since the [website builder refactor] as the previous builder re-used the preview of the initial snippet. This commit adds the interaction to fill dynamic content in the preview iframe, and changes the interaction to avoid emptying the fake content from initial dynamic snippets during preview. Steps to reproduce: - Open website builder - Add a dynamic snippet (for example "Events") - Save the snippet as a custom snippet - Click on "Custom" snippet category - Bug: The preview for the custom snippet does not have the dynamic part (there is no event, just the title) [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5427353 Forward-Port-Of: odoo/enterprise#110696 Forward-Port-Of: odoo/enterprise#108912
This update enables companies to create equity transactions in currencies other than the default USD. Previously, the system was locked to USD, limiting flexibility. Now, the equity currency can be set on the first transaction, ensuring accurate tracking regardless of the company's base currency.
Original PR description
### Issue: When a company is set in USD, it was not possible to create equity transactions in another currency (e.g., EUR) ### Cause: The equity_currency_id is initialized with the company currency at partner creation (or module installation) However, there was no way to override this value when creating transactions ### Fix: It is now possible to set the equity currency on the first transaction Subsequent transactions reuse this currency and the field becomes read-only ### Steps to reproduce: - Install `equity` with demo data (currency and equity_currency default to USD) - Enable the EUR currency - Create an equity transaction for a company - You can now choose EUR on this transaction - Create another transaction for the same company, the selector is hidden and the currency remains EUR opw-5382255 Forward-Port-Of: odoo/enterprise#108248
This update fixes a bug preventing the proper synchronization of XML documents (like e-invoices) related to accounting moves. Previously, invoices created from various sources didn't always attach the original XML files to the Documents app, leading to data discrepancies. Now, all XML attachments are correctly linked, ensuring accurate document tracking.
Original PR description
[FIX] documents_account: sync all XML documents for account moves Before this commit, the synchronization between accounting attachments and the Documents app was incomplete regarding XML files…
[FIX] documents_account: sync all XML documents for account moves Before this commit, the synchronization between accounting attachments and the Documents app was incomplete regarding XML files (e.g., e-invoices, Peppol). This caused several specific issues: 1. When creating an invoice via the Accounting upload interface, only the generated PDF was synced to the correct Documents folder, leaving the original XML file unsynced. 2. When creating an invoice from an existing file in the Documents app (via server action), the system correctly synced the generated PDF, but failed to move or sync the original XML source file to the target folder. 3. When receiving vendor bills via Peppol or other EDI networks, the proxy attaches the fetched XML to the `account.move` via an `ir.attachment` write. Because this bypassed the existing sync filters, the Peppol XMLs were never pushed to the Documents app. This commit updates the `ir.attachment` logic in both `create` and `write`. It ensures that whenever an XML file (mimetype `application/xml` or `text/xml`) is attached to an `account.move`—regardless of the move type or whether it was uploaded manually or fetched via EDI—the document synchronization logic is triggered, properly linking and filing the XML alongside the PDF. Task-5909245 Task-5917535 Forward-Port-Of: odoo/enterprise#111881 Forward-Port-Of: odoo/enterprise#106574
This update resolves an issue where only administrators could delete work entry types within the payroll module. Now, users with SUPERUSER permissions can delete these types, improving flexibility and reducing reliance on administrator intervention. This change ensures smoother management of payroll configurations.
Original PR description
Forward-Port-Of: odoo/enterprise#111967
This update corrects a minor issue where the system incorrectly interpreted empty strings as disabling Two-Factor Authentication (2FA). The change ensures that an empty secret field is now treated as the default, allowing 2FA to function correctly when it's not explicitly enabled. This improves the reliability of 2FA setup and usage.
Original PR description
Empty strings in secret mean that totp is not enabled. Remove support for the totp_secret = 'false'. If we don't have a secret, it should be empty (null or ''). --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255536
This update fixes an issue where users couldn't properly filter records based on date and time fields within the CRM. The update ensures the system correctly recognizes and filters these fields, allowing for more accurate data searches and reporting. This enhancement improves the usability of the CRM for filtering customer data.
Original PR description
Steps: - Install crm - Add a propertie field date type - try to filter with this field - Invalid domain Currently tree_editor does not take into account if a path is a property field or not, with this commit there is a new `is_property` attribut in node opw-5906605 Forward-Port-Of: odoo/odoo#255605 Forward-Port-Of: odoo/odoo#250350
This update corrects a display issue where the 'Pick Up in Store' option was incorrectly shown for products with excluded tags. The fix ensures that unavailable delivery methods aren't presented to customers, maintaining a consistent and accurate shopping experience. This improves usability and prevents customer confusion.
Original PR description
Currently, when a product has a tag that is configured as an Excluded Tag on the Pick Up in Store delivery method, the method is still shown on the product page. Steps to produce: --- - Install…
Currently, when a product has a tag that is configured as an Excluded Tag on the Pick Up in Store delivery method, the method is still shown on the product page.
Steps to produce:
---
- Install `website_sale` module.
- Enable `Click and Collect` in settings.
- Go to `website > ecommerce > products > product tags.`
- Create a new tag and add a product in product template.
- Go to` website > configuration > ecommerce > delivery method.`
- Open` pick up in store`:
- In the `Stores` tab, set your company warehouse.
- In the `Availability` tab, add the created tag to Excluded Tags.
- Publish the delivery method.
- Open the tagged product on the website.
Issue:
---
- The Pick Up in Store option is still displayed on the product page, even though the product has a tag listed in the carrier’s Excluded Tags.
Root cause:
---
- Here at [1], the method `_get_additional_combination_info ()` does not check whether the product has tags that are excluded by the delivery method.
- However, at [2], during checkout, the exclusion works correctly because `_match_excluded_tags` in `delivery.carrier` filters the carrier based on excluded tags.
Solution:
---
- Hide the Pick Up in Store option when the product has tags excluded
for that delivery method. This keeps the behavior consistent across
the website, avoids showing unavailable delivery options, does not
impact other flows and aligns with the existing behavior during
checkout.
[1]https://github.com/odoo/odoo/blob/1c483c3a8d7d079bd34a378f9f8716551e4bab93/addons/website_sale_collect/models/product_template.py#L17-L21
[2]https://github.com/odoo/odoo/blob/1c483c3a8d7d079bd34a378f9f8716551e4bab93/addons/delivery/models/delivery_carrier.py#L192-L194
opw-5921268
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#255482
Forward-Port-Of: odoo/odoo#250837This update resolves a technical issue that caused an error when users accessed the project dashboard. Specifically, the system was incorrectly attempting to access data without checking if it existed, leading to a 'KeyError'. This fix ensures the dashboard functions correctly for all users, regardless of their group membership.
Original PR description
### Description of the issue/feature this PR addresses: If you create a custom group and not using project user group, if you click on "Dashboard" in the project, KeyError profitability_items appears. It appears because it accesses to panel_data without checking if panel_data is not empty. ### Current behavior before PR: Appear KeyError profitability_items ### Desired behavior after PR is merged: No error --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252687
This update resolves a gap in documentation for the Direct Deposit module within the l10n_us_account add-on. Previously, the module's integration lacked a link to the relevant direct deposit documentation. Now, a link has been added to res_config_settings_views.xml, ensuring users have easy access to the necessary information.
Original PR description
When the Direct Deposit module was merged, there was no documentation created yet. Now that it has been merged we will add the link to the right documentation. task-none Forward-Port-Of: odoo/odoo#255655
This update enhances the product viewing experience by adding a zoom feature to product images within the Product, Expenses, and Point of Sale modules. This allows users to more easily examine product details, leading to a better customer experience and potentially increased sales.
Original PR description
This PR enables the zoom feature for product images across the **Product**, **Expenses**, and **Point of Sale** modules. Currently, some product views display images without the zoom capability. This makes it difficult for users to inspect smaller details of a product. Enabling the `zoom` option on the `image_1920` widget provides a more consistent UI. ### **Changes** Added zoom to the following modules: **hr_expense** (product variant), **point_of_sale** (product view), and **product** (template and variant views). **Task ID: 6003499** Forward-Port-Of: odoo/odoo#255568
This update resolves issues preventing the preview record field in email templates from functioning correctly. Specifically, it corrects a data access error and ensures the record selector remains visible when removing records, improving the email preview experience. This ensures users can accurately preview their email templates.
Original PR description
Steps to reproduce =============== Issue 1 --------- 1. Open any email template's form view 2. Click the `Preview` button -> Preview wizard will open 3. Remove the record from the record selector 4.…
Steps to reproduce =============== Issue 1 --------- 1. Open any email template's form view 2. Click the `Preview` button -> Preview wizard will open 3. Remove the record from the record selector 4. Click the next button of the pager. -------> Traceback Issue 2 --------- 1. Open email marketing 2. Open any mailing 3. Click the `Preview & Test` button -> Preview wizard will open 4. Remove the record from the record selector. -------> Record selector and the pager will disappear. Technical ======== Issue 1 ---------- The [line] mistakenly used `display_name` instead of `displayName` to access from the record, making the _first_ record's display_name `undefined`. When we switch to the next record, the code used the resModel of the current record raising the error through `update -> _update -> _preprocessReferenceChanges -> _completeMany2OneValue -> webRead`, the cause being the `undefined` value of resModel passed to the `webRead`. Notably, this problem would've been omitted if: -> `display_name` of the first record wasn't `undefined` as it would've prevented the call to `_completeMany2OneValue` or -> use the `getRelation` method as `resModel` of the reference field while updating. After this commit, we make sure to apply the above both points. Issue 2 ---------- The reference field sets the `relation` of the current field from the current value or the provided `model_field`. When unsetting the record, the current value is set to `false`. Therefore, the `relation` value is `undefined` making the record selector disappear (See [Ref]) After this commit, we add the computed `model_id` field to the wizard's model and provide it to the preview record field. [line]: https://github.com/odoo/odoo/blob/07378556a633f50938c92b7abe094cf2adf43c2c/addons/mail/static/src/views/web/fields/mail_preview_record_field/mail_preview_record_field.js#L24 [Ref]: https://github.com/odoo/odoo/blob/35785af180c68075a94f3f1464b8dddf526a0646/addons/mail/static/src/views/web/fields/mail_preview_record_field/mail_preview_record_field.xml#L5 Task-5944834
A recent issue caused user mail inboxes to crash when accessing multiple companies. This fix addresses a permissions problem that prevented notifications from being properly processed, leading to inbox lockups. The update ensures that users can reliably access their mail regardless of the company they're working with.
Original PR description
### Issue: Due to this bug, user's inbox can crash and become inaccessible by another user. #### Steps to reproduce: 1- Create a db with two companies and sale installed with demo data. 2- Demo user should only have access to company A 3- Demo user preference should be handle in Odoo 4- Admin should access both companies 5- Create a partner called partner_b with company set to company B 6- Using admin create a SO in company B, with the partner_b 7- Send a message (not internal note) in SO chatter, and mention Demo user 8- Login using Demo user 9- Open discuss app. As you see the inbox is not accessible anymore. ### Cause: This is caused because Demo user doesn't have read access to partner_b. This cause issue in adding notification for partner_b. https://github.com/odoo/odoo/blob/6e262e8cf7666216305a04f92c213578452fd652/addons/mail/models/mail_message.py#L1042-L1064 opw-5089738 Forward-Port-Of: odoo/odoo#252298 Forward-Port-Of: odoo/odoo#232894
This update fixes a potential issue where groups could be incorrectly linked to inherited views, causing errors during upgrades. The change adds a validation rule to prevent this, ensuring groups are defined directly within view XML definitions for stability and to avoid confusing user configurations.
Original PR description
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the…
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the Views section. - Upgrade the module. **Issue:** - Odoo already prevents assigning groups directly on inherited view records in ir.ui.view. However, it is still possible to indirectly assign groups to inherited views through res.groups via the view_access relation. - This creates entries in ir_ui_view_group_rel and can trigger a ValidationError during module upgrades. As a result, users may unknowingly create invalid group-view relations, leading to errors and confusion. **Solution:** - Add a validation constraint on res.groups to prevent linking groups to inherited views via the view_access relation. - Raise a ValidationError when such an assignment is attempted, with the message: "Groups should instead be defined using the 'groups' attribute inside the view XML definition." This ensures that inherited views cannot be assigned to groups, avoiding invalid configurations and preventing errors during module upgrades. **opw-6015526** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255411 Forward-Port-Of: odoo/odoo#254849
This update corrects a problem where the QR code on printed POS receipts was sometimes pointing to the wrong order invoice. The fix ensures that unique QR codes are generated for each order, preventing incorrect data from being printed. This improves the accuracy of receipts and reduces potential errors.
Original PR description
**Step to reproduce:** - install "l10n_es_edi_verifactu_pos" - setup "ePOS printer" for a pos - open pos and settle a order below 400$ - notice we get l10n_es_edi_verifactu_qr_code in our receipt -…
**Step to reproduce:** - install "l10n_es_edi_verifactu_pos" - setup "ePOS printer" for a pos - open pos and settle a order below 400$ - notice we get l10n_es_edi_verifactu_qr_code in our receipt - click on "Print receipt" - repeat above steps for one more order **Observation:** - when we print the second order receipt, the QR still points to 1 order invoice **Issue:** - [getCacheKey](https://github.com/odoo/odoo/blob/0cee3350df09b06af77c879f0eba74bf6a8dd2c9/addons/point_of_sale/static/src/app/utils/html-to-image.js#L351C10-L355 ) was trimming query strings when generating cache keys. URLs like: ` http://localhost:9000/report/barcode/?barcode_type=QR&value=... ` were reduced to: ` http://localhost:9000/report/barcode/` - As a result, different QR code requests shared the same cache key. Subsequent requests reused the previously cached image instead of fetching a new one, producing incorrect QR codes for different orders. **Solution:** Add an `includeQueryParams` flag to `resourceToDataURL` so the full URL, including query parameters, is used as the cache key when needed. This ensures unique QR code URLs are cached and fetched correctly. opw-5455807 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251139
This update fixes a visual issue where long property names in the worksheet property selector were overlapping, creating a confusing user experience. The fix applies CSS to ensure labels are displayed correctly, resulting in a cleaner and more intuitive interface for configuring rules.
Original PR description
Before this commit: --------------------------------- Long property names in the worksheet properties dropdown (ModelFieldSelector) were overflowing and overlapping with the chatter, causing a poor…
Before this commit: --------------------------------- Long property names in the worksheet properties dropdown (ModelFieldSelector) were overflowing and overlapping with the chatter, causing a poor user experience and making it difficult to select and configure rules. Steps to reproduce: ------------------------- 1. Install the quality_control_worksheet module. 2. Create a new Control Point. 3. Set the Type to Worksheet and select a Worksheet Template. 4. Open the selected Worksheet Template and add a property with a very long name. 5. Return to the Control Point, create a rule, select Worksheet Properties, and choose the property with the long name. 6. Observe that long labels overflow and overlap with the chatter, making selection difficult. After this commit: -------------------------------- This fix applies CSS to properly handle long text, preventing layout issues and improving readability and usability, resulting in a smoother and more user-friendly experience. Before: <img width="1916" height="789" alt="image" src="https://github.com/user-attachments/assets/ec585c21-bcce-4fed-a847-db42511f5f69" /> After: <img width="1329" height="819" alt="image" src="https://github.com/user-attachments/assets/bb39e4bf-93b7-4885-80b2-ef75da8398f6" /> Enterprise PR: [110899](https://github.com/odoo/enterprise/pull/110899) Task Id: 5955976
A test failure related to order quantity synchronization in the Restaurant POS module was resolved. The fix ensures the test waits for backend synchronization to complete before updating order quantities, preventing incorrect data updates. This improves the reliability of the test and the overall POS functionality.
Original PR description
During the tour test `test_sync_lines_qty_update_ticket_screen`, the order line quantity was sometimes incorrect after navigating to the TicketScreen. When opening the TicketScreen and loading an order, the order is synchronized with the backend. A race condition could occur where the order was loaded with a certain quantity, triggering `sync_from_ui`, which takes some time to complete. During this delay, the test updated the order line quantity, but the sync response returned with the old quantity and overwrote the new value. To fix this, the tour now waits for `sync_from_ui` to complete after each `Chrome.clickOrders()` and `TicketScreen.loadSelectedOrder()`. Runbot error: 241916 --- Runbot Error: https://runbot.odoo.com/odoo/runbot.build.error/241916
This update resolves an issue preventing users from editing multiple stock counts simultaneously in the Physical Inventory list view. The fix synchronizes the editing process, allowing users to accurately update quantities in bulk. This improves efficiency and reduces manual data entry for stock adjustments.
Original PR description
# How to reproduce - Go to the Pysical Invetory list view - Select more than one record - In the Counted field, try to type a two digit number # The problem A popup asking for confirmation for…
# How to reproduce - Go to the Pysical Invetory list view - Select more than one record - In the Counted field, try to type a two digit number # The problem A popup asking for confirmation for editing a field is shown before the user has the time to type in the other digits. This makes it so it is not possible to input a number that has more than one digit. # Cause The Counted (invetory_quantity) field in the list view uses a special widget (CountedQuantityWidgetField). This widget has the responsability to set the inventory_quantity_set field to true when the the value of the inventory_quantity field is updated. The inventory_quantity_set field is updated on input : https://github.com/odoo/odoo/blob/f450bb6379b5c0354c048abcc688428d8bff1172/addons/stock/static/src/widgets/counted_quantity_widget.js#L33-L35 The inventory_quantity field is updated on blur : https://github.com/odoo/odoo/blob/f450bb6379b5c0354c048abcc688428d8bff1172/addons/stock/static/src/widgets/counted_quantity_widget.js#L44-L49 This does not make a lot of sense, because we tell the backend that the quantity has been changed before sending the new quantity. This was not really an issue before but starting in 19.0, this commit (https://github.com/odoo/odoo/commit/9f0470b48e4e8c783513788e269ad16cbf84b7af) made the Physical Invetory list view multi-editable, highlighting the desynchronization This fix aims to resynchronize the editing of both of theses values, allowing the bulk edit at the same time. opw-5908205 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254399
This update optimizes how Odoo calculates inventory values, specifically for large warehouses. By directly using valued locations instead of redundant expansion, the process is significantly faster. This change reduces the time taken to generate inventory valuation reports, improving overall system performance.
Original PR description
To compute the inventory valuation report, stock_account builds a valuation context through `_with_valuation_context()` and passes the valued internal/transit locations to stock quantity computation.…
To compute the inventory valuation report, stock_account builds a valuation context through `_with_valuation_context()` and passes the valued internal/transit locations to stock quantity computation. Without `strict=True`, stock quantity domains treat these locations as hierarchical anchors and expand them again through the location tree. This is redundant in this specific call site because `_with_valuation_context()` already provides the valued locations to filter on. On databases with a large location tree, this extra expansion makes the inventory valuation load much slower than necessary. Using `strict=True` makes quantity computation use the provided valued locations directly. ### Benchmark: - active products: 5912 - stock moves: ~785k - internal locations: 4213 | Before | After | |---------|--------| | 99.285s | 1.853s | opw-5944584 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254354 Forward-Port-Of: odoo/odoo#253656
This update fixes a bug where duplicating a manufacturing order (MO) would incorrectly link a new purchase order to the wrong quantity, leading to inaccurate inventory counts. The fix prevents the MO reference from being copied during duplication, ensuring purchase orders are correctly associated with the intended production order. This improves data accuracy and reduces potential order fulfillment issues.
Original PR description
Steps to reproduce the bug:
- Create a storable product "P1" with the following BoM:
- Component: C1 with the following routes: - Buy + MTO
- Create a MO to produce one unit of P1:
- Confirm the MO -> a purchase order is created because the component uses MTO
- Duplicate the MO
Problem:
A new MO is created, but the reference is copied. As a result, the purchase order becomes linked to the new MO and the quantity in the purchase order line is updated from 1 to 2 units.
Explanation:
When the purchase order is created, the MO reference is stored on the PO, which links both records together. Since the reference is also copied when duplicating the MO, the new MO is incorrectly linked to the same purchase order.
opw-5873769
Forward-Port-Of: odoo/odoo#255335This update corrects an issue where two separate RFQs were generated for subcontracting orders, leading to inefficiencies. The change ensures that a single, shared stock reference is used for manufacturing orders, streamlining the RFQ process and preventing duplication. This improves the grouping of RFQs for better order management.
Original PR description
Steps to reproduce: - Go to Azure Interior contact form: - Sales & Purchase tab > Group RFQs > Always - Create a storable product "P1": - Route: Resupply Subcontractor - BoM: - Type: Subcontracting -…
Steps to reproduce:
- Go to Azure Interior contact form:
- Sales & Purchase tab > Group RFQs > Always
- Create a storable product "P1":
- Route: Resupply Subcontractor
- BoM:
- Type: Subcontracting
- Component: C1 with Dropship route and azure interior as vendor
- Create a storable product "P2":
- Route: Resupply Subcontractor
- BoM:
- Type: Subcontracting
- Component: C2 with Dropship route and azure interior as vendor
- Create a purchase order with one unit of P1 and P2
- Confirm the purchase order
Problem:
Two RFQs are generated (one for C1 and one for C2) instead of a single grouped RFQ.
When confirming the purchase order, a stock reference is created and assigned to it. This reference is correctly propagated to the picking and stock moves.
However, when the two manufacturing orders are created, new stock references are generated instead of reusing the original one. As a result, each MO ends up with a different reference:
https://github.com/odoo/odoo/blob/2713876dbc70d3984e584a9037a2206dcda4e84a/addons/mrp_subcontracting/models/stock_picking.py#L69-L72
This prevents from grouping RFQs, since the grouping logic relies on identical references. When the first RFQ is created for C1, it uses the MO reference, and when searching for a candidate RFQ for C2, none is found due to the reference mismatch:
https://github.com/odoo/odoo/commit/77dc92e4a0db0575a1a0e865cdd0c82978d593f6#diff-201f9fd7ec1067f7530aafeaa88420021930be82ce89e912d595ed55bb885f26R370-R372
Solution:
Reuse existing stock references when creating subcontracting MOs instead of creating new ones.
opw-5895378
Forward-Port-Of: odoo/odoo#254327This update resolves an issue where using a delivery address in the POS for invoicing incorrectly calculated Cost of Goods Sold (COGS). The fix ensures accurate COGS tracking by correctly linking the invoice to the relevant stock movements, aligning with Anglo-Saxon accounting practices. This prevents inaccurate financial reporting.
Original PR description
When a delivery address is selected as the customer in the POS UI and an invoice is generated from the POS order, it results in two different `partner_id` being set on the `pos.order` and the…
When a delivery address is selected as the customer in the POS UI and an invoice is generated from the POS order, it results in two different `partner_id` being set on the `pos.order` and the `account.move`. It is expected, as a delivery address cannot logically be used as an invoicing address. Anglo-saxon accounting registers the COGS with additional account.move.line on the invoice and, when using real time valuation, the balance of these lines is calculated from values found on the corresponding `stock.move`. Currently, the `stock.move` cannot be found if the `partner_id` on the `pos.order` and the `account.move` are different. The system then falls back on the `standard_price` of the `product_id`, which is incorrect. In version 19+, the `product_id` used to calculate the unit price is fetched from the `stock.move` but, because it's an empty recordset, the balance of the COGS is 0 and the lines are not created. An easy fix could be to remove this check of equivalence between the two `partner_id`. The invoice is created directly from the POS order anyway. I am not sure why it is necessary. Am I missing something? Steps to reproduce: 1. Create a product with fifo and automated valuation. Make sure that the product type is storable. 2. Validate one purchase and its delivery for the product (qty 5, unit price 5). 3. Validate another purchase and its delivery for the product (qty 5, unit price 10). 4. Configure the point of sale to allow invoicing. 5. Open a pos session then sell 1 item of the product. Select a delivery adress as the customer and generate an invoice. 6. Since the product is fifo, this means that the cost of goods sold is 1 * 5. 7. The correct expense account line should have balance of 5.0. 8. The correct output account line should have balance of -5.0. 9. The COGS lines instead have a balance of 8.13 and -8.13 which corresponds to the standard price of the product at the time of the invoice. Related ticket: opw-5467877 Forward-Port-Of: odoo/odoo#245208
This update resolves a bug that caused Odoo to crash when users added products to a list field while in edit mode. Specifically, the system was receiving incorrect data when adding products, leading to an error. This fix ensures a more stable and reliable experience when managing product lists.
Original PR description
When a record is in edit mode in an x2many list and the user presses a key while clicking "Add a product", onCellKeydownEditMode is called with record=null while editedRecord is set, causing a TypeError on record.dirty. Steps to reproduce: 1. Create a Sales Order 2. Click "Add a product" 3. While pressing the right arrow key, click "Add a product" again opw-6032870 Forward-Port-Of: odoo/odoo#255324 Forward-Port-Of: odoo/odoo#254881
This update corrects a validation issue that prevented invoices with Recupel taxes applied to negative lines from generating valid XML files for Peppol transmission. The fix ensures that negative fixed taxes are correctly identified as allowances, resolving a compatibility problem with PEPPOL standards. This ensures accurate invoice processing and compliance.
Original PR description
**PROBLEM** If you set a recupel tax (fixed tax affecting base) and use it on a negative line, the generate xml will not pass validation. **STEP TO REPRODUCE** 1. Setup Peppol. 2. Create a recupel tax (fixed tax of 1€, affecting the base). 3. Create an invoice with a negative line, with a VAT and the recupel tax. 4. Send the invoice using peppol, and validate the xml. 5. Notice the xml doesn't pass validation. **CAUSES** 1. The negative fixed tax should be an allowance, but is marked as a charge in the xml. 2. Only fixed taxes that are charges influences the line_extension_amount, but it should also be the case with negative fixed taxes. 3. Negative fixed taxes should have a ChargeAllowanceReasonCode that is in the AllowanceReasonCode list. opw-5955289 Forward-Port-Of: odoo/odoo#255436 Forward-Port-Of: odoo/odoo#252716
This update resolves a validation error occurring when generating Peppol invoices with Belgian company settings. The fix addresses a rounding discrepancy in the invoice data, ensuring the XML output complies with VAT regulations. It achieves this by explicitly declaring rounding amounts in the XML.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_be - Switch to a Belgian company (e.g. BE Company CoA) - In Accounting settings: * activate Peppol * set "Rounding Method" to "Round Globally" -…
**Steps to reproduce:**
- Install Accounting and l10n_be
- Switch to a Belgian company (e.g. BE Company CoA)
- In Accounting settings:
* activate Peppol
* set "Rounding Method" to "Round Globally"
- Create an invoice:
* Customer: [a Belgian customer with a VAT]
* Invoice Lines:
| Label | Quantity | Price | Taxes |
| ------- | ---------- | ------- | ------- |
| Line 1 | 1.0 | 90.30 | 0% |
| Line 2 | 0.45 | 2.54 | 6% |
| Line 3 | 0.28 | 6.87 | 6% |
- Confirm the invoice
- Send the invoice to Peppol
**Issue:**
The generated XML has a line with `<cbc:LineExtensionAmount>` set to 90.31, `<cbc:InvoicedQuantity>` set to 1.0 and `<cbc:PriceAmount>` set to 90.30, which fails the validation with the following error:
`[BR-E-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Exempt from VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Exempt from VAT".`
**Cause:**
The use of decimal number in quantity generates a 0.01 rounding difference in the base amounts.
The extra cent is dispatched in one of the `<cbc:LineExtensionAmount>` node.
**Solution:**
There is no easy solution to handle these rounding cases. The solution used in this fix is to handle the extra cents as if they are cash rounding amount and declare them in `<cbc:PayableRoundingAmount>` node.
opw-5933545
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#255224
Forward-Port-Of: odoo/odoo#253625This update resolves an issue where a down payment line was incorrectly added twice to POS order settlement. When automatic invoicing is enabled and online payments are processed, the system was creating duplicate down payment records. This fix ensures that only one down payment line is created, streamlining the order settlement process and improving data accuracy.
Original PR description
Case 1: --- **Steps to produce:** - Install `pos_sale` module. - Enable `Automatic Invoice` in settings - Create a new SO with product price 1000. - In `Other Info`, set `Online Payment` to 30%. -…
Case 1: --- **Steps to produce:** - Install `pos_sale` module. - Enable `Automatic Invoice` in settings - Create a new SO with product price 1000. - In `Other Info`, set `Online Payment` to 30%. - Preview > make payment > down payment of 300 is created in SO. - In POS, open Furniture Shop register > Actions > Quotation/Order > select the SO > settle order. **Issue:** - The down payment line is added twice in the POS order. **Root cause:** - At [1], `sale_order.amount_paid` = 300, so `addDownPaymentProductOrderlineToOrder` adds the line in order. - At [2], the down payment line from the SO is added again. - Here, when `Automatic invoice` is on and we make the online payment then `amount_paid` is updated and the downpayment invoice is also created. - So, we have also downpayment line in sale order also. **Solution:** - Ensure that if a downpayment line has already been added to the POS order, the first downpayment line matching `amount_paid` is skipped. [1]: https://github.com/odoo/odoo/blob/54a62bdbe927108a7f85374db26787f8ba45f6ac/addons/pos_sale/static/src/overrides/models/pos_store.js#L88-L93 [2]: https://github.com/odoo/odoo/blob/54a62bdbe927108a7f85374db26787f8ba45f6ac/addons/pos_sale/static/src/overrides/models/pos_store.js#L109-L111 Before: <img width="484" height="279" alt="image" src="https://github.com/user-attachments/assets/c803c9bd-0751-4a90-81f4-8fb3da3b393e" /> After: <img width="490" height="235" alt="image" src="https://github.com/user-attachments/assets/2ec4ac43-1db3-4c2e-bfcf-8c52a4830dac" /> Case 2: --- **Steps to produce:** - Install `pos_sale` module. - Enable `Automatic Invoice` in settings - Create a new SO with product price 1000. - In `Other Info`, set `Online Payment` to 30%. - Preview > make payment. **Issue:** -The computed value of amount_unpaid is 400, whereas it should be 700. **Root cause:** - When Automatic Invoice is enabled and an online payment is made, the invoice is automatically created and amount_paid is also updated. - At [3], the logic subtracts both the total invoice amount and amount_paid from the actual total, which results in an incorrect calculation. **Solution:** - When an online payment is made, a transaction is created and linked to an invoice. - While computing the total invoice amount, if the transaction’s invoice ID is encountered again, it should be skipped to avoid double-counting. [3]: https://github.com/odoo/odoo/blob/75f6be6744006ed1a3c0857881822723f90f5d4a/addons/pos_sale/models/sale_order.py#L46-L51 opw-5415404 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255474 Forward-Port-Of: odoo/odoo#242026
This update ensures that email templates, like those used for invoices, correctly pass the specified 'Reply-To' address when sending emails. Previously, the system was overriding this setting, leading to misdirected replies. This change guarantees emails are sent with the intended recipient information.
Original PR description
Steps to reproduce: 1. Go to an Email Template (e.g., 'Invoice: Send by email') and set a specific 'Reply-To' address. 2. Open a posted Invoice and click the 'Send & Print' button. 3. Ensure the…
Steps to reproduce: 1. Go to an Email Template (e.g., 'Invoice: Send by email') and set a specific 'Reply-To' address. 2. Open a posted Invoice and click the 'Send & Print' button. 3. Ensure the 'Email' method is selected and click 'Send'. 4. Observe the sent email in the chatter or the mail queue. Observation: The 'Reply-To' header is overwritten by the system's catchall or author email, ignoring the template setting. Cause: The 'account.move.send' logic processes email data via the '_get_mail_params' method. This method manually constructs a dictionary of parameters to be passed to 'message_post'. However, it only explicitly includes a fixed set of fields (author_id, body, subject, partner_ids, and attachments), effectively filtering out the 'reply_to' value. When 'message_post' is called without this key, Odoo's mail thread logic defaults to the standard '_notify_get_reply_to' calculation, causing the custom template configuration to be lost. Solution: Update the '_get_mail_params' method to safely extract the 'reply_to' value from the move data and include it in the parameters dictionary passed to the mail engine. opw-5922963 Forward-Port-Of: odoo/odoo#255489 Forward-Port-Of: odoo/odoo#249116
This update ensures that when replenishing stock from one warehouse to another (using the 'resupply' feature), the delivery address correctly reflects the destination warehouse. Previously, the delivery address wasn't being set properly, causing issues with tracking stock movements. This fix resolves a bug related to how the system handles stock replenishment across warehouses.
Original PR description
### Steps to reproduce: - Ensure that sale_stock is installed - In the settings enable Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Warehouses - Create a second warehouse…
### Steps to reproduce: - Ensure that sale_stock is installed - In the settings enable Multi-Steps Routes - Inventory > Configuration > Warehouse Management > Warehouses - Create a second warehouse WH2 and enable: Resupply from WH1 - Create a physical product using the route: Resupply from WH1 - Click on the product form cog wheel icon > Replenish - Replenish 1 unit to warehouses 2 #### > The delivery that was created from WH1 to the inter company transit location does not set the `partner_id` (delivery address) to the partner of warehouse 2. ### Cause of the issue: Triggering the replenish will create a move chain relying on the `_run_pull` mechanich. In particular, the receipt move will be created first from Inter-company transit to `WH2/Stock` without `partner_id`: https://github.com/odoo/odoo/blob/b9845f693af28e1d9fac773ae391b29f6831e982/addons/stock/models/stock_move.py#L1709 https://github.com/odoo/odoo/blob/b9845f693af28e1d9fac773ae391b29f6831e982/addons/stock/models/stock_move.py#L1674-L1677 Then, during its confirmation, the delivery move from WH1/Stock to the intercompany transit location will be created based on the rule and, thanks to these lines: https://github.com/odoo/odoo/blob/b9845f693af28e1d9fac773ae391b29f6831e982/addons/stock/models/stock_rule.py#L342-L349 The `partner_id` of WH2 will be set as the `partner_id` of the delivery. Since there is a single partner this will also set the partner of the `move_values` of the delivery move we are creating to this partner: https://github.com/odoo/odoo/blob/b9845f693af28e1d9fac773ae391b29f6831e982/addons/stock/models/stock_rule.py#L355-L360 However, if `sale_stock` is installed that `move_value` is reset to the value provided by the procurement values just a few lines bellow: https://github.com/odoo/odoo/blob/b9845f693af28e1d9fac773ae391b29f6831e982/addons/stock/models/stock_rule.py#L381-L384 because the `partner_id` field is part of the field name returned by the `_get_custom_move_fields`: https://github.com/odoo/odoo/blob/b9845f693af28e1d9fac773ae391b29f6831e982/addons/sale_stock/models/stock.py#L173-L176 Since the `partner_id` value provided by the procurement values was `False`, it resets the the `partner_id` creation value to `False`. ### Fix: As the flow relies on the value provided here: https://github.com/odoo/odoo/blob/c4f8eb2824bef7348e3f94031140450daa4df651/addons/stock/models/stock_rule.py#L342-L349 when `sale_stock` is not installed but relies on the value of the procurement provided here: https://github.com/odoo/odoo/blob/c4f8eb2824bef7348e3f94031140450daa4df651/addons/stock/models/stock_move.py#L1709 https://github.com/odoo/odoo/blob/c4f8eb2824bef7348e3f94031140450daa4df651/addons/stock/models/stock_move.py#L1674-L1677 if `sale_stock` is installed, it is necessary that both provide the same value to keep coherence in the flow. However, since the partner is will be expected to be set also via the procurement values, it is necessary to adapt the condition to which we will set a partner on the reception of the inter-company-transit: https://github.com/odoo/odoo/blob/c4f8eb2824bef7348e3f94031140450daa4df651/addons/stock/models/stock_rule.py#L349 Which is the reason why we moved this line should be triggered only if no partner was set by the procurement values. opw-6034309 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254855
This update fixes a bug where custom snippets didn't display their dynamic content in the preview. The change ensures that dynamic snippet data is correctly reflected when previewing custom snippets, improving the website builder experience and allowing users to accurately see the content they're creating.
Original PR description
*: website_blog, website_event, website_sale The interaction for filling the dynamic content of dynamic snippets did not run inside the iframe to preview the snippet to add. This is not an issue for…
*: website_blog, website_event, website_sale The interaction for filling the dynamic content of dynamic snippets did not run inside the iframe to preview the snippet to add. This is not an issue for the initial dynamic snippet, as they are filled with fake content. But when saving a custom snippet, the dynamic content is cleared, and they seem empty when previewed. This is the case since the [website builder refactor] as the previous builder re-used the preview of the initial snippet. This commit adds the interaction to fill dynamic content in the preview iframe, and changes the interaction to avoid emptying the fake content from initial dynamic snippets during preview. Steps to reproduce: - Open website builder - Add a dynamic snippet (for example "Events") - Save the snippet as a custom snippet - Click on "Custom" snippet category - Bug: The preview for the custom snippet does not have the dynamic part (there is no event, just the title) [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5427353 Forward-Port-Of: odoo/odoo#253985 Forward-Port-Of: odoo/odoo#246328
This update ensures that thread unread counters accurately reflect the number of unread messages in the Inbox, even after refreshing the page. Previously, the counters were incorrect after a refresh, leading to misleading information. This fix improves the user experience by providing accurate thread status.
Original PR description
***: test_discuss_full** **Description of the issue this PR addresses:** Thread unread counters should reflect the actual backend state as soon as Inbox messages are loaded, not only after a new bus…
***: test_discuss_full** **Description of the issue this PR addresses:** Thread unread counters should reflect the actual backend state as soon as Inbox messages are loaded, not only after a new bus notification is received. **Steps to Reproduce:** - Log in as User A and User B. - Ensure User A preferences set to Handle in Odoo. - From User B, mention User A in the chatter of a record. - From User A, Open the messaging menu, counter for that related thread is correct. - Refresh the page. - Open the messaging menu again, the thread now shows a grey badge instead of the expected unread counter. **Current behavior before PR:** - When loading Inbox messages, related `mail.thread` records (such as project.task) did not include unread counters in the store payload. As a result, threads that already had unread messages appeared as (grey badge) after a refresh, leading to an incorrect counter state. - Additionally, frontend-only counter adjustments could sometimes lead to inconsistent or even negative unread values due to missing initial sync. **Desired behavior after PR is merged:** - Threads with existing unread messages now receive the correct counter state, when Inbox messages are fetched. - This also prevents inconsistent or negative counter values caused by frontend-only updates. - This also ensures updating the `inbox query list` and corresponding `query count`: task-[5474143](https://www.odoo.com/odoo/project/1519/tasks/5474143) Before/After (**on refresh**): <img width="461" height="55" alt="image" src="https://github.com/user-attachments/assets/2fc57aba-049c-4129-95b1-1d2b2770ac66" /> <img width="469" height="57" alt="image" src="https://github.com/user-attachments/assets/111d10bb-2aec-4711-8f5a-af7f332021d8" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252611 Forward-Port-Of: odoo/odoo#247569
This update resolves an issue where cash rounding was incorrectly applied during the consolidation of Point of Sale orders into invoices. Previously, when only non-cash payment methods were used, the system generated incorrect accounting entries. This fix ensures that cash rounding only occurs when a cash payment is involved, preventing errors and maintaining accurate financial records.
Original PR description
When consolidating POS orders into a single invoice, the cash rounding adjustment logic was triggered whenever cash rounding was enabled on the POS configuration, even if the payment methods were not cash.
In scenarios where only non-cash payment methods (card or customer account) were used, 'invoice.invoice_cash_rounding_id' could legitimately be unset as 'only_round_cash_method' is enabled. However, the rounding adjustment code still attempted to create a rounding line using accounts from this field.
This resulted in a NULL `account_id` on a rounding line ("Missing required account on accountable line")
This fix ensures that the rounding adjustment logic only executes when there is cash payment (meaning that 'invoice_cash_rounding_id' exsists).
Related to opw-5969706
Forward-Port-Of: odoo/odoo#251862This update addresses a performance issue during Odoo tests by proactively generating bundled files before test execution. Previously, these bundles were created on the fly, slowing down the testing process. This change ensures faster and more reliable test runs, contributing to overall system stability.
Original PR description
tl;dr: look for lazy loaded bundles and add them to the bundles' list to pregenerate before running tests to avoid generation on the fly. Forward-Port-Of: odoo/odoo#248256
This update corrects a bug where manual Stripe SEPA payments were immediately canceled, even when the transaction was pending. Previously, this caused subscriptions to close after a delay. The fix ensures payments remain in a 'pending' state until the Stripe transaction is confirmed, preventing subscription closures.
Original PR description
**Problem:** When manually registering a payment using a Stripe SEPA Direct Debit token, the associated `account.payment` is immediately canceled, even though the Stripe transaction is in "Pending"…
**Problem:** When manually registering a payment using a Stripe SEPA Direct Debit token, the associated `account.payment` is immediately canceled, even though the Stripe transaction is in "Pending" status. Later, when Stripe confirms the transaction, the payment remains canceled, leading to subscription closures after 90 days of apparent non-payment. **Steps to reproduce:** 1) Set a customer address to Belgium and add a SEPA Direct Debit payment token via Stripe. 2) Change the company currency to euro. 4) Create a manual invoice for that customer. 5) Pay the invoice using the pre-configured Stripe SEPA token. 6) Observe the `account.payment` is immediately canceled despite the transaction being "Pending". 7) When Stripe confirms the transaction, the payment stays canceled. **Cause:** In `account_payment.action_post()`, after sending the payment request, all payments whose transaction state was not `done` were canceled. For asynchronous payment methods like SEPA Direct Debit, the transaction starts in `pending` (not `done`), so the payment was wrongly canceled. **Solution:** - Only cancel payments whose transaction ended in a failure state (not in `done`, `pending`, or `authorized`), so pending/authorized payments stay in draft/in_process. **NOTE** In v19.2 the states naming got changed by this commit https://github.com/odoo/odoo/commit/34280f6e14e291ba4414eaf6d00d1cee7bbdac5b so now a payment state is set to "paid" no "in_process" after the `payment.action_post()` opw-5934381 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253876
This update fixes an issue where snippet dropzones weren't correctly activated within the editor, preventing users from adding certain snippets to specific areas. The change ensures that dropzones are now dynamically determined by the selected snippet, resolving a conflict where sanitization rules were bypassed. This improves editor functionality and allows for more accurate snippet placement.
Original PR description
Before this commit, the dropzones activated would not always be correct clicked on a group and then selected a snippet. The dropzones would be determined based on a default section and not based on the selected snippet. Therefore, even though there could be rules preventing a snippet from behing in a certain dropzone, the dropzone would still be activated because the snippet chosen would not be taken into account. This commit fixes the issue by using the chosen snippet to activate the dropzones. task-5428387 Forward-Port-Of: odoo/odoo#240547
This update corrects a visual issue where the grid layout on the website was missing a left border when viewed on smaller screens. The problem stemmed from a minor typo in a CSS selector. This ensures a consistent and professional appearance for all users, regardless of screen size.
Original PR description
On smaller viewports the sidebar is hidden and the grid misses a left border. It's because of a selector typo. task-6059942 <img width="845" height="925" alt="image" src="https://github.com/user-attachments/assets/9ebb8a04-c3ce-40fd-acfa-8a17fbc31e3a" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255318
This update optimizes the process of exporting financial data (FEC) from large Odoo databases. Previously, the entire export file was loaded into memory, causing potential errors. Now, the data is streamed to the user, improving performance and preventing memory issues for complex transactions.
Original PR description
On large databases (millions of account moves), The FEC exported file can be huge. This resulted in memory error since at some point we have the entire file in memory. This commit aims to overcome this issue by streaming the content of the file to the user. task-5404142 Forward-Port-Of: odoo/odoo#254683 Forward-Port-Of: odoo/odoo#240981
This update resolves a frequent issue where EU tax ID checks failed due to VIES server errors, particularly in France. We’ve switched to a more reliable system using the IAP server, which automatically updates tax ID validity. This ensures accurate intra-com processing and enhances data integrity.
Original PR description
Currently, when changing the Tax ID of a partner that is another EU country, we perform a VIES check to know whether it is valid (i.e. can do intra-com). However, it is often the case that the VIES check fails because of an internal error on their side (timeout, max concurrent update, ...), especially for France. Instead, we will now use the IAP server which stores the validity of a Tax ID for some time. If the IAP server does not have the info (because VIES is down), we will not actively wait. Instead, IAP will perform a push to a webhook on the client database once it has the information. For security purposes, an HMAC is generated and sent to IAP so that only IAP can contact the db with the up-to-date info, and not anyone on the internet that calls this new webhook. task-5977584 PR IAP: https://github.com/odoo/iap-apps/pull/1473 Forward-Port-Of: odoo/odoo#255279 Forward-Port-Of: odoo/odoo#251988