Daily updates from Odoo
Wednesday, March 25, 2026
52 changes · saas-19.1
New functionality added to Odoo
This update reintroduces the generation of a proxy token for the l10n_eg_iot module, specifically to support the Egyptian VAT (IoT) functionality. Previously, a modal was used to display the token, which was deemed unnecessary by most users. Now, the token is displayed directly in the database for this module, streamlining the process for Egyptian users.
Original PR description
Proxy token generation was removed to avoid showing a modal with a token nobody cares about except Egypt. We reintroduce token generation, but display it to the database instead of showing a modal. see odoo/odoo#255121 Forward-Port-Of: odoo/enterprise#111496
Enhancements to existing features
This update improves the Project Side Panel by allowing more budget details to be displayed. Specifically, it enables inheritance to include additional budget information, enhancing the visibility of project financial data. This change provides greater insight into project spending.
Original PR description
Enabling the inheritance of the method _get_budget_items to include more budget information, by adding a method for the budget items domain. Forward-Port-Of: odoo/enterprise#107466
This update enhances debugging of Chrome within Odoo by capturing detailed logs when Chrome encounters issues, such as tab terminations. These logs provide more specific information than previous methods, aiding in identifying and resolving stability problems. Administrators can control the level of logging through a new environment variable.
Original PR description
Followup and partial revert of #232612: turns out chrome's stderr is worthless at best and confusing at worst (because it logs a bunch of dbus errors which don't actually matter), however chrome…
Followup and partial revert of #232612: turns out chrome's stderr is worthless at best and confusing at worst (because it logs a bunch of dbus errors which don't actually matter), however chrome turns out to have pretty extensive debug logging facilities which are somewhat valuable: https://www.chromium.org/for-testers/enable-logging/
For instance if the oomkiller decides to nuke a chrome tab (example selected for no reason whatsoever), the debug log will have an entry along the lines of
[...:WARNING::chrome/browser/ui/sad_tab.cc:256] Tab Killed: http://127.0.0.1:8069/
which is a much more helpful hint than just being told a test timed out (to say nothing of being told that chrome was not able to do dbus stuff when we never asked for that).
Because it can be useful for all sort of debugging, this log is saved not just when chrome fails to start, but also when a Chrome completes, successfully or unsucessfully (in the latter case it's logged as RUNBOT to be available from the runbot UI).
The chrome logging facilities are controlled by a new envvar `ODOO_BROWSER_LOG_VERBOSITY`, it can be set to `-1` to disable logging, or a strictly positive integer for ever increasing amounts of logging. At `1` chrome will log every network request it attempts which can be useful for debugging some races but is already extremely noisy.
Forward-Port-Of: odoo/odoo#255548
Forward-Port-Of: odoo/odoo#255054This update streamlines the process for generating IoT driver tokens in Egypt. Previously, a modal prompted users for tokens, which was found to be unnecessary for this region. Now, tokens are automatically generated and stored in the database, improving efficiency and user experience.
Original PR description
Proxy token generation was removed to avoid showing a modal with a token nobody cares about except Egypt. We reintroduce token generation, but send it to the database instead of showing a modal. see odoo/enterprise#111496 Forward-Port-Of: odoo/odoo#255121
Resolved issues and error corrections
This update enhances payroll calculations, particularly for employees with changing contracts during a pay period. By grouping payslips and considering previously calculated amounts, the system now accurately avoids overpaying contributions and allowances, especially in Hong Kong. This ensures greater payroll precision and compliance.
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#111570
This update resolves an issue where the AEAT tax report file was being rejected due to an incorrect date format. The fix ensures the file includes a default numeric date ('00000000') when the procuration date is not specified, meeting 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 resolves two bugs preventing new employee creation in the Belgian payroll module. The first issue involved duplicate record creation due to a mail activity trigger. The second addressed a problem where activities were attempted before the employee record was fully saved. These fixes ensure reliable employee onboarding within the Belgian company setup.
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 fixes a potential issue where a user could indirectly change an employee's work email through contract settings. Previously, linking an employee to a user allowed for unintended email modifications. Now, the system ensures the work_email remains consistent if the employee is associated with a user, improving data integrity.
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#110810
A technical issue causing a tour to fail has been resolved. This change adjusted the company referenced within the tour, addressing a previously unreplicable access rights problem. The fix ensures the tour now runs correctly, improving the user experience.
Original PR description
Before this commit, the tour `hr_referral_utm_campaign_tour` was failing because of some weird access rights issues. The issue did not seem to be reproducible in local with similar condition. This commit changes the company used in that tour runbot issue 239152
This update significantly speeds up the bank reconciliation view, particularly when dealing with large volumes of financial data. The previous freezing issue was caused by redundant calculations, which has now been resolved by optimizing the system's performance. This results in a much faster and more responsive user experience.
Original PR description
The bank reconciliation view was freezing on large databases (50k+ invoices, 90k+ journal entries), making it impossible to expand lines, filter, or interact with the view in any way. Attempting to…
The bank reconciliation view was freezing on large databases (50k+ invoices, 90k+ journal entries), making it impossible to expand lines, filter, or interact with the view in any way. Attempting to open a line would sometimes result in a timeout. **Root cause:** The `reconciledLineName` getter was called multiple times per render cycle — once in `t-foreach` and again in the `t-if` condition. Since OWL re-evaluates the template on every reactive state change, this created an O(n×m) computation loop (n renders × m statement lines) that overwhelmed the browser. **Fix:** Cache the result in OWL reactive state via a dedicated `_computeReconciledLineName()` method, called once on setup and reactively via `useEffect` when `line_ids.records` changes. The template is updated to store `Object.entries(reconciledLineName)` in a `t-set` variable to avoid rebuilding the array on every iteration. | Metric | Before | After | |---|---|---| | Longest blocking task | 15 091 ms | 5 118 ms | | Total blocking time | 74 147 ms | 22 481 ms | | Avg. click response | 2 163 ms | 28 ms | | Max click response | 14 305 ms | 222 ms | | Total microtasks executed | 9 917 | 32 484 | opw-5879798 Forward-Port-Of: odoo/enterprise#107135
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 impacting report accuracy and preventing errors.
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 an issue where users could inadvertently create 'Requested Documents' instead of folders when syncing Peppol documents through the accounting settings. To avoid a confusing 'My Drive' folder creation, the ability to create or edit documents within the settings has been disabled, aligning with a previous fix.
Original PR description
Before this commit a user could create or edit a folder in the accounting settings to sync peppol documents to. The issue was that this created a 'Requested Document' instead of a folder. This commit removes the possibility to create or edit documents through the settings. An alternative would have been to add the contex to create a Folder instead of a Requested Document, however another problem then arises: the folder is created in My Drive, which does not make any functional sense. Therefore we are disabling creation and edit. This is the same logic applied in 8ada2a4f. Task-6063736 Forward-Port-Of: odoo/enterprise#111761
This update resolves a problem where invoices with discounts and decimal values (over 2 decimals) were failing to send to ARCA for electronic invoicing. The fix uses a simplified unit price to calculate discounts, ensuring accurate decimal calculations and successful invoice transmission. This improves the reliability of our ARCA integration.
Original PR description
After changes made in Odoo of how the decimal precision works some of the code we use to prepare the data to create EDI invoices now fails. We already adapt the code to fix the data depending of the expected webserive format but we miss a case related to when invovice has discounts. The problem is that any invoice with lines that has more than 2 decimals and also have a discount will fail when trying send it to ARCA because the computed amount has differences in the decimals. Now we use the truncated unit price to compute the discount instead of the full amount with decimal of the `line.price_unit` value. Forward-Port-Of: odoo/enterprise#110706
This update corrects a rounding error in the US payslip PDF that was causing incorrect overtime rates for very small work durations (like seconds). The fix now calculates the rate directly from the work entry, ensuring accurate overtime pay is displayed. This improves the precision of US payroll reporting.
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
A recent update to Odoo Enterprise prevented the deletion of newly created approval rules within the Studio interface. This was caused by the way the system managed updates to these rules, leading to data inconsistencies. This fix ensures that these rules are properly managed, preventing data loss during updates.
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 a technical issue that caused a traceback error when generating the 281.10 report for Belgian payroll. The fix ensures the report correctly identifies payslips without the Fleet module, preventing errors and improving report generation reliability. This resolves a disruption in generating key financial reports.
Original PR description
[FIX] l10n_be_payroll: fix traceback in 281.10 sheets
Bug reproduction: Go to any version>=17.0 -> select belgium company -> install only belgium payroll (don't install fleet one) -> fill in niss, certification level, address, Time in R&D -> generate payslip and confirm it -> try to generate 281.10 report -> traceback
Bug cause:
1 - In traceback it was saying payslip doesn't have vehicle_id, in 281.10 sheet preparation (in function _get_atn_nature), there is a term like that
2 - Payslip doesn't have it because fleet module is not there.
Bug solution:
1 - Instead of checking the payslip has vehicle like that, we calculated it by using paylsip line_ids
2 - If the code ATN.CAR is there and the total of it is not zero, which means this payslip has a vehicle indeed.
task - 6037206
Forward-Port-Of: odoo/enterprise#111506
Forward-Port-Of: odoo/enterprise#110860This 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 consistently attach the original XML files to the Documents app. This change ensures all XML files are now correctly linked, improving document management and compliance.
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#106574
This update fixes an issue where project budget totals were incorrectly summing expenses and revenue. The code was adjusted to properly differentiate between expense and revenue budgets when calculating totals, ensuring accurate reporting of project financial status. This improves the reliability of project cost tracking.
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 for each user, improving data accuracy and user 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 a technical issue that caused warnings during the initial setup of reports for Belgian accounting. The fix ensures that report generation works correctly by providing a backup method for identifying account references, even when standard XMLIDs are missing. 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 technical issue where certain invoice PDFs (specifically for FCAM, FCAP, and FESP document types) were missing legally required 'complementos' data. The fix ensures that all invoices generated using the l10n_gt_edi module comply with tax regulations, preventing potential compliance problems. This change improves data accuracy and reduces risk.
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 ensures that changes to a subscription's salesperson are automatically reflected on all associated contacts. Previously, updates only applied to the company partner, leading to inconsistencies. This improvement streamlines workflows and eliminates manual data updates.
Original PR description
Before this commit, changing the salesperson on a subscription only updated the company partner, leaving child contacts with outdated salesperson info. After this commit, updating the subscription's salesperson also updates all child contacts of the company, ensuring consistency across the portal and reducing manual work. An unit test was added to ensure this behavior. task-5917271 Forward-Port-Of: odoo/enterprise#111499 Forward-Port-Of: odoo/enterprise#108339
This update resolves an issue where equity transactions couldn't be created in currencies other than the company's default (USD). Now, users can set the equity currency for the first transaction, ensuring flexibility and accuracy when managing equity values in multiple currencies. Subsequent transactions will automatically use this selected 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 resolves a bug where removing an EPD line in bank reconciliation incorrectly removed associated tax lines. Now, only the EPD line and its corresponding tax line are properly removed, ensuring accurate reconciliation reporting. This improves the reliability of bank statement processing.
Original PR description
When removing an EPD line in the bank rec widget, if the invoice line added to the statement line contained a tax, the invoice line was removed aswell. Now, only the EPD line and its tax line are removed. no-task Forward-Port-Of: odoo/enterprise#110514
This update resolves a technical issue preventing users from generating VSME and CSRD reports within the ESG app. The fix removes an unnecessary check in the report search process, which was causing an error. This ensures reports can now be successfully printed.
Original PR description
Steps to reproduce:
1. From Accounting, create a Vendor bill with today's date, and containing a line
2. Confirm (post) it
3. Make the Payment ('Pay' stat button)
4. Create a VSME or CSRD report from the ESG App, for the current year
5. Try to print it
=> A traceback occurs (in _get_payment_terms_data()) as we are trying to search on the 'active' field of account.move, which does not exist. => Solution: remove this uneeded check
version-19.0
Forward-Port-Of: odoo/enterprise#111816This update prevents data merge operations from silently failing due to timeouts. Instead, a warning is displayed, suggesting users merge smaller groups of records. Upon successful completion, the model is automatically reloaded, ensuring data integrity and a smoother user experience.
Original PR description
Display a warning notification when the merge operation times out instead of failing silently. Suggest merging fewer records and reload the model on success. task-5912855 Forward-Port-Of: odoo/enterprise#110763
This update corrects a problem with importing invoices from the Italian tax authority (EDI) due to how attachments were handled within the XML files. The fix prevents data corruption and ensures attachments are correctly processed, improving the reliability of the EDI import process. Additionally, the naming of attachments has been improved.
Original PR description
PR #212726 removed a Many2One field and used an existing binary field, `l10n_it_edi_attachment_file`, to store E-invoice files as XMLs. This change was made for security reasons. However, this PR…
PR #212726 removed a Many2One field and used an existing binary field, `l10n_it_edi_attachment_file`, to store E-invoice files as XMLs. This change was made for security reasons. However, this PR also stores attachments embedded in the `<Allegati>` element of the XML in this same field. This results in three issues when importing invoices from the SDI: 1. The first embedded attachment will overwrite the XML file's contents, corrupting it. 2. Subsequent embedded attachments will continue to overwrite the previous attachment. 3. All embedded attachments are linked to the `account.move` record by the Many2one field `attachment_ids`, which is contrary to the stated goal of PR #212726. These behaviors cannot be replicated in a runbot environment, as there is no way to test the SDI import process in runbot at the time of writing. Localhost environments can replicate this issue by receiving an XML from the test l10n_it API server, or by passing similarly encrypted data to the method `_l10n_it_edi_process_downloads()`. See the method `test_decrypt_invoice_from_IAP()` from PR #250439 for an example of the encryption process. **Solution**: Do not overwrite the field `l10n_it_edi_attachment_file`. Add stored field(s) to master for attachment(s) within an XML's `<<Allegati>` element. This PR also improves how Allegati attachments are named, as my previous PR #246220 could result in files with two extensions (e.g. "filename.txt.TXT"). Ticket [link](https://www.odoo.com/odoo/project.task/5800658) opw-5800658 Forward-Port-Of: odoo/odoo#252806
This update resolves a gap in documentation for the Direct Deposit module within the l10n_us_account add-on. Now that the module is fully integrated, a link to the relevant direct deposit documentation has been added to the settings view, improving clarity for users.
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
This update fixes a potential error that occurred when creating returns for delivery orders. Previously, manually adjusting quantities after validation could cause calculations to fail. The change now prevents quantity updates on validated pickings, ensuring accurate return computations and data consistency.
Original PR description
Currently, an error occurs when creating a return for a delivery order whose quantity has been manually set to zero after validation. **Steps to reproduce:** - Install `stock_account` module. - Create and validate a delivery order. - Unlock the order and set the product quantity to 0. - Create a return order and validate it. **Error:** `ZeroDivisionError - float division by zero` **Cause:** The system allows quantities to be modified even after the picking is validated, leading to inconsistent data during return computations. **Fix:** This commit makes the quantity field read-only once the picking is in the done state to prevent invalid updates. sentry-7345265575
This change corrects a bug where the 'Pick Up in Store' delivery option was incorrectly displayed for products with excluded tags. The fix ensures that unavailable delivery methods aren't shown to customers, improving the website's accuracy and user experience. This aligns with existing checkout behavior.
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 corrects a bug where down payment lines were incorrectly duplicated when settling POS orders with online payments enabled. The fix ensures that only the first down payment line matching the payment amount is added, preventing data inconsistencies. This improves the accuracy of POS order totals and simplifies reconciliation.
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#255420 Forward-Port-Of: odoo/odoo#242026
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 closely examine product details, leading to better customer engagement 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 ensures that emails generated from invoices and other documents consistently use the 'Reply-To' address specified in the email template. Previously, the system was overriding this setting, leading to misdirected replies. This fix improves email communication and ensures recipients receive replies to the intended address.
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#249116
This update resolves a technical issue that caused an error when users accessed the project dashboard. Specifically, the system was incorrectly trying 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 fixes a potential issue where users could inadvertently assign inherited views to groups, leading to errors during module upgrades. The change adds a validation rule to prevent this, ensuring groups are defined correctly within the view XML, simplifying the system and reducing potential upgrade problems.
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 resolves an issue where the global search modal prevented users from adding snippets to product pages. The fix ensures the modal closes automatically when entering edit mode, allowing seamless snippet functionality. This improves the user experience for adding product information.
Original PR description
Steps to reproduce: - Go to the Shop and enable the floating toolbar. - Click the search icon in the header. - When the search modal opens, click 'Edit' to enable website editing. - Try to add a snippet from the floating toolbar. => The same issue also occurs on individual product pages. Observed behavior: Snippets cannot be added while the global search modal remains open. Expected behavior: Snippets should be draggable and added normally in edit mode. This PR ensures that the global search modal is closed when entering edit mode, preventing it from blocking add snippet. task-5905963 Forward-Port-Of: odoo/odoo#253724 Forward-Port-Of: odoo/odoo#247781
This update resolves an issue preventing users from editing multiple stock counts simultaneously within the physical inventory list view. The previous system triggered confirmation popups prematurely, disrupting the bulk editing process. This change synchronizes the editing of quantity fields, enabling users to efficiently update stock counts for multiple items at once.
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 fixes a bug where duplicating a manufacturing order (MO) would incorrectly link a new purchase order to an outdated quantity. The change prevents the duplication of the MO reference, ensuring purchase orders accurately reflect the correct production needs. This avoids over-ordering and potential stock discrepancies.
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 across manufacturing orders, streamlining the RFQ process and preventing duplication. This improves order grouping and reduces manual effort.
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 corrects a validation issue that prevented invoices with recupel taxes applied to negative lines from being correctly processed. The fix ensures that the XML generated for these invoices meets required standards, particularly when using Peppol for electronic invoicing. This resolves a problem impacting invoice accuracy 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 bug where custom snippets created from dynamic snippets had incorrect layouts. The fix prevents the cleaning code from removing attributes that should be preserved when creating a custom snippet, ensuring consistent layouts. This improves the user experience when customizing website content.
Original PR description
The commit ae4824640665fc639e03a13c341f18e73060349e, added cleaning of some attributes used by filter controller for dynamic snippet. Those attributes are also saved when changed by the user. When the user creates a custom snippet based on a dynamic snippet, the attributes appears legitimately on the root of the view, but the cleaning code removes them. This commit adds a condition to only remove those attributes only if the node is "not static" (and therefore are not causing the issue for which the cleaning code was added). Steps to reproduce: - Open website builder - Drop the snippet `s_blog_posts_horizontal`, and click on it - Save it as a custom snippet - Drop the custom snippet - Bug: The layout is different than the original snippet task-5969305
This update corrects a visual issue in the restaurant floor plan display when using RTL languages like Arabic. Previously, elements were positioned incorrectly due to how the UI handles right-to-left text. This change ensures accurate placement of tables and decorations for all users.
Original PR description
In RTL languages (e.g. Arabic), `position: absolute` elements anchor to the top-right corner of their containing block instead of top-left. Since floor plan elements are positioned via `transform: translate(left, top)` using pixel coordinates stored from a top-left origin, all tables and decor elements were rendered at wrong positions when the UI direction was RTL. opw-6040855 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the user interface would freeze during reloadable operations. The fix ensures the UI is always released, preventing blocks and improving the overall user experience. This enhancement contributes to a smoother and more reliable application for our users.
Original PR description
Since commit [1], the UI is blocked during a reloadable operation, but an early exit on error prevented unblock() from being called. This commit fixes it by wrapping it in a try/finally to ensure the UI is always unblocked. [1]: https://github.com/odoo/odoo/commit/453b7eb8e038ee8e8a54de16fc1a45fb2fab573a Forward-Port-Of: odoo/odoo#255477
This update corrects a bug where an extra product received during a backorder creation would automatically trigger the creation of an additional return. The fix ensures that only the necessary products are involved in the backorder process, streamlining operations and preventing duplicate return records. This improves data accuracy and reduces manual intervention.
Original PR description
When creating a backorder because of missing product, if there is an extra product received it will create a return also create a return for that product. ### Steps to reproduce: * Create and confirm…
When creating a backorder because of missing product, if there is an extra product received it will create a return also create a return for that product. ### Steps to reproduce: * Create and confirm a purchase ordre for 2 products (A & B) * Add a product C to the picking order and reduce the quantity of product B received * Validate the picking ordre * Create a backorder * Go back on the PO and open the linked pickings -> There is delivery linked for product C ### Observation: When processing the backorder, it will sync the delivery and the PO with _action_synch_order where it will add the new product to the PO: https://github.com/odoo/odoo/blob/1a62c4333de61a4e1358ef8e229b2e0f5a3e9826/addons/purchase_stock/models/stock_move.py#L88-L89 The create that is started by the creation of the new POL will trigger _create_or_update_picking that will create a stock move and a picking: https://github.com/odoo/odoo/blob/2855f0f2b0ffbc340e2af4785dde5bf465579ee8/addons/purchase_stock/models/purchase_order_line.py#L97 https://github.com/odoo/odoo/blob/2855f0f2b0ffbc340e2af4785dde5bf465579ee8/addons/purchase_stock/models/purchase_order_line.py#L197-L198 opw-5868172 Forward-Port-Of: odoo/odoo#248433
This update ensures that when replenishing stock from one warehouse to another (using the resupply feature), the delivery address is correctly set to the destination warehouse's location. Previously, the address wasn't being populated, causing issues with order fulfillment. This fix resolves a bug related to how move chains are created during the replenishment process.
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 streamlines our testing process by proactively generating bundles used in Odoo's templates. Previously, these bundles were created on-the-fly during testing, which slowed down the entire process. This change ensures faster and more reliable test execution, leading to quicker development cycles.
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 replaces the unreliable VIES check for validating EU VAT IDs with a more robust system using the IAP server. This prevents delays and errors, particularly for French partners, ensuring accurate intra-com tax calculations. Security is enhanced through HMAC authentication for secure data updates.
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#251988
This update resolves an issue where PDF merging errors didn't consistently display user-friendly error messages. The fix ensures that a clear error message is always presented to the user when PDF merging fails, regardless of the underlying cause (like a corrupted PDF). This improves the user experience and prevents confusion.
Original PR description
When merging pdfs, if there is an error when meging those pdfs (due to a malformed PDF for example), the UserError that should be shown to the user is not due to an error in the arguments given to the handle_error function.
The aim here is to keep the same function signature and edit the signature of the local function used when a custom_handle_error was defined and edit the function itself.
The error message appeared when I was working on a task to change a
test and tested it on master and got the following stacktrace:
```
...
File "/home/odoo/Desktop/src/odoo/odoo/addons/base/models/ir_actions_report.py", line 788, in _merge_pdfs
handle_error(error=e, error_stream=stream)
TypeError: IrActionsReport._handle_merge_pdfs_error() missing 1 required positional argument: 'self'
```
Discovered during : task-3603619
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#211611This update resolves a bug where Stripe SEPA payments were immediately canceled upon initiation, even when the transaction status was 'Pending'. This prevented successful payment processing and risked subscription closures. The fix ensures payments remain in the correct 'Pending' state until Stripe confirms the transaction, improving payment reliability.
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. 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 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
A bug was preventing users from resetting the 'Lead Forward: Send to partner' email template. This update resolves a validation error that occurred when attempting to reset the template, ensuring the forwarding process functions correctly. This fix improves the reliability of lead management features.
Original PR description
Steps to reproduce: - Create a lead > click on gear icon > Forward to partner - Send the forward and ensure there is at least one record of crm.forward.to.partner - Navigate to email templates technical settings menu and search for Lead Forward: Send to partner - Click on Reset Template in the template form Current behavior: - Validation Error thrown Expected behavior: - No validation error thrown and template is reset Note: MailTemplate._check_can_be_rendered was added in version 18.3 which checks for invalid object references when trying to alter + save templates. This template was out of date and fails the check Referenced PR: https://github.com/odoo/odoo/pull/176623 opw-6001560 Forward-Port-Of: odoo/odoo#252599
Features or functions removed from Odoo
This change removes the automatic assignment of a VoIP provider to new users. Previously, users were linked to the first available provider, which created issues for systems with multiple providers. Now, users will not be linked to a VoIP provider by default, aligning with best practices for multi-provider environments.
Original PR description
Following this Pull Request, users will not be linked to any VoIP provider by default. Prior to this Pull Request, users were linked to the first `voip.provider` record found. The rationale behind this behavior has been forgotten, but it was likely implemented to spare admins with a single provider from having to assign one. However, for databases with more than one provider, "nothing" is usually the relevant default. See also: [task-6023412](https://www.odoo.com/odoo/project.task/6023412)