Daily updates from Odoo
Monday, January 19, 2026
257 changes
19 changes
Resolved issues and error corrections
This update fixes a minor issue where the employee onboarding tour sometimes finished prematurely, leaving the form in an incomplete state. This prevented users from fully completing the tour and resulted in a confusing error message. The fix ensures the tour waits for form autosave, guaranteeing a clean and successful completion.
Original PR description
This commit fixes an indeterministic error in the hr_salary_calculator_tour where, sometimes, the last tour's steps finish too quickly and doesn't wait for the form's autosave (triggered by the employee autocomplete selection) to complete, leading to a "Tour finished with a dirty form view being open" error. This is kind of a follow-up of https://github.com/odoo/enterprise/commit/5497e947cdfa242c090a3d77d900375bfb067b0f runbot-237794
This update corrects a bug where invoices could be incorrectly linked to DIAN documents due to connection issues. When a DIAN rejection error occurs, the system now verifies key invoice details (customer, date) match the DIAN document before linking, ensuring accurate tracking and compliance.
Original PR description
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian…
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian localization with valid DIAN credentials - Create an invoice for a Colombian customer - Confirm the invoice - Send the invoice to DIAN - Cancel and delete the invoice - Create another invoice for another Colombian customer with the same name (sequence) than the previously deleted invoice - Confirm the invoice - Send the invoice to DIAN **Issue:** A previous fix (https://github.com/odoo/enterprise/commit/4d782030631350cfaa8f2993e68f33c9f66929e4) had been made to sync together a DIAN document from Odoo and DIAN when the following error was returned by DIAN: "Regla: 90, Rechazo: Documento procesado anteriormente." It can happen when an invoice is sent to DIAN but due to a connection issue, the DIAN response is not received and the invoice is flagged as rejected. In that case, the "Regla: 90" error is returned by DIAN when trying to send the invoice again and the fix is linking the identifier returned by the DIAN error with the invoice to prevent this issue. However, the fix wasn't taking into account the case in which the error returned by DIAN is legit and the identifier is linked to another document. It results of having an invoice that is linked to an incorrect document in DIAN. The customer, date and other info, completely different. **Solution:** When "Regla: 90" error is returned by DIAN, a check is performed to make sure that the customer, the issue date and time on the document in Odoo and on the XML from DIAN are the same before assigning the identifier from DIAN to the document in Odoo. opw-5095212 Forward-Port-Of: odoo/enterprise#99936
This update ensures that live chat and member lists automatically open by default, providing a better user experience. Previously, opening one panel would disable the other. Now, the system intelligently manages panel visibility to always display the most relevant information, prioritizing the live chat panel by default.
Original PR description
Before this commit, auto-open of member panel and livechat info panel did not combine from [1]. This means that when livechat info was auto-open in livechat, this necessarily meant the auto-open of member list was disabled, and vice-versa. This is a problem because when navigating between livechat and non-livechat would necessarily imply the dismiss of either panel, which is not good because the best default is having livechat panel open by default, and for non-livechat conversations it should auto-open the member list panel. This commit fixes the issue as follow: - auto-close of panel are aware of whether action are active, as removal of auto-open from auto-close makes sense only when another panel is made active when the older panel was visible - closing of member panel by opening the livechat info panel should preserve auto-open of member list for other conversations Task-5496830 [1]: https://github.com/odoo/odoo/pull/238472
This update resolves a technical issue related to how live chat and WhatsApp information is combined when creating support tickets. Specifically, the system now correctly merges member and live chat details, ensuring a more seamless and accurate ticketing process. This enhancement improves the overall efficiency of our helpdesk operations.
This update fixes an issue where products created through the website automatically appeared as published, even without a category assigned. The fix removes a setting that forced publication and a related configuration, ensuring products remain unpublished until a category is selected, aligning with the user's expected experience. This improves the consistency and usability of the website's product creation process.
Original PR description
**Description:** Products created from the website frontend were automatically published even without a category assigned, contradicting the "Unpublished" placeholder expectation. The issue had three root causes: 1. JavaScript (new_content.js) forced default_is_published: true 2. XML action context contained website_published: True 3. Both caused products to be published regardless of category **Fixed by:** - Removed default_is_published from JS product creation handler - Removed website_published from action context. **After this PR:** Now products remain unpublished until a category is assigned, matching the intended UX indicated by the placeholder text. opw-5408903 SEE ALSO: Enterprise PR:https://github.com/odoo/enterprise/pull/103778 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244067 Forward-Port-Of: odoo/odoo#242779
This update ensures the website's product barcode lookup feature accurately reflects a recent change in Odoo. Specifically, the test now correctly handles scenarios where products created through the website aren't automatically published if a category isn't selected, aligning with a community update.
Original PR description
Align barcodelookup website test with the community change where products created from the website are not auto-published when no category is selected. opw:5408903 SEE ALSO: Community PR:https://github.com/odoo/odoo/pull/242779 Forward-Port-Of: odoo/enterprise#104491 Forward-Port-Of: odoo/enterprise#103778
This update fixes an issue where loyalty points weren't accurately adjusted when a customer reduced the quantity of a free, loyalty-rewarded product. Previously, decreasing the order quantity didn't correctly update the points spent. The fix ensures that loyalty point calculations are recomputed when rewards are modified, maintaining accurate tracking of customer loyalty benefits.
Original PR description
When decreasing the quantity of a product that was awarded for free using loyalty points, the points spent were not updated accordingly. Steps to reproduce: ------------------- * Create a loyalty program that grant 1 free product A for 1 point * Create a loyalty card with 3 points for partner A * Open PoS and make an order for partner A * Just claim the 3 free products A using loyalty points * Decrease the quantity of product A from 3 to 2 > Observation: The points spent were not updated accordingly. It should be 3 - 2 = 1. Why the fix: ------------ We need to recompute the loyalty programs when the quantity of a reward is changed. This was not done if the changes happened in `_updateRewardLines`. We now track if changes happened in this method and we call `orderUpdateLoyaltyPrograms` if needed. opw-5177593 Forward-Port-Of: odoo/odoo#242816
This update resolves a sporadic issue where the quotation signing tour occasionally failed to complete correctly. The fix adds a deliberate pause within the tour to ensure all interactions have finished loading, resulting in a more reliable and consistent user experience for creating quotes.
Original PR description
This commit fixes the flaky quotation signing tour in sale_management by adding an explicit step to wait for interactions to fully load before proceeding with the next steps. runbot error-224021 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#242848 Forward-Port-Of: odoo/odoo#242746
This update resolves an issue where the HTML editor would crash when attempting to remove formatting (specifically color) from a cell after text had been deleted. The fix ensures that the color is correctly removed without triggering an error, improving the stability and usability of the editor. This was a minor bug impacting the functionality of a core feature.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Create a m x n table - Write some text in a cell, apply color on text - Delete text and keep empty colored element - Select cell - Trying to remove format throws infinite loop error in removeAllColor **Desired behavior after PR is merged:** Clicking on remove format button should remove color from empty colored element without causing traceback. task-5454993 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243976 Forward-Port-Of: odoo/odoo#241829
This update fixes an issue where the Netherlands localization incorrectly created duplicate fiscal positions. The change removes the redundant position and properly configures the NL Domestic fiscal position, ensuring accurate reporting for Dutch businesses. This ensures compliance with Dutch tax regulations.
Original PR description
Installing the Netherlands localisation creates two Domestic fiscal positions, both incorrectly configured. This commit removes the empty duplicate fiscal position and properly defines the NL Domestic fiscal position by setting the Country Group, leaving Country empty, and disabling VAT requirement. task-5489829 Forward-Port-Of: odoo/odoo#244183
This update corrects an issue where Odoo incorrectly displayed a 'Resume' prompt after successfully importing large CSV files in batches. The fix ensures the 'Resume' prompt only appears when a batch is truly incomplete, improving the user experience and preventing unnecessary prompts. This resolves a minor annoyance for users importing sizable datasets.
Original PR description
When importing a large file in multiple batches , Odoo incorrectly displays a "Resume" prompt at the end of the process, even though all records have been successfully imported. Steps to reproduce:…
When importing a large file in multiple batches , Odoo incorrectly displays a "Resume" prompt at the end of the process, even though all records have been successfully imported. Steps to reproduce: 1. Create a CSV file with enough records to trigger at least 2 batches 2. Go to any list view and select "Import records". 3. Upload the file and click "Import". 4. Wait for the import to complete. 5. Observe that despite an "X records successfully imported" notification, a warning "Click 'Resume' to proceed..." appears. The issue occurs because the `importRes.nextrow` state variable is updated during intermediate batches but is not cleared when the final batch completes. * In `_executeImportStep`, if `nextrow` is returned (intermediate batch), `importRes.nextrow` is updated. * If `nextrow` is falsy (final batch), the loop is stopped, but `importRes.nextrow` retains the value from the previous batch. * `executeImport` checks `importRes.nextrow` to decide whether to show the `"Resume"` message, leading to a false positive caused by the stale value. This commit fixes the issue by explicitly setting `importRes.nextrow` to `0` in `_executeImportStep` when the server indicates completion (returns a falsy `nextrow`). opw-5343837 Forward-Port-Of: odoo/odoo#241490
This update fixes an issue where reports were displaying unit prices with incorrect decimal precision. The change removes a technical setting that was overriding the configured Decimal Accuracy, ensuring reports now accurately reflect the product's price to the specified number of digits. This improves reporting accuracy for financial data.
Original PR description
Steps to reproduce: 1. Install the Sale app. 2. Enable developer mode and go to Decimal Accuracy. 3. Set the "Product Price" precision to 3 digits. 4. Create a quotation and print the report. Issue:…
Steps to reproduce: 1. Install the Sale app. 2. Enable developer mode and go to Decimal Accuracy. 3. Set the "Product Price" precision to 3 digits. 4. Create a quotation and print the report. Issue: The decimal precision of the unit price is not respected in the report. Cause: The unit price field in the report uses the `monetary` widget, which ignores the Decimal Accuracy configuration and enforces currency precision instead. Solution: Remove the `monetary` widget from the unit price field in the report so that Decimal Accuracy is applied correctly. Before: <img width="570" height="97" alt="image" src="https://github.com/user-attachments/assets/dda22b25-0ade-40ae-b585-c6251ba89c89" /> After : <img width="584" height="87" alt="image" src="https://github.com/user-attachments/assets/b51d3040-e7b5-41d6-bdd9-7ec799b8005d" /> opw-5418665 Revert [PR #224219](https://github.com/odoo/odoo/pull/224219/files#diff-92dda03d204cc6ea8b7aacd0c07939843c83b1841f4a3049903844777d83c07bR201) to the original implementation so that the configured Decimal Accuracy is correctly applied in reports as other apps i.e. Purchase or Account Forward-Port-Of: odoo/odoo#241255
This update resolves a test failure that occurred when the current date was in 2027. The issue stemmed from subscription end dates being set to December 31, 2026, causing a system error. This fix ensures the subscription logic functions correctly regardless of the year.
Original PR description
Before this commit, the test was failing if today date was in 2027. it occured because the end_date of the subscription was on the 31 of December 2026. As a result, when running in 2027, the _create_recurring_invoice method would close the order. runbot-id-237658 Forward-Port-Of: odoo/enterprise#104604
This update enhances the security of our connections to external services by allowing us to securely verify server identities using certificate stores. Previously, our system struggled to utilize certificate verification effectively due to limitations in the underlying software. This change adds support for managing CA certificates, strengthening security and reliability.
Original PR description
Our webservice client (`zeep`) connections lacked a way to use `certificate.certificate` models to verify the connection with server identification. This is rather complicated, since PyOpenSSL only allows filenames with their default methods. We now add the feature to pass these certificate records, load them into memory buffers, and add them to the CA store. IAP PR: odoo/iap-apps#1308 Task [link](https://www.odoo.com/odoo/project.task/5068741) task-5068741 Forward-Port-Of: odoo/odoo#244386 Forward-Port-Of: odoo/odoo#238717
This update fixes inaccuracies in the Spanish balance reports, specifically for 'pymes' and 'completo' business types. The changes ensure that financial data is correctly calculated and balanced, addressing previous errors related to section sums and specific account entries. This improves the reliability of financial reporting for Spanish-speaking customers.
Original PR description
Waking up a test that check the balancedness of balance sheet, we check again the Spanish ones: pymes: - subsections were not taken into account into the sum of the section - 296/596 are specific to pymes, but it goes into the overall section - 473 was included. It is not included in documentations because it needs to be emptied at closing, but we want balanced all the time. - 5585 was missing completo: - 200/280/290: research should be expenses at closing, but in the meantime we add it to the other accounts assoc: - 178/189: to deudas a largo plazo can caracteristicas especiales Translation for deudas a largo plazo was changed. Forward-Port-Of: odoo/enterprise#97875
This update ensures that documents are correctly moved to the appropriate folder and receive the correct tags when linked to a journal entry (like a vendor bill). Previously, the system didn't update document locations, but this fix resolves that issue, streamlining document management within Odoo.
Original PR description
Steps to reproduce: 1. Open the Documents app and select an uploaded file. 2. Click the action "Create Vendor Bill" (or any journal entry action). 3. The Invoice is created and the document is…
Steps to reproduce: 1. Open the Documents app and select an uploaded file. 2. Click the action "Create Vendor Bill" (or any journal entry action). 3. The Invoice is created and the document is attached to it. **Current Behavior:** The document remains in its original folder (e.g., Finance) and does not receive the tags defined on the journal settings. **Expected Behavior:** The Document should be moved to the specific folder linked to the Journal (e.g., "Vendor Bills") and receive the configured tags. **Cause:** The `write` method attempts to identify documents to sync by calling `_get_document_attachments_to_sync`, which inspects the current record (`self`). However, when an invoice is being linked to a document for the first time, the attachment ID exists only in `vals` and has not yet been applied to `self` via `super().write()`. Consequently, the code assumes there are no documents to sync and skips the folder/tag update. This issue was introduced in 2333367. **Fix:** Detect the specific case where `attachments_to_sync` is empty (no current link) but `vals` contains a `message_main_attachment_id`. In this scenario, force the synchronization flag to `True` so the document is updated after the changes are saved. Note: The loop logic was also refactored to flatten the structure and accommodate the new check more cleanly. Task-5452880
This update resolves a test failure within the im_livechat module. The issue stemmed from a mismatch between the demo data's time zone setting and the test's expectations. By explicitly setting the time zone for the OdooBot partner record, the test now passes correctly.
Original PR description
This PR fixes a failing assertion in `test_channel_get_livechat_visitor_info`. The test fails since [*] because the demo data sets the OdooBot time zone to 'Europe/Brussels', while the test was asserting it to be False. This PR explicitly sets the time zone of the OdooBot partner record and updates assertions accordingly. [*] https://github.com/odoo/odoo/pull/210094 runbot-237778 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a potential issue where live chat agents weren't receiving the latest conversation updates. The change ensures the live chat system correctly connects to the channel bus, guaranteeing agents see real-time updates within the live chat interface. This improves the agent experience and the quality of customer interactions.
Original PR description
The `test_form_view_embed_thread` ensures that the live chat list view redirects to the discuss app and that the bus subscription for the selected channel is properly made. This ensure that a live chat agent looking at a channel will receive the latest updates for the conversation. To ensure the bus subscription is made, the bus service is patched in order to detect calls to add or remove methods. However, we only wait for `whenReady` which is not enough to guarantee the bus is already exposed via `odoo.__WOWL_DEBUG__`. This PR ensure we wait for the list view to be displayed, which ensures the webclient is mounted and the debug info is already set. runbot-234928 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 in the Point of Sale system that prevented users from creating orders with custom prefixes. The change ensures order names are correctly generated, avoiding errors related to data type conversions. This ensures consistent order naming functionality across Odoo 19.1.
Original PR description
**Steps to reproduce:** - Go to the sequence interface, and chose the config number 1 for a pos.order - In the prefix field, enter something with characters that are not numbers - Go to a PoS with…
**Steps to reproduce:** - Go to the sequence interface, and chose the config number 1 for a pos.order - In the prefix field, enter something with characters that are not numbers - Go to a PoS with config number 1 active and make a purchase - A traceback appears saying that we can't convert the sequence to an Integer **Why the fix:** Having a custom prefix with letters used to work, but in version 19, we now store the sequence_number with the prefix, which can be composed of characters which can not be stored in an Integer field such as sequence_number. To prevent this error, we remove the prefix and the suffix (which has the same issue) from the sequence_number before storing it. We then add the prefix and the suffix back when computing the order's name, so that it's consistant with the prefix and the suffix the user chose. This is the way the order's name was computed before version 19.0, which saw the prefix and suffix disappear from the order's name. opw-5386575 Forward-Port-Of: odoo/odoo#239515
6 changes
Resolved issues and error corrections
This update resolves an issue where Odoo couldn't process XML invoices for customer invoices if the 'CustomizationID' tag was missing. The tag is a required element in UBL files, so this fix ensures invoices are correctly imported and processed, preventing import failures.
Original PR description
[FIX] account_edi_ubl_cii: xml import error customization id This error happens when the user tries to import an xml invoice in accounting > customer > invoice and the CustomizationID tag is empty. The cause of this is the CustomizationID tag that exists in the file, but it's empty. This tag is mandatory in a ubl file, so we cannot process the file if it's empty. opw-5238398 Forward-Port-Of: odoo/odoo#236668
This update resolves a bug in the website builder that caused a crash when users modified shadow settings beyond the standard options. The fix ensures the system gracefully handles custom shadow configurations, preventing unexpected errors and improving builder stability.
This update resolves an issue where the final chatbot answer wasn't saved or displayed in the side panel. The fix ensures the backend route is triggered, saving the user's answer and correctly closing the chat session. This improves the user experience by providing complete chat session data.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ When reaching the last chatbot step, the frontend stopped before calling `/chatbot/step/trigger` due…
**Description of the issue this PR addresses:** ------------------------------------------------ When reaching the last chatbot step, the frontend stopped before calling `/chatbot/step/trigger` due to the `isLast` check in `_goToNextStep()`. As a result, `_process_answer()` was not executed, and the user's final answer was not saved, which resulted in the `rawAnswer` field remaining empty and the answer not appearing in the side panel. The chat session was also not marked as closed since the backend route was never called. **Current behavior before PR:** --------------------------------- - The final chatbot answer is not visible in the side panel - The chat session remains open after the final step **Desired behavior after PR is merged:** ----------------------------------------- - The final chatbot answer is saved and displayed in the side panel - The backend route is triggered for the last step - The chat session is properly marked as closed **Task:** 5172125 --- 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 could be incorrectly linked to DIAN documents due to a previous fix that didn't account for legitimate DIAN error messages. Now, the system verifies key invoice details (customer, date) before linking a DIAN identifier, ensuring invoices are correctly associated with the correct documents.
Original PR description
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian…
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian localization with valid DIAN credentials - Create an invoice for a Colombian customer - Confirm the invoice - Send the invoice to DIAN - Cancel and delete the invoice - Create another invoice for another Colombian customer with the same name (sequence) than the previously deleted invoice - Confirm the invoice - Send the invoice to DIAN **Issue:** A previous fix (https://github.com/odoo/enterprise/commit/4d782030631350cfaa8f2993e68f33c9f66929e4) had been made to sync together a DIAN document from Odoo and DIAN when the following error was returned by DIAN: "Regla: 90, Rechazo: Documento procesado anteriormente." It can happen when an invoice is sent to DIAN but due to a connection issue, the DIAN response is not received and the invoice is flagged as rejected. In that case, the "Regla: 90" error is returned by DIAN when trying to send the invoice again and the fix is linking the identifier returned by the DIAN error with the invoice to prevent this issue. However, the fix wasn't taking into account the case in which the error returned by DIAN is legit and the identifier is linked to another document. It results of having an invoice that is linked to an incorrect document in DIAN. The customer, date and other info, completely different. **Solution:** When "Regla: 90" error is returned by DIAN, a check is performed to make sure that the customer, the issue date and time on the document in Odoo and on the XML from DIAN are the same before assigning the identifier from DIAN to the document in Odoo. opw-5095212 Forward-Port-Of: odoo/enterprise#99936
This update fixes a bug in the website builder where changing a setting would incorrectly open the 'Edit' tab instead of the 'Theme' tab. The fix reorganizes the code to ensure the correct tab is displayed after a setting change, improving the user experience.
Original PR description
In commit 281ce591d4271a15dc867b439365cb41e9dee0b4, the condition for the `initiaTab` introduced a mistake: the actual value is ignored, and a truthy value is interpreted as `blocks`. This commit fixes the operation order and move the logic to a single place. Steps to reproduce: - Open website builder - Go to "Theme" tab - Change an option that reloads (like "Show header" in last section) - Bug: it goes to "Edit" (aka customize) tab task-5722163
This update fixes an issue where product prices weren't correctly calculated when using Point of Sale with different currency settings. The fix ensures standard prices are converted to the PoS currency, preventing errors in pricelist calculations and ensuring accurate order totals. This improves the reliability of pricing within the PoS system.
Original PR description
The standard price of the products were not converted to the currency of the PoS journal, which could lead to issues when creating pricelist items based on the standard price. Steps to reproduce: ------------------- * Change the currency of any PoS journal to a different currency than the company currency. * Create a product with a standard price > 0. * Create a pricelist that uses the standard price as a base price. (e.g. price = standard price * 2) * Add this product to a PoS order > Observation: The price is not correctly computed according to the pricelist, because the standard price was not converted to the PoS currency. Why the fix: ------------ We just make sure to convert the standard price of the products when loading the products in the PoS session the same way as we do it for the list price. opw-5124388 Forward-Port-Of: odoo/odoo#241620 Forward-Port-Of: odoo/odoo#241168
12 changes
Resolved issues and error corrections
This update fixes an issue where invalid warehouse addresses were causing repeated geolocation requests to OpenStreetMap. The change now sets default coordinates for invalid addresses, preventing further attempts and improving the reliability of location data on the website. This results in a smoother user experience when selecting warehouse locations.
Original PR description
When a warehouse location had no coordinates, a request to geolocate the address was made to OpenStreetMap every time the location selector was open. However, when the address was invalid, the geolocation failed, and no coordinates were set, which caused further geolocation requests being continuously sent. This commit changes the geolocation behavior to set invalid coordinates for the address when the request fails, thus disabling future geolocation attempts for that address.
This update fixes an issue where clicking links within the Odoo chat window on mobile devices caused the window to remain open and block the newly opened page. The change automatically folds the chat window after a link click, ensuring users can immediately see the relevant page below. This enhances usability and prevents frustration for mobile users.
Original PR description
Clicking on an odoo link in the chat window will take the user to the related page in odoo. However, in mobile view, the chat window remains unfolded and covers the entire page, so the user can't see the newly opened page below the chat window unless they fold the chat window. This change fixes this by folding the chat window in mobile view when clicking an odoo link inside the chat window. task-4762503 Forward-Port-Of: odoo/odoo#208440
This update corrects a bug where invoices could be incorrectly linked to DIAN documents after a rejection due to a connection issue. The fix ensures that the invoice is only linked to the correct DIAN document by verifying key details like customer and date before assigning the DIAN identifier. This prevents data discrepancies and ensures accurate reporting to DIAN.
Original PR description
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian…
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian localization with valid DIAN credentials - Create an invoice for a Colombian customer - Confirm the invoice - Send the invoice to DIAN - Cancel and delete the invoice - Create another invoice for another Colombian customer with the same name (sequence) than the previously deleted invoice - Confirm the invoice - Send the invoice to DIAN **Issue:** A previous fix (https://github.com/odoo/enterprise/commit/4d782030631350cfaa8f2993e68f33c9f66929e4) had been made to sync together a DIAN document from Odoo and DIAN when the following error was returned by DIAN: "Regla: 90, Rechazo: Documento procesado anteriormente." It can happen when an invoice is sent to DIAN but due to a connection issue, the DIAN response is not received and the invoice is flagged as rejected. In that case, the "Regla: 90" error is returned by DIAN when trying to send the invoice again and the fix is linking the identifier returned by the DIAN error with the invoice to prevent this issue. However, the fix wasn't taking into account the case in which the error returned by DIAN is legit and the identifier is linked to another document. It results of having an invoice that is linked to an incorrect document in DIAN. The customer, date and other info, completely different. **Solution:** When "Regla: 90" error is returned by DIAN, a check is performed to make sure that the customer, the issue date and time on the document in Odoo and on the XML from DIAN are the same before assigning the identifier from DIAN to the document in Odoo. opw-5095212 Forward-Port-Of: odoo/enterprise#99936
This update resolves an issue where grouping financial records by account roots resulted in an error. The change allows for full domain optimization, ensuring that grouped record sets display the expected nested data. This improves the functionality of the chart of accounts and reporting.
Original PR description
Access records in a grouped by `account_root` list failed, showing an error message:
Unsupported operator on Root 'Account' (account.account) in [('root_id', 'any', [('display_name', 'in', [10])])]
Step to reproduce:
- New DB with `accountant` module
- Accounting -> Chart of accounts
- Group By "Root"
- Open any grouped record set
When opening the record set, Odoo fetches data using the domain `[('id', '=', '10')]`
The domain goes through optimization as follows:
```
[('id', '=', '10')]
basic : [('id', 'in', ['10'])]
full : [('root_id', 'any', [('display_name', 'in', [10])])]
```
However, the `_search_account_root` method protects the technical field `account_root`.
This commit adapts it to allow full optimized domain search and solving the error.
Ticket [link](https://www.odoo.com/odoo/project.task/5178896)
opw-5178896This update resolves an issue where tables inserted into the To-Do module appeared after the existing text instead of before it. The fix streamlines the table insertion process by moving the logic to a more robust component, ensuring tables are now correctly positioned at the beginning of the block where the user intended.
Original PR description
### Steps to Reproduce : - Open To-Do and type some text. - Place the cursor at the start of the block. - Insert a table. (e.g.: /table) - The table appears after the text instead of before it. ### Purpose of this PR: - Table insertion logic was previously duplicated inside TablePlugin, where it tried to manually split text and inline nodes before inserting the table. However, this responsibility is now correctly handled by `DomPlugin.insert()`, which already: - deletes the current selection if needed. - splits text and inline nodes safely. - handles block boundaries and unsplittable elements. - normalizes the DOM after insertion. - places the cursor at a valid position. task-5480759 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244299 Forward-Port-Of: odoo/odoo#243242
This update fixes an issue where sign templates created in languages other than English didn't correctly reflect the document name. The fix ensures that template names are always updated to match the document name, regardless of the user's language setting, improving the user experience for international users.
Original PR description
## Steps to reproduce: 1. Upload a new PDF document to be signed. 2. Select it in the Documents app to sign it. 3. Check the name of the sign template created. ## Issue: When creating signature templates in languages other than English, the template name would stay as "New Template" instead of updating to the actual document name. This happened because the code was comparing the template name against a translated version of "New Template", but the template was initially created with the English default value. Since "New Template" ≠ "Nueva Plantilla" (Spanish), the comparison failed and the name never got updated. The fix ensures we always compare against the original English default value, so the template name gets properly updated to match the document name regardless of the user's language. Related commit: 4254542 opw-4980747
This update fixes an issue where product prices in Point of Sale were incorrectly displayed due to a double currency conversion. The fix prevents the list price from being multiplied by the exchange rate twice, ensuring accurate pricing for users with multi-currency POS configurations. This improves the reliability of sales transactions.
Original PR description
**Steps to reproduce:** - Have a company that has USD as currency - Make a PoS config that has another currency in the sales journal, such as AED - Open that PoS - Click on a product, then go the the Info tab - Some of the displayed prices will be wrong, as they are multiplied by the exchange rate twice **Why the fix:** If the config's currency is different from the company's currency, we convert the templates' list_price to match the config's currency. This is done in those lines https://github.com/odoo/odoo/blob/b64bdf67dcf273a7e666928ffa6df37b45566f2b/addons/point_of_sale/models/product_template.py#L277-L278 The current problem with this is that this function is called twice, thus multiplying the list_price twice and making it wrong. We can prevent this by checking if it has already been converted before multiplying the template's list_price. opw-5226656
This update allows users to automatically generate QR codes on invoices linked to payment links, enhancing payment convenience. The previous issue occurred when generating these QR codes via API calls due to a missing environment object. This fix provides an optional environment object to the QR code generation process, resolving the error and enabling the feature to function correctly.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. In Accounting/Invoicing settings, enable "Add QR-code link on PDF"; 2. create an automation rule for the `account.move` model; 3. set "Trigger" to…
Versions
--------
- saas-18.3+
Steps
-----
1. In Accounting/Invoicing settings, enable "Add QR-code link on PDF";
2. create an automation rule for the `account.move` model;
3. set "Trigger" to "Create & Edit";
4. set "Apply on" domain to `[("state", "=", "posted")]`;
5. set "When updating" to "Status";
6. add an action to execute the following code:
```python
env['account.move.send']._generate_and_send_invoices(records)
```
7. call `action_post` on an invoice via RPC or Odoo Shell.
Issue
-----
> odoo.addons.base.models.ir_qweb.QWebException: Error while render the template
> RuntimeError: object is not bound
Cause
-----
In order to add a payment link QR code to the invoice[^1], it needs to generate an access token for the portal. This happens via the `generate_access_token` function from `odoo.addons.payment.utils`. Issue is that it relies on having access to a `odoo.http.request` object, so that it can use its `env` to retrieve the `database.secret` config parameter.
When this flow gets triggered via an API call (or Odoo Shell), the `request` object is unbound, causing the error.
[^1]: feature added via commit bcb73cd159885
Solution
--------
Introduce an optional `env` kwarg to `generate_access_token`, falling back on `request.env` if it's not provided.
opw-5487075This update corrects a technical issue preventing users from importing XML invoices through the accounting module. The problem stemmed from a required 'CustomizationID' tag being missing from the XML files, which is now enforced. This ensures proper invoice processing and avoids import failures.
Original PR description
[FIX] account_edi_ubl_cii: xml import error customization id This error happens when the user tries to import an xml invoice in accounting > customer > invoice and the CustomizationID tag is empty. The cause of this is the CustomizationID tag that exists in the file, but it's empty. This tag is mandatory in a ubl file, so we cannot process the file if it's empty. opw-5238398 Forward-Port-Of: odoo/odoo#236668
This update fixes an issue where product prices weren't correctly calculated when using Point of Sale with different currency settings. The fix ensures standard product prices are converted to the PoS currency, preventing incorrect pricelist calculations and ensuring accurate order totals. This improves the reliability of pricing within the PoS system.
Original PR description
The standard price of the products were not converted to the currency of the PoS journal, which could lead to issues when creating pricelist items based on the standard price. Steps to reproduce: ------------------- * Change the currency of any PoS journal to a different currency than the company currency. * Create a product with a standard price > 0. * Create a pricelist that uses the standard price as a base price. (e.g. price = standard price * 2) * Add this product to a PoS order > Observation: The price is not correctly computed according to the pricelist, because the standard price was not converted to the PoS currency. Why the fix: ------------ We just make sure to convert the standard price of the products when loading the products in the PoS session the same way as we do it for the list price. opw-5124388 Forward-Port-Of: odoo/odoo#241620 Forward-Port-Of: odoo/odoo#241168
This update resolves an issue where subfolders accessed via shared links weren't initially displayed correctly. The fix ensures that subfolders are immediately accessible when a user views a shared folder, eliminating the need for a refresh. This enhances the user experience for sharing and accessing documents.
Original PR description
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) -…
**Steps to reproduce:** - Create a portal user - Go to the documents app - Click on the marketing folder - Share the marketing folder through a link (Anyone with a link = viewer + discoverable) - Copy the share link - Login with the portal user in an incognito window - Paste the share link in an incognito browser - Click on "brand 1" folder, result nothing is showing while there should be a folder and a picture - Click on "brand 2" - Click back on "brand 1" and now the folder and picture are visible - If you click on a subfolder of "brand 1" you also get an error **Issue:** Discoverable subfolders accessed using `accessToken` are not available on the first read of a user and this happens for each level of the hierarchy (refresh is needed each time). When using sharing link to display folders with a user, the subfolder document access is created on `/documents/touch/` using `_from_access_token`. But on the js side the call is delayed (with debounce) and occurs after the `web_search_read`. This means that subfolders are only accessible after a refresh or by switching back and forth between folders. Also, even after the folder is displayed, if there are other subfolders in it, going deeper in the hierarchy won't work as well without a refresh due to the `search_panel_select_range` missing the new folder. **Fix:** Not sure on the best way to fix this, the issue will always be related to performance. Current fix checks if a reload is needed by sending a flag in the `/documents/touch/<access_token>` request result when a new document access was created. opw-5156297 Forward-Port-Of: odoo/enterprise#104451 Forward-Port-Of: odoo/enterprise#99820
This update resolves an issue where the l10n_mx_edi module was encountering a 'singleton error' when multiple invoices with the same payment method code were processed. The fix ensures that the system correctly handles these scenarios, preventing errors and improving invoice generation reliability. This change impacts the Mexican e-invoicing reports.
Original PR description
- for more then one records having same code it's raising an singleton error at fetching the name - error: ```py File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 753, in…
- for more then one records having same code it's raising an singleton error at fetching the name
- error:
```py
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 753, in _render_iterall
for item in frame.iterator:
File "<6403>", line 6097, in template_l10n_mx_edi_report_invoice_document_6403
File "<6403>", line 6083, in template_l10n_mx_edi_report_invoice_document_6403_content
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 616, in __str__
self.html = ''.join(self.irQweb._render_iterall(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 753, in _render_iterall
for item in frame.iterator:
File "<6403>", line 1723, in template_l10n_mx_edi_report_invoice_document_6403_t_call_0
File "/home/odoo/src/enterprise/l10n_mx_edi/models/account_move.py", line 424, in _l10n_mx_edi_get_extra_invoice_report_values
cfdi_infos['payment_way'] = f'{payment_way} - {payment_method.name}'
^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/odoo/orm/fields.py", line 1659, in __get__
record.ensure_one()
File "/home/odoo/src/odoo/odoo/orm/models.py", line 5934, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: l10n_mx_edi.payment.method(23, 24)
```
- OPW-5450360
Forward-Port-Of: odoo/enterprise#1034603 changes
Resolved issues and error corrections
This update fixes a layout issue with image galleries containing many images, preventing indicator crowding. It also addresses a laggy visual experience in Firefox caused by lazy loading, now preloading images for smoother transitions. This improves the overall user experience and visual appeal of image galleries.
Original PR description
## [FIX] website: add versioning for GallerySlider interaction The GallerySlider interaction (and its edit mode counterpart) is not up to date: the logic is still written for old snippets (before…
## [FIX] website: add versioning for GallerySlider interaction
The GallerySlider interaction (and its edit mode counterpart) is not up
to date: the logic is still written for old snippets (before [9042b1c],
so before 18.0).
In the meantime, the pagination for the indicators was lost, meaning
that if you add too many images, the indicators will have less and less
space.
Steps to reproduce:
- Drop an Image Gallery snippet
- Set the indicators to squared or rounded miniatures
- Add 15 or more images
=> All the indicators are crammed into the same line.
With this commit, we deprecate the old `GallerySlider` interaction and
create a `GallerySlider001` for the snippets dropped since 18.0.
For the indicators, instead of a pagination, we now use a horizontal
scrolling container which centers on the active indicator.
[9042b1c]: https://github.com/odoo/odoo/commit/9042b1c
## [FIX] website: preload available carousel images
As images are lazy loaded, it means that in the context of a carousel or
an image gallery, they only start loading once the user clicks either on
its indicator or on the previous / next button (or after completing an
auto-slide). While Chrome seems to optimize that to make it seemless, on
Firefox this causes the carousel slide to appear blank for a moment
before the image suddenly pops up, as the sliding animation arrives to
its end.
In effect, this causes a flicker and a feeling that the carousels, and
especially the gallery, is extremely laggy.
To mitigate that while trying to keep the advantages of image lazy
loading, this commit partially backports [08d837e], which loads the
images of the next and the previous carousel items.
Additionally, we prefetch the target images on pointerdown / keydown on
an indicator. That may seem like too small of a difference to be
interesting, but it actually gives a little bit of time between the
pointerdown and pointerup (which triggers the slide event) to start
loading the images, which with a correct connexion already goes a long
way towards mitigating the laggy feeling.
[08d837e]: https://github.com/odoo/odoo/commit/08d837e70f28a84a9bd97974f5d15d387a42b7c0
task-5245513This update fixes an issue where invoices could be incorrectly linked to DIAN documents due to a previous fix that didn't account for legitimate DIAN error messages. Now, the system verifies key invoice details (customer, date, time) before linking a DIAN identifier, ensuring accurate document association and preventing data discrepancies.
Original PR description
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian…
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian localization with valid DIAN credentials - Create an invoice for a Colombian customer - Confirm the invoice - Send the invoice to DIAN - Cancel and delete the invoice - Create another invoice for another Colombian customer with the same name (sequence) than the previously deleted invoice - Confirm the invoice - Send the invoice to DIAN **Issue:** A previous fix (https://github.com/odoo/enterprise/commit/4d782030631350cfaa8f2993e68f33c9f66929e4) had been made to sync together a DIAN document from Odoo and DIAN when the following error was returned by DIAN: "Regla: 90, Rechazo: Documento procesado anteriormente." It can happen when an invoice is sent to DIAN but due to a connection issue, the DIAN response is not received and the invoice is flagged as rejected. In that case, the "Regla: 90" error is returned by DIAN when trying to send the invoice again and the fix is linking the identifier returned by the DIAN error with the invoice to prevent this issue. However, the fix wasn't taking into account the case in which the error returned by DIAN is legit and the identifier is linked to another document. It results of having an invoice that is linked to an incorrect document in DIAN. The customer, date and other info, completely different. **Solution:** When "Regla: 90" error is returned by DIAN, a check is performed to make sure that the customer, the issue date and time on the document in Odoo and on the XML from DIAN are the same before assigning the identifier from DIAN to the document in Odoo. opw-5095212 Forward-Port-Of: odoo/enterprise#99936
This update ensures Argentinian users can correctly issue credit notes by adding document type 110 - CREDIT NOTE TICKET, as required by AFIP regulations. Previously, this option was missing, preventing proper credit note creation. This change improves compliance and functionality for Odoo users in Argentina.
Original PR description
**Description of the issue/feature this PR addresses:** This PR adds the AFIP document type 110 - CREDIT NOTE TICKET, which is required for the Argentinian localization **Current behavior before…
**Description of the issue/feature this PR addresses:** This PR adds the AFIP document type 110 - CREDIT NOTE TICKET, which is required for the Argentinian localization **Current behavior before PR:** When users in Argentina tried to create a credit note for a ticket, the corresponding document type was not available as an option. **Desired behavior after PR is merged:** After this change, users can now select "110 - CREDIT NOTE TICKET" to issue the document correctly. [HERE](https://app.screencastify.com/watch/fVBWwSD6DAcodKO57qUZ) is a video replicating the issue 1) In localization Argentina, check document types and see that 110 CREDIT NOTE TICKET exists 2) Create a new journal as shown in the video 3) Create an invoice selecting that journal, and (83) TICKET as Document Type 4) Confirm the invoice and try to create a credit note. See that (110) CREDIT NOTE TICKET does not appear as an option --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228256
17 changes
Resolved issues and error corrections
This update clarifies how preset selections work within the Point of Sale (POS) system. Specifically, it now visually indicates when preset options are presented as pop-ups, aligning with a recent change in how two-preset selections are handled. This ensures a smoother and more intuitive user experience for POS operations.
Original PR description
In this commit: =============== Update POS tours to explicitly indicate popup usage when selecting presets, to support the new auto-toggle behavior introduced when only two presets are configured. Task-5491093 Related Comm. PR: https://github.com/odoo/odoo/pull/244455
This update resolves an issue where the 'Other Input' section of the Payroll app incorrectly displayed trailing zeros for negative salary attachment counts. The fix adjusts a widget to properly handle negative values, ensuring accurate reporting of negative amounts. This improves the clarity and reliability of payroll data.
Original PR description
Steps to Reproduce: - install Payroll app - create an employee and create a salary attachment. - check the negative value for salary attachment - generate a payslip Issue: - In "Other Input" section, salary attachment count displays value with trailing decimal zeros for negative amounts. Reason: - The field is using the widget float_without_trailing_zeros which should remove the extra decimal zeros but it doesn't work when the value is negative. Solution: - Fix the regular expression in the float_without_trailing_zeros widget to handle negative values and properly remove trailing decimal zeros. task-5477466 Forward-Port-Of: odoo/odoo#243074
This update resolves a technical error within the WPS report testing process. Previously, a test was incorrectly creating bank records, which has now been corrected by ensuring the correct company ID is used. This ensures accurate report generation and data integrity.
Original PR description
The test was creating a res.partner.bank with the id of company passed as partner_id. This commit fixes this issue by passing the partner_id of the company instead. build_error-237562
This update corrects a problem where product images weren't consistently being removed from the website, particularly for products with variations. The fix ensures the image is fully loaded into the webpage before the removal button is clicked, preventing errors and improving the user experience. This ensures accurate product displays on the website.
Original PR description
With this commit, we fix tours: - website_sale.remove_main_product_image_with_variant - website_sale.add_and_remove_main_product_image_no_variant where we want to remove the product image. This fix add a step to ensure the image is in DOM before clicking on the remove button. error-runbot-id~237766 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 simplifies the handling of recoverable amounts in return payments. Instead of automatic propagation, users can now manually deduct these amounts within the payment wizard, triggering a reconciliation move. This provides greater control and accuracy when processing returns.
Original PR description
Now we removed the automatic propagation of the recoverable amount from closing to closing. Instead the balance under the return amount shows the amount that is left to pay. And if we want, in the pay wizard, we can deduct the recoverable amount from the amount to pay for the period. When doing this, a reconciliation move is automatically made. task-5172274
This update resolves a technical issue that prevented demo data from installing correctly. The problem stemmed from a missing timezone setting for employees, introduced during a recent update to the working schedule. This fix ensures demo data installs without errors.
Original PR description
This PR fixes a bug in a test when demo data is installed. A timezone setting was missing on the employee. The refatoring PR of the working schedule (https://github.com/odoo/enterprise/pull/96139) introduced the issue. Runbot build error: https://runbot.odoo.com/odoo/runbot.build.error/238014 task-5704131
This update resolves a problem where scanning barcodes on picking orders with kit product variants would cause an error. The fix ensures that packaging information is correctly captured during barcode scans, allowing for accurate tracking of kit components.
Original PR description
In the barcode application, scanning a picking order containing a kit product variant with packaging will raise a Traceback. ### Steps to reproduce: 1. Enable packagings on inventory configuration.…
In the barcode application, scanning a picking order containing a kit product variant with packaging will raise a Traceback. ### Steps to reproduce: 1. Enable packagings on inventory configuration. 2. Create a product, that as a least 2 variants. 3. Add a packaging to one of the variants. 4. Create a BoM for created product (kit type). 5. Create a picking order for the variant with packaging. 6. Print the picking operation to scan the code through barcode. 7. Go to barcode and try to scan it, this will trigger the traceback. ### Cause of the issue: Scaning a barcode will call get_barcode_data during this call it will retrieve the information about the picking order and call _get_stock_barcode_data: https://github.com/odoo/enterprise/blob/f2dd6326c2084ed467c3e4c3e9d931f41309ad79/stock_barcode/controllers/stock_barcode.py#L91 _get_stock_barcode_data will obtain the packaging methode for the products. https://github.com/odoo/enterprise/blob/f2dd6326c2084ed467c3e4c3e9d931f41309ad79/stock_barcode_mrp/models/stock_picking.py#L13-L16 since in our use case the product has variant the packaging information is not inside product_tmpl_id.packaging_ids and thereof it will not retrieve the packaging information. ### Fix: We don't need to use product_tmpl_id.packaging_ids because of its compute and set methods (and the fact that the product_variant_ids field is required), the product_tmpl_id.packaging_ids will always be included in the product_tmpl_id.product_variant_ids.packaging_ids: https://github.com/odoo/odoo/blob/eb88370e2fc1887e8c88dfd8dbeadce23bb7abe5/addons/product/models/product_template.py#L430-L441 our fix will allow for packaging in the variant to be considered when there is more than only one variant. opw-4852875 Forward-Port-Of: odoo/enterprise#103860 Forward-Port-Of: odoo/enterprise#87867
This update clarifies the 'Do Not Disturb' (DND) icon in the softphone interface. Previously, the DND icon was visually similar to other status indicators, leading to potential user confusion. This change ensures a clearer visual distinction for the DND status, improving usability.
Original PR description
This commit updates the DND icons in the softphone to avoid confusion with other status icons represented by a colored dot. task-5479064 Requires: - https://github.com/odoo/odoo/pull/244291 | Before | After | |--------|--------| | <img width="168" height="91" alt="Capture d’écran 2026-01-16 à 16 15 32" src="https://github.com/user-attachments/assets/ad7447d2-8d8d-4963-abf8-6b4ac27270c0" /> | <img width="155" height="86" alt="Capture d’écran 2026-01-16 à 16 16 17" src="https://github.com/user-attachments/assets/485ec299-1f39-4bc4-84c8-199c0bbdf6cc" /> | | <img width="399" height="159" alt="Capture d’écran 2026-01-16 à 16 16 58" src="https://github.com/user-attachments/assets/c590e7bf-c3ee-45c7-a6bf-69080c2a158c" /> | <img width="397" height="156" alt="Capture d’écran 2026-01-16 à 16 17 32" src="https://github.com/user-attachments/assets/32b3ec65-4ca4-492a-a9c4-642b16be5340" /> |
This update enhances the message list by displaying specific error details when loading messages fails. Previously, users only saw a generic 'An error occurred' message. Now, users receive a more informative error message, providing a clue about the cause of the failure and reducing frustration.
Original PR description
Before this commit, when message list failed to load, it just displays a "Ann error occurred" generic message with a retry button. This assumes that error happens rarely and when so this is temporarily. However some errors are persistent and it's frustrating to have no clue on why there's error or what may have caused it. This commit shows the `Error.toString()` from fetch message RPC failure on UI, so that there's a clue on the reason the fetch of messages failed. Before / After <img width="322" height="78" alt="Screenshot 2026-01-15 at 18 18 31" src="https://github.com/user-attachments/assets/81873d16-c489-4be8-b2de-64f7dec2215e" /> <img width="347" height="91" alt="Screenshot 2026-01-15 at 18 17 44" src="https://github.com/user-attachments/assets/90bc09e6-99a8-4722-92d0-f972aee20b36" />
This update ensures that optional field toggles within the Odoo list view are always visible above column resize handles. Previously, these toggles could be obscured, making it harder for users to quickly select or deselect optional fields. This change improves the user experience and clarity of the list view.
Original PR description
This commit increases the z-index of the toggle of the optional field dropdown s.t. it is always above the column resize handle. Task~5504022 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 an issue preventing the bank reconciliation view from functioning correctly offline. The change disables caching for this specific view, ensuring it can access data even without an internet connection. This improves the reliability of this key financial reporting tool.
This update fixes a bug in the chatbot where invalid phone numbers were accepted, leading to inaccurate data. Now, the chatbot validates phone input, displaying an error message and preventing users from proceeding until a valid number is entered, ensuring reliable contact information.
Original PR description
**Description of the issue this PR addresses:** ------------------------------------------------ Before this change, the chatbot phone step allowed any input, including invalid characters, leading to incorrect phone numbers and inconsistent data. **Current behavior before PR:** --------------------------------- - Phone step accepts any input - Users can proceed with invalid numbers **Desired behavior after PR is merged:** ----------------------------------------- - Phone input is validated in the chatbot - Invalid numbers show an error message: `'xxx' does not look like a valid phone number. Can you please try again?'` - Users cannot proceed until a valid number is entered **Task:** 4949441 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where excessive logging was appearing in Odoo's unit tests. By hiding these logs, the tests now run more efficiently and reliably. This improves the overall stability and performance of the Odoo platform.
Original PR description
This commit hides unwanted logs in unit tests check_undeterminisms 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 corrects an issue where valid Mexican account numbers (CLABE) were incorrectly formatted with spaces. This change ensures that payroll reports generated for Mexico comply with EDI standards, preventing errors in reporting and financial processing. The fix utilizes a sanitized account number to guarantee accurate data transmission.
Original PR description
Before this commit, an account number that is a valid CLABE would be formatted with spaces. Reporting this account number then in the mexican EDI would be wrong because it's expected to have no spaces. This commit solves this issue by reporting the sanitized_account_number instead. task-5727295
This update enhances how users manage their consent for online account synchronization. The change allows for a more flexible approach to handling consent requests, addressing a previous technical issue. This improves the user experience and ensures compliance with data privacy regulations.
Original PR description
In this commit:https://github.com/odoo/enterprise/commit/bf5b7d03fe8e138ee8bc0246d3d148638db5d620 we introduce a message on the account_online_link to be able to manage the consent. But since manage_consent is not a field of account.online.linki would traceback, we changed the position of the code by popping the value. Also changed the url to use the provider_type to be able to use the route with any provider if needed task-5187621 Forward-Port-Of: odoo/enterprise#104519 Forward-Port-Of: odoo/enterprise#102428
This update addresses several small issues within the l10n_hr_edi module, primarily focused on improving error handling and the user interface. Specifically, it enhances the process of fiscal document status checks, supports multi-company operations, and streamlines bill approval workflows. These changes ensure greater stability and usability for users.
Original PR description
- Adjusting error handling for receiving an empty response from MER for a document fiscalization status. - Adding additional checks for running multi-company-wide MER API methods. - Adjusting how approval API call is handled when confirming a bill. - Adding a tooltip about Company BU in MER settings and missing "company dependent" indicators for the credentials. Continuation of task-4925745 Related to opw-5477846 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244357 Forward-Port-Of: odoo/odoo#244023
This update corrects a data issue within the Odoo Enterprise system related to Chilean SII (Service de Impuestos Internos) reporting. Specifically, the information for the 'Alto Hospicio' Regional Office and its associated Comuna (Alto Hospicio) within the Taracapá region has been added, ensuring accurate tax reporting compliance.
Original PR description
Oficina Regional Alto Hospicio Comuna Alto Hospicio Región Taracapá Forward-Port-Of: odoo/enterprise#102712
21 changes
Resolved issues and error corrections
This update simplifies the Odoo Point of Sale receipt by removing the unit price display for individual items within combo products. This change, aligned with a recent Odoo 19.0 update, reduces customer confusion and provides a cleaner, more straightforward receipt experience. The removal ensures the total combo price is clearly presented.
Original PR description
Steps to reproduce: - In POS, select a combo product, confirm, and pay for it. - When the receipt is shown, the price per unit for the combo and for each product inside the combo is showing. Issue: - The price calculation of the individual products constituting the combo and showing the unit price of the combo when the combo quantity is 1 is confusing for the customer. Fix: - Since Odoo 19.0, we stopped showing prices for child lines in a combo on the cashier side; the same logic was followed here for the receipt. - The price per unit for a combo isn't necessary to appear when the quantity of the combo is 1.
This update resolves an issue where the 'generate recurring invoices' cron job repeatedly ran due to subscriptions without payment methods. The fix prevents the cron job from getting stuck in a retry loop by excluding invalid subscriptions, ensuring invoices are generated correctly and efficiently. This improves the reliability of recurring billing.
Original PR description
### Issue: The cron "Sale Subscription: generate recurring invoices and payments" runs several times when there is a subscription with no payment method. ### Steps to reproduce: - Install…
### Issue: The cron "Sale Subscription: generate recurring invoices and payments" runs several times when there is a subscription with no payment method. ### Steps to reproduce: - Install "sale_subscription" - In the Settings, activate "Online payment" AND "Consolidate subscriptions billing" - Activate Stripe - As admin, connect to /my/ page - Add a payment method using Stripe VISA test card: 4000000000000341 - Create a subscription for a newly created user: - Recurring plan: monthly - Start date in the past to make it "to renew" - Gear > Mark quotation as sent - Confirm - Create another similar subscription for the admin: - this time also add the payment method in "Payment Token" - Go to "Scheduled Actions" and run "Sale Subscription: generate recurring invoices and payments" manually - In the second subscription, there should be several messages (~10) saying the payment failed ### Cause: When `grouped` is `True`, `_get_subscriptions_to_invoice()` is called for each partner. As one partner only has a subscription for which we can't create a payment, the method returns `sale.order()`. So `all_subscriptions` is something like `[sale.order(2), sale.order()]`. Then in `_create_recurring_invoice()` the empty sale orders are ignored but the progress is not notified to the cron. So the cron is always in the "partially done" state and retries up to its max number of tries. ### Solution: Exclude the null values returned by `_get_subscriptions_to_invoice()`. opw-5242298
This update fixes an issue where contacts with duplicate courses were incorrectly merged, leading to data inconsistencies. Now, the system prevents merging contacts with identical courses, displaying an error message to the user. This ensures data accuracy and a better user experience when managing attendees for website slides.
Original PR description
Expected Behaviour: Contacts with Duplicate courses should not be merged and the merge should fail. Actual Behaviour before the Fix: Contacts with duplicate courses are getting merged and the duplicate course is kept in the destination contact. Behaviour with the Fix: Contacts with duplicate courses are blocked from being merged and an error message is shown to the user saying that the reason the merge is blocked is a duplicate course. Steps to reproduce: 1- Go to one of the courses 2- Add two attendees to the course 3- Go to Contacts App 4- Select the two attendees you added to the course 5- Try merging the two contacts Before the fix, the merging will happen. After the fix, the merging will stop and an error message will appear.
This update significantly speeds up the process of searching for products within EDI invoices, particularly those generated by PEPPOL. By restructuring the database query, the system now utilizes indexes more effectively, dramatically reducing search times from minutes to seconds, even with a large number of products.
Original PR description
The \_retrieve \_product() function relies on a query with multiple domains OR'ed together. As the search will require a LEFT JOIN with the product_template table, the use of OR in the query prevents…
The \_retrieve \_product() function relies on a query with multiple domains OR'ed together. As the search will require a LEFT JOIN with the product_template table, the use of OR in the query prevents Postgres from utilizing indexes. This becomes a problem in databases with a large number of products since a seq scan would be very slow. This commit changes the way this is done by performing separate queries instead of a single query with multiple conditions within an OR statement. Although this might seem a performance degradation, it actually allows these separate queries to utilize indexes and run much faster compared to the original approach. It also simplifies the priority logic and allows for faster early exits compared to the original one. This function is mainly used with EDI crons (such as PEPPOL where this problem was noticed), which could require hundreds of product searches as it does a search per invoice line. Benchmarks: Importing a peppol document of 173 invoice lines. | Num products | Num invoice lines | Before | After | | ------------ | ----------------- | -------- | ------- | | 864873 | 173 | 868.18 s | 19.43 s | | 397005 | 173 | 468.91 s | 20.68 s | | 8064 | 173 | 125.08 s | 20.1 s | | 564 | 173 | 119.9 s | 20.21 s | opw-5245007 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240753 Forward-Port-Of: odoo/odoo#238853
This update resolves an issue in the forecasted inventory view where manufacturing reservations (mrp.production) were incorrectly linked, leading to inaccurate navigation. The fix ensures the correct reservation document is displayed, improving the accuracy of inventory forecasts and reporting.
Original PR description
**Issue:** The forecasted inventory view assumed that line.reservation was always a `stock.picking`. In manufacturing flows, the reservation can be an `mrp.production`, which caused incorrect…
**Issue:** The forecasted inventory view assumed that line.reservation was always a `stock.picking`. In manufacturing flows, the reservation can be an `mrp.production`, which caused incorrect navigation to a `stock.picking` record. Fix this by comparing both model and id when checking if the reservation differs from the outgoing document, and by opening the reservation using its actual model. This ensures the correct document is shown and avoids duplicate or invalid links in the "Used by" column. **Steps to reproduce:** - Create a v19 db with sale,mrp,sale_stock with `--demo-true`. - Go to products -> search for 'FURN_0269' product and open form view. - open forecasted smart button for forecasted reeport. - check the used by column for mrp reservation - i.e,: `WH/MO/00001 - WH/MO/00001` appears twice. - clicking on first, opens correct record of `mrp.production` where the units is reserved. - clicking on the second, navigate to false record of `stock.picking` by taking the id of `mrp.produciton` as the reserve is having `_name: "mrp.production"` **Screenshots from UI:** - Product page: <img width="1253" height="572" alt="stock_1" src="https://github.com/user-attachments/assets/13cd7f0a-34b0-48ea-a8d5-5337cbf9f5a5" /> - Forecasted report for that product: <img width="1908" height="994" alt="stock_2" src="https://github.com/user-attachments/assets/ce0af8a3-9f37-469c-8119-36b6e7be9c4a" /> - Clicking on First `WH/MO/00001` button: <img width="1265" height="568" alt="stock_3" src="https://github.com/user-attachments/assets/a8cb8a08-5c24-45f7-ad2e-5e3987f9ee70" /> - Clicking on second `WH/MO/00001` button, navigating to incorrect `stock.picking` by taking id of `mrp.production` even though there is no picking avaiable: <img width="1264" height="519" alt="stock_4" src="https://github.com/user-attachments/assets/3a2d1613-ccbb-4994-898c-c885690c507e" /> **Final view Before and After the Fix:** - For final view, In order to check the reservation done by `stock.picking`, I have created a `sale.order` having delivery for the same product to showcase both of them are working. - **Before Fix:** <img width="1907" height="994" alt="stock_5" src="https://github.com/user-attachments/assets/4441910e-348b-4270-ab1b-db903b334c97" /> - **After Fix:** <img width="1905" height="940" alt="stock_66" src="https://github.com/user-attachments/assets/ba288e6b-b2c9-47ed-b752-233ff876fb55" /> opw-[5481220](https://www.odoo.com/odoo/70/tasks/5481220?debug=1) upg-[3804157](https://upgrade.odoo.com/odoo/upgrade.request/3804157?debug=1) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the Odoo Studio export process incorrectly excluded certain related and computed fields. The team has refined the exclusion logic to accurately handle these fields, ensuring a more reliable export experience. This change was validated by the Industry team and addresses a previous bug.
Original PR description
This commit fixes the computation of excluded fields for the studio export models. Before this commit, the excluded fields computation was considering computed and related fields in a similar way but…
This commit fixes the computation of excluded fields for the studio export models. Before this commit, the excluded fields computation was considering computed and related fields in a similar way but there are subtle differences that cause the excluded fields to sometimes be wrong. While analyzing the heuristic with the ORM team, we decided to separate the computation of related and computed fields. After this commit, we have a refined computation of excluded fields for related and computed fields: - for computed fields (that are not related ones), we always exclude them except when they are writeable (i.e. stored or with inverse) - for related fields, we always exclude them when the relation is in the list of related models to exclude. We also exclude them when they are not writeable on the current record only (not the source record), except if they are required. Some export scenarios have been tested manually and brought with them adaptations in the hardcoded lists of default fields to exclude. The Industry team agreed with these changes. Task id: opw-4974787
This update fixes an issue where invoices generated for EU Standard (Peppol Bis 3.0) eInvoices were incorrectly displaying the customer's VAT number instead of their company registration number. The change ensures that the correct company identification data is used in the XML invoice format, complying with EU regulations. This improves data accuracy and reduces the risk of errors during e-invoicing.
Original PR description
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs:…
The base `_get_party_node` uses `commercial_partner.ref` for `PartyIdentification` and `commercial_partner.vat` for `CompanyID`. There was no logic to prefer `company_registry` when available. Refs: An independent invoice example: https://developer.vertexinc.com/einvoicing/docs/belgium-example-documents https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1564-L1566 https://github.com/odoo/odoo/blob/40c862476382c68d7f452284074f5b44955d1f98/addons/account_edi_ubl_cii/models/account_edi_xml_ubl_20.py#L1585 Steps To Reproduce: - Have accounting, account_edi_ubl_cii and contacts installed. - Create a Belgian company and set the VAT, Company ID and Reference (under Sales & Purchase tab). - Create a contact and set his eInvoice format in Accounting tab to EU Standard (Peppol Bis 3.0) and make sure to give him a country. - Go to accounting -> Customers -> Invoices and create an invoice for the contact you created. - Send the invoice to the contact and download the XML from the chatter and inspect it. - PartyIdentification/ID shows the partner's ref field value (e.g., "(odoobe)") instead of the company registration number. - PartyLegalEntity/CompanyID uses the VAT number instead of the company registration number (ondernemingsnummer). Ticket [link](https://www.odoo.com/odoo/project.task/5418190) opw-5418190 Forward-Port-Of: odoo/odoo#243143
This update ensures the minimum wage is correctly calculated for employee contracts, reflecting recent changes in Belgian labor laws. Specifically, the minimum wage is now proportionally adjusted based on the employee's work time rate, ensuring accurate payroll processing. This change improves compliance and accuracy.
Original PR description
Since changes made in 302bf2b4e201da8f56b1da012dd7f03c81a85e22 the minimum wage should be pro-rated to the work time rate.
This update fixes an issue where sorting of picking records wasn't functioning correctly due to a technical detail in how Odoo compares related data. The change ensures that picking records are accurately sorted based on their identifiers, improving data consistency and reliability. This resolves a potential problem with reporting and data analysis.
Original PR description
Ordering recordset based on relationnal field should always take the relational field's `.id` instead of the field itself. This is due to the BaseModel `__gt__` override comparing if a set is included into another and not if the `id` is bigger that the other `id`. runbot : 237512 Forward-Port-Of: odoo/enterprise#104561
A test used to fail intermittently due to a race condition during inventory adjustments. This update ensures the test accurately reflects the process by closing a notification message after the first adjustment, preventing confusion and ensuring correct results. This improves the reliability of our inventory testing.
Original PR description
Before this commit, it could happen the test `test_inventory_packaging` fails sometime. It fails while checking the last assert: ```python self.assertEqual(self.product1.qty_available, 15.0) ``` The…
Before this commit, it could happen the test `test_inventory_packaging` fails sometime. It fails while checking the last assert: ```python self.assertEqual(self.product1.qty_available, 15.0) ``` The error message is: `AssertionError: 16.0 != 15.0` In the tour, we do a first inventory adjustment where we set the `proquct1` qty to 16, then we do a second inventory adjustment where we set its qty to 15. Now, the assert sometime fails because in the tour, the last step check the success message is visible: ```javascript trigger: ".o_notification_bar.bg-success", ``` The issue with that is that we already do a first inventory adjstment and its success notification is still visible while processing the second inventory adjustment, creating a race condition. To fix that, we just need to close the first notification message, and to do so, this commit back-ports and uses the step utils' method `checkNotificationMessage` (see [1]) since this method checks a notification message is there and close it. [1]: https://github.com/odoo/enterprise/pull/101495 runbot-build-error: [227692](https://runbot.odoo.com/odoo/runbot.build.error/227692) Forward-Port-Of: odoo/enterprise#104481
This update corrects a bug where invoices could be incorrectly linked to DIAN documents due to connection issues. When a DIAN error occurs, the system now verifies key invoice details (customer, date, time) match the DIAN data before linking, ensuring accurate document association and preventing data discrepancies.
Original PR description
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian…
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian localization with valid DIAN credentials - Create an invoice for a Colombian customer - Confirm the invoice - Send the invoice to DIAN - Cancel and delete the invoice - Create another invoice for another Colombian customer with the same name (sequence) than the previously deleted invoice - Confirm the invoice - Send the invoice to DIAN **Issue:** A previous fix (https://github.com/odoo/enterprise/commit/4d782030631350cfaa8f2993e68f33c9f66929e4) had been made to sync together a DIAN document from Odoo and DIAN when the following error was returned by DIAN: "Regla: 90, Rechazo: Documento procesado anteriormente." It can happen when an invoice is sent to DIAN but due to a connection issue, the DIAN response is not received and the invoice is flagged as rejected. In that case, the "Regla: 90" error is returned by DIAN when trying to send the invoice again and the fix is linking the identifier returned by the DIAN error with the invoice to prevent this issue. However, the fix wasn't taking into account the case in which the error returned by DIAN is legit and the identifier is linked to another document. It results of having an invoice that is linked to an incorrect document in DIAN. The customer, date and other info, completely different. **Solution:** When "Regla: 90" error is returned by DIAN, a check is performed to make sure that the customer, the issue date and time on the document in Odoo and on the XML from DIAN are the same before assigning the identifier from DIAN to the document in Odoo. opw-5095212 Forward-Port-Of: odoo/enterprise#99936
This update resolves a technical issue where Stripe was not properly reporting the reason for failed expense authorization requests. Specifically, when Stripe reached its spending limit, a 'authorization_controls' reason wasn't displayed. This change adds a user-friendly translation of this reason, improving the clarity of error messages and enabling better tracking of expense authorization problems.
Original PR description
When Stripe refuses an authorization due to the maximum allowed being reached, there is a specific technical reason "authorization_controls" that wasn't mentioned in their documentation. This adds the reason with a user-friendly translation See [doc](https://docs.stripe.com/api/issuing/authorizations/object?api-version=2025-01-27.acacia#issuing_authorization_object-request_history-reason)
This update fixes an issue where the product comparison bar was hidden behind website snippets. By increasing the bar's z-index, it now consistently appears on top of all content, ensuring users can always access and use the comparison feature regardless of the website layout. This enhances the user experience for product selection.
Original PR description
Reverting this Commit: https://github.com/odoo/odoo/commit/0cda08f0c215ae6c7db0c4226a8b60ad3884e6b7 Before this commit: The product comparison bottom bar had a z-index of only 3 (or 4 when expanded).…
Reverting this Commit: https://github.com/odoo/odoo/commit/0cda08f0c215ae6c7db0c4226a8b60ad3884e6b7 Before this commit: The product comparison bottom bar had a z-index of only 3 (or 4 when expanded). This low z-index value caused it to be overlapped by any website snippets using grid mode with more than 3 items, as grid items conventionally have incremental z-index values (1, 2, 3, 4, ...) for JavaScript consistency. The issue was not limited to s_banner_categories but affected all grid-based snippets, making the comparison bar inaccessible when positioned behind snippet content. Solution: Increase the comparison bar's z-index to -modal (1055 in Bootstrap), ensuring it always appears above regular page content including grid snippets, while still remaining below actual modals and dialogs. After this commit: The comparison bar consistently appears on top of all snippet content, ensuring users can always access and interact with product comparisons regardless of the page layout or snippet configuration. opw:5426163 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects a visual glitch where dynamic website snippets would briefly appear and disappear. The issue stemmed from a change in how snippets were styled, and this commit restores the original design: snippets now start with no visibility class, relying on content to determine display.
Original PR description
Steps to reproduce [18.2+]: 1. Add a dynamic snippet to a website page (e.g., Events). 2. Unpublish all event records. 3. The snippet first appears with a visible header, which then disappears. [A]-…
Steps to reproduce [18.2+]: 1. Add a dynamic snippet to a website page (e.g., Events). 2. Unpublish all event records. 3. The snippet first appears with a visible header, which then disappears. [A]- Starting from [1], the `o_dynamic_empty` class was introduced to handle the dynamic snippets visibility, and an upgrade script (see [3]) set this class by default on them. Later in 18.0 (after [2]), the class was changed to `s_dynamic_empty` in the XML template, while on the JS side, the class used to toggle snippet visibility was `o_dynamic_snippet_empty`. This class was also added to snippets on destroy (before saving). [B]- As a result, a dynamic snippet may end up with: - `o_dynamic_empty` & `o_dynamic_snippet_empty`: for old (before 18.0) but edited snippets. - `o_dynamic_empty`: for old snippets never updated in edit mode on 18.0. - `s_dynamic_empty` & `o_dynamic_snippet_empty`: for new snippets created in 18.0. Remark: the `s_dynamic_empty` class was introduced by mistake and does not have any associated CSS Since only `o_dynamic_snippet_empty` has `display: none` in CSS, the interaction flow became inconsistent (starting from 18.2): snippets were initially visible, then hidden if no content was found... which caused the flickering behavior described above. And because of [B], old snippets with the `o_dynamic_empty` class will be visible by default in 18.0. This commit restores the intended (and original) behavior: - A dynamic snippet should be invisible by default, - Then the interaction decides (based on actual content) whether the snippet should be displayed. [1]: https://github.com/odoo/odoo/commit/63def9c87305dd7773e0592a28fe19d0b63c0878 [2]: https://github.com/odoo/odoo/commit/76cf201e1fc356ad00b27bcdec408c54949df33b [3]: https://github.com/odoo/upgrade/commit/af5821d9aeb75d09653fc33f14e98fae5f5ba906 opw-5354523 Forward-Port-Of: odoo/odoo#240475 Forward-Port-Of: odoo/odoo#238305
This update fixes an issue where Odoo was creating duplicate vendor contacts due to differences in how VAT numbers were formatted. Now, Odoo correctly identifies and merges contacts even when VAT numbers have or don't have dots, ensuring accurate record-keeping for vendor bills. This improves data consistency and simplifies reporting.
Original PR description
Description of the issue/feature this PR addresses: Odoo can create two contacts for the same VAT number Current behavior before PR: If you have two incoming vendor bills (over a period of time)…
Description of the issue/feature this PR addresses: Odoo can create two contacts for the same VAT number Current behavior before PR: If you have two incoming vendor bills (over a period of time) where the first bill has these details: - VAT number: `BE0477472701` - Name: `Odoo` And the second bill (e.g three months later) has these details: - VAT number: `BE0477.472.701` - Name: `Odoo S.A` Odoo will do something interesting and will create a second new contact. The reason is because the fallback on `name` from `res.partner` fails (since "Odoo S.A" is not equal to "Odoo". However, the `vat` number matching also fails! Since the VAT number "BE0477.472.701" is not identical to "BE0477472701". Throughout Odoo however VAT numbers are parsed and stored without dots in it. The function `_retrieve_partner_with_vat` however is an exception because the `vat` number here is sanitized for spaces but not for dots. Because of the combination of no exact match on neither `name` nor `vat` it now creates a second contact although the VAT number is technically the same. Desired behavior after PR is merged: Both an incoming vendor bill with `0477.472.701` and `0477472701` match to the same contact even if there are dots in it and if the name of the company is different. P.S: please find two sample XML's here: [sample_odoo_sa_bill.xml](https://github.com/user-attachments/files/24718225/sample_odoo_sa_bill.xml) [sample_odoo_bill.xml](https://github.com/user-attachments/files/24718226/sample_odoo_bill.xml) If you upload both back to back on a default V19 you will see two contacts. After this code change you will only see one contact where both bills are mapped to the same contacts. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue preventing Spanish reports from correctly displaying translations. The previous method of executing translations within the Markup frame resulted in a lack of necessary context and data, failing to retrieve the correct language. By changing the translation process, the reports now display accurate Spanish translations.
Original PR description
Problem --------- Currently, the lazy translation is executed inside the Markup frame. This has the consequence of having the frame pretty much empty (no context, no user, no cr) when looking for the language. Thus, the lazy translate cannot retreive any language. Solution --------- Use `str` in the compute method so that the frame used to compute the translation is actually the compute method (which has data needed to retreive the language) and not the markup. Before: -> compute ..|-> Markup (the frame used) ....|-> _lt => fail After: -> compute (the frame used) ..|-> _lt ....|-> Markup error-237535 error-237536
This update corrects a bug where free product rewards in the loyalty program were incorrectly displaying a non-zero price in the shopping cart. The issue stemmed from an override in the `sale_subscription` module that was causing unnecessary discount calculations. This fix ensures accurate pricing for free loyalty rewards.
Original PR description
### Issue: Due to this issue, the free product reward line might have a non-zero price. #### To reproduce: 1- Install `website_sale_loyalty` and `sale_subscription`. 2- Enable `Discounts` on…
### Issue: Due to this issue, the free product reward line might have a non-zero price. #### To reproduce: 1- Install `website_sale_loyalty` and `sale_subscription`. 2- Enable `Discounts` on configuration. 3- Create a `promotion`: - rule: minimum quantity: 0, minimum purchase: 10 - reward: free product, quantity: 1 4- Set a non-zero price on reward product from product page. 5- Create a product with price of 6 and publish it on the website. 6- On website, add 1 unit of created product to cart. 7- Open cart, and increase the quantity. 8- As you see the free product is added to cart but the price is non-zero. ### Cause: Based on #89397, the reward line have the discount of 100. In the `_compute_discount` this discount is set to 0: https://github.com/odoo/odoo/blob/e48a7f1b03f23a4c96e35ee4350029439ec73e47/addons/sale/models/sale_order_line.py#L797 As `compute_discount` only depends on `product_id`, `product_uom_id`, `product_uom_qty` this shouldn't cause issue. However, in `sale_subscription` its override includes `sale_order.plan_id` as dependency: https://github.com/odoo/enterprise/blob/d0375627c6f8de6098dfe93a80f522f31e3a4174/sale_subscription/models/sale_order_line.py#L86-L90 Which setting `plan_id` to `False` here makes discount to be recomputed: https://github.com/odoo/enterprise/blob/d0375627c6f8de6098dfe93a80f522f31e3a4174/website_sale_subscription/models/sale_order.py#L27-L30 ### Fix: This can be avoided by filtering reward lines in a `_compute_discount` override. As none of reward lines regardless of reward type are expected to have a discount calculated this fix will not break any other flows. It's noteworthy to mention that in the test, `_compute_discount` is directly called in order to mimic the flow without the need to install `sale_subscription`, as the `sale_subscription` is not root cause of the issue and the same issue could reproduced by any other modules overriding `_compute_discount`. opw-5485796
This update fixes a critical issue with how strings are processed in the Odoo web framework, specifically related to template substitution. The changes improve accuracy and consistency, and streamline translation management for better flexibility and maintainability.
Original PR description
### [[FIX] web: cleanup string-related utils](https://github.com/odoo/odoo/pull/241068/changes) This commit cleans up several utility files relating to string-parsing and translations. Main changes…
### [[FIX] web: cleanup string-related utils](https://github.com/odoo/odoo/pull/241068/changes) This commit cleans up several utility files relating to string-parsing and translations. Main changes are: - fixed `sprintf` and related functions: before this commmit, string substitutions were incorrectly inserted in the template string, and it was actually reflected in a test (template : `"<p>%s</p>%s"` => test incorrectly asserted that both strings were inserted in the first "%s" and "undefined" was inserted in the second); - to replicate the Python homonymous behaviour: "%s" characters can now be escaped in "sprintf-ed" strings by adding an additional "%" sign before the expression; - unification of translations via a TranslatedString class (which will also simplify external overrides); - unified API for some utility functions sharing the same purpose (typically: accepting an iterable instead of a list, etc.); - filling missing docstring, re-ordering functions and constants for clarity; - added "headless" tag to some utility functions' tests, when UI is not needed. --- 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 l10n_mx_edi module was encountering a 'singleton error' when generating invoices with similar payment information. The fix ensures that the system correctly handles multiple invoices using the same payment method, improving invoice generation stability. This prevents errors and ensures accurate invoice creation.
Original PR description
- for more then one records having same code it's raising an singleton error at fetching the name - error: ```py File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 753, in…
- for more then one records having same code it's raising an singleton error at fetching the name
- error:
```py
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 753, in _render_iterall
for item in frame.iterator:
File "<6403>", line 6097, in template_l10n_mx_edi_report_invoice_document_6403
File "<6403>", line 6083, in template_l10n_mx_edi_report_invoice_document_6403_content
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 616, in __str__
self.html = ''.join(self.irQweb._render_iterall(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/odoo/addons/base/models/ir_qweb.py", line 753, in _render_iterall
for item in frame.iterator:
File "<6403>", line 1723, in template_l10n_mx_edi_report_invoice_document_6403_t_call_0
File "/home/odoo/src/enterprise/l10n_mx_edi/models/account_move.py", line 424, in _l10n_mx_edi_get_extra_invoice_report_values
cfdi_infos['payment_way'] = f'{payment_way} - {payment_method.name}'
^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/odoo/orm/fields.py", line 1659, in __get__
record.ensure_one()
File "/home/odoo/src/odoo/odoo/orm/models.py", line 5934, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: l10n_mx_edi.payment.method(23, 24)
```
- OPW-5450360
Forward-Port-Of: odoo/enterprise#103460This update resolves a minor issue within the email invite tour process. Previously, the tour's speed caused conflicts with the automatic opening of the channel member list. This fix ensures the tour waits for the member list to open, preventing a rare but disruptive behavior. This improves the overall user experience for inviting new members to channels.
Original PR description
The `test_01_invite_by_email_flow` test ensures we can invite partners to a channel using their email. The tour opens the invitation panel, then sends an email. However, it conflicts with the auto-open of the member list. Sometimes, the member list opens after clicking on the invite panel button. This only occurs because the tour runs very fast. It's very unlikely that this occurs to a real user. This commit fixes the tour in order to wait for the member list to open initially. runbot-237994 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 fixes a performance issue in the translation sidebar. By preloading translated elements, the sidebar now renders fully before tests begin, preventing delays and ensuring tests pass consistently. This improves the reliability of our translation testing process.
Original PR description
When opening the sidebar in translation mode, translated elements must be preloaded before the sidebar renders. Without preloading, the fetch requires an extra tick to complete, causing tests that immediately check sidebar content to fail because the sidebar isn't fully open yet. runbot-237540 Forward-Port-Of: odoo/odoo#242490
14 changes
Resolved issues and error corrections
This update resolves a problem where GS1 barcodes were causing errors during scanning, preventing products from being correctly identified. The fix allows the system to gracefully handle GS1 barcodes that don't conform to date formatting rules, ensuring accurate product and location detection.
Original PR description
Steps to reproduce: - Activate the GS1 nomenclature - Create a product with barcode: 15099590483921 - Scan the product from the Barcode app main menu Problem: A ValidationError is raised: "A GS1…
Steps to reproduce: - Activate the GS1 nomenclature - Create a product with barcode: 15099590483921 - Scan the product from the Barcode app main menu Problem: A ValidationError is raised: "A GS1 barcode nomenclature pattern was matched. However, the barcode failed to be converted to a valid date." Explanation: GS1 barcodes must follow a strict nomenclature based on well-defined rules. For example, a GS1 product barcode should start with the Application Identifier 01 followed by 14 digits. The GS1 parser processes the barcode rule by rule and applies the first matching rule. In this case, the barcode 15099590483921 is interpreted as a date because it starts with "15", which corresponds to a GS1 Application Identifier for a date. As a result, the parser attempts to convert the first six digits into a date and raises a ValidationError. Solution: Catch the ValidationError raised during GS1 date parsing in main_menu and explicitly reset parsed_results to False, allowing the normal main menu resolution logic to continue. This prevents GS1 parsing errors from blocking valid barcodes and ensures that product, picking, or location detection still works as expected. opw-5357611
This update fixes an issue where foreign currency rates weren't correctly applied when generating Datev CSV export reports. Now, the system accurately uses the specified currency rate, ensuring accurate financial reporting for Datev integration. This improves the reliability of data exported to Datev.
Original PR description
When we set the foreign currency rate on invoices, it won't be used when exporting the report. Make sure to use the correct currency rate. task-5404816 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where foreign currency rates weren't correctly applied when generating Datev CSV reports. Now, the system accurately reflects the invoice's foreign currency rate during report export, ensuring accurate financial reporting for Datev. This improves the reliability of data sent to Datev.
Original PR description
When we set the foreign currency rate on invoices, it won't be used when exporting the report. Make sure to use the correct currency rate. task-5404816
This update resolves an issue where embedded buttons in the control panel were getting cropped due to incorrect height calculations during dragging. The fix ensures buttons accurately display their size, improving the user experience and preventing visual distortion. This change improves the overall appearance and functionality of the control panel.
Original PR description
The `o_embedded_actions` buttons are getting cropped when they are long enough. This is due to the `overflow-hidden` property which is now applied when no element are actively dragged. When an element is dragged after a css transformation, eg. the `o_dragged_embedded_action`, `getBoundingClientRect()` is returning the element height with the transformation. This creates an excess height on the `o_embedded_actions` due to the placeholder button having it's transformed height instead of the button height. Using offsetHeight returns the element size without the transform. Note this is not done on the width, because the width without the transform can lead to text-truncation. task-5225696 --- 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 could be incorrectly linked to DIAN documents due to a previous fix that didn't account for legitimate DIAN error messages. Now, the system verifies key invoice details (customer, date) before linking to the DIAN document, ensuring accurate reporting and compliance.
Original PR description
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian…
**Steps to reproduce:** (only reproducible in production) - Install accountant and l10n_co_dian - Switch to a Colombian company (e.g. CO Company) - In Accounting settings, configure the Colombian localization with valid DIAN credentials - Create an invoice for a Colombian customer - Confirm the invoice - Send the invoice to DIAN - Cancel and delete the invoice - Create another invoice for another Colombian customer with the same name (sequence) than the previously deleted invoice - Confirm the invoice - Send the invoice to DIAN **Issue:** A previous fix (https://github.com/odoo/enterprise/commit/4d782030631350cfaa8f2993e68f33c9f66929e4) had been made to sync together a DIAN document from Odoo and DIAN when the following error was returned by DIAN: "Regla: 90, Rechazo: Documento procesado anteriormente." It can happen when an invoice is sent to DIAN but due to a connection issue, the DIAN response is not received and the invoice is flagged as rejected. In that case, the "Regla: 90" error is returned by DIAN when trying to send the invoice again and the fix is linking the identifier returned by the DIAN error with the invoice to prevent this issue. However, the fix wasn't taking into account the case in which the error returned by DIAN is legit and the identifier is linked to another document. It results of having an invoice that is linked to an incorrect document in DIAN. The customer, date and other info, completely different. **Solution:** When "Regla: 90" error is returned by DIAN, a check is performed to make sure that the customer, the issue date and time on the document in Odoo and on the XML from DIAN are the same before assigning the identifier from DIAN to the document in Odoo. opw-5095212
This update resolves a problem where Odoo invoices exported to the SII system (Chile) were being rejected due to incorrect decimal formatting. The fix ensures the `<TotClauVenta>` tag always uses a maximum of two decimal places, aligning with SII requirements and preventing validation errors. This ensures accurate export invoices and avoids potential rejection by the SII system.
Original PR description
Before this PR: Everything works fine, but if the user change the decimal precision for foreign currency (i.e. USD, usually needed for export invoices, for example to three decimals), the SII system…
Before this PR: Everything works fine, but if the user change the decimal precision for foreign currency (i.e. USD, usually needed for export invoices, for example to three decimals), the SII system rejects the invoice. The rejectment cause is cryptic, and difficult to undertand, since it says: That is expecting a `<Documento>` tag, while this tag is not used in Exports invoices (the correct tag is `<Exportaciones>`. The real cause of the error is that if the `<TotClauVenta>` tag has more than 2 decimals is ignored, and if it is ignored, the SII system assumes that the invoice is not an export invoice, and that's why an incorrect tag is expected by the validator. After this PR: We simply forced the decimals of the tag `<TotClauVenta>`to 2. This definitely solves the issue. Source: https://www.sii.cl/factura_electronica/formato_dte.pdf Capture of this portion of the normative: <img width="626" height="118" alt="Captura de pantalla 2026-01-07 a la(s) 18 21 06" src="https://github.com/user-attachments/assets/3b9ec8f0-d343-4819-8589-67afeeeba807" /> Forward-Port-Of: odoo/enterprise#103600
This update resolves an issue where the 1099 report incorrectly identified the payer company when generating reports with multiple companies. The fix ensures that each line item in the 1099 report accurately reflects the correct payer company, improving the accuracy of tax reporting for businesses using a multi-company configuration. This resolves a previous bug impacting 1099 report generation.
Original PR description
When generating 1099 report with multicompany setup, the payer company is wrongly assigned in the csv file. Steps: - Have 2 companies - Make one bill per company with one different 1099 vendor for each one - With both companies selected, generate the 1099 report - open the csv file -> Payer name is the same for both line opw-5442190 Forward-Port-Of: odoo/enterprise#103805
This update fixes an issue where the TTC (Tax Total Charge) value was incorrect for taxes with negative tax rates. It also prevents a potential error related to missing payment method information, ensuring accurate financial reporting. This improves the reliability of tax calculations within the Odoo Enterprise system.
Original PR description
This PR complete the fix in the following PR: https://github.com/odoo/enterprise/pull/104619 The TTC value was incorrect for taxes with negative tax rate An error may be raised if bill_data['payment_method'] is None opw-5002779
This update resolves a technical issue within the l10n_ro_saft module that was causing errors when generating SAFT reports. The fix ensures accurate reporting by correctly handling unit of measure data, preventing a 'singleton error' that impacted report generation. This improves the reliability of the SAFT reporting process.
Original PR description
`saft_template` in `l10n_ro_saft` adds a table that loops over the different Unit of Measures (`uoms`) available. The issue is that if the `uoms` are part of different categories (ie: Length and Weight) we get a singleton error as we're trying to access a non-relational field of a recordset with multiple records. The commit fixes the error by using the already defined variable `uom` OPW-5499918 Forward-Port-Of: odoo/enterprise#104478
This update fixes a bug where merging tables in POS restaurants would cause orders to be duplicated and sent to the kitchen, leading to wasted food. The fix prevents the order from being deleted and re-created, ensuring accurate order processing and reducing potential losses. This improves restaurant efficiency and accuracy.
Original PR description
**Problem:** When merging two tables in the middle of their service, the moving table's order would be deleted and then made again. The problem is that this order would be sent to the kitchen, making…
**Problem:** When merging two tables in the middle of their service, the moving table's order would be deleted and then made again. The problem is that this order would be sent to the kitchen, making the order cancelled and displaying another one with the same content. This would lead to food wastage as the order would be made twice. **Steps to reproduce:** - Open the restaurant, chose two tables and make an order for the two of them. - Confirm the order. - Drag and drop the tables next to each other to merge them. - The dragged table's order will be deleted and made again in the kitchen. **Why the fix** https://github.com/odoo/odoo/blob/cf525d2a981515d39a126c6dfb5a612338cc8d14/addons/pos_restaurant/static/src/overrides/models/pos_store.js#L349 The order was deleted, causing the kitchen to receive the same order two times. It was done because when merging the tables, the order would be cancelled, and put in the new table's orders that need to be confirmed (order button). It was only when pressing this button that the order was sent again to the kitchen. This was done in two steps, because we needed to first cancel the order and then manually confirm it again. The order is no longer cancelled, the kitchen doesn't get the order twice, as the order is not replaced. opw-4654226
This update fixes an issue where merging tables in the POS system would create duplicate orders sent to the kitchen, leading to wasted food. The change prevents the order from being deleted and re-created, ensuring accurate order processing and reducing potential losses. This improves operational efficiency and minimizes food waste.
Original PR description
**Problem:** When merging two tables in the middle of their service, the moving table's order would be deleted and then made again. The problem is that this order would be sent to the kitchen, making…
**Problem:** When merging two tables in the middle of their service, the moving table's order would be deleted and then made again. The problem is that this order would be sent to the kitchen, making the order cancelled and displaying another one with the same content. This would lead to food wastage as the order would be made twice. **Steps to reproduce:** - Open the restaurant, chose two tables and make an order for the two of them. - Confirm the order. - Drag and drop the tables next to each other to merge them. - The dragged table's order will be deleted and made again in the kitchen. **Why the fix** https://github.com/odoo/odoo/blob/cf525d2a981515d39a126c6dfb5a612338cc8d14/addons/pos_restaurant/static/src/overrides/models/pos_store.js#L349 The order was deleted, causing the kitchen to receive the same order two times. It was done because when merging the tables, the order would be cancelled, and put in the new table's orders that need to be confirmed (order button). It was only when pressing this button that the order was sent again to the kitchen. This was done in two steps, because we needed to first cancel the order and then manually confirm it again. The order is no longer cancelled, the kitchen doesn't get the order twice, as the order is not replaced. The deleteOrders function would make those two steps, first sending another ticket in the kitchen, then deleting the one that was duplicated and just sent to the kitchen. opw-4654226
This update corrects a flaw in how commission averages are calculated when grouping sales data. Previously, all commissions were treated equally, which inaccurately reflected the value of larger commissions. The fix now uses a weighted average, ensuring that higher-value commissions have a greater influence on the reported average, leading to more reliable reporting.
Original PR description
**Problem:** When grouping the commissions, the achieved_rate field was computed by making the average of the achieved_rates, making a regular average. This average doesn't really make sense as a…
**Problem:** When grouping the commissions, the achieved_rate field was computed by making the average of the achieved_rates, making a regular average. This average doesn't really make sense as a commission of 1 euros would have the same weight as a commission of 1000 euros. It made sense to compute the average of the achieved rate as a weighted average, so that the commissions worth more would have more weight in the computed result. **Steps to reproduce:** - Go to commissions in the sales app - Make the achieved rate field visible by clicking on the dots on the right - Make a Group By - The average of the achieved rate is not computed correctly **Cause of the issue:** https://github.com/odoo/enterprise/blob/7d52febd7d870d381c887e171217b9a13fed4b4a/sale_commission/report/commission_report.py#L19 The default average aggregator was given, but didn't take into account that some commissions should weight more in the average result. **Fix:** The read_group function was overrided to compute the achieved_rate depending on the achieved and the target_amount fields. opw-4512739
This update corrects a limitation in how Odoo updates electronic invoices for Mexico (l10n_mx_edi). Previously, updates were limited, leading to inaccurate tracking. Now, the system is forced to update the document's write date, ensuring accurate record-keeping and compliance.
Original PR description
Before the commit 8b118a7, the search of the documents to update has been limited and ordered. With the actual domain the records to update will be most of the time the same because is not being updated. To fix this issue we force to update it. OPW-5368047
This update resolves an issue that occurred when users attempted to 'Show', 'Force CFDI', or 'Retry' actions on MX electronic invoices. The problem stemmed from a payment being deleted or cancelled, leading to an error. This fix ensures a smoother process for generating and submitting CFDI invoices.
Original PR description
When user is clicking any of the `Show`, `Force CFDI`, or `Retry` buttons in l10n_mx_edi.document error occurs. Steps to reproduce: - Install `l10n_mx_edi` module > Switch to `MX Company` - Setup `MX Electronic invoicing` in settings - Create a New Invoice > Send > Select `CFDI` > `Pay` > `Update Payments` - Payment > Cancel that Payment > Back to Invoice > CFDI(Notebook page) > Click on `Show` or `Force CFDI` or `Retry` Traceback: `ValueError: Expected singleton: account.move()` This error occurs when a payment is created and later deleted or cancelled, which results in an empty `move_id` in l10n_mx_edi.document. sentry-7113267386
8 changes
Resolved issues and error corrections
This update prevents errors when creating inter-company invoices by ensuring payment terms are compatible with the receiving company. Previously, payment terms were incorrectly applied, causing invoice posting to fail. Now, only company-specific payment terms are used, streamlining inter-company transactions.
Original PR description
**Steps to reproduce:** * Install `Accounting` and `sales` modules. * Create two companies and enable **Inter-Company Transactions** with **Synchronize invoices/bills** in settings for both…
**Steps to reproduce:** * Install `Accounting` and `sales` modules. * Create two companies and enable **Inter-Company Transactions** with **Synchronize invoices/bills** in settings for both companies. * Create a **payment term** assigned to **Company A**. * Create a **sale order** from Company A to Company B using that payment term. * Confirm the sale order and create the **invoice**. * Post the invoice to trigger the inter-company vendor bill. **Observed behavior:** * The generated **vendor bill** for Company B uses **Company A’s payment term**. * Posting fails because the payment term is incompatible with Company B. **Cause:** * Inter-company document creation reuses payment terms without checking whether they belong to the **target company**. * Payment terms from the source company can be propagated to the destination document. **Fix:** * Ensure only **company-compatible** payment terms are applied when creating inter-company sale orders, purchase orders, and invoices. * Payment terms belonging to a different company are now ignored. **NOTE**: test is not implemented due to technical limitations. Inter-company invoice synchronization relies on UI context propagation that cannot be replicated in unit tests. The payment term validation logic depends on web client context flags that are only set during real UI interactions, not programmatic execution. opw-5392745
This update resolves an issue where the Amazon connector wasn't correctly identifying key delivery modules for major carriers like UPS, FedEx, USPS, and DHL. By mapping these modules, the connector now functions reliably with these carriers, ensuring accurate order processing and fulfillment within the Amazon integration.
Original PR description
Amazon connector did not recognize the _rest delivery modules (ups_rest, fedex_rest, usps_rest, dhl_rest). This maps them to the correct carrier names, consistent with existing mappings.
This update fixes an issue where the unit price and discount on Purchase Order Lines created through the vendor catalog were not correctly calculated. The fix ensures that the vendor's pricelist discount is accurately applied, resulting in correct pricing and subtotal calculations. This improves the accuracy of purchase order pricing.
Original PR description
**Steps to reproduce:** - Install the `purchase_stock` module. - Create a product and configure a Vendor Pricelist for a vendor. Include a discount on the vendor pricelist line. - Create a Purchase…
**Steps to reproduce:** - Install the `purchase_stock` module. - Create a product and configure a Vendor Pricelist for a vendor. Include a discount on the vendor pricelist line. - Create a Purchase Order for the same vendor. - In the Purchase Order, add a Purchase Order Line using the catalog (vendor catalog popup) and add a configured product. **Observed behavior:** - The unit price on the Purchase Order Line becomes vendor `unit price − discount` The `discount` field remains empty, causing incorrect price calculations. --- **Example** --- Product-A - > Vendor Price list - > Vendor - > Test Vendor, Unit price = 100 and discount 10 - Create PO with `Test Vendor` and add a Product to POL via catalog then **Current behavior:** Product - A , qty - >1, unit price -> 90, discount->0% , subtotal ->90 **Expected behavior :** Product-A , qty->1, unit_price->100, discount->10%, subtotal->90 --- **Cause:** - The catalog selection applies the vendor pricelist discount directly to the unit price instead of populating the discount field. **Fix:** - Use the vendor pricelist's price as the `unit_price` and apply vendor pricelist discount to the discount field on the Purchase Order Line. --- `NOTE` - This issue is resolved from version 18.2, In this [Commit](https://github.com/odoo/odoo/pull/227695/commits/6b91f393353bcdaeed076d58dcac3149ed587e77#diff-1281da5f4d0a3daaf162a2e6456469537d1b74b8034437783c9c717307aa8fcd) --- opw-5217345 --- 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 'Month 13' column in the Mexican Trial Balance report incorrectly displayed data. The fix removed a redundant 'balance' column and corrected a hardcoded value, ensuring accurate reporting for Mexican companies. This improves the reliability of financial reports.
Original PR description
With l10n_mx company: 1 - Add the balance column to the “Trial Balance” accounting report 2 - Create a journal entry for the date 12/31/2024 for 5000 as a credit on the account 119.01.01 VAT due and balance it with 5000 as a debit on another account 3 - Open the Trial Balance report and click on the “Month 13” filter as well as the year 2024. Notice that the “Month 13” column has some numbers when there should not be a number in that column. Delete the balance column from the “Trial Balance” accounting report and notice that the numbers now appear in their appropriate columns. In the _l10n_mx_set_options_month_13 the way to find the initial value, month 13 and end value columns was hardcoded. opw-5222117
This update fixes an issue where manufacturing orders split into multiple MOs didn't consistently apply the defined removal strategy for components tracked by lots. The fix ensures all components are assigned correctly at once, guaranteeing the removal strategy is applied as intended, leading to more accurate inventory management.
Original PR description
**Problem:** When splitting a MO that has products with components tracked by lots, the new MOs won't follow the removal strategy assigned to said product. The first MO will have the first lot, and…
**Problem:** When splitting a MO that has products with components tracked by lots, the new MOs won't follow the removal strategy assigned to said product. The first MO will have the first lot, and the second MO will have the second lot, even if some products are still available in the first lot. Once every lot has been used once, the removal strategy is applied as intended on the remaining MOs. **Steps to reproduce:** - Make a product, that has a BoM with a component that is tracked by lots - Make two lots for this components - Set the removal strategy for this component to FIFO (or another one) - Make a manufacturing order with quantity high enough to use multiple lots - Confirm the MO and then split it in as much parts as components were used - Look at the lot of the second MO, it is the second lot, even though there are still components available in the first lot **Cause of the issue:** The removal strategy was not taken into account as a whole when splitting the MO. Thus resulting in values that seems kind of random. As the components were assigned one at a time to the backorders, they did not synchronize between themselves before being assigned, which explains why they did not have a correct lot assigned. **Fix:** As the components are assigned one at a time during the MO splitting, it is not an option to try and sort them according to the removal strategy during the assignation. We instead wait for all of the components to be assigned (in a wrong way) then unassign them all just to assign them the right way right afterwards. This is done by calling *_action_assign* which takes the removal strategy into account. This time around, all the components are assigned at them same time, making the removal strategy applicable. opw-4678932
This update fixes a technical issue that caused errors during server shutdowns. Specifically, the server stop process was incorrectly closing database connections before the system was ready, leading to errors. This change ensures a smoother and more reliable shutdown process, preventing these errors from occurring.
Original PR description
When the server stops, pool errors can occur. It's due to the server stop function calling `sql_db.py@close_all()`. If this occurs before the dispatcher loop wakes up, the `__exit__` function of the cursor context manager will raise an error, because the connection has already been popped from the pool. As for interface errors in [1], pool errors should be ignored during server shutodwn. runbot-229800 [1]: https://github.com/odoo/odoo/pull/99849 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
A test was failing in the website sale module due to a sale order not requiring payment. This update forces the sale order to always require a payment, resolving the test failure and ensuring consistent functionality. This ensures the website sale process functions correctly.
Original PR description
version: 17.0+e Why ? --------------- test_payment_provider_visibility_with_portal didn't pass on runbot because the sale order used doesn't reqire payment. The fix --------------- Force the sale order to require a payment. runbot-237786 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a discrepancy in how holiday allocations are calculated when employees have different working schedules. Previously, the system produced inconsistent hour counts for related allocations. The fix ensures that all child allocations accurately reflect the total hours defined in the parent allocation, improving allocation accuracy and reporting.
Original PR description
### Steps to reproduce: - Create two employees with two different working schedule - Create a multi employee allocation for the created employees with 40 hours - Validate the allocation you created - Notice the number of hours is differenc between the two allocations ### Cause: When validating the multi employee allocation and while creating the children allocations we compute the number_of_hours_display and since we calculate it with number of days * hours per day it will result into two different values for the number of hours as the hours per day is different for each working schedule. ### Fix: To fix this we check if the allocation is an hourly one we change the number of days depending on the number of hours that we already got from the parent allocation. So when computing the number of hours for the children allocations we get the same value opw-5232797