Daily updates from Odoo
Thursday, March 26, 2026
257 changes
24 changes
Enhancements to existing features
This update quietly generates and stores a proxy token for Odoo users in Egypt, eliminating a previous modal prompt that was rarely used. This change streamlines the user experience for Egyptian customers while maintaining security. It addresses a specific need identified in a related Odoo issue.
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#255280 Forward-Port-Of: odoo/odoo#255121
Resolved issues and error corrections
This update fixes a technical issue that prevented users from properly closing the online payment popup in the POS system. The previous system incorrectly relied on an outdated 'currentOrder,' leading to errors. This change ensures the system uses the correct 'order' data, improving the payment process and preventing disruptions for customers.
Original PR description
Before this commit, when the user closed the online payment popup, an error was raised because the currentOrder was not valid and instead order must be used. opw-6034405 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255292
This update resolves an issue preventing the preview of certain reports, specifically the DIN 5008 layout, in Odoo 19.1 and later. The fix addresses a change that removed a key variable used to correctly render these previews, ensuring they function as expected.
Original PR description
Under some conditions, it is currently not possible to render the preview of some layouts To reproduce the issue: (Need `l10n_din5008`) 1. Open Settings more times than the number of companies in the…
Under some conditions, it is currently not possible to render the preview of some layouts To reproduce the issue: (Need `l10n_din5008`) 1. Open Settings more times than the number of companies in the database - (We actually need to increase the psql sequence of its table...) 2. Configure your document layout - Layout: DIN 5008 3. Click "Preview Document" Error: an error is displayed: "Missing record: Record does not exist or has been deleted. (Record: res.company(4,), User: 2)" When clicking on _Preview Document_, we are actually requesting `/report/pdf/web.preview_externalreport/4` Where we have both the report name and the `docids` (equal to `4` in the above example). Since we are calling it from the `res.config.settings`, we provide the doc IDs with the ID of the `res.config.settings`. However, the report is based on the `res.company` model: https://github.com/odoo/odoo/blob/2f64f909d2f20cc8c0a8e95ba7d17348b9b015e6/addons/base_setup/views/res_config_settings_views.xml#L90 https://github.com/odoo/odoo/blob/e602fc2279e85b66c9983741df5d84fab42a3c44/addons/web/views/report_templates.xml#L1006-L1010 As a consequence, the mechanism will try to render the report using the company with ID equal to the ID of the config settings, which does not make sense. This is the reason why, at some point, it can lead to a `Missing Record` error. That said, the case is working well on previous versions because we were defining a global `o` variable before rendering the template, cf for instance on Odoo 19, L896: https://github.com/odoo/odoo/blob/1c2e17718e6f2a11d93585f0ea3ba3abee5a4a41/addons/web/views/report_templates.xml#L893-L897 Thanks to that variable, DIN 5008 side, we ignore the `docs`, cf here for instance: https://github.com/odoo/odoo/blob/dae4fd0000080ba6395b370e25d3f13f1becd74e/addons/l10n_din5008/report/din5008_report.xml#L96 On Odoo 19.1+, this global variable has been removed by [1]. This commit is actually the result of a script (cf its description). Since the script hasn't detected the use of `o`, it moved its declaration inside the previous `t-call`, L829: https://github.com/odoo/odoo/blob/e602fc2279e85b66c9983741df5d84fab42a3c44/addons/web/views/report_templates.xml#L827-L830 This was a mistake since the global variable is sometimes used. Long story short, the script didn't see the dynamic `t-call` inside the template of `web.external_layout`: https://github.com/odoo/odoo/blob/e602fc2279e85b66c9983741df5d84fab42a3c44/addons/web/views/report_templates.xml#L758-L761 We have therefore decided to revert this part of the commit and apply the same logic to its siblings `preview_internalreport` and `preview_layout_report` [1] https://github.com/odoo/odoo/commit/b7ec60d68c6ee23f7684960e33e5bd6290c9d829 OPW-5951003 Forward-Port-Of: odoo/odoo#254198
This update resolves an issue where the expiration date for products wasn't correctly updated when switching between lots. The fix ensures that the expiration date accurately reflects the lot being used, improving inventory management and traceability. This prevents discrepancies in product expiry tracking.
Original PR description
Steps to reproduce: - Enable "Expiration Dates" in Inventory settings - Create a storable product "P1" - Add 10 units with "Lot 1" - Enable expiration dates on product P1 - Add 10 units with "Lot 2"…
Steps to reproduce: - Enable "Expiration Dates" in Inventory settings - Create a storable product "P1" - Add 10 units with "Lot 1" - Enable expiration dates on product P1 - Add 10 units with "Lot 2" and set an expiration date - Create a delivery for 10 units of P1 - Mark as "To Do" - Open the move line -> "Lot 1" is automatically reserved - Change the lot from "Lot 1" to "Lot 2" -> The expiration date is not updated automatically - Save and reopen the move line -> The expiration date is correctly set - Change again to "Lot 1" - Save and reopen the move line -> The expiration date is not reset and incorrectly keeps the value from "Lot 2" Cause: The expiration date was only computed based on `lot_id`, ignoring the `quant_id` used during reservation. Additionally, the value was not reset when switching to a lot without an expiration date. Solution: - Add `quant_id` to the compute dependencies - Compute the expiration date based on `quant_id.lot_id` - Explicitly set an expiration date to today when the use_expiration_date product is set to True and the lot doesn't have an expiration date. Result: The expiration date is now correctly updated and cleared when changing lots on stock move lines. opw-5999294 Forward-Port-Of: odoo/odoo#254610
This update corrects a problem where incorrect withholding reasons on Italian invoices were causing issues during import. The change relaxes the rules to allow taxes with the same withholding type to be used, ensuring invoices are processed correctly. This improves the accuracy of VAT calculations for Italian customers.
Original PR description
Some invoice come in with a wrong ENASARCO withholding reason. We now broaden the search to allow taxes with the same withholding type to be used during import even if the withholding reason doesn't match. In the test, I change the Enasarco tax to reason Q to check that it gets correctly assigned. Ticket [link](https://www.odoo.com/odoo/project.task/5175587), [link](https://www.odoo.com/odoo/project.task/5933699) opw-5175587 opw-5933699 Forward-Port-Of: odoo/odoo#255725 Forward-Port-Of: odoo/odoo#236251
This update resolves an issue where a partner's identification type was incorrectly set based on its country. The change ensures that a partner's ID type remains consistent regardless of the selected country, preventing data discrepancies and improving data accuracy for Latin American reporting. This fix was implemented to maintain the integrity of partner records.
Original PR description
**PROBLEM** PR: https://github.com/odoo/odoo/pull/179078 Removed _onchange_country_id() which was used to set the identification type according to the country of the partner. This PR reintroduce it, so id type and country remains consistent. **STEP TO REPRODUCE** 1. install l10n_ar and l10n_co. 2. create a new partner. 3. set its country to Argentina, and select an argentinian id type. 4. set the country to Colombia and save. You end up with a partner from Colombia, with a id type that is used for Argentinian partners which shouldn't be possible. opw-5801824 Forward-Port-Of: odoo/odoo#248585
This update ensures that Point of Sale orders are automatically assigned a default product preset when one isn't explicitly provided. Previously, orders created without a preset ID would not use the configured default. This change aligns with how other key settings like price lists are handled, ensuring consistent and reliable order processing.
Original PR description
When a pos.order was created without a preset_id (e.g. frontend order synced before the async preset dialog resolved, or any other path that omits the field), _complete_values_from_session did not fall back to the config's default_preset_id. Apply it the same way pricelist and fiscal position are defaulted, without overriding an explicitly passed value. opw-5997872 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251934
This update resolves an issue where custom snippets created from dynamic snippets would have a different layout than the original. The fix ensures that attributes from dynamic snippets are preserved when creating custom snippets, maintaining the intended design and functionality. 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 Forward-Port-Of: odoo/odoo#254613
This update fixes a reporting issue where product inventory tracking changes didn't properly adjust stock valuations. Previously, after setting a product to track inventory, the system incorrectly reported stock values. This change ensures that inventory adjustments are automatically applied when a product's tracking status is updated, providing accurate stock valuation reports.
Original PR description
### Steps to reproduce: - Create a product that is not track inventory (`is_storable = False`) - Set its cost to 50$ and put it in an avco perpetual valuation category - Create and receive a purchase…
### Steps to reproduce: - Create a product that is not track inventory (`is_storable = False`) - Set its cost to 50$ and put it in an avco perpetual valuation category - Create and receive a purchase order for 10 units - Set the product as track inventory (`is_storable = True`) - Inventory > Reporting > Stock - Click on the `unit cost` of your product line #### > This opens the `stock.avco.report` according to which the total value of your stock is 500$ and the total quantity is 10 units even though do not have any unit in stock. ### Expected behavior: The line of the receipt should have been counter balanced by an inventory adjustment line to resets the valuation at the same time as the product has been set to `is_storable` ### Cause of the issue: There is currently no mechanism to counter balance the stock that should have been present in internal locations if the moves done had been processed with a storable product. opw-5472902 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255557 Forward-Port-Of: odoo/odoo#254380
This update resolves a technical issue that caused instability in the HTML editor's automated tests. The fix ensures the editor is fully loaded before tests attempt to interact with it, preventing test failures due to timing differences. This improves the reliability of the HTML editor.
Original PR description
See commit messages. Forward-Port-Of: odoo/odoo#253432 Forward-Port-Of: odoo/odoo#253051
This update fixes a test failure related to email notifications in the Google Calendar and Mail modules. The previous test incorrectly checked for empty timeout emails, leading to false positives. Now, the test focuses on ensuring no emails are sent for any message, regardless of recipient, improving test reliability.
Original PR description
No need to always check the timeout email_to always contains formatted emails. task-5152917 Forward-Port-Of: odoo/odoo#255635 Forward-Port-Of: odoo/odoo#230766
This update ensures that attachment files are always linked to the corresponding financial transaction (move) within the Odoo system. Previously, updates to the transaction and attachments were handled separately, which could lead to inconsistencies. This change guarantees data integrity and avoids potential errors when managing financial records.
Original PR description
Was committing the move fields update, then updating the attachment. This might create an issue were the move update commits successfully, but setting the attachment fails and we end up with an inconsistency. Set attachment in the same transaction as the move update. task-6035727 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255745 Forward-Port-Of: odoo/odoo#255262
This update fixes an issue where invoices with exchange differences and exchange accounts as write-offs were incorrectly fully reconciled after the user chose to keep the invoice open. Now, the system accurately reflects partial payments and maintains the selected exchange account for reconciliation, ensuring correct financial reporting.
Original PR description
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an…
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an invoice in foreign currency - Click 'Register Payment' - Select company currency - Change the amount to a lower one - Select 'Mark as fully paid' - Add the exchange difference loss/gain account as write off account - Select 'Keep open' - Click 'Create payment' Issue: Even though the user selected the option to create a partial payment and keep the invoice open, it is totally reconciled with a difference booked in the selected exchange account. Analysis: This occurs because the use of the exchange account as write off account trigger a specific flow used in localization where a writeoff is not allowed. Once the payment registration process is ongoing, the system does not check that user kept the same choice on how to handle the payment difference. opw-5468052 Forward-Port-Of: odoo/odoo#254479 Forward-Port-Of: odoo/odoo#251965
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.
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#255654 Forward-Port-Of: odoo/odoo#255477
A test within the sale_timesheet module was failing due to a missing dependency on the invoicing module. The fix ensures the invoicing module is automatically installed during test execution, allowing the test to run correctly. This prevents disruptions to the testing process.
Original PR description
__ ## Error description When the test runs following a specific configuration, the field `invoicing_switch_threshold` isn't found. However, we have to keep this field in the test because we can't replicate the issue the test checks without it. ## Origin of the issue This field belongs to the `account_accountant` (Invoicing) module. However, `sale_timesheet` doesn't have a dependency on this module: there's only an auto install for `account_accountant` when installing the module from the front-end. Therefore, if we launch the test without the `account_accountant` auto install, it will fail. __ original commit: https://github.com/odoo/odoo/pull/250946/changes/52a9841c754466c2df65c75d13c9ed2ae86a51ce Forward-Port-Of: odoo/odoo#254506 Forward-Port-Of: odoo/odoo#252772
This update fixes a technical error that prevented users from sharing course content hosted externally via Google Drive. The issue stemmed from a browser security restriction (Same-Origin Policy) when accessing the content's internal structure. This change ensures seamless content sharing functionality for all course types.
Original PR description
Step to reproduce: 1. Install `website_slides` 2. Open any course and add content 3. Select the `Document` type and upload a Google Drive link 4. Save and publish the content 5. Click the "Share" button for this specific content in full screen Issue: - A traceback occurs: `Uncaught Javascript Error > Failed to read a named property 'document' from 'Window': Blocked a frame with origin "http://localhost:3000" from accessing a cross-origin frame.` Cause: - The `_onClickShareSlide` method attempts to calculate the `documentMaxPage` by accessing the internal DOM of the slide's iframe (`iframe.contentWindow.document`). When the content is hosted externally the iframe source is cross-origin. Browsers enforce the Same-Origin Policy. Solution: - Check the origin of the iframe's source URL before attempting to get max page. opw-5422655 Forward-Port-Of: odoo/odoo#251859 Forward-Port-Of: odoo/odoo#241090
This update resolves an issue where users couldn't download attachments linked within the website editor when browsing in incognito mode. The fix ensures the correct access token is included in the download link, allowing attachments to be accessed consistently across different browsing sessions. This improves the user experience and prevents data access limitations.
Original PR description
# How to reproduce
- Go to the website in edit mode
- Select some text
- Upload and link an attachment to that text
- Open a new incognito tab
- Try to download the attachment
# The problem
An error 404 is displayed
# Why
The access token of the attachment is not correctly added in the link URL. This is because link_popover.js does not correctly call the upload function from the uploadLocalFile services.
The signature of that function is :
```py
async function upload(
{ resId, resModel },
{ accept = "*/*", multiple = false, accessToken = false } = {}
) {
```
opw-5500362
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#251427This update fixes a previous restriction that prevented users from editing taxes on reward lines within confirmed sales orders. Previously, changes would trigger a recomputation of taxes, now edits are permitted on confirmed orders as the tax calculation is no longer affected. This improves order management flexibility.
Original PR description
Issue: --- Due to this issue, the tax on reward SOL cannot be edited. Cause: --- This is introduced in #172110 to prevent users from editing taxes on reward lines because confirming the order would recompute the tax. We can make it editable on confirmed SO as the tax wouldn't recomputed on reward lines later. opw-5918435 Forward-Port-Of: odoo/odoo#255644 Forward-Port-Of: odoo/odoo#255102
This update ensures that users are warned before performing a full synchronization of products within the Point of Sale system. Previously, a 'Full' sync could overwhelm the system with a large number of products, leading to performance issues. Now, the system checks against a configured limit to prevent this, ensuring a smoother and more reliable POS experience.
Original PR description
When the user selects "Full" in the SyncPopup, the system now checks the total number of PoS-available products against the configured `point_of_sale.limited_product_count` system parameter before proceeding. opw-5484051 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243763
This update resolves an issue where users couldn't add reactions to messages using the 'mail.group' model. The fix ensures that the 'add reaction' button is only displayed for message types that properly support reactions, improving stability and preventing errors.
Original PR description
*= im_livechat, portal, test_discuss_full **Steps to reproduce:** • Install the mail_group module • Open Discuss • Go to the History tab • Add a reaction on a message that has model `mail.group` •…
*= im_livechat, portal, test_discuss_full **Steps to reproduce:** • Install the mail_group module • Open Discuss • Go to the History tab • Add a reaction on a message that has model `mail.group` • Throws an error The error occurs because the `mail.group` model does not implement the `_get_allowed_access_params()` method, which is invoked during the process here. Actually, the "add reaction" button should not be shown on messages whose model does not inherit from mail.thread. https://github.com/odoo/odoo/blob/d12c1e07727f9b04cd2be2e7dac1ec3af49cb637/addons/mail/models/mail_message.py#L579 Desired behavior after PR is merged: This PR fixes the issue by hiding the "add reaction" button on messages with models that don’t inherit from mail.thread, such as mail.group. enterprise: https://github.com/odoo/enterprise/pull/111271 Task-5098050 [Reference](https://github.com/user-attachments/assets/aa2c4251-fd1f-4734-a62c-9fc80dd5f587) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255950 Forward-Port-Of: odoo/odoo#218615
This update fixes an issue where downpayment accounts weren't correctly linked between POS invoices and sales order invoices. The fix ensures that the correct account ID is used when generating invoices, preventing discrepancies in payment tracking. This improves the accuracy of financial reporting and simplifies reconciliation.
Original PR description
[Issue] 1) When a POS downpayment is created, it doesn't set the account.move.lines.is_downpayment = true. So, no POS invoice line was being marked as a down payment. 2) When preparing to create the…
[Issue] 1) When a POS downpayment is created, it doesn't set the account.move.lines.is_downpayment = true. So, no POS invoice line was being marked as a down payment. 2) When preparing to create the invoice lines for the sales order, it never checks the original POS Invoice lines for down payments. [Fix] 1) When creating the invoice lines for the down payment through the POS, set the 'is_downpayment' based on if the product is the POS's down payment product. 2) Create _prepare_invoice_lin,e then filter through the POS invoice lines for downpayments and then set them accordingly. Steps to Replicate: 1) User creates a Sales Order for a customer, 2) Transfers it to the POS, and the customer makes a down payment. 3) The user creates an invoice on the Sales order to pay the remainder of the bill 4) The account Id on the account.move.line does not match the original account on the POS invoice for the original account.move.line Video Demo of the issue: https://drive.google.com/file/d/1FszCJRUF-cCgg8otxu1jj1kmdKauwTGL/view?usp=drive_link Video Demo of Solution: https://drive.google.com/file/d/1yrYBdQZFw7YeKxsgsQQx5gHkuGER-7BN/view?usp=drive_link Forward-Port-Of: odoo/odoo#249180
This update ensures that the 'mail.catchall.domain.allowed' system parameter is properly sanitized when created manually. Previously, a space character introduced an error, preventing valid domain entries from being used correctly. This fix resolves a potential issue where users couldn't configure catch-all domains as intended, improving mail functionality.
Original PR description
Since its introduction (https://github.com/odoo/odoo/pull/76734), the "mail.catchall.domain.allowed" system parameter is normally sanitized by `_sanitize_allowed_domains` when using `set_param`. But…
Since its introduction (https://github.com/odoo/odoo/pull/76734), the "mail.catchall.domain.allowed" system parameter is normally sanitized by `_sanitize_allowed_domains` when using `set_param`. But the method is not run when the system parameter is created manually, for example through the UI, because the current conditional logic is not triggered for write and create call. This can be an issue if for example the use submits this value: "domain1.com, domain2.com,domain3.com" The comma seperated list will only be split by ',', meaning that the second element is " domain2.com" (space character in front). As such, that domain will not be used as expected, since most flows using that data will end up comparing "domain2.com" vs " domain2.com", and not considering it a match. Before this fix: Create new record in System parameters with key = "mail.catchall.domain.allowed" value = "domain1.com, domain2.com,domain3.com" -> after save, value == "domain1.com, domain2.com,domain3.com" After this fix: -> after save, value == "domain1.com,domain2.com,domain3.com" OPW-5505414 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255969 Forward-Port-Of: odoo/odoo#244279
This update resolves an issue where Odoo could crash if a module didn't include a manifest file. The system now handles this gracefully, ensuring that lazy-loaded bundles are generated as reliably as possible. This improves overall system stability and prevents unexpected errors.
Original PR description
This commit avoids a crash when a module doesn't provide a manifest (cf. Industry). Pregenerating lazy loaded bundles is a "best effort" detection and should be resilient so, not a big deal if some aren't properly found. Forward-Port-Of: odoo/odoo#256056
This update resolves an issue where a key function was incorrectly imported, causing a minor disruption in the IoT drivers module. The fix ensures the function is correctly located within the intended module, improving overall system stability and performance. This change was necessary to maintain the proper functionality of the IoT drivers.
Original PR description
`get_conf` was moved to `system` instead of `helpers`, and a call in `main.py` hasn't been updated in a fw port. This commit fixes it. Forward-Port-Of: odoo/odoo#256049
18 changes
New functionality added to Odoo
This update introduces new tests to ensure the accurate synchronization of Gelato products between our systems and Odoo, as well as the proper handling of Gelato product sales. These tests provide increased confidence in the reliability and functionality of the Gelato integration, streamlining our operations.
Original PR description
Tests for synchronizing Gelato products with Odoo and buying Gelato products are added. task-4527206 Forward-Port-Of: odoo/odoo#252642 Forward-Port-Of: odoo/odoo#244752
Resolved issues and error corrections
This update fixes an issue where invoices with exchange differences and exchange accounts as write-offs were incorrectly fully reconciled even when the user chose to keep the invoice open for partial payment. The fix ensures that the system accurately reflects the partial payment and correctly books the exchange difference to the designated account, improving financial reporting accuracy.
Original PR description
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an…
Currently, if a user selects an exchange difference account as a write-off but then decides to keep the invoice open, the system still fully reconciles the invoice. Steps to reproduce: - Create an invoice in foreign currency - Click 'Register Payment' - Select company currency - Change the amount to a lower one - Select 'Mark as fully paid' - Add the exchange difference loss/gain account as write off account - Select 'Keep open' - Click 'Create payment' Issue: Even though the user selected the option to create a partial payment and keep the invoice open, it is totally reconciled with a difference booked in the selected exchange account. Analysis: This occurs because the use of the exchange account as write off account trigger a specific flow used in localization where a writeoff is not allowed. Once the payment registration process is ongoing, the system does not check that user kept the same choice on how to handle the payment difference. opw-5468052 Forward-Port-Of: odoo/odoo#254479 Forward-Port-Of: odoo/odoo#251965
This update fixes inaccuracies in the tax exemption codes and reasons used for certain taxes within the Odoo Belgium localization. These corrections ensure compliance with Belgian tax regulations and prevent potential issues with tax reporting. The changes were carefully reviewed and validated.
Original PR description
Some taxes had a wrong tax exemption code and tax exemption reason. This commit corrects them. task-4976471 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253309
A test within the sale_timesheet module was failing due to a missing dependency on the invoicing module. The fix ensures the necessary invoicing module is automatically installed during test execution, allowing the test to run correctly. This prevents disruptions to the testing process.
Original PR description
__ ## Error description When the test runs following a specific configuration, the field `invoicing_switch_threshold` isn't found. However, we have to keep this field in the test because we can't replicate the issue the test checks without it. ## Origin of the issue This field belongs to the `account_accountant` (Invoicing) module. However, `sale_timesheet` doesn't have a dependency on this module: there's only an auto install for `account_accountant` when installing the module from the front-end. Therefore, if we launch the test without the `account_accountant` auto install, it will fail. __ original commit: https://github.com/odoo/odoo/pull/250946/changes/52a9841c754466c2df65c75d13c9ed2ae86a51ce Forward-Port-Of: odoo/odoo#254506 Forward-Port-Of: odoo/odoo#252772
This update resolves an issue where a key function (`get_conf`) was incorrectly imported, causing a minor disruption in the IoT drivers. The import was corrected, and a related call in the main Python file was updated, ensuring proper functionality and stability.
Original PR description
`get_conf` was moved to `system` instead of `helpers`, and a call in `main.py` hasn't been updated in a fw port. This commit fixes it.
This update resolves an issue where pressing the spacebar in certain HTML content could unintentionally create symbols. The fix adjusts how the HTML editor calculates text offsets, ensuring accurate symbol placement and preventing unexpected symbol generation. This improves the overall user experience and stability of the HTML editor.
Original PR description
Problem: Sometimes pressing space in content containing a symbol pattern creates the symbol even when the space is not placed directly before it. Cause: `leftLeafOnlyNotBlockPath` sums the…
Problem: Sometimes pressing space in content containing a symbol pattern creates the symbol even when the space is not placed directly before it. Cause: `leftLeafOnlyNotBlockPath` sums the `spaceOffset` of all non-block leaf nodes, then performs a substring on the whole block containing those leafs. In this case, the file box contains a `span` with `d-flex`, which is considered a block. Therefore, the file box text content length is not included in the `spaceOffset` calculation. However, we later call `substring` on the `textContent` of the `closestBlock`, which includes the file box content. This leads to an incorrect `spaceOffset`, effectively skipping the file box text. This can happen by chance when the `substring` returns the file box text content with `"-->"` immediately after it, making it the last character and triggering symbol creation. Solution: When computing the `substring`, consider only the `textContent` of the leaf nodes traversed while calculating `spaceOffset`. This ensures the offset matches the actual traversed content and prevents accidental symbol generation. Steps to reproduce: - Use the same HTML structure as in the test. - Place the selection as in the test case. - Press space. - Observe that a symbol is incorrectly created. task-6004954 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where snippets like 'countdown' were incorrectly placed in unexpected areas of the website editor. The fix restores a necessary filter, ensuring snippets are dropped into their intended sections. This improves the user experience and prevents content from being misaligned.
Original PR description
After https://github.com/odoo/odoo/pull/240547 was merged, an issue appeared with the snippets that could also be dropped as inner content. Instead of only having the dropzones for sections, all…
After https://github.com/odoo/odoo/pull/240547 was merged, an issue appeared with the snippets that could also be dropped as inner content. Instead of only having the dropzones for sections, all dropzones were activated, meaning that snippets such as countdown would sometimes be dropped as inner content. Steps to reproduce the issue: - Go to Website - Go to Edit mode - From an empty website, click on the snippet group "Content" - Select the countdown => The countdown was dropped in the footer instead of the main To fix this issue, this commit restores the missing filter (removed when the new builder was added). However, since the drag and drop was updated to only display dropzones of the "active" element, there is no need to filter the dropzones within #website_cookies_bar. Finally, the filter is no longer based on the s_popup snippet, as the drag and drop mechanic was moved outside of the website module. This commit also partially reverts the commit 5cb4f5c, since it made the tour fail with the changes of this PR (s_banner snippets can no longer be dropped inside of the s_table_of_content) The tour testing the Countdown was updated since it did not fail prior to saas-19.2, because it was not precise enough. Related to task-5428387 Forward-Port-Of: odoo/odoo#254724 Forward-Port-Of: odoo/odoo#250613
This update fixes a vulnerability where email security software was incorrectly triggering meeting cancellations by visiting links in emails. We’ve changed the email format to use post requests instead of GET requests, preventing these bots from interfering with meeting scheduling. This ensures meetings are scheduled correctly and reliably.
Original PR description
Mails are sent to users containing an acceptation and cancellation link that accepts GET requests but performs an action on visit Some mail defender software analyzes urls in links by actually visiting the URL. This leads to both actions being triggered without user input. Instead we now send buttons with a neutralizing parameter in the mail. Recipients may then visit the url and click a form button to "accept" or "decline". As these are post requests, the email bots should avoid clicking them. task-4555579 Forward-Port-Of: odoo/odoo#255912 Forward-Port-Of: odoo/odoo#198560
This update fixes an issue where invoices processed through Nemhandel in Denmark were incorrectly using the VAT ID instead of the company partner's EAN/GLN as the EndpointID. This change ensures invoices are properly routed and processed within the Nemhandel system, improving data accuracy and compliance. The fix was triggered by a specific test case demonstrating this incorrect behavior.
Original PR description
**STEP TO REPRODUCE** 1. install l10n_dk_nemhandel, and activate nemhandel. 2. Create a company partner, with a EAN/GLN as the nemhandel id. 3. Create an individual partner linked to the company partner. 4. Create an invoice with this individual partner. 5. Send the invoice with nemhandel. 6. open the xml file, and notice that the EndpointID doesn't use the EAN/GLN of the company partner. (It falls back to the VAT instead). opw-5945440 Forward-Port-Of: odoo/odoo#251783
This update resolves an issue where users in incognito mode couldn't download attachments linked within the HTML editor. The fix ensures the necessary access token is included in the download link URL, allowing attachments to be successfully downloaded regardless of the browsing session. This improves the user experience for all users.
Original PR description
# How to reproduce
- Go to the website in edit mode
- Select some text
- Upload and link an attachment to that text
- Open a new incognito tab
- Try to download the attachment
# The problem
An error 404 is displayed
# Why
The access token of the attachment is not correctly added in the link URL. This is because link_popover.js does not correctly call the upload function from the uploadLocalFile services.
The signature of that function is :
```py
async function upload(
{ resId, resModel },
{ accept = "*/*", multiple = false, accessToken = false } = {}
) {
```
opw-5500362
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#251427This update fixes an issue where analytic distribution wasn't being correctly passed from sales orders to purchase orders. Now, when a sale order is created with analytic distribution enabled, that distribution will automatically be applied to the corresponding purchase order, ensuring accurate cost tracking and reporting. This improves financial visibility and reporting accuracy.
Original PR description
Steps to reproduce: - Enable analytic distribution in Accounting settings - Create a storable product "P1": - Routes: MTO + Buy - Vendor: add any supplier - Create a Sale Order: - Add 1 unit of P1 -…
Steps to reproduce: - Enable analytic distribution in Accounting settings - Create a storable product "P1": - Routes: MTO + Buy - Vendor: add any supplier - Create a Sale Order: - Add 1 unit of P1 - Set any analytic distribution - Confirm the Sale Order Result: A Purchase Order is created, but the analytic distribution is not propagated to the purchase order line. Problem: When the Sale Order is confirmed, `_action_launch_stock_rule()` is triggered. It creates and confirms the corresponding stock move with values from the sale order line. Since the product uses the MTO route, the procurement rule is executed. The rule prepares procurement values from the stock move, but the analytic distribution is not included in these values: https://github.com/odoo/odoo/blob/18.0/addons/stock/models/stock_move.py#L1539 Later, `_run_buy` is triggered. It uses the procurement values coming from the stock move to find an existing purchase order line candidate or to create a new one. Because the analytic distribution is missing from the values, the created (or matched) purchase order line does not contain the analytic distribution: https://github.com/odoo/odoo/blob/621a93b7b723999d943f1c4da78547763498c008/addons/purchase_stock/models/stock_rule.py#L113 Solution: Propagate the analytic distribution from the sale order line through the stock move so it can be included in the procurement values and correctly applied to the purchase order line. opw-5936971 Forward-Port-Of: odoo/odoo#254933 Forward-Port-Of: odoo/odoo#252292
This update fixes a previous restriction that prevented users from editing taxes on reward lines within confirmed sales orders. Previously, confirming an order would recompute taxes, but now edits can be made to these tax lines after the order is confirmed. This improves flexibility for users managing reward orders.
Original PR description
Issue: --- Due to this issue, the tax on reward SOL cannot be edited. Cause: --- This is introduced in #172110 to prevent users from editing taxes on reward lines because confirming the order would recompute the tax. We can make it editable on confirmed SO as the tax wouldn't recomputed on reward lines later. opw-5918435 Forward-Port-Of: odoo/odoo#255644 Forward-Port-Of: odoo/odoo#255102
This update ensures that users are warned before performing a full synchronization of products in the Point of Sale system. The system now checks if the number of products exceeds a configured limit, preventing potential performance issues and data inconsistencies. This improves the reliability of the POS functionality.
Original PR description
When the user selects "Full" in the SyncPopup, the system now checks the total number of PoS-available products against the configured `point_of_sale.limited_product_count` system parameter before proceeding. opw-5484051 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243763
This update resolves an issue where downpayment accounts weren't correctly linked between POS invoices and sales order invoices. The fix ensures that the correct account ID is used when generating invoices, preventing discrepancies in payment tracking. This improves accuracy and simplifies financial reporting.
Original PR description
[Issue] 1) When a POS downpayment is created, it doesn't set the account.move.lines.is_downpayment = true. So, no POS invoice line was being marked as a down payment. 2) When preparing to create the…
[Issue] 1) When a POS downpayment is created, it doesn't set the account.move.lines.is_downpayment = true. So, no POS invoice line was being marked as a down payment. 2) When preparing to create the invoice lines for the sales order, it never checks the original POS Invoice lines for down payments. [Fix] 1) When creating the invoice lines for the down payment through the POS, set the 'is_downpayment' based on if the product is the POS's down payment product. 2) Create _prepare_invoice_lin,e then filter through the POS invoice lines for downpayments and then set them accordingly. Steps to Replicate: 1) User creates a Sales Order for a customer, 2) Transfers it to the POS, and the customer makes a down payment. 3) The user creates an invoice on the Sales order to pay the remainder of the bill 4) The account Id on the account.move.line does not match the original account on the POS invoice for the original account.move.line Video Demo of the issue: https://drive.google.com/file/d/1FszCJRUF-cCgg8otxu1jj1kmdKauwTGL/view?usp=drive_link Video Demo of Solution: https://drive.google.com/file/d/1yrYBdQZFw7YeKxsgsQQx5gHkuGER-7BN/view?usp=drive_link Forward-Port-Of: odoo/odoo#249180
This update streamlines the testing process by pre-generating a key asset bundle used by the bus module. Previously, this bundle was rebuilt repeatedly during tests, causing delays. This change significantly speeds up test execution times, improving overall development efficiency.
Original PR description
This commit sets the `bus.websocket_worker_assets` bundle to be pregenerated while running tests to avoid rebuilding it at runtime (i.e. +900 times with a db "all"). Forward-Port-Of: odoo/odoo#255843
This update resolves an issue where Odoo would crash if a module didn't include a manifest file. The system now handles this gracefully, ensuring a more stable experience. This change improves overall system reliability and prevents unexpected downtime.
Original PR description
This commit avoids a crash when a module doesn't provide a manifest (cf. Industry). Pregenerating lazy loaded bundles is a "best effort" detection and should be resilient so, not a big deal if some aren't properly found. Forward-Port-Of: odoo/odoo#256056
This update resolves a technical problem that prevented accurate product cost calculations when multiple companies were involved. The issue stemmed from incorrectly accessing BOMs across different companies, leading to access errors. This fix ensures correct product costing is calculated regardless of the number of companies a user is working with.
Original PR description
When computing the product cost in `_get_product_cost_with_moves`, iterating over `product.bom_ids` would include BOMs from all companies, causing an `AccessError` when the current user lacked read access to a BOM belonging to another company. opw-6060735 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255859
This update fixes an issue where the cost of stock lots was incorrectly calculated across multiple companies. Previously, the system stored a single, company-specific cost, leading to inaccurate valuations when using shared products. Now, the cost is dynamically calculated based on each company's context, ensuring accurate accounting for all businesses.
Original PR description
Field avg_cost was set to store=True in 42d3e34, but the compute method _compute_avg_cost() is company-context-dependent (calls _run_fifo which filters by env.company). Storing a single value causes incorrect valuations in multi-company databases with FIFO + lot valuation. In multi-company setups with shared products (company_id=False), the lot's avg_cost would compute in one company's context and store that value globally, causing all other companies to see the wrong cost. Fix: Remove store=True to compute dynamically per company context. Cannot use company_dependent=True as it requires JSONB migration. opw-5446941 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247278
9 changes
New functionality added to Odoo
This update introduces specific fuel tax calculations and related accounting data for Chile (l10n_cl). It adds two new fuel tax rates, incorporates relevant tax tags, and includes a migration script to ensure a smooth transition. These changes align with Chilean tax regulations.
Original PR description
- Adding two specific fuel taxes and relevant tax tags. - Adding specific fuel tax account tag. - Adding end-migrate to handle additions. task-4259393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This update resolves an issue preventing API key creation through the batch RPC call. The previous implementation had a problem with how expiration dates were handled, which was causing the process to fail. This fix ensures API keys can now be created reliably using the batch RPC method.
Original PR description
Commit 3b3ee6bb5f2d3edc69f4166e0e63074f8b1e1c87 allows apikey creation via batch RPC call. However, this will not work when dereferencing `res.expiration_date`.
This update resolves an issue where the `/lead` command within the live chat feature wouldn't display conversation history when a chatbot wasn't attached. The change ensures the system correctly retrieves message history regardless of whether a chatbot is present, improving the user experience.
Original PR description
In PR: https://github.com/odoo/odoo/pull/253566, _get_channel_history was modified to fetch messages from `chatbot_message_ids.mail_message_id` instead of `message_ids`. This caused an issue where the `/lead` command was not working correctly when no chatbot is associated, resulting in an empty conversation history. This commit fixes the issue by falling back to `message_ids` when `chatbot_message_ids` is not available.
This update corrects a problem where changes to country names in the `l10n_pe` or `l10n_ec` modules (e.g., renaming 'Peru' to 'PERÚ') caused module upgrades to fail. The fix replaces country names with stable, unique identifiers (XMLIDs) to ensure reliable data resolution during upgrades.
Original PR description
### Steps to reproduce ------------------ - Install `l10n_pe` or `l10n_ec` module. - Go to *Settings → Countries* and rename the country (e.g. "Peru" → "PERÚ", "Ecuador" → "ECUADOR"). - Upgrade the…
### Steps to reproduce
------------------
- Install `l10n_pe` or `l10n_ec` module.
- Go to *Settings → Countries* and rename the country (e.g. "Peru" → "PERÚ",
"Ecuador" → "ECUADOR").
- Upgrade the module.
### Issue
-----
The files `l10n_pe/data/res.bank.csv` and `l10n_ec/data/res.bank.csv`
reference countries using their names (e.g. "Peru", "Ecuador").
During module upgrade, the CSV import resolves many2one relations using
the country name. If the country name has been modified by the user,
the lookup fails and the module upgrade crashes with:
```python3
2026-03-06 23:48:11,112 27 CRITICAL db_3950261 odoo.service.server: Failed to initialize database `db_3950261`.
Traceback (most recent call last):
File "/home/odoo/src/odoo/19.0/odoo/service/server.py", line 1510, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'], reinit_modules=config['reinit'])
File "/home/odoo/src/odoo/19.0/odoo/tools/func.py", line 88, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/orm/registry.py", line 199, in new
load_modules(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 456, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 216, in load_module_graph
load_data(env, idref, mode, kind='data', package=package)
File "/home/odoo/src/odoo/19.0/odoo/modules/loading.py", line 59, in load_data
convert_file(env, package.name, filename, idref, mode, noupdate=kind == 'demo')
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 689, in convert_file
convert_csv_import(env, module, pathname, fp.read(), idref, mode, noupdate)
File "/home/odoo/src/odoo/19.0/odoo/tools/convert.py", line 754, in convert_csv_import
raise Exception(env._(
Exception: Module loading l10n_pe failed: file l10n_pe/data/res.bank.csv could not be processed:
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
No matching record found for name 'Peru' in field 'Country'
select id,name,code from res_country where code='PE'
+-----+----------------------------------------------------------------------+------+
| id | name | code |
|-----+----------------------------------------------------------------------+------|
| 173 | {"de_DE": "Peru", "en_US": "PERÚ", "es_ES": "PERÚ", "es_PE": "Perú"} | PE |
+-----+----------------------------------------------------------------------+------+
```
### Root Cause
----------
Using translatable/display names in CSV data is not reliable, as these
values can be customized or translated.
### Fix
---
Replace country name references with stable XMLIDs:
- `base.pe` for Peru
- `base.ec` for Ecuador
Using XMLIDs ensures consistent resolution regardless of name changes
or translations.
opw-6015302
upg-3950261
tbg-2492
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#254096This update resolves a bug where the bold formatting action wasn't consistently removing bolding from text, particularly when a `/file` component was present. The fix ensures that bolding is correctly applied or removed based solely on editable text nodes, improving the reliability of the HTML editor's formatting capabilities.
Original PR description
When determining whether the "bold" action is about adding bold or removing bold, non-editable text nodes are also taken into account. Because of this, if the selection contains an embedded component such as `/file`, it always considers bold was not applied on all nodes, and should therefore be applied. The action thus never removes bold. This commit fixes this by only taking into account the editable nodes. Steps to reproduce: - Go to a "To do" note - Add a few lines of text - Add a `/file` in the middle - Select all - Press Ctrl+B: bold is applied on the surrounding text - Press Ctrl+B again => Bold was not removed from the surrounding text task-5955977
This update resolves a bug that caused errors when creating payments linked to expenses paid by a 'Branch' company. The fix ensures the payment journal entry correctly uses the 'Branch' company, preventing conflicts with the parent company's accounting. This improves the accuracy of expense reporting and payment processing for Branch operations.
Original PR description
**Steps to reproduce:** - Install Accounting and Expenses - Create a Branch company (e.g. Branch) - In company selector, select both Branch (as main) and its parent - In Bank journal settings, make…
**Steps to reproduce:** - Install Accounting and Expenses - Create a Branch company (e.g. Branch) - In company selector, select both Branch (as main) and its parent - In Bank journal settings, make sure that there is an outstanding payment account for "Manual Payment" - Create an employee in Branch - Create an expense: * Category: [any] (e.g. [EXP_GEN] Expenses) * Total: [anything] (e.g. 100.00) * Employee: [the created employee] * Paid By: company * Company: Branch - Create Report - Submit to Manager - Approve **Issue:** A UserError is raised because it tries to create a payment in Branch linked to a journal entry in the parent company. **Cause:** The payment is initialized with the company of the expense but not the related journal entry. **(A similar issue happens with an expense paid by the employee when generating the bill upon approval of the expense sheet)** opw-6007859 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures that customer invoices can be properly updated by regenerating the XML file during import. Previously, reusing the original imported XML caused issues when invoices were modified. This change guarantees accurate invoice XML generation for customer invoices, improving data integrity.
Original PR description
Problem --------- Currently, when importing a move, `ubl_cii_xml_file` gets set with said XML. This XML is then re-used during the export rather that regenerate a new XML each time. This is fine for customer bills as those are not meant to be modified. This is not the case of customer invoices. Client may import an invoice XML and later update that invoice. In such a case, we want to regenerate the XML and not reuse the imported version. Solution --------- Only set `ubl_cii_xml_file` for purchase move during the import. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where invoices sent via Peppol were creating duplicate documents in the system. The change ensures attachments are synchronized only once during the dedicated document linking process, streamlining the Peppol invoice sending workflow. This improves data accuracy and efficiency.
Original PR description
When sending an invoice via Peppol, the PDF and XML attachments are logged in the chatter. This automatically triggers a synchronization with the Documents app. However, the Peppol sending flow also includes a dedicated document linking step later in the process. This caused the same attachments to be registered as documents twice. This commit skips the document synchronization during the initial chatter logging step. The attachments will now only be synchronized once during the dedicated linking phase. Note: ec6e559 prevented duplicate attachments in the chatter with some cleanup code, but this cleanup code runs after the document has already been created and does not remove the document, resulting in duplicate documents, which this commit fixes. Task-6030468 Forward-Port-Of: odoo/odoo#254893
This update optimizes the testing process by pre-generating the `bus.websocket_worker_assets` bundle. Previously, this bundle was rebuilt repeatedly during tests, causing significant delays. This change dramatically speeds up test execution times, improving overall development efficiency.
Original PR description
This commit sets the `bus.websocket_worker_assets` bundle to be pregenerated while running tests to avoid rebuilding it at runtime (i.e. +900 times with a db "all"). Forward-Port-Of: odoo/odoo#255843
6 changes
Resolved issues and error corrections
This update optimizes the testing process for the Live Chat module by pre-generating a key asset bundle. Previously, this bundle was rebuilt repeatedly during tests, causing performance slowdowns. This change significantly reduces test execution time and improves overall stability.
Original PR description
This commit sets the `im_livechat.assets_embed_external` bundle to be pregenerated while running tests to avoid rebuilding it at runtime (i.e. +280 times with a db "all").
This update optimizes testing by pre-generating the `bus.websocket_worker_assets` bundle. Previously, this bundle was rebuilt repeatedly during tests, causing performance slowdowns. This change significantly reduces test execution time and improves overall system stability.
Original PR description
This commit sets the `bus.websocket_worker_assets` bundle to be pregenerated while running tests to avoid rebuilding it at runtime (i.e. +900 times with a db "all").
This update resolves an issue where credit notes created through 'Reverse and create invoice' lost the original invoice's source information, leading to discrepancies in reports. The fix ensures that the source invoice is correctly linked and displayed on the credit note's PDF, improving traceability and report accuracy.
Original PR description
### Issue before this commit: When creating a credit note using “Reverse and create invoice”, the generated invoice loses the Source field. While the original invoice correctly displays the source,…
### Issue before this commit: When creating a credit note using “Reverse and create invoice”, the generated invoice loses the Source field. While the original invoice correctly displays the source, the new invoice created after reversal does not, leading to missing information in the report. ### Steps to reproduce the issue: 1. Create a sales order for product A 2. Deliver product A 3. Create invoice 4. Create credit note by clicking on "Reverse and create invoice" 5. The new invoice correctly remains linked to the Sales order 6. However, the source document disapear on the PDF ### Cause of the issue: In the reversal flow, the new invoice is created using copy_data() without explicitly preserving the invoice_origin field. As a result, the newly created invoice does not inherit the source information from the original invoice, even though it is still logically linked. ### Reason to introduce the fix: To ensure consistency between invoices and preserve important traceability information, the invoice_origin field must be propagated to the new invoice created during the reversal process. This guarantees that the Source is correctly displayed in the PDF. opw-6034574 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a potential issue where forum URL title requests could hang indefinitely, causing delays. A timeout has been implemented to prevent the system from being blocked, ensuring a smoother and more responsive forum experience for users. This improves overall forum stability and performance.
Original PR description
Add a timeout to the requests done by /forum/get_url_title to avoid blocking indefinitely Forward-Port-Of: odoo/odoo#254607
This update ensures that Odoo correctly maintains translation caches for related fields, even when calculations are re-run using different language versions of those fields. Previously, changes to translated fields could prematurely clear these caches, leading to performance issues. This fix improves the efficiency and responsiveness of Odoo when working with multi-language data.
Original PR description
when related translated field (field_x) is changed when onchange, if another computed fields which depends on the field_x is recomputed but using another language value of the field_x. The orm should keep the existing translations in the cache but not drop them. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where modifying a recurring event's base time caused duplicate meeting notifications and data loss in Outlook. The fix ensures Microsoft IDs are preserved when an event is a follow-up, preventing these synchronization problems.
Original PR description
When an attendee syncs a recurring event where the first occurrence (base event) was modified by the organizer, `_write_from_microsoft` falsely triggers the destructive recreation path. This happens because `_has_base_event_time_fields_changed` compares the exception's modified time against the seriesMaster's pattern time, detecting a "change" even though the master hasn't changed. This causes: - All non-base events lose their microsoft_id and ms_universal_event_id - The base event gets recreated without Microsoft IDs - A duplicate event is pushed to Outlook on the next odoo2microsoft sync - Spurious "join the meeting now" notifications are sent to attendees Add a `follow_recurrence` guard so that when the base event is an exception (follow_recurrence=False), the non-destructive else branch is taken instead, preserving all Microsoft IDs.