Daily updates from Odoo
Wednesday, December 24, 2025
45 changes
12 changes
Resolved issues and error corrections
This update resolves a crash in the Point of Sale mobile view when editing payments and viewing customer information. The fix ensures that necessary data related to customer activity is loaded, preventing the POS from freezing. This improves overall stability and user experience for our POS users.
Original PR description
Steps to reproduce: =================== - Use the POS in mobile view - Complete a payment - Click on "Edit Payment" - Select customer or Edit customer Issue: ====== - POS crashes when rendering the partner kanban view - Frontend error occurs because `activity_state` is missing in the record Cause: ====== - The partner kanban view references activity-related fields - `activity_state` was not loaded when the view is rendered in POS Fix: ==== - Explicitly load `activity_state` in the kanban view (invisible) Task:5406890
This update speeds up the calculation of product quantities, particularly for databases with many products where most have zero stock. By optimizing the computation process, the system now runs significantly faster – reducing processing time by over 50% when dealing with a large number of products. This improves overall system responsiveness and efficiency.
Original PR description
In databases with a large number of products, most of them will have 0 quantities on hand. This commit fast-tracks the computation of 0 qty products, skipping unnecessary `uom_id` and `float_round()` computations in _compute_quantities_dict and skipping unnecessary `__set_item__` in _compute_quantities. Benchmark | `product.product` count | Before this PR | After this PR | | ----------------------- | -------------- | ------------- | | 700,000 | 52.84s | 28.33s | opw-4930856 Forward-Port-Of: odoo/odoo#241017 Forward-Port-Of: odoo/odoo#239687
This update fixes a problem where taxes weren't correctly applied to Point of Sale transactions, specifically down payments and full settlements. Now, taxes set on Sale Orders are consistently applied to POS transactions, ensuring accurate tax calculations for all sales. Additionally, the color styling of buttons has been updated for a more consistent user experience.
Original PR description
Before this commit: ------------------- - If a tax was set on the Sale Order line, it was not applied on the down payment created from the POS. - If no tax was set on the Sale Order line, the POS settlement incorrectly applied the product’s default tax when settling the order. After this commit: --------------------- - The tax defined on the Sale Order line is now consistently applied to both down payments (partial settlements) and full settlements from the POS. - If the Sale Order line has no tax, then no tax is applied on either partial or full settlements and if have tax the tax will be applied. - Added consistent color styling to all buttons. task: 5269354 Forward-Port-Of: odoo/odoo#238051
This update resolves a restriction preventing users without the 'hr' group from accessing bank account information. Previously, a technical requirement limited access to a related field, causing errors. This fix ensures all users can manage bank accounts correctly.
Original PR description
The field `employee_salary_amount_is_percentage` is computed, but the computation[^1] relies on `hr_employee.salary_distribution`, a field restricted[^2] to members of `hr.group_hr_user`. If you try…
The field `employee_salary_amount_is_percentage` is computed, but the computation[^1] relies on `hr_employee.salary_distribution`, a field restricted[^2] to members of `hr.group_hr_user`. If you try to check a bank account without an hr group, you will get an access error: ``` odoo.exceptions.AccessError: You do not have enough rights to access the field "salary_distribution" on Employee (hr.employee). Please contact your system administrator. Operation: read User: 21 Groups: allowed for groups 'Employees / Officer: Manage all employees' ``` This also happens during the mock crawl test of upgrades if the admin lacks the group. To reproduce in standard: - Install contacts and hr. - Use a user without hr permissions. - Try to create a new bank account. [^1]:https://github.com/odoo/odoo/blob/57573994313988837d89329d77ab1def63a8cfdd/addons/hr/models/res_partner_bank.py#L26 [^2]:https://github.com/odoo/odoo/blob/57573994313988837d89329d77ab1def63a8cfdd/addons/hr/models/hr_employee.py#L147 --- I've also added another commit to make the percentage symbol stick to the salary amount. Before: <img width="366" height="38" alt="image" src="https://github.com/user-attachments/assets/ef890852-50ca-40b1-8c09-07c4aa2d330d" /> After: <img width="219" height="35" alt="image" src="https://github.com/user-attachments/assets/88e4a6c4-bc3f-483e-97f9-3080c6aa85c9" /> I know the number is not formated correctly but I don't think I can do more just from the view. Forward-Port-Of: odoo/odoo#239298
This update adds a field to the salary configuration to allow users to specify the correct bank account holder name. This is a security enhancement to prevent payment delays caused by incorrect account holder information, ensuring timely and accurate payroll processing. Related tests and documentation have also been updated.
Original PR description
Law is now more secure and you need to have the correct name on the bank account holder otherwise payment need to be manually confirmed everytime. Therefore a field is added to the salary config to allow the user to set his account holder name separately from his actual name in case it is different. Task-5222712 [Related PR](https://github.com/odoo/odoo/pull/233965) Forward-Port-Of: odoo/enterprise#98572
This pull request resolves a bug in the Salary Calculator that prevented it from displaying correctly when an employee had a resource calendar assigned. The fix ensures the calculator functions properly regardless of whether an employee is linked to a calendar, improving payroll accuracy. This impacts all users who utilize the Salary Calculator feature.
Original PR description
This commit fixes an issue in the Salary Calculator where all fields were displayed as empty when selecting an employee with a resource_calendar_id set. Steps to Reproduce : First Change to either…
This commit fixes an issue in the Salary Calculator where all fields were displayed as empty when selecting an employee with a resource_calendar_id set. Steps to Reproduce : First Change to either the default company (MyCompany) or Demo Belgian company Payroll -> Employee -> Salary Calculator -> choose an employee. Bug : All fields in the Salary Calculator view are empty (evaluated as False). Root Cause : Inside _compute_salary, the method _generate_salary_simulation_payslip writes on payslip.version_id using: payslip.version_id.write(new_payslip_vals) Because the is_simulation_offer key was missing from the context, this write triggered a full payslip computation, generating payslip lines. During this computation, compute_sheet() performs an unlink() on existing payslip lines. Since the Salary Calculator view fields are only cached at that point, the unlink causes the cached values to be lost, resulting in all fields being evaluated as False. Fix : Ensure that is_simulation_offer is present in the context when writing to payslip.version_id, preventing payslip line generation and avoiding the unintended unlink() during salary simulation. Task - 5387155
This update fixes an issue where multiple loyalty programs on a product could cause incorrect discount application during POS orders. By adding a 'mutex' to control program updates, the system now reliably applies all discounts, ensuring accurate order totals. This improves the customer experience and prevents revenue loss.
Original PR description
When adding a lot of loyalty programs with discounts to an order the updatePrograms method could be called multiple times in parallel, that would cause an issue where some of the programs were not…
When adding a lot of loyalty programs with discounts to an order the updatePrograms method could be called multiple times in parallel, that would cause an issue where some of the programs were not applied correctly. Steps to reproduce: ------------------- * Create 7 loyalty programs that apply on the same product, each with a discount reward of 10%. (Give them different name) * Create a POS order with 1 unit of that product. > Observation: Only the 6 first programs are applied. Why the fix: ------------ The issue is happening because the updatePrograms is called multiple times in parallel, and when coming to this block of code : https://github.com/odoo/odoo/blob/f3e74f9b840efef7c567ba31acd6ac61c79b5d6d/addons/pos_loyalty/static/src/overrides/models/pos_store.js#L182-L188 The last program has 2 coupons in the `couponPointChanges`, so it will proceed to delete all the coupons of the concerned program. To avoid this we use a mutex to ensure that only one call to updatePrograms is happening at a time. opw-4974788 Forward-Port-Of: odoo/odoo#241023 Forward-Port-Of: odoo/odoo#239662
This update resolves an issue where tax mappings weren't properly set when upgrading to version 19.1, leading to errors during session closing with Fiskaly. The fix ensures accurate data transmission by automatically correcting missing mappings and handling company names with hyphens, preventing transaction failures.
Original PR description
Steps to reproduce: ------------------------- - Upgrade from lower version to 19.0 or higher. - Start a fiskaly registered company's session. - Close the session after transactions. Issue: ------- -…
Steps to reproduce:
-------------------------
- Upgrade from lower version to 19.0 or higher.
- Start a fiskaly registered company's session.
- Close the session after transactions.
Issue:
-------
- Tax mapping used to send data to fiskaly is not set.
- If have `-` in company name or cash move reason and try to do cash move will give a tb.
Cause:
---------
- When the user's database is upgraded, the taxes already exist and the company is already registered. As a result, `l10n_de_vat_export_data` is never set, and since no tax changes occur, `l10n_de_vat_definition_export_identifier` is also not generated. This leads to incorrect values being sent to Fiskaly during the session closing request, causing errors.
- The cash statement name uses - as a separator, the current structure is `{session_name}-{move_type}-{statement_type}-{move_reason}` set from `_prepare_account_bank_statement_line_vals()` If move_reason or company name contains additional `-` splitting the whole name breaks the expected structure.
Fix:
-----
- We have added a check to identify any taxes that are missing their tax mapping If such taxes are found, we filter them and trigger the logic to set their mappings. However, if the main mapping reference value l10n_de_vat_export_data is not set, we first retrieve and update it. Once this reference is available, we update all taxes that were previously unset and then prepare the correct tax data.
As a result, the first session closing after the upgrade will automatically correct all issues both for customers who have already upgraded and for those who upgrade in the future.
- We first remove the `{session_name}-` prefix, then split the rest. Since move_type and statement_type never contain -, we take them directly not user inputs, and then rejoin everything from index 2 onward to reconstruct the correct move_reason.
Additional fixes:
--------------------
- Some places the limit of characters may exceed than what fiskaly is asking than it can give us an error so restricted all places where needed.
- We don't have check if the settlement is present if not getting id directly may cause error.
help ticket: 5362897, 5367425
Forward-Port-Of: odoo/enterprise#101468This update fixes an issue where pasted content in the website builder's translation mode wasn't correctly styled, leading to inconsistent appearance and reset spans. It now ensures translated content is properly formatted and avoids unexpected HTML elements being inserted, improving the translation experience.
Original PR description
### [FIX] html_editor: unwrap blocks when inserting in editable span When the ancestors of the selection are not elements supposed to contain blocks when pasting, nothing was done to remove those…
### [FIX] html_editor: unwrap blocks when inserting in editable span When the ancestors of the selection are not elements supposed to contain blocks when pasting, nothing was done to remove those blocks. This could lead to `span` elements containing `p` elements for example. This commit unwraps the blocks in the pasted content if the block containing the selection is outside of the `contenteditable` element that contains the selection. It also fixes the function `makeContentsInline` that was not robust to containing some nodes structures. Steps to reproduce: - Open `example.com`, and copy "Example" from the first block - Open website builder in translate mode - Paste - Bug: The appearance is weird because the pasted title is not styled as translation - Save - Bug: The span of translation where the text was pasted has been reset #### - Open `example.com`, and copy the whole content - Open website builder - Move cursor to the bottom of the footer, with the company name - Paste - Bug: it inserted a `p` element in the `span` (non deterministic, depends on the mood of the AI) - Open website builder in translate mode - Select some text (more likely to trigger the bug if it includes a line break, for example the description in the footer) - Use the "Translate with AI" tool from the toolbar - Bug: The appearance is weird because the inserted translation is not styled as translation - Save - Bug: The span of translation where the text was changed has been reset opw-5053872 opw-5109137 opw-5136337 task-5222402 ### [FIX] website: restrict inserted content in translate mode to whitelist The translate mode of the website builder should only ever insert nodes with a tag in the `TRANSLATED_ELEMENTS` whitelist or with `o_translate_inline` class inside a translation span. Doing otherwise makes the translation span "invalid" according to the server, which discards the translation. Blocks are already unwrapped when inserting in translations (by the previous commit), but some other nodes are not in the whitelist, for example `img`. This commit adds the class `o_translate_inline` on `a` elements when inserted and unwraps nodes that are not in the whitelist and do not have that class. Steps to reproduce: - Open `example.com`, and copy the link "Learn More" - Open website builder in translate mode - Paste - Save - Bug: The span of translation where the link was pasted has been reset #### - Copy an image (or a piece of html containing an image) - Open website builder in translate mode - Paste - Save - Bug: The span of translation where the image was pasted has been reset opw-5053872 opw-5109137 opw-5136337 task-5222402 Forward-Port-Of: odoo/odoo#240421 Forward-Port-Of: odoo/odoo#237969
This update expands the functionality of the 'sign' module to align with the official itsme service's coverage, now supporting countries beyond Belgium and the Netherlands. This ensures our business users can utilize itsme for identity verification, improving accessibility and compliance with current regulations.
Original PR description
Extend itsme availability beyond BE and NL to match the official itsme coverage: https://www.itsme-id.com/en-BE/business/coverage task-5424818 Forward-Port-Of: odoo/enterprise#102823 Forward-Port-Of: odoo/enterprise#102423
This update fixes an issue where invoices with 0% taxes incorrectly displayed "Not subject to VAT" in XML reports. By mapping appropriate exemption codes and ensuring UBL compliance, the change guarantees accurate VAT data representation and full compliance with ZATCA standards, preventing misinterpretations of sales.
Original PR description
Issue: - The field `l10n_sa_exemption_reason_code` was not mapped for zero-rated, zero-rated export, and exempt taxes. - As a result, invoices using 0% taxes incorrectly showed "Not subject to VAT" in the XML, which misrepresented the actual nature of the supply. Imp: - Mapped appropriate exemption reason codes to 0% and exempt taxes based on the official ZATCA/UN CEFACT mapping. - Updated tax definitions and ensured UBL compliance with business rules BR-Z, BR-E, and BR-O. - It also makes the exemption reason text visible on the invoice. - Improved error spacing and removed redundant comma text. Impact: - Ensures full compliance with ZATCA XML standards. - Prevents misleading VAT data representation. Task: 5151903 Forward-Port-Of: odoo/odoo#234096
This update resolves an issue where overlays disappear after refreshing the website editor. The problem stemmed from how the editor was being reset, leading to the removal of necessary elements. This fix ensures overlays are correctly displayed after editor refreshes, improving the user experience within the website builder.
Original PR description
The bug is only observable after 18.4, after the website refactoring, but the root cause has been present since 18.0, so we fix it there in case there are other use cases. Since [1], overlays are no longer visible after an operation that executes `reloadEditor`. Steps to reproduce (observable after 18.4): - On website, go into edit mode - Change header template - After reload, overlays are missing Reason: `WebsiteBuilderClientAction.reloadEditor` sets up the new `Editor` before the old one is destroyed. Consequently, `LocalOverlayPlugin.destroy` removes the newest overlays as well. This commit ensures the plugin only cleans up its specific DOM elements. The order of operations bug will be fixed in a later PR. task-5438306 [1]: https://github.com/odoo/odoo/commit/3cd29fbac2b06566bfff40b5e7ed310cb0ce12c1 Forward-Port-Of: odoo/odoo#241161
7 changes
Resolved issues and error corrections
This update ensures that product images are hidden in the combo product configurator, aligning with the overall POS settings for product image visibility. Previously, combo products displayed images regardless of the configured settings, creating a confusing user experience. This change improves consistency and simplifies the product selection process for customers.
Original PR description
Before this commit: ==================== In POS, when product images were configured to be hidden, the setting was correctly applied to normal products. However, in the combo product configurator, product images were still displayed, causing inconsistency with the configured behavior. After this commit: ====================== The combo product configurator now respects the product image visibility configuration, ensuring consistent behavior across all product types in the POS interface. Task-5163955 Forward-Port-Of: odoo/odoo#240997 Forward-Port-Of: odoo/odoo#231366
This update fixes an issue in the Hungarian localization where e-invoices incorrectly used the invoice date to calculate currency exchange rates. The fix ensures the currency rate is based on the invoice delivery date, aligning with Hungarian tax regulations. This ensures accurate e-invoice generation and compliance.
Original PR description
In the Hungarian localization, the currency exchange rate for invoices is based on the delivery date. Steps to reproduce: - With HU localization setup - Create an invoice Issue: Currently, when issuing the e-invoice, the system would compute the currency exchange rate using the invoice date. opw-5126816 Forward-Port-Of: odoo/odoo#240999
This update streamlines the planning process by automatically notifying managers when employee work emails are missing. Instead of being blocked by a manual wizard, users receive a list of employees needing email information, allowing for quick action like removal or escalation to HR. This improves efficiency and prevents delays in sending plans.
Original PR description
Before this commit, when the planning manager wants to send the planning and for some employees the work email is missing, the user is blocked on the wizard to fill the work email on those employees if he does not edit access to employee model. This commit makes sure the wizard to fill in the missing work email is not displayed if the user cannot edit the information of the employees. It also displays a notification listing the employees for which the work email is missing. By doing that, the user can easily remove those employees to continue his flow or ask to HR user or the employees concerned to complete the missing information. task-5090163 Forward-Port-Of: odoo/enterprise#102458 Forward-Port-Of: odoo/enterprise#96111
This update fixes an issue where deferred accounting for misc entries wasn't correctly identifying the appropriate account type. The change now analyzes each deferred line individually, ensuring deferrals are linked to the correct expense or revenue account, enhancing financial accuracy. This improves the handling of complex transactions.
Original PR description
The commit 42f823d6b8aa3d1cd171ae1603549ee95fc9d0f0 allows to use deferred on misc entries. However, there are many places in the code that were not updated. Usually they were in the form of `if move_type is sale, then deferred_type = income, else expense`. However we cannot rely on the move_type anymore for misc entries, because it will always take the `else` branch of the condition. Instead, if we have a misc entry, we should rely on the account type of the line that is being deferred, so we have more granularity. For this, we now compute the deferral account/journal for each line, and not per move. The logic inside the computation remains the same. Steps to reproduce: 1. Create a misc entry with two deferred lines (one expense, one revenue) 2. Post it 3. Check the generated deferrals, they all use the same deferred account and journal even though we have different account types opw-5194305 Forward-Port-Of: odoo/enterprise#100295
This update fixes a critical bug that caused Odoo to crash when sending invoices via Peppol with invoice lines lacking a product name. Now, the system gracefully displays an error message, guiding users to ensure each invoice line has a product or label before sending. This improves invoice processing reliability and prevents data loss.
Original PR description
Before this commit: When sending an invoice via Peppol with an invoice line that has no product name, the system crashes with a TypeError instead of showing a error message. Steps to reproduce: 1. Go to Accounting 2. Navigate to Customers > Invoices 3. Create a new invoice 4. Add an invoice line without entering a product name 5. Click 'Send' 6. Select 'by Peppol (Demo)' 7. Click 'Send' -> TypeError: 'NoneType' object is not subscriptable After this commit: System validates that the product name exists before accessing its text content. Users see a clear, error message: `Each invoice line should have a product or a label.` task-5432061 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240908
This update resolves an issue where overlays disappear after refreshing the website editor in version 18.4 and later. The problem stemmed from how the editor is reloaded, causing a cleanup of overlays. This fix ensures overlays are correctly displayed after editor refreshes, improving the user experience when making website changes.
Original PR description
The bug is only observable after 18.4, after the website refactoring, but the root cause has been present since 18.0, so we fix it there in case there are other use cases. Since [1], overlays are no longer visible after an operation that executes `reloadEditor`. Steps to reproduce (observable after 18.4): - On website, go into edit mode - Change header template - After reload, overlays are missing Reason: `WebsiteBuilderClientAction.reloadEditor` sets up the new `Editor` before the old one is destroyed. Consequently, `LocalOverlayPlugin.destroy` removes the newest overlays as well. This commit ensures the plugin only cleans up its specific DOM elements. The order of operations bug will be fixed in a later PR. task-5438306 [1]: https://github.com/odoo/odoo/commit/3cd29fbac2b06566bfff40b5e7ed310cb0ce12c1 Forward-Port-Of: odoo/odoo#241161
This update significantly speeds up the generation of budget reports by optimizing how data is filtered. Previously, a slow process required generating a large table, but now the filtering is applied directly within the underlying queries, reducing processing time and improving report loading speed. This results in a much quicker user experience.
Original PR description
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the…
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the UNION, any filtering (like on specific budget_line_ids) happened after the full, unfiltered table was generated. This post-filtering caused slowness, especially in nested loop joins with large tables like account.analytic.line. This commit optimizes performance by pushing the filter condition (using specific budget_line_ids) directly down into the three underlying queries. This reduces the number of budget.line records processed, speeding up joins and overall computation. The benchmark below is done on a database that has **66396** `budget.line` records and **928567** `account.analytic.line` records. Opening a budget report for a specific year, only applied the filter with **40** `budget.line` records. | Scenario | Execution Time | | :--- | :--- | | **Before this Commit** | **60.00 seconds** | **After this Commit** | **1.84 seconds** opw-5150569 Forward-Port-Of: odoo/enterprise#102771 Forward-Port-Of: odoo/enterprise#99096
7 changes
Resolved issues and error corrections
This update fixes an issue where the 'late' filter on deliveries was incorrectly returning all outgoing pickings, regardless of their status. The change adds a necessary separator between filters, ensuring that users only see deliveries that are genuinely marked as 'late'.
Original PR description
Issue: ------------------------------------------ When opening deliveries and applying the 'late' filter, the results show: - All `outgoing pickings`, regardless of whether they are `late` or not,…
Issue: ------------------------------------------ When opening deliveries and applying the 'late' filter, the results show: - All `outgoing pickings`, regardless of whether they are `late` or not, and - All `late pickings`, regardless of their `picking type`. In short: `Deliveries OR Late`. The same issue occurs with other picking types as well. How to reproduce: ------------------------------------------ 1. Install stock. 2. Open deliveries through operations menu. 3. Apply 'late' filter. Cause of the issue: ------------------------------------------ There is no `seperator` between `picking_type_code` and `date_category` filters, so OR operator is applied between them. Solution: ------------------------------------------ Added `seperator` between `picking_type_code` and `date_category`. which now shows only the outgoing pickings which are late. In short: `Deliveries AND Late`. This helps users to apply filters like: Find deliveries that are late. Task ID: [4614363](https://www.odoo.com/odoo/project/966/tasks/4614363) Forward-Port-Of: odoo/odoo#201344
This update fixes an issue in the Hungarian localization where e-invoices incorrectly used the invoice date to determine currency exchange rates. Now, the system accurately uses the delivery date, as required for Hungarian e-invoice regulations. This ensures compliance and accurate financial reporting for transactions in the Hungarian market.
Original PR description
In the Hungarian localization, the currency exchange rate for invoices is based on the delivery date. Steps to reproduce: - With HU localization setup - Create an invoice Issue: Currently, when issuing the e-invoice, the system would compute the currency exchange rate using the invoice date. opw-5126816 Forward-Port-Of: odoo/odoo#240999
This update resolves an issue where deleting a Point of Sale order didn't properly remove associated order lines from local records. The fix corrects a technical problem related to how data was accessed, ensuring that all related items are now removed during order deletion. This improves data accuracy and prevents orphaned records.
Original PR description
Issue: Deleting an order did not remove its related order lines from local records. Cause: Because of the use of `lazyGetter`, model fields were defined as getters instead of object keys. This caused `Object.entries` to skip some fields, preventing cascade deletion from including child records. Fix: Updated the logic for computing `recordsToDelete` to correctly handle cascade deletion and ensure child records are properly removed. Task-5095578
This update streamlines the planning process by automatically notifying users when employee work emails are missing. Instead of a blocked wizard, users receive a list of employees needing email information, allowing for quick action like removal or requesting completion from HR. This improves efficiency and prevents delays in sending plans.
Original PR description
Before this commit, when the planning manager wants to send the planning and for some employees the work email is missing, the user is blocked on the wizard to fill the work email on those employees if he does not edit access to employee model. This commit makes sure the wizard to fill in the missing work email is not displayed if the user cannot edit the information of the employees. It also displays a notification listing the employees for which the work email is missing. By doing that, the user can easily remove those employees to continue his flow or ask to HR user or the employees concerned to complete the missing information. task-5090163 Forward-Port-Of: odoo/enterprise#102458 Forward-Port-Of: odoo/enterprise#96111
This update resolves an issue where refunding and canceling orders in Point of Sale (POS) would sometimes lead to a blank screen and errors. The fix ensures that related order data is properly removed when a refund or order cancellation is performed, improving the stability and reliability of the POS system.
Original PR description
Step to reproduce: (try this in 19.0) - open pos and settle a order - refund the same order, from payment screen, go back to product screen - cancel this order - again try to refund the same order…
Step to reproduce: (try this in 19.0)
- open pos and settle a order
- refund the same order, from payment screen, go back to product screen
- cancel this order
- again try to refund the same order
Observation:
- Blank screen with traceback in console
```
Caused by: TypeError: Cannot read properties of undefined (reading 'state')
at Proxy.reduce (<anonymous>)
at get refundedQty
```
Cause:
- refundedQty() reads refund_orderline_ids.order_id.
- On the first refund cancellation, the refund was deleted but its related order_line was not.
- Order deletion relies on localDeleteCascade, which uses Object.entries() to find related records to delete.
- With lazy getters, this fails because Object.entries() does not expose or execute getter-based properties.
Fix:
- as we already have keys `relationsToDelete`, we pull the value, which execute the getter and we will have the needed data.
- Fixed the test, as for new order, we expect the newer orderline, older ones
should be deleted.
opw-5379747
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update resolves an issue where overlays disappear after refreshing the website editor in version 18.4 and later. The fix focuses on cleaning up the HTML editor's elements to prevent the removal of newly created overlays. This ensures overlays are consistently visible during editor operations.
Original PR description
The bug is only observable after 18.4, after the website refactoring, but the root cause has been present since 18.0, so we fix it there in case there are other use cases. Since [1], overlays are no longer visible after an operation that executes `reloadEditor`. Steps to reproduce (observable after 18.4): - On website, go into edit mode - Change header template - After reload, overlays are missing Reason: `WebsiteBuilderClientAction.reloadEditor` sets up the new `Editor` before the old one is destroyed. Consequently, `LocalOverlayPlugin.destroy` removes the newest overlays as well. This commit ensures the plugin only cleans up its specific DOM elements. The order of operations bug will be fixed in a later PR. task-5438306 [1]: https://github.com/odoo/odoo/commit/3cd29fbac2b06566bfff40b5e7ed310cb0ce12c1 Forward-Port-Of: odoo/odoo#241161
This update significantly speeds up the generation of budget reports by optimizing how data is filtered. Previously, a slow process required generating a large, unfiltered table, leading to delays. Now, the filtering is applied directly within the underlying queries, dramatically reducing processing time and improving report performance.
Original PR description
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the…
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the UNION, any filtering (like on specific budget_line_ids) happened after the full, unfiltered table was generated. This post-filtering caused slowness, especially in nested loop joins with large tables like account.analytic.line. This commit optimizes performance by pushing the filter condition (using specific budget_line_ids) directly down into the three underlying queries. This reduces the number of budget.line records processed, speeding up joins and overall computation. The benchmark below is done on a database that has **66396** `budget.line` records and **928567** `account.analytic.line` records. Opening a budget report for a specific year, only applied the filter with **40** `budget.line` records. | Scenario | Execution Time | | :--- | :--- | | **Before this Commit** | **60.00 seconds** | **After this Commit** | **1.84 seconds** opw-5150569 Forward-Port-Of: odoo/enterprise#102771 Forward-Port-Of: odoo/enterprise#99096
1 change
Resolved issues and error corrections
This update significantly speeds up the generation of budget reports by optimizing how data is filtered. Previously, a slow process required generating a large table, but now the filtering is applied directly within the queries, reducing the amount of data processed and dramatically improving report loading times. This results in a much more responsive user experience.
Original PR description
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the…
Previously, generating the budget.report table was necessary to trigger _compute_all for budget.line fields. This table was built using three separate queries with a UNION operator. Because of the UNION, any filtering (like on specific budget_line_ids) happened after the full, unfiltered table was generated. This post-filtering caused slowness, especially in nested loop joins with large tables like account.analytic.line. This commit optimizes performance by pushing the filter condition (using specific budget_line_ids) directly down into the three underlying queries. This reduces the number of budget.line records processed, speeding up joins and overall computation. The benchmark below is done on a database that has **66396** `budget.line` records and **928567** `account.analytic.line` records. Opening a budget report for a specific year, only applied the filter with **40** `budget.line` records. | Scenario | Execution Time | | :--- | :--- | | **Before this Commit** | **60.00 seconds** | **After this Commit** | **1.84 seconds** opw-5150569 Forward-Port-Of: odoo/enterprise#99096
2 changes
Resolved issues and error corrections
This update improves the customer experience by adding the delivery OTP directly to the receipt. Previously, the receipt only displayed the delivery address, creating confusion for customers. This change ensures customers have immediate access to the OTP needed for delivery.
Original PR description
Before this commit: --------- - Delivery OTP was not shown on the receipt. - Receipt only displayed delivery address without any OTP. After this commit: ------------------- - Display “Delivery OTP ” below the delivery address on the receipt. Task-5048040
This update fixes a security vulnerability where Portal and Internal users could create private knowledge articles without the necessary permissions. The fix ensures that users only have access to create articles when they have the appropriate 'Create' access rights, improving data security and control. UI changes have also been implemented to hide creation buttons for users without the correct permissions.
Original PR description
How to Reproduce : 1. Remove 'Create' access on the 'Knowledge Article' model for Portal and Internal users. 2. Now log in as a Portal. 3. Try to create a new private article. 4. Log in as an…
How to Reproduce :
1. Remove 'Create' access on the 'Knowledge Article' model for Portal and
Internal users.
2. Now log in as a Portal.
3. Try to create a new private article.
4. Log in as an Internal user.
5. Try to create a new private article.
Both Internal and Portal users can still create private articles even after
'Create access' is removed.
Article creation logic in `knowledge.article` was bypassing the usual access
rights because of `sudo` (mainly to add the creator as a member, since creation
rights on the member model are not granted). This allowed users to create
private articles even without create access.
This commit introduces:
1. Model-level access check in `create`. Sudo the creation of articles only when
the user has create rights.
2. UI imp to hide the '+' button in the sidebar and the `New` button in
the topbar when the user doesn't have create access.
3. New test cases to verify that model-level access rights are respected when creating an article.
4. Removed 'create=1' from article embedded list view as it was always displaying 'New' button
irrespective of create rights.
Now it displayed based on create rights.
task-4916280
Forward-Port-Of: odoo/enterprise#102299
Forward-Port-Of: odoo/enterprise#930346 changes
Resolved issues and error corrections
This update resolves an issue where tax mappings weren't correctly set when upgrading to version 19.0, leading to errors during session closing with Fiskaly. The fix ensures accurate data transmission to Fiskaly, particularly when company names or cash move reasons contain hyphens, preventing transaction failures.
Original PR description
Steps to reproduce: ------------------------- - Upgrade from lower version to 19.0 or higher. - Start a fiskaly registered company's session. - Close the session after transactions. Issue: ------- -…
Steps to reproduce:
-------------------------
- Upgrade from lower version to 19.0 or higher.
- Start a fiskaly registered company's session.
- Close the session after transactions.
Issue:
-------
- Tax mapping used to send data to fiskaly is not set.
- If have `-` in company name or cash move reason and try to do cash move will give a tb.
Cause:
---------
- When the user's database is upgraded, the taxes already exist and the company is already registered. As a result, `l10n_de_vat_export_data` is never set, and since no tax changes occur, `l10n_de_vat_definition_export_identifier` is also not generated. This leads to incorrect values being sent to Fiskaly during the session closing request, causing errors.
- The cash statement name uses - as a separator, the current structure is `{session_name}-{move_type}-{statement_type}-{move_reason}` set from `_prepare_account_bank_statement_line_vals()` If move_reason or company name contains additional `-` splitting the whole name breaks the expected structure.
Fix:
-----
- We have added a check to identify any taxes that are missing their tax mapping If such taxes are found, we filter them and trigger the logic to set their mappings. However, if the main mapping reference value l10n_de_vat_export_data is not set, we first retrieve and update it. Once this reference is available, we update all taxes that were previously unset and then prepare the correct tax data.
As a result, the first session closing after the upgrade will automatically correct all issues both for customers who have already upgraded and for those who upgrade in the future.
- We first remove the `{session_name}-` prefix, then split the rest. Since move_type and statement_type never contain -, we take them directly not user inputs, and then rejoin everything from index 2 onward to reconstruct the correct move_reason.
Additional fixes:
--------------------
- Some places the limit of characters may exceed than what fiskaly is asking than it can give us an error so restricted all places where needed.
- We don't have check if the settlement is present if not getting id directly may cause error.
help ticket: 5362897, 5367425This update resolves an issue with the processing of payroll data (DDP) within the Belgian HR payroll module. The fix ensures accurate calculations and reporting related to employee salaries, improving the reliability of payroll processing. This update primarily impacts the accounting and HR functionalities.
This update fixes an issue where deferred accounting for misc entries wasn't correctly identifying the appropriate account type. The change now analyzes each deferred line individually, ensuring deferrals align with the actual account type of the line, leading to more accurate financial reporting. This improves the reliability of deferred accounting processes.
Original PR description
The commit 42f823d6b8aa3d1cd171ae1603549ee95fc9d0f0 allows to use deferred on misc entries. However, there are many places in the code that were not updated. Usually they were in the form of `if move_type is sale, then deferred_type = income, else expense`. However we cannot rely on the move_type anymore for misc entries, because it will always take the `else` branch of the condition. Instead, if we have a misc entry, we should rely on the account type of the line that is being deferred, so we have more granularity. For this, we now compute the deferral account/journal for each line, and not per move. The logic inside the computation remains the same. Steps to reproduce: 1. Create a misc entry with two deferred lines (one expense, one revenue) 2. Post it 3. Check the generated deferrals, they all use the same deferred account and journal even though we have different account types opw-5194305 Forward-Port-Of: odoo/enterprise#100295
This update restores the ability to generate negative overtime (undertime) in attendance records. Previously removed to avoid financial losses, this feature is now re-enabled based on specific Absence Management settings, ensuring accurate time tracking and reporting for our clients.
Original PR description
…time generation
This update resolves an issue where the control panel's 'Select All' button only processed the first 40 files uploaded. Now, all selected documents – regardless of the number – are correctly included when performing actions like duplication or deletion. This ensures consistent and reliable functionality for managing large document sets.
Original PR description
Steps to Reproduce =================== 1. Upload more than 40+ files in a folder. (One page displays upto 40 docs) 2. Use the checkbox to select all files on the page (this selects only 40 files) 3.…
Steps to Reproduce =================== 1. Upload more than 40+ files in a folder. (One page displays upto 40 docs) 2. Use the checkbox to select all files on the page (this selects only 40 files) 3. Click the 'Select All' button in the control panel to select all 40+ files. 4. Now, try duplicating or moving them to the trash. => Only the first 40 selected files (on the single page) are considered for action, not all the selected files. Technical ========== For documents control panel action we have custom handling for selecting records and executing action. We use `model.root.selection` which only consider records in current page, case of select all records from other pages is missed here. After this PR ================== - All selected records are considered for the actions - Added custom `getResIds` method to get filtered `resIds` as per domain. Note: `getResIds` in DynamicList doesn't have custom domain feature so create our own as per use case Task-4700841 Forward-Port-Of: odoo/enterprise#100791 Forward-Port-Of: odoo/enterprise#87634
This update fixes an issue preventing payment lines from being printed on Italian POS receipts. The problem stemmed from a configuration error that was consistently causing the payment information to be missed. This change ensures that all payment details are accurately included on the Italian fiscal receipts, resolving a critical functionality gap.
Original PR description
Currently payment lines are not sent to the italian printer. Steps to reproduce: ------------------- * Install l10n_it_pos * Switch to italian company * Set up italian printer for a shop * Make an order and pay it * Print italian receipt > Observation: no matter the payment used it is not sent to the italian printer Why the fix: ------------ This condition is currently always true: https://github.com/odoo/enterprise/blob/41e9fcd162cd51f93c98a0f0f6922d5faaf8914d/l10n_it_pos/static/src/app/documents/fiscal_document/body/body.xml#L27-L29 because `this.priceIncl` is always undefined. Therefore we would never use the payment lines: https://github.com/odoo/enterprise/blob/41e9fcd162cd51f93c98a0f0f6922d5faaf8914d/l10n_it_pos/static/src/app/documents/fiscal_document/body/body.xml#L30-L36 opw-5428027
9 changes
Resolved issues and error corrections
This update resolves an issue where overlays disappear after refreshing the website editor in version 18.0 and later. The root cause was identified and corrected to ensure overlays are properly displayed during editor reloads. This improves the user experience when making website changes.
Original PR description
The bug is only observable after 18.4, after the website refactoring, but the root cause has been present since 18.0, so we fix it there in case there are other use cases. Since [1], overlays are no longer visible after an operation that executes `reloadEditor`. Steps to reproduce (observable after 18.4): - On website, go into edit mode - Change header template - After reload, overlays are missing Reason: `WebsiteBuilderClientAction.reloadEditor` sets up the new `Editor` before the old one is destroyed. Consequently, `LocalOverlayPlugin.destroy` removes the newest overlays as well. This commit ensures the plugin only cleans up its specific DOM elements. The order of operations bug will be fixed in a later PR. task-5438306 [1]: https://github.com/odoo/odoo/commit/3cd29fbac2b06566bfff40b5e7ed310cb0ce12c1
This update corrects a previous error in the Profit & Loss report's Gross Profit calculation, now accurately including stock effects. Additionally, the report's UI has been simplified for better readability and user experience. This ensures more reliable financial reporting.
Original PR description
Previously, the Gross Profit calculation did not include the stock effect, which resulted in incorrect values. With this PR, the Gross Profit is now computed including the stock effect, ensuring accurate results. In addition, some UI adjustments have been made to simplify and improve the readability of the report. task-5357539 opw-5163207 master PR: https://github.com/odoo/enterprise/pull/101650
This update resolves issues with shared tables across multiple devices, preventing order modification errors and ensuring accurate payment processing. Specifically, it fixes synchronization problems related to online payments and ensures data consistency when managing tables in the Restaurant POS system.
Original PR description
`point_of_sale`, `pos_restaurant`, `pos_loyalty`, `pos_online_payment` ## Issue 1 - sync issue on shared tables across multiple devices ### Steps to Reproduce: - Open POS Restaurant in `two devices`…
`point_of_sale`, `pos_restaurant`, `pos_loyalty`, `pos_online_payment` ## Issue 1 - sync issue on shared tables across multiple devices ### Steps to Reproduce: - Open POS Restaurant in `two devices` (or `two different browsers`). - On Device 1: - Open any table & click on `Book Table`. - Add products & click the `Payment` button. (Do not validate the order) - On Device 2, open the same table and click on `Release Table`. - Back on Device 1 & try to add a payment line, partner, or enable Invoice. ### Issue: - `TB` will occures `Finalized order can't be modified` ### Fix: - Properly tracked and synced order, ensured relevant user notifications are shown. - Fixed TB if customer note not set (it's false value causing TB) ## Issue 2 - prevent traceback when cancelling empty order ### Steps to Reproduce: - Open Restaurant POS. - Click on any table. - Click the Book Table button. - Reopen the same table. - Click the Action button. - Click Cancel Order. ### Issue: - A traceback occurs because the order is undefined. ### Fix: - Added a condition to safely handle cases where no order exists. ## Issue 3 - always sync order before online payments in restaurant ### Steps to reproduce: - Open POS in Restaurant mode. - Open any table and add a product. - Return to the floor screen. - Reopen the same table and add another product. - Proceed to payment and select an online payment method. - Click "Validate". ### Issue: - The "Invalid online payments" dialog appears because the order is partially synced. Due to the current condition, it is not synced again before adding the online payment line, causing the dialog to appear, which is confusing. ### Fix: - Updated the condition to ensure that in Restaurant mode, the order is always fully synced before allowing online payment lines to be added. Task: 4788430
This update fixes an issue where payment differences on UrbanPiper POS orders were incorrectly calculated. The fix recomputes order totals and payments after a payment is added, ensuring the 'amount_difference' accurately reflects the actual payment amount. This prevents discrepancies in financial reporting for UrbanPiper transactions.
Original PR description
When UrbanPiper webhooks create POS orders, all monetary fields are initialized to 0 and _compute_prices() is called before any payment exists. Later, _make_order_payment() adds a payment via the pos.make.payment wizard, but no recomputation is done. As a result, amount_total and amount_paid are correct but amount_difference remains based on the initial 0 values (e.g. 0 - 40 = -40), even on posted orders. Recompute prices/totals after adding the payment so amount_difference reflects the actual paid amount for UrbanPiper orders.
This update ensures that gift cards purchased through the POS system are correctly linked to the customer who made the purchase. Previously, gift cards lacked a designated partner, making it difficult to track sales data. This fix resolves this issue, providing better reporting and traceability for gift card transactions.
Original PR description
When buying a gift card from a POS, the gift card is created without a partner. This is an issue for users who want to see who bought a specific gift card. In…
When buying a gift card from a POS, the gift card is created without a partner. This is an issue for users who want to see who bought a specific gift card. In [`pos_loyalty/models/pos_order.py`](https://github.com/odoo/odoo/blob/0bf53e6b2ab8c4c1705ebbb776102d493ac7445c/addons/pos_loyalty/models/pos_order.py), the `coupon_data` passed to the `confirm_coupon_programs` method does not contain the `partner_id`. This happens because the *Gift Card* program is not considered "nominative", failing the following condition from `pos_loyalty/static/src/overrides/models/pos_store.js`: https://github.com/odoo/odoo/blob/0bf53e6b2ab8c4c1705ebbb776102d493ac7445c/addons/pos_loyalty/static/src/overrides/models/pos_store.js#L795-L801 In fact, the conditions for nominative programs are defined in the `loyalty` module: https://github.com/odoo/odoo/blob/0bf53e6b2ab8c4c1705ebbb776102d493ac7445c/addons/loyalty/models/loyalty_program.py#L196-L200 This fix uses the customer's id when there's no `partner_id` in the `coupon_data` coming from the Javascript side. If there's no customer selected when buying the gift card from the POS, `self.partner_id.id` evaluates to `False`, leading to the original behavior: a gift card with no partner. ### Steps to reproduce: 1. Install Point of Sale (`point_of_sale`) 2. In Settings > Point of Sale, toggle *Promotions, Coupons, Gift Card & Loyalty Program* 3. In the POS, open a register 4. On the product screen, select the *"Gift Card"* product and click *Payment* 5. On the payment screen, set the Customer to any customer, pay, and click *Validate* 6. In the POS backend, go to Products > Gift cards & eWallet, click the *Gift Cards* program, and click the *Gift Cards (1)* smart button 7. The gift card we just sold in the POS appears in the list, but there's no Partner assigned to it. opw-5261991
This update resolves an issue where UrbanPiper orders were incorrectly displaying a payment difference after completion. The fix ensures that the final payment amount is accurately reflected as $0.00, improving the reliability of UrbanPiper order processing. This change impacts the financial reporting for UrbanPiper transactions.
Original PR description
In this commit, The amount difference should be 0.0 after the Urbanpiper order has been paid. task-5441252
This update fixes a problem where automatic ticket assignment wasn't working correctly when users had access to multiple companies. The change uses 'sudo()' to ensure proper access to resources, resolving a conflict between user access and team membership, and ensuring tickets are assigned as intended.
Original PR description
### Steps to reproduce: - Install hr_contract and helpdesk - Create two companies - Create a user that has access to both companies - Create an employee for this user in Company A - Create a helpdesk team in Company B and activate the auto assign - Add the user as a member in the created team - Create a ticket ### Cause: Since this commit https://github.com/odoo-dev/odoo/commit/79a559c9741410ad861c107e395b2fc486da95e8 we are reading from resources which is affecting the automatic assignment flow as we might have a team member that his user can access multi companies but he only has an employee in one company. ### Fix: Use sudo() to avoid the access error. opw-5241036
This update fixes an issue where helpdesk ticket creation would fail due to incorrect access permissions across different companies. The change prevents unnecessary data fetching in sudo, ensuring users only access resources within their own company, resolving a potential access error.
Original PR description
Before this commit, the `resource_ids` field in `res.users` model was fetched in sudo due to the `resource_calendar_id` related field in `res.users` and so the user will get the resources of members…
Before this commit, the `resource_ids` field in `res.users` model was fetched in sudo due to the `resource_calendar_id` related field in `res.users` and so the user will get the resources of members in a helpdesk team from another company than the current one(s). The problem is since the current user does not have access to those resources due to the multi company rule, he will get a traceback when he will try to create a ticket from that helpdesk team if the assignement method is ramdom and a user with resource exists in another company. This commit makes sure the resource_ids field in res.users is not fetched in sudo to correctly determine which user to set to the ticket when the current user tries to create a ticket. Steps to reproduce the issue: ---------------------------- 1. Install helpdesk module 2. Create a new company B 3. Create a new user with helpdesk user access right (or use Marc demo) and give the company B to that user 4. Select that new company created in step and go to helpdesk app. 5. Create an helpdesk team with auto-assignment set to "randomly" and set admin user as members in that helpdesk team 6. log in as the user created in step 3 7. make usre the company selected is the one created in step 2 8. create a ticket in the helpdesk team created in step 5 Expected behavior: ----------------- The ticket should be created without any issue. Actual behavior: --------------- An access error is raised because the current user does not have access to the resource of admin user since it is not in the same company than the current one. opw-5223717
This update fixes a reporting issue where the Expected Arrival Date wasn't displayed on DIN 5008 Purchase Order reports. The fix adds this critical information to the report template, aligning with user expectations and regulatory requirements. This ensures accurate reporting for DIN 5008 transactions.
Original PR description
**Steps to reproduce:** 1. Install l10n_din5008 and purchase modules. 2. Switch the Document Layout template to DIN 5008. 3. Create or open an existing Purchase Order. 4. Print the Purchase Order…
**Steps to reproduce:** 1. Install l10n_din5008 and purchase modules. 2. Switch the Document Layout template to DIN 5008. 3. Create or open an existing Purchase Order. 4. Print the Purchase Order report. **Issue:** The Expected Arrival Date does not appear on the DIN 5008 Purchase Order report. Both functional experts and PO (CHKL) confirmed that the Expected Arrival Date should appear by default on the Purchase Order report in DIN 5008. **Cause:** The date_planned (Expected Arrival) field was introduced in standard Purchase Order report in v18.0, but DIN 5008 report template was not updated accordingly **Fix:** Add the Expected Arrival information to the DIN 5008 Purchase Order template. Before: <img width="606" height="162" alt="image" src="https://github.com/user-attachments/assets/e11f5b1f-5898-4ec9-a4f2-087db5dfeced" /> After: <img width="605" height="147" alt="image" src="https://github.com/user-attachments/assets/57419d00-50c9-4508-9bfc-307c0a54dc67" /> **opw-5376176**
1 change
Resolved issues and error corrections
This update resolves an issue related to invoice QR codes generated for ZATCA compliance. Previously, the QR code included timezone information, which was incorrect. This change ensures the time data is sent in the correct Asia/Riyadh timezone format, meeting ZATCA requirements and avoiding potential processing delays.
Original PR description
In ZATCA phase 1, after converting the time to Asia/Riyadh timezone, the time information is added to the qr code in iso format which concatenates the timezone ("+03:00"). However, ZATCA expects the time to simply be sent as is in Asia/Riyadh timezone.
Task: 5319097
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