Daily updates from Odoo
Monday, March 23, 2026
267 changes
17 changes
Resolved issues and error corrections
This update ensures that all worked days on payslips are correctly linked to a work entry type. Previously, creating a public holiday without this link prevented payslips from being generated. This change makes the process more reliable and accurate for payroll processing.
Original PR description
All worked days lines in payslips should be linked to a work entry type. If we create a public holiday without linking it to a work entry type, it won't be possible to generate a payslip. Making the field required fixed the issue. task-6044274 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 technical error that prevented users from selecting a 'Time Off Type' within the 'New Group Allocation' wizard. The issue stemmed from an outdated reference to a company ID field, which has now been removed. This ensures the allocation process functions correctly for all users.
Original PR description
This error occurs when selecting the `Time Off Type` in the `New Group Allocation` wizard.
Steps to reproduce:
- Install `hr_holidays` module
- Time Off > Management > Allocations > `New Group Allocation`
- Try to select `Time Off Type`
Traceback:
`ValueError: Invalid field hr.work.entry.type.company_id in condition ('company_id', 'in', [1, False])`
In this [commit], the `company_id` field was removed from the `hr.work.entry.type` model; however, it is still referenced in the `_domain_work_entry_type_id` domain.
[commit]: https://github.com/odoo/odoo/commit/d37cf89a6ff134988b4a7c001a97973cd95a2ea8#diff-5cda5340aaeaddd073ac083c1909e0e52d6cbc48cb8d9c8f93ad48fd8a04f00dL68-L69
sentry-7328870622This update ensures that payment methods created within a branch company can be correctly associated with point-of-sale locations, regardless of the primary company. Previously, a validation error occurred when attempting to save a payment method linked to a branch, now this is resolved by adding a company constraint to the payment method model.
Original PR description
Steps to reproduce: ------------------- * Let's say you're on company A, create a pos payment method * Don't assign a pos yet * Create a branch company sub_A * Switch to that branch company * Create…
Steps to reproduce: ------------------- * Let's say you're on company A, create a pos payment method * Don't assign a pos yet * Create a branch company sub_A * Switch to that branch company * Create a pos * Now switch to company A but also select sub_A * In the config of the pos from sub_A, try to add the new payment method and save > Validation error -> Normal * Now instead go to the payment method form * In the point of sales select the pos sub_A * Save > No error * Try opening the pos sub_A > Validation error, same as the first one -> Normal Why the fix: ------------ We already have a contraint on the pos config model checking that the companies match. https://github.com/odoo/odoo/blob/88df50bc96448dfaff28bd37e970ffd18bf8d554/addons/point_of_sale/models/pos_config.py#L469-L473 However when writing on the model pos payment there is no constraint and the ORM currently does not trigger constraints on comodel of the field we're modifying so we need to add this constraint on the pos payment method model as well opw-6000206 Forward-Port-Of: odoo/odoo#253858
A recent test related to product archiving in the Point of Sale module was failing intermittently. This update ensures all test sessions are closed before running the test, resolving the issue where products weren't being properly archived. This improves the reliability of our testing process.
Original PR description
After this commit https://github.com/odoo/odoo/pull/252211/changes/3344bd72b9c5591b466aeca7f9da218da53dee3b the test test_archived_product_removed_and_order_is_refunded was sometimes broken because some session were still opened and the product could not be archived. This commit ensures that all sessions are closed before lauching the test. runbot-error: 241842 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253296
This update prevents unwanted formatting from being pasted into the HTML composer within Discuss. Previously, pasting content could introduce styles and HTML elements that disrupted the composer's intended use. This change ensures a cleaner and more consistent experience for creating HTML content.
Original PR description
When pasting content into the HTML editor composer, we want to ensure that no formatting is retained from the source in Discuss. This is achieved by intercepting the paste event in the clipboard plugin and removing the style and remove tags that we do not want to allow in the HTML editor composer in Discuss. This prevents any unwanted styles or HTML elements from being introduced into the composer in Discuss. task-5364799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238136
This update fixes a bug where customers could modify the global discount line within optional sections of sales orders. The change prevents unauthorized edits to this discount, ensuring accurate order pricing and preventing potential revenue discrepancies. This resolves issue OPW-6045297.
Original PR description
Issue: --- Due to this issue global discount line can be edited by customer. #### Steps to reproduce: 1- Create a SO with SOLs and add a optional section. 2- Add a global discount under optional section. 3- Preview the SO. The quantity of discount can be edited. Cause and Fix: --- In `_can_be_edited_on_portal` we are not excluding the global discount line from being editable. We could fix that by excluding line with company discount product from being editable. opw-6045297 Forward-Port-Of: odoo/odoo#254870
This update corrects a formatting issue in Odoo's Danish (DK) nemhandel XML files. The 'DK' prefix was missing from the CVR nemhandel identifier, which is now correctly added to ensure accurate data transmission. This ensures proper processing of invoices and refunds related to Danish electronic payments.
Original PR description
In this commit af94099c4d74e9c48251a1c1656e3ad11b9f8a70, we made a fix regarding OIOUBL21 XML files, but we forgot to add the 'DK' prefix for CVR nemhandel identifier. The format should be 'DK' + nemhandel_identifier_value. no-task Forward-Port-Of: odoo/odoo#254430
This update addresses several minor issues related to resource management within Odoo, primarily focusing on enhancing the user experience and flexibility. Specifically, the Kanban interface now correctly displays resource search options, and employees without defined schedules are now recognized as flexible resources. These changes ensure a smoother workflow for managing resources.
Original PR description
## [FIX] resource_mail: change placeholder for the many2many_avatar_resource in kanban The default placeholder is "Search users...." which made little sense in the context of searching for resources.…
## [FIX] resource_mail: change placeholder for the many2many_avatar_resource in kanban The default placeholder is "Search users...." which made little sense in the context of searching for resources. ## [FIX] web: give specification to AutoComplete in m2m tags popover Before this commit, when the user uses the quick edit of m2m avatar widget, the specification is not given to props since the popover does not have the specification of the main component. This commit makes sure the specification is given to popover to correctly give them to the Autocomplete widget. ## [FIX] web: allow to change the popover to use in KanbanMany2ManyTagsAvatarFieldPopover Before this commit, it was not possible to change the popover used in KanbanMany2ManyAvatarFieldPopover in the case, we need to extend that popover class used. This commit allows to alter the popover class. ## [FIX] resource_mail: review m2m resource field widgets This commit reviews the code in the different components for m2m resource to use as much as possible the methods defined in the basic m2m avatar widgets defined in web and mail. ## [FIX] resource: make sure resource without calendar set is flexible one Before this commit, when an employee does not have a working schedule set, neither work per day set, this employee is not considered as a resource flexible in resource.resource record associated. This commit makes sure this kind of employee be considered as flexible resource. task-6020304
This update resolves an issue where cross-origin requests with the Range header would fail due to preflight checks. The change adds the necessary header to allow these requests to succeed, improving compatibility with external systems. While future customization is considered, this fix addresses a specific, previously undetected problem.
Original PR description
Previously, specifying the Range header in a CORS request would result in a preflight failure even if cors was enabled on the route. It is sometimes desirable to allow querying ranges even in a CORS context. It may be desirable at some point in the future to allow controllers to customize their preflight responses more thoroughly, but considering this hasn't really be an issue before, it seems premature. Instead, this commit just adds the Range header to the Allow-Control-Allow-Headers response header to allow such requests to succeed. Forward-Port-Of: odoo/odoo#254805
This update fixes visual and functional issues within the SelectMenu component, including highlighting search results and resolving glitches related to dropdown behavior and placeholder display. The changes enhance the user experience and ensure consistent styling across the Odoo interface. This resolves a reported bug and improves the overall usability of the SelectMenu.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251992
This update resolves a visual bug in the website builder where certain options groups would disappear unexpectedly when accessed by users with limited permissions. The fix moves the access right filtering step earlier in the process, ensuring the builder correctly displays available options or shows a blank state when none are visible. This improves the user experience for all website builder users.
Original PR description
Since the [website builder refactor], the `OptionContainer` component filters the option based on access right when rendering the list of options, and hides itself if there is no options visible when…
Since the [website builder refactor], the `OptionContainer` component filters the option based on access right when rendering the list of options, and hides itself if there is no options visible when rendered. With [folding of options], the options are rendered only when the group is unfolded. Thus the component can hide itself only if unfolded. Generally, there is at least one option visible when a group is rendered, which appears when the group is unfolded. But when options are filtered because of access right, the filtered list is often empty, and the group disappears when unfolded. This commit moves the filtering slightly earlier, so the options are filtered before rendering. If the filtered list of options is empty, the component shows nothing at all as it knows it has zero options, instead of a folded group. Steps to reproduce: - With a user with only the "restricted editor" access right (and not "editor and designer") - Open website builder on /blog - Click in the title in the cover - Bug: the "Blog Page" options group appears (but it is empty, and disappears when opened) [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 [folding of options]: 64d35ccd6fade9e0473686b8484f561b5f4215ce task-6032728
This update ensures that all required address fields (street, city, zip, state, country) are included when generating seller addresses on e-invoices for Viettel. This change is necessary to meet Viettel's EDI requirements and avoid potential invoice rejection issues, ensuring compliance and accurate reporting.
Original PR description
The seller address on e-invoices was missing some fields. This commit updates the logic to include street2, city, zip, state, and country when generating the seller address, ensuring full address details are provided in compliance with Viettel EDI requirements. task-6040875 Forward-Port-Of: odoo/odoo#254564
This update fixes an issue where the VAT Return (CZ) report was incorrectly displaying negative amounts when invoices with VAT 24 or 23 tax grids were created. Previously, the report showed incorrect VAT calculations. This change ensures accurate VAT reporting for Czech companies using the l10n_cz module.
Original PR description
With l10n_cz company: 1. Create some invoices using the VAT 24 or VAT 23 tax grid on an invoice line containing an amount in credit. 2. Go to the VAT Return (CZ) report 3. The amount shown will be negative instead of positive, which goes against what the report should show. Missed by 17a6117ed88c29b5bc4db0c872bcdbc109a7d98b opw-5978183 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252243
This update fixes an issue where the table editor lost focus after deleting rows or columns, disrupting the editing workflow and causing confusion. Now, the editor automatically refocuses, ensuring actions like Undo work correctly and improving the overall user experience when managing table data.
Original PR description
**Current behavior before PR:** When a user deletes a row or column from table menu, the editor loses focus. As a result, actions like Undo do not behave as expected and require multiple attempts to restore the original table state. This breaks the editing flow, causes confusion when performing table-related actions. **Desired behavior after PR:** This PR ensures that editable is focused after deleting row or column from table menu. This commit also makes sure that selection is set properly and hint is visible on empty cell after deleting the column. task-5725593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254684 Forward-Port-Of: odoo/odoo#245433
This update corrects a bug where project sharing settings were incorrectly changing after sharing with portal users. The change ensures that project visibility remains as intended, regardless of the sharing method used. This resolves an issue impacting how users access and collaborate on projects.
Original PR description
Steps to reproduce: - Create/open any project - Set visibility to `Invited internal users and portal users`. - Share project with a portal user - Visibility changes to `All internal users and invited portal users`. Cause: - Previously, this behavior was implemented specifically for sharing the project from the cog menu. However, the `Share Project` option has now been removed from the cog menu. - After introducing the new `invited_users` visibility option, the existing share logic was not updated to support this new value; as a result, the project's existing visibility is unintentionally overwritten. Solution: - Remove the hardcoded update of `privacy_visibility` in the `action_send_mail` method. task-5924243 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255197 Forward-Port-Of: odoo/odoo#248235
This update corrects a previous issue where half-day leave periods (like 3.5 or 4.5 days) weren't accurately displayed in the calendar view. The system now correctly recognizes and shows these half-day portions, ensuring leave schedules are displayed completely and accurately.
Original PR description
-When the leave includes a half day (for example, 4.5 or 3.5 days), the half-day portion is not displayed on the dashboard. --Rendering logic has been adjusted to count for half-days. Forward-Port-Of: odoo/odoo#255096 Forward-Port-Of: odoo/odoo#250342
This update ensures that all product attributes (like color and size) are accurately reflected when scanning barcodes in the Point of Sale system. Previously, the system only displayed variant-specific attributes, leading to inconsistent order lines. This fix guarantees a more reliable and complete product representation during scanning, improving the customer experience.
Original PR description
Currently, when a product has more attribute values then variant values (some attribue can have only one option), the pos behaves differently depending if you select the product or scan it. Steps to reproduce: ------------------- * Modify the acoustic bloc screen "Attributes & Variants" tab * Have one attribute line Color, only White as values * Have one attribute line Size, S and M as values * Go to the variants, select the one corresponding to the Size S > Observe it also has the attribute White * Set a barcode on this variant * Open shop * Select Acoustic Bloc Screens, select Size S, confirm * Now scan the barcode > Observation: 2 Different pos order lines on the order, the first shows S, White as attributes, the second one only shows S. Why the fix: ------------ We need to use all attribute values, not only the variant values. opw-5932560 Forward-Port-Of: odoo/odoo#255181 Forward-Port-Of: odoo/odoo#252233
28 changes
Resolved issues and error corrections
This update optimizes how Odoo handles large sales orders, significantly speeding up the rendering process. Previously, a slow process was triggered when processing many order lines, leading to UI delays. Now, the system pre-computes parent-child relationships, resulting in a much smoother and faster experience for users.
Original PR description
This commit resolves a performance bottleneck that occurred when handling very large sale orders (e.g., ~200 order lines). Previously, the util function `getParentSectionRecord` determined the parent…
This commit resolves a performance bottleneck that occurred when handling very large sale orders (e.g., ~200 order lines). Previously, the util function `getParentSectionRecord` determined the parent (sub)section of an order line by iterating over all preceding order lines. Since this logic was executed for each order line, the overall complexity became O(n²). Moreover, this function was invoked inside the `shouldCollapse` method, which is used in multiple UI flows during rendering. As a result, large sale orders could cause noticeable UI slowdowns and block the main JavaScript thread. To address this, we now build a parent–child section mapping once per render in O(n) time. Subsequent lookups simply read from this mapping instead of recomputing the parent by scanning previous lines. This significantly reduces the computational cost and prevents UI blocking when working with large orders, leading to a much smoother rendering experience. opw-5865167 Benchmark: | No. records | Before | After | |----------------|---------------|--------------| | 150 | 1300ms | ~850ms | | Before | After | |---------------|--------------| | <img width="287" height="284" alt="image" src="https://github.com/user-attachments/assets/dd73ab18-3c53-4958-99b7-083dd5cd9e64" /> | <img width="311" height="277" alt="image" src="https://github.com/user-attachments/assets/b6e90fa3-85eb-4d72-b616-28aff9a938e8" />| --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252991
This update corrects a map data issue that was preventing the display of Russia on the Asia map. It also adds a new Oceania map, ensuring more complete geographical representation within the Odoo spreadsheet functionality. This enhances the accuracy and usability of maps displayed in the spreadsheet.
Original PR description
- Fix Asia map (russia was missing) - Added Oceania map Task-5224009 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248847
This update resolves an issue where project sharing visibility was incorrectly changing after sharing with portal users. The change ensures that projects shared with 'Invited internal users and portal users' retain their intended visibility settings, preventing unintended changes to user access. This improves the reliability of project sharing workflows.
Original PR description
Steps to reproduce: - Create/open any project - Set visibility to `Invited internal users and portal users`. - Share project with a portal user - Visibility changes to `All internal users and invited portal users`. Cause: - Previously, this behavior was implemented specifically for sharing the project from the cog menu. However, the `Share Project` option has now been removed from the cog menu. - After introducing the new `invited_users` visibility option, the existing share logic was not updated to support this new value; as a result, the project's existing visibility is unintentionally overwritten. Solution: - Remove the hardcoded update of `privacy_visibility` in the `action_send_mail` method. task-5924243 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248235
A recent update caused a technical error in the composer when users tried to select mentions (@). This was due to a change in how the system identifies mentions, specifically a renaming of an attribute. This fix ensures the composer functions correctly when selecting mentions, improving the user experience.
Original PR description
Problem: Opening the composer, typing "@" and selecting any item causes a traceback. Cause: After 8c99b17fcc3a612fd897da9ee29e2f53254d5933, the attribute `channel` was renamed to `thread`. Some code still referenced the old `channel` attribute, leading to errors when selecting mentions. Steps to reproduce: - Open the composer. - Type "@" to trigger mentions. - Select any item from the suggestions. - Observe a traceback. opw-6030307 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254127
This update resolves a problem where users without live chat access were encountering errors when trying to open the live chat invite panel. The fix ensures that active live chat partners are correctly retrieved for invited users, improving the overall live chat experience. This prevents frustration and ensures all users can easily initiate live chat conversations.
Original PR description
When opening the livechat invite panel, users without livechat access rights encounter an access error. This commit fixes the issue by ensuring active live chat partners can be retrieved for invited users. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254928 Forward-Port-Of: odoo/odoo#254565
This update resolves an issue preventing users from adding a partner's bank account to the 'Recipient Bank' field when creating a credit note. Previously, this field only showed company accounts, blocking credit note processing. Now, the field correctly prefilters bank accounts based on the expected recipient, enabling proper credit note creation.
Original PR description
Description of the issue this commit addresses: The Recipient Bank field in the Other Info tab of the Account Move form view refilters accounts to only show you company's ones. This is expected for invoices but is blocking when doing a credit note. You can't find a partner's bank account to fill that field. --- Steps to reproduce: 1. Install account. 2. Create an Invoice to a partner which has a bank account setup. 3. Create a Credit Note for that Invoice. 4. In the "Other Info" tab, remove the partner's bank account. 5. Try to search for his bank account to add it back. It won't show up. --- Desired behavior after this commit is merged: The Recipient Bank field prefilters bank accounts based on who is expected to be the recipient of the move. --- task-5976951 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254850 Forward-Port-Of: odoo/odoo#252961
This update fixes issues with the XML invoices generated for Spanish VAT (EDI) reporting. Specifically, it now correctly calculates and formats tax outputs per tax type instead of per line item, and enables rounding for tax data aggregation. This ensures accurate VAT reporting and compliance.
Original PR description
- Adjusting invoice-level `<TaxesOutputs>` nodes to be generated per tax rather than per line - Enabling rounding for invoice-level tax data aggregation - Adding a second rounding test derived from bug ticket task-6009108 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253305
This update corrects a problem where invoices using fixed taxes for 'consigne/vidange' were failing Peppol validation. The fix adjusts how tax exemptions are handled during invoice generation, ensuring compliance with Peppol standards and allowing these invoices to be successfully processed.
Original PR description
**PROBLEM** Here is the client use case: The client uses fixed tax to do 'vidange/consignage'. When selling a product with a 'consigne/vidange', they add a fixed tax which amount correspond to the…
**PROBLEM** Here is the client use case: The client uses fixed tax to do 'vidange/consignage'. When selling a product with a 'consigne/vidange', they add a fixed tax which amount correspond to the 'consigne/vidange'. When returning the 'consigne', you would create an invoice line, with a product with a price of 0, negative quantity,a 0% tax and the fixed tax for the 'consigne'. When an invoice contains such lines, it fails peppol validations. **STEP TO REPRODUCE** 1. Create a fixed tax used for 'vidange/consigne'. 2. Create an invoice, with a line with unit price of 0, negative quantity, a 0% tax and the fixed tax for the 'consigne'. 3. Send the invoice using peppol, use a validator to validate the xml and notice you get the following errors: [BR-E-01] [BR-E-08]. **CAUSE** Fixed tax (like the one used for vidange) are aggregated in new invoice lines by the function `_ubl_turn_emptying_taxes_as_new_base_lines()`. Let say we have the following invoice: line 1: qty=2, unit_price=3, taxes: 21% & vidange(fixed tax of 1). line 2: qty=-1, unit_price=0, taxes: 0% & vidange. After calling `_ubl_turn_emptying_taxes_as_new_base_lines()`, we got: line 1: qty=2, unit_price=3, taxes: 21%. line 2: qty=-1, unit_price=0, taxes: 0%. line 3: qty=1, unit_price=1(amount of the fixed tax), taxes:None. When generating the VAT breakdown, we have 2 line will end up being tax exempted (line 2 and 3). Because the `tax_exemption_reason` differs, they will not be merged in the same entry in the breakdown, which break the constraint of peppol saying we can only have one VAT breakdown with code 'Exempt from tax'. Line 2 reason comes from: https://github.com/odoo-dev/odoo/blob/de22093ee225df499b2de80e1f07dd281ac686bc/addons/account_edi_ubl_cii/models/account_edi_common.py#L271-L274 opw-5912986 Forward-Port-Of: odoo/odoo#254875 Forward-Port-Of: odoo/odoo#250413
This update resolves an issue where tours on the website were experiencing delays loading translations, particularly with recent Chrome versions. The change introduces a temporary step to ensure translations start loading promptly, preventing tours from stalling and improving the user experience.
Original PR description
This commit adds an intermediary step ensuring the proper page has been reached before actually doing the checks and avoiding to let startup requests (like the loading of the translations) pending at the end of the tour (and the eventual stop of the runner browser). Note: this is most likely due to a timing (indeterministic by nature) change, emphasised by recent Chrome versions (like v145). runbot-239128 Forward-Port-Of: odoo/odoo#254745 Forward-Port-Of: odoo/odoo#253896
This update fixes a bug where customers could unintentionally modify global discount lines within optional sections of sales orders. The change prevents customers from editing these discount lines, ensuring accurate order pricing and preventing potential revenue discrepancies. This improves order accuracy and reduces the risk of errors.
Original PR description
Issue: --- Due to this issue global discount line can be edited by customer. #### Steps to reproduce: 1- Create a SO with SOLs and add a optional section. 2- Add a global discount under optional section. 3- Preview the SO. The quantity of discount can be edited. Cause and Fix: --- In `_can_be_edited_on_portal` we are not excluding the global discount line from being editable. We could fix that by excluding line with company discount product from being editable. opw-6045297 Forward-Port-Of: odoo/odoo#254870
This update resolves a problem where pasting content into the HTML composer in Discuss would retain unwanted formatting and styles. The update intercepts the paste event to remove formatting tags, ensuring a cleaner and more consistent experience for users when creating HTML content. This improves the usability of the HTML composer.
Original PR description
When pasting content into the HTML editor composer, we want to ensure that no formatting is retained from the source in Discuss. This is achieved by intercepting the paste event in the clipboard plugin and removing the style and remove tags that we do not want to allow in the HTML editor composer in Discuss. This prevents any unwanted styles or HTML elements from being introduced into the composer in Discuss. task-5364799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238136
This update corrects a visual issue where menu items on the website didn't align properly when using mobile view or hamburger menus. The fix adjusts how menu labels are styled, ensuring they align to the right or center based on the user's chosen setting. This improves the overall website appearance and user experience.
Original PR description
Steps to reproduce: =================== 1- Enter the website editor 2- Enable mobile view 3- Edit the alignment of the mobile menu to be center or right aligned The group labels (e.g. "Shop",…
Steps to reproduce: =================== 1- Enter the website editor 2- Enable mobile view 3- Edit the alignment of the mobile menu to be center or right aligned The group labels (e.g. "Shop", "Forum") stay left-aligned regardless of the chosen alignment. This can also be seen on desktop by switching to the sidebar header template. Cause: ====== The class .accordion-button uses `display:flex` and `text-align:left` and that class is used for the menu groups labels. this prevents the alignment from working. Solution: ========= When right-aligned (`text-end`), reverse the flex direction so the arrow moves to the left and the text stays on the right. When centered (`text-center`), let the text span fill the remaining space and center its content via `text-align: center`, keeping the arrow on its position. The default left-aligned case is unchanged. opw-5494765 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244565
This update resolves an issue where the selection within the HTML editor would reset to the beginning after using the command palette. The change creates an override to refocus the editable area upon closing the command palette, ensuring the user's current selection is preserved. This improves the editor's usability and workflow.
Original PR description
Before this commit: when the whole editable regains the focus, the selection in the editable is reset to the start of it. After this commit: We create a override for hotkey service to open the command palette with an onClose to refocus the editable area without losing the current selection. For the hotkey override, we pass the area option so it's only valid in the editable area. Outside the editable, the command palette is opened in the default way. task-5949705 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254623 Forward-Port-Of: odoo/odoo#250624
This update ensures payment methods created within a company branch can be consistently used across all company branches, resolving a previous validation error. The fix adds a necessary constraint to the payment method model, aligning with existing company checks and preventing inconsistencies in the point-of-sale system. This improves data integrity and user experience.
Original PR description
Steps to reproduce: ------------------- * Let's say you're on company A, create a pos payment method * Don't assign a pos yet * Create a branch company sub_A * Switch to that branch company * Create…
Steps to reproduce: ------------------- * Let's say you're on company A, create a pos payment method * Don't assign a pos yet * Create a branch company sub_A * Switch to that branch company * Create a pos * Now switch to company A but also select sub_A * In the config of the pos from sub_A, try to add the new payment method and save > Validation error -> Normal * Now instead go to the payment method form * In the point of sales select the pos sub_A * Save > No error * Try opening the pos sub_A > Validation error, same as the first one -> Normal Why the fix: ------------ We already have a contraint on the pos config model checking that the companies match. https://github.com/odoo/odoo/blob/88df50bc96448dfaff28bd37e970ffd18bf8d554/addons/point_of_sale/models/pos_config.py#L469-L473 However when writing on the model pos payment there is no constraint and the ORM currently does not trigger constraints on comodel of the field we're modifying so we need to add this constraint on the pos payment method model as well opw-6000206 Forward-Port-Of: odoo/odoo#253858
This update resolves an issue where cross-origin requests with the Range header would fail due to preflight checks. The change adds the necessary header to allow these requests to succeed, improving compatibility with external systems. While future customization is considered, this fix addresses a specific, previously undetected problem.
Original PR description
Previously, specifying the Range header in a CORS request would result in a preflight failure even if cors was enabled on the route. It is sometimes desirable to allow querying ranges even in a CORS context. It may be desirable at some point in the future to allow controllers to customize their preflight responses more thoroughly, but considering this hasn't really be an issue before, it seems premature. Instead, this commit just adds the Range header to the Allow-Control-Allow-Headers response header to allow such requests to succeed. Forward-Port-Of: odoo/odoo#254805
A recent test related to archiving products in Point of Sale was failing intermittently. This update ensures all test sessions are properly closed before running the test, resolving the issue where products weren't being archived correctly. This improves the reliability of our testing process.
Original PR description
After this commit https://github.com/odoo/odoo/pull/252211/changes/3344bd72b9c5591b466aeca7f9da218da53dee3b the test test_archived_product_removed_and_order_is_refunded was sometimes broken because some session were still opened and the product could not be archived. This commit ensures that all sessions are closed before lauching the test. runbot-error: 241842 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#253296
This update corrects a formatting issue in Odoo's Danish tax XML files (l10n_dk) related to the 'nemhandel' identifier. The 'DK' prefix was missing, which is now added to ensure compliance with Danish tax regulations. This ensures accurate data transmission for VAT reporting.
Original PR description
In this commit af94099c4d74e9c48251a1c1656e3ad11b9f8a70, we made a fix regarding OIOUBL21 XML files, but we forgot to add the 'DK' prefix for CVR nemhandel identifier. The format should be 'DK' + nemhandel_identifier_value. no-task Forward-Port-Of: odoo/odoo#254430
This fix ensures that product order lines in the Point of Sale (POS) system accurately reflect all assigned attributes, regardless of whether the product is selected or scanned. Previously, the system displayed inconsistent information, leading to inaccurate order details. This update corrects this behavior, improving the reliability of POS transactions.
Original PR description
Currently, when a product has more attribute values then variant values (some attribue can have only one option), the pos behaves differently depending if you select the product or scan it. Steps to reproduce: ------------------- * Modify the acoustic bloc screen "Attributes & Variants" tab * Have one attribute line Color, only White as values * Have one attribute line Size, S and M as values * Go to the variants, select the one corresponding to the Size S > Observe it also has the attribute White * Set a barcode on this variant * Open shop * Select Acoustic Bloc Screens, select Size S, confirm * Now scan the barcode > Observation: 2 Different pos order lines on the order, the first shows S, White as attributes, the second one only shows S. Why the fix: ------------ We need to use all attribute values, not only the variant values. opw-5932560 Forward-Port-Of: odoo/odoo#252233
This update corrects a display issue where half-day leave periods (e.g., 3.5 days) were not accurately shown in the calendar view. The system now correctly calculates and displays half-day leave durations, ensuring a more precise representation of employee time off.
Original PR description
-When the leave includes a half day (for example, 4.5 or 3.5 days), the half-day portion is not displayed on the dashboard. --Rendering logic has been adjusted to count for half-days. Forward-Port-Of: odoo/odoo#250342
This update corrects a bug where live chat channel names were duplicated when a user was both the visitor and the agent (self-chat). The fix ensures the visitor user is handled correctly, preventing incorrect channel naming. This improves the consistency and accuracy of live chat interactions.
Original PR description
Since PR #212150 when getting the livechat channel values, the `visitor_user` value is set to the current visitor user even when the visitor user is the same as the agent (self chat). The code is guarded in the next step and so this visitor is not added to the channel members but the already set value affects the livechat channel name. The bug becomes visible when the `displayName` computation is changed later by the PR #227240. This change ensures that the visitor user remains falsy throughout the process when the visitor and agent are the same. task-6015652 Forward-Port-Of: odoo/odoo#255093
This update ensures that e-invoices generated using the l10n_vn_edi_viettel module include complete seller address information, specifically street2, city, zip, state, and country. This change is necessary to meet Viettel EDI requirements and avoid potential invoice rejection issues.
Original PR description
The seller address on e-invoices was missing some fields. This commit updates the logic to include street2, city, zip, state, and country when generating the seller address, ensuring full address details are provided in compliance with Viettel EDI requirements. task-6040875 Forward-Port-Of: odoo/odoo#254564
This update fixes an issue where the VAT Return (CZ) report was incorrectly displaying negative amounts when using VAT 24 or VAT 23 tax grids on invoices with credit amounts. The change ensures the report accurately reflects VAT amounts, improving the reliability of Czech Republic tax reporting within Odoo.
Original PR description
With l10n_cz company: 1. Create some invoices using the VAT 24 or VAT 23 tax grid on an invoice line containing an amount in credit. 2. Go to the VAT Return (CZ) report 3. The amount shown will be negative instead of positive, which goes against what the report should show. Missed by 17a6117ed88c29b5bc4db0c872bcdbc109a7d98b opw-5978183 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#252243
A recent test used to fail unexpectedly due to an error in how it accessed image URLs. This update adds a safety check to the template, ensuring it handles cases where the related information isn't immediately available. This resolves a previous bug and improves the stability of the meeting tour functionality.
Original PR description
Before this commit, test `test_04_meeting_view_tour` could crash non-deterministically with the following error:
```
OwlError: An error occured in the owl lifecycle (see this Error's "cause" property)
Caused by: TypeError: Cannot read properties of undefined (reading 'avatarUrl')
at DiscussSidebarCallParticipants.template
```
This happens because the template was reading a deep field in a JS relation without guard in `rtc_session.channel_member_id.avatarUrl`.
When a rtc_session is known in client code, the `channel_member_id` is not necessarily known, therefore code should guard it unless context is explicit that this is known.
This commit adds optional guarding in the template to take into account possibility to know rtc session without the related channel member id.
Fixes runbot-error-242142
Backport of https://github.com/odoo/odoo/pull/233232
Forward-Port-Of: odoo/odoo#255265This update resolves issues with overtime calculations related to timezone differences, specifically impacting how attendances are processed in UTC+ timezones. The fix ensures accurate overtime intervals are generated and prevents crashes or stale overtime records, improving the reliability of employee time tracking.
Original PR description
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a…
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a period, then create two consecutive midnight-to-midnight attendances in the employee's local timezone. Creating the second attendance crashes with: "ValueError: Expected singleton: hr.attendance.overtime.line(...)". Steps to reproduce (stale overtime lines): With the same setup, delete the attendance after it generated overtime lines. The overtime lines remain in the database instead of being removed. The singleton crash occurred because `end_of_day` in `_get_overtime_intervals` was computed as a naive datetime, implicitly treated as UTC. For UTC+ timezones, the actual local end of day is earlier than UTC midnight. As a result, overtime intervals were computed with a stop time extending past the real local midnight into UTC time. When consecutive attendances were processed together, these extended intervals overlapped. The `Intervals` class (`keep_distinct=True`) merges overlapping intervals into a single entry with a multi-record recordset as payload. The subsequent `overtime.rule_ids.work_entry_type_id` and `overtime.status` calls expected a singleton but received a multi-record set, causing the crash. The same multi-record issue also affected the iteration in `_set_real_overtime_intervals` and the overtime work entry loop in `_get_attendance_intervals`. The stale overtime lines issue occurred because `_get_overtimes_to_update_domain` built its search date range from raw UTC `.date()` values instead of the employee's local timezone. For UTC+ employees whose attendance spans local midnight, the overtime line is dated in the next local calendar day. Since the domain was derived from UTC dates, that next local day fell outside the search range, so the overtime line was never found and deleted when the attendance was removed. Additionally, `_get_localized_times` called `.astimezone()` on naive UTC datetimes without first localizing them, producing incorrect local times for the same reason. Solution: - In `_get_overtimes_to_update_domain`, localize check_in/check_out to the employee's timezone before computing the overtime search date range (with a ±1 day buffer) so overtime lines for dates that only exist in local time are correctly included in the delete-and-recreate cycle. - Fix `_get_localized_times` to call `utc.localize()` on naive UTC datetimes before converting to the employee's timezone. opw-5931665 Forward-Port-Of: odoo/odoo#251812
Previously, emails weren't automatically sent when a task was created using a template. This update ensures that emails are consistently sent, mirroring the behavior when a task is copied. This improves communication and notification workflows for project teams.
Original PR description
Steps to reproduce: - Open form view project that has task templates. - Add a partner to follow project when task is created. - From `New` button click on any available task templates . Issue: - Mail is not sent when task is created from template. Fix: - Now we are treating creating task from template same as we do copy. Solution: - Make sure we send a mail and stop the normal logging which happens when copying the task. Forward-Port-Of: odoo/odoo#250306
This update corrects a validation error that occurred when generating invoices in the Belgian accounting module (l10n_be) using Peppol. The fix addresses a rounding discrepancy that caused the invoice XML to fail validation, ensuring compliance with VAT regulations. It achieves this by correctly handling decimal rounding differences.
Original PR description
**Steps to reproduce:** - Install Accounting and l10n_be - Switch to a Belgian company (e.g. BE Company CoA) - In Accounting settings: * activate Peppol * set "Rounding Method" to "Round Globally" -…
**Steps to reproduce:**
- Install Accounting and l10n_be
- Switch to a Belgian company (e.g. BE Company CoA)
- In Accounting settings:
* activate Peppol
* set "Rounding Method" to "Round Globally"
- Create an invoice:
* Customer: [a Belgian customer with a VAT]
* Invoice Lines:
| Label | Quantity | Price | Taxes |
| ------- | ---------- | ------- | ------- |
| Line 1 | 1.0 | 90.30 | 0% |
| Line 2 | 0.45 | 2.54 | 6% |
| Line 3 | 0.28 | 6.87 | 6% |
- Confirm the invoice
- Send the invoice to Peppol
**Issue:**
The generated XML has a line with `<cbc:LineExtensionAmount>` set to 90.31, `<cbc:InvoicedQuantity>` set to 1.0 and `<cbc:PriceAmount>` set to 90.30, which fails the validation with the following error:
`[BR-E-08]-In a VAT breakdown (BG-23) where the VAT category code (BT-118) is "Exempt from VAT" the VAT category taxable amount (BT-116) shall equal the sum of Invoice line net amounts (BT-131) minus the sum of Document level allowance amounts (BT-92) plus the sum of Document level charge amounts (BT-99) where the VAT category codes (BT-151, BT-95, BT-102) are "Exempt from VAT".`
**Cause:**
The use of decimal number in quantity generates a 0.01 rounding difference in the base amounts.
The extra cent is dispatched in one of the `<cbc:LineExtensionAmount>` node.
**Solution:**
There is no easy solution to handle these rounding cases. The solution used in this fix is to handle the extra cents as if they are cash rounding amount and declare them in `<cbc:PayableRoundingAmount>` node.
opw-5933545
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#255095
Forward-Port-Of: odoo/odoo#253625This update optimizes a key stock query that previously performed very slowly due to complex string comparisons. The change replaces these comparisons with a more efficient method of checking location ancestry using integer IDs, dramatically reducing query execution times, especially when dealing with large lists of locations. This improves overall system responsiveness and stability.
Original PR description
### Description of the issue/feature this PR addresses: Some stock queries determine whether a location belongs to the subtree of a set of locations by checking the parent_path prefix against…
### Description of the issue/feature this PR addresses:
Some stock queries determine whether a location belongs to the subtree of a set of locations by checking the parent_path prefix against candidate parent locations. This is done using a correlated EXISTS subquery with a LIKE parent.parent_path || '%' condition.
When the list of candidate locations becomes large (for example tens or hundreds of thousands of ids), this approach causes extremely poor performance because the database must repeatedly compare hierarchical path strings for every candidate row.
This PR improves the performance of this ancestry check by replacing the string prefix comparison with a direct check on the ancestor ids contained in parent_path.
### Current behavior before PR:
The query determines whether a location belongs to the subtree of one of the provided locations using:
location.parent_path LIKE parent.parent_path || '%'
For each row, PostgreSQL must evaluate a correlated subquery against all candidate parent locations. Because this relies on string prefix comparisons on parent_path, when the location list is large, this results in extremely slow queries.
### Desired behavior after PR is merged:
Instead of performing string prefix comparisons, the query extracts the ancestor ids directly from parent_path.
The path is:
1. Trimmed to remove leading and trailing /
2. Split into an array of ancestor ids
3. Expanded using unnest
4. Checked for intersection with the provided location ids
This converts the ancestry check from repeated string comparisons into a simple integer membership check.
### Benchmarks
Comparing performance of old subquery:
```
SELECT stock_location_inner.id
FROM stock_location AS stock_location_inner
WHERE EXISTS (
SELECT 1
FROM stock_location parent
WHERE parent.id IN (long list)
AND stock_location_inner.parent_path LIKE parent.parent_path || '%%'
);
```
to new one:
```
SELECT stock_location_inner.id
FROM stock_location AS stock_location_inner
WHERE EXISTS (
SELECT 1
FROM unnest(
string_to_array(trim(both '/' FROM stock_location_inner.parent_path), '/')::int[]
) AS path_id(id)
WHERE path_id.id IN (long list)
);
```
Depending on the number of elements in 'long list'
| # of elements | Before | After |
| --- |---|---|
| 130,000 | 21min | 0.8sec |
| 10,000 | 95sec | 0.5sec |
| 1,000 | 10.5sec | 0.5sec |
In practice, on the reference ticket this causes the "Validate" button on a stock picking to go from timing out to taking 8 seconds.
### Reference
opw-5932436
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#254245This update resolves a problem where invoice lines were not appearing correctly when certain tax modules (l10n_in and l10n_ar) were installed. The change ensures that invoice lines are created and managed through the correct Odoo data structure, preventing conflicting entries and ensuring accurate reporting.
Original PR description
Create the invoice line through the `invoice_line_ids` o2m write command instead of a standalone `account.move.line` create with move_id. The mock server's `inverse_fname_by_model_name` mapping only keeps one o2m per co-model; when extra modules add another o2m with the same inverse (`l10n_in_withholding_line_ids` from l10n_in, `l10n_ar_withholding_ids` from l10n_ar_withholding), it shadows `invoice_line_ids` and the list renders empty. runbot-233670 Forward-Port-Of: odoo/odoo#255188
14 changes
Resolved issues and error corrections
This update resolves an issue where dropship orders weren't accurately reflecting delivered quantities. The fix adjusts how the system tracks moves during dropship transactions, ensuring the correct quantity is displayed on sale order lines. This ensures accurate order fulfillment reporting.
Original PR description
**Steps to reproduce:** - Make sure you have 3 companies (comp A, B and C) - Navigate to Settings/Users & Companies/ Companies - for each company in the 'Inter Company Transactions' tab: check…
**Steps to reproduce:** - Make sure you have 3 companies (comp A, B and C) - Navigate to Settings/Users & Companies/ Companies - for each company in the 'Inter Company Transactions' tab: check 'generate Sale Orders', 'generate purchase orders' and 'synchronize Deliveries to your receipts' then select a warehouse and a receipt operation type From company A - create a storable product - in the Purchase tab, set the company B as a vendor From company B - in the Purchase tab of the product, set company C as a vendor From company C - set a positive on hand quantity From Company A - create a SO for 1 quantity of your product - on the sale order line, unhide de route_id column and set it to dropship - confirm the SO and the linked PO From company B - on the SO created with company A as customer (you might need to remove the 'my quotations filter to find it), set the dropship route in the route_id column of the sale order line - confirm the SO and the linked PO From company C - confirm SO created with company B as customer - validate the delivery From company B - validate the dropship **Current behavior:** the quantity delivered on the sale order line is 0 **Expected behavior:** it should be 1 **Cause of the issue:** inside _compute_qty_delivered, we fetch the incoming and outgoing moves using _get_outgoing_incoming_moves() https://github.com/odoo/odoo/blob/b936b64ed0217909ff96a1b28d1370f5064be46a/addons/sale_stock/models/sale_order_line.py#L200 There, for the move of the dropship picking, inside the if condition, move._is_dropshipped_returned() will be True https://github.com/odoo/odoo/blob/b936b64ed0217909ff96a1b28d1370f5064be46a/addons/sale_stock/models/sale_order_line.py#L348-L354 That's because the move is going from transit to transit https://github.com/odoo/odoo/blob/b936b64ed0217909ff96a1b28d1370f5064be46a/addons/stock_account/models/stock_move.py#L186-L195 So it will not be added to the outgoing moves and qty_delivered will stay 0. **fix** is_dropshipped_returned should not prevent the move to be added to the outgoing moves if is_dropshipped() is aslo true (i.e. it's a transit to transit move) opw-5023215
This update fixes an issue where archived channels were not searchable, leading to access problems. Now, users can perform actions on all channels, including those that have been archived, improving channel management and usability. This resolves a previous error impacting channel access.
This update fixes an issue where chatbot restart messages were incorrectly included in new ticket or lead descriptions. Now, only messages exchanged after the chatbot is restarted are accurately reflected, ensuring a cleaner and more reliable record of conversations. This improves the clarity and usability of customer support tickets.
Original PR description
Before this commit: When a chatbot conversation is restarted and the script creates a new ticket/lead, the description also includes messages from the previous session. After this commit: Only the messages sent after the chatbot conversation is restarted are included in the ticket/lead description. Task-5118966 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where formatted notes in customer records within the Point of Sale module were not being displayed correctly. The fix ensures the necessary HTML editor runtime is included in the POS asset bundle, allowing users to properly edit and view formatted notes in the Customer Edit Details dialog. This enhances the user experience for managing customer information within Point of Sale.
Original PR description
Ensure the POS asset bundle includes the html editor runtime (and DOMPurify) so partner Internal Notes are rendered/edited correctly in the Edit Details dialog. Steps to reproduce: ------------------- * Install only Point of Sale on a fresh DB (community setup). * Add a formatted note in a customer Internal Notes field. * Open POS -> Customer -> Edit Details -> Internal Notes. > Observation: note is shown as raw HTML / fallback textarea instead of rendered HTML. Why the fix: ------------ `point_of_sale.assets_prod` did not include the html editor runtime. Adding html editor to that bundle restores proper HTML rendering/editing. Test note: ---------- No automated test added: the issue depends on runtime asset loading and it differs in POS vs backend/test environment opw-5938168
This update resolves a previous issue where different addons could overwrite each other's translations for the same term, leading to inconsistent language displays. The fix ensures that translations are correctly prioritized based on the addon that's currently being used, providing a more reliable and accurate user experience. This improves the overall quality and consistency of the Odoo web interface.
Original PR description
When multiple addons provide different translations for the same term (e.g. "Table" → "Mesa" in pos_restaurant vs "Tabla" in web_editor), the last-loaded module would silently overwrite the others.
Fix by storing scoped keys ("addon\x04term") in translatedTerms for any module that conflicts with a previously loaded one. The module loader now intercepts require("@web/core/l10n/translation") and returns a module-bound _t via createModuleT(addon), so every JS import of _t resolves translations against the importing addon's scope — including calls inside method bodies, not just at module init time. OWL templates continue to resolve via this.templateName in the CodeGenerator, which takes precedence inside createModuleT.
opw-5970092
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update corrects a bug where manual Stripe payments (SEPA Direct Debit) were immediately canceled despite transactions remaining in 'Pending' status. This prevented subscriptions from correctly reflecting payments and risked automatic closures after 90 days. The fix ensures payments remain in the correct 'Pending' state until Stripe confirms the transaction.
Original PR description
**Problem:** When manually registering a payment using a Stripe SEPA Direct Debit token, the associated `account.payment` is immediately canceled, even though the Stripe transaction is in "Pending"…
**Problem:** When manually registering a payment using a Stripe SEPA Direct Debit token, the associated `account.payment` is immediately canceled, even though the Stripe transaction is in "Pending" status. Later, when Stripe confirms the transaction, the payment remains canceled, leading to subscription closures after 90 days of apparent non-payment. **Steps to reproduce:** 1) Set a customer address to Belgium and add a SEPA Direct Debit payment token via Stripe. 2) Change the company currency to euro. 4) Create a manual invoice for that customer. 5) Pay the invoice using the pre-configured Stripe SEPA token. 6) Observe the `account.payment` is immediately canceled despite the transaction being "Pending". 7) When Stripe confirms the transaction, the payment stays canceled. **Cause:** In `account_payment.action_post()`, after sending the payment request, all payments whose transaction state was not `done` were canceled. For asynchronous payment methods like SEPA Direct Debit, the transaction starts in `pending` (not `done`), so the payment was wrongly canceled. **Solution:** - Only cancel payments whose transaction ended in a failure state (not in `done`, `pending`, or `authorized`), so pending/authorized payments stay in draft/in_process. opw-5934381 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update ensures the sale dashboard accurately displays all completed POS orders, regardless of their status. Previously, orders with statuses like 'done' were not visible. This change corrects a discrepancy in how the dashboard processes order status information, providing a more complete view of sales data.
Original PR description
Step to reproduce: - install spreadsheet_dashboard_sale and pos_sale - create a order in pos , invoice it too - open sale dashboard Observation: - the order fulfilled in pos, does not reflect in…
Step to reproduce: - install spreadsheet_dashboard_sale and pos_sale - create a order in pos , invoice it too - open sale dashboard Observation: - the order fulfilled in pos, does not reflect in dashboard Cause: - sale has 4 status i.e ["draft", "sent", "sale", "cancel"] - when pos_sale is installed, new status oders are added i.e ['paid', 'invoiced', 'done'] - sale dashboard pivot relies on sale defined status only, which so not consider orders that have status in ['paid', 'invoiced', 'done'] Fix: - fix the domain of pivots such that, it will now accept other orders too **Before:** <img width="1058" height="277" alt="image" src="https://github.com/user-attachments/assets/e58c88fa-5ad3-4194-9f9c-ddf41f2f73de" /> <img width="1116" height="190" alt="image" src="https://github.com/user-attachments/assets/259e0347-5d5b-4d5c-9aeb-74102aa4becd" /> <br/> **After** <br/> <img width="1137" height="232" alt="image" src="https://github.com/user-attachments/assets/406b71a5-1dd8-4164-9d4e-4f0bca34c9e8" /> <img width="1125" height="235" alt="image" src="https://github.com/user-attachments/assets/fded3203-7d72-45ea-b5aa-142ebcd52136" /> opw-5487654 --- 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 users could inadvertently assign inherited views to groups, leading to validation errors during module upgrades. The change adds a safeguard to prevent this, ensuring groups are defined correctly within the view XML, improving stability and reducing user confusion.
Original PR description
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the…
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the Views section. - Upgrade the module. **Issue:** - Odoo already prevents assigning groups directly on inherited view records in ir.ui.view. However, it is still possible to indirectly assign groups to inherited views through res.groups via the view_access relation. - This creates entries in ir_ui_view_group_rel and can trigger a ValidationError during module upgrades. As a result, users may unknowingly create invalid group-view relations, leading to errors and confusion. **Solution:** - Add a validation constraint on res.groups to prevent linking groups to inherited views via the view_access relation. - Raise a ValidationError when such an assignment is attempted, with the message: "Groups should instead be defined using the 'groups' attribute inside the view XML definition." This ensures that inherited views cannot be assigned to groups, avoiding invalid configurations and preventing errors during module upgrades. **opw-6015526** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254849
This update resolves an issue where invoices with recupel taxes applied to negative lines were failing XML validation, specifically when using the Peppol standard. The fix ensures negative fixed taxes are correctly identified as allowances, preventing validation errors and enabling proper invoice export for PEPPOL transactions.
Original PR description
**PROBLEM** If you set a recupel tax (fixed tax affecting base) and use it on a negative line, the generate xml will not pass validation. **STEP TO REPRODUCE** 1. Setup Peppol. 2. Create a recupel tax (fixed tax of 1€, affecting the base). 3. Create an invoice with a negative line, with a VAT and the recupel tax. 4. Send the invoice using peppol, and validate the xml. 5. Notice the xml doesn't pass validation. **CAUSES** 1. The negative fixed tax should be an allowance, but is marked as a charge in the xml. 2. Only fixed taxes that are charges influences the line_extension_amount, but it should also be the case with negative fixed taxes. 3. Negative fixed taxes should have a ChargeAllowanceReasonCode that is in the AllowanceReasonCode list. opw-5955289 Forward-Port-Of: odoo/odoo#253657 Forward-Port-Of: odoo/odoo#252716
This update resolves an issue where invoice cancellations were causing database blocks due to a mismatch in status between Odoo and the ticketBAI system. The fix checks for a security hash before sending invoices to ticketBAI, preventing the attempted reset to draft that triggered the error. This ensures invoices can be correctly processed and avoids disruptions.
Original PR description
Before this commit, if the user configured the sales journal to be locked by a hash, then a cancellation in ticketbai would 1/ send the cancel request to ticketBAI. This would be processed…
Before this commit, if the user configured the sales journal to be locked by a hash, then a cancellation in ticketbai would 1/ send the cancel request to ticketBAI. This would be processed successfully 2/ try to reset the invoice to draft inside of Odoo, then cancel it. This would fail with an error since account moves protected by a hash cannot be reset to draft. The result is a blocked database where the invoice cannot be altered in Odoo while its status doesn't match the status in ticketBAI. In this commit, we propose to check for the secure hash before sending the invoice over to ticketBAI. The invoice is not altered yet at that stage to account for potential ticketBAI errors in the normal flow. While this option is not great from a usability perspective (preventing secure hashes with ticketBAI is probably best), we believe the current solution offers the best compromise in the context of a bugfix. The issue does not seem to be reproducible outside of production as the core of the problem is a mismatch in state between ticketBAIand Odoo. opw-5912848
This update simplifies how packaging quantities are calculated on sale order lines. Previously, changing the packaging quantity triggered unintended calculations, leading to inconsistent results. Now, users can directly choose their packaging and quantity, ensuring accurate order fulfillment and reducing potential errors.
Original PR description
Setup: A product with a packaging of 1 unit and a box of 4 units Usecase1: - Add a line (by default it suggest the 1 unit packaging) - Increase the quantity to 4 (it remains on unit packaging) - Increase it to 5 It switch the packaging to Box of 4 and the quantity to 20. Usecase2: - Add a line of 1 unit - Swith the packaging to box (the packaging quantity switch to 0.25) - Set the packaging quantity to 4 (I want 4 boxes) It switch everything back to unit. We had to choose between: - The packaging is computed base on the quantity to delivery in order to suggest a packaging or - The user choose the packaging and the quantity of packaging to drive the quantity to deliver. This commit modify the behavior, in order to let the user choose its packaging and drive the quantity to deliver base on that. opw-6019088
This update fixes an issue where kit products were incorrectly reporting the full sales price of each component in delivery DDTs. Previously, the report didn't account for kits, leading to inflated values. Now, the report accurately reflects the value of each component within the kit.
Original PR description
Steps to reproduce: - Have an IT company setup - Create a product with a Sales Price and define a kit BOM with 2 components - Create SO with product - Confirm, go to delivery, validate - Print Issue: In the delivery DDT, there is a summary of the delivery where each item has its own entry (product, quantity, value). However, in case of kit BOM, each component is reported with the full value of the sale operation. Analysis: This occurs because in the report code we don't consider the possibility of kit products, where multiple components are associated to the same sale line. Ticket [link](https://www.odoo.com/odoo/project.task/5013606) opw-5013606 Forward-Port-Of: odoo/odoo#224103
This update fixes a potential issue where users could inadvertently create incorrect group assignments within Odoo's view settings. The change prevents assigning inherited views to groups through a specific database link, ensuring data integrity and preventing upgrade-related errors. This improves stability and reduces confusion for users.
Original PR description
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the…
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the Views section. - Upgrade the module. **Issue:** - Odoo already prevents assigning groups directly on inherited view records in ir.ui.view. However, it is still possible to indirectly assign groups to inherited views through res.groups via the view_access relation. - This creates entries in ir_ui_view_group_rel and can trigger a ValidationError during module upgrades. As a result, users may unknowingly create invalid group-view relations, leading to errors and confusion. **Solution:** - Add a validation constraint on res.groups to prevent linking groups to inherited views via the view_access relation. - Raise a ValidationError when such an assignment is attempted, with the message: "Groups should instead be defined using the 'groups' attribute inside the view XML definition." This ensures that inherited views cannot be assigned to groups, avoiding invalid configurations and preventing errors during module upgrades. **opw-6015526** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#254849
This update resolves a problem where strict email servers rejected Odoo emails due to folded Subject headers. We've extended our system to prevent folding, ensuring emails are properly delivered and avoiding errors. This aligns with best practices for reliable email communication.
Original PR description
…r rejections Yahoo and other strict mail servers reject emails with folded Subject headers containing RFC 2047 encoded-words when the folding occurs at inappropriate positions, resulting in "554…
…r rejections Yahoo and other strict mail servers reject emails with folded Subject headers containing RFC 2047 encoded-words when the folding occurs at inappropriate positions, resulting in "554 Invalid Subject header" errors. The root cause is in Python's stdlib (bpo-144156). In an ideal world we would be fixing the issue there, but experience tells us that they are very slow to fix bugs / merge PRs in the email module, and even when they do they usually don't backport the fixes in the python versions we use. This commit extends the existing IdentificationFieldsNoFoldPolicy to also prevent Subject header folding, keeping long subjects on a single line (up to 998 characters per RFC 5322 "MUST" requirement, from the 98 "SHOULD" limit). Since at it, include the other "user defined" smtp headers: to, from, ... The solution follows the same pattern already established for identification headers (Message-ID, In-Reply-To, References) where Odoo prevents folding to avoid MTAs rewriting these critical headers and breaking email threading. closes odoo/odoo#250388 See-also: #243119 Backport: #247057 Forward-Port-Of: odoo/odoo#254670
8 changes
Resolved issues and error corrections
This update resolves a problem where strict email servers rejected Odoo emails due to improperly folded subject headers. By preventing folding and adhering to RFC standards, Odoo ensures compatibility with a wider range of email systems, improving email delivery reliability. This change aligns with best practices for email communication.
Original PR description
…r rejections Yahoo and other strict mail servers reject emails with folded Subject headers containing RFC 2047 encoded-words when the folding occurs at inappropriate positions, resulting in "554…
…r rejections Yahoo and other strict mail servers reject emails with folded Subject headers containing RFC 2047 encoded-words when the folding occurs at inappropriate positions, resulting in "554 Invalid Subject header" errors. The root cause is in Python's stdlib (bpo-144156). In an ideal world we would be fixing the issue there, but experience tells us that they are very slow to fix bugs / merge PRs in the email module, and even when they do they usually don't backport the fixes in the python versions we use. This commit extends the existing IdentificationFieldsNoFoldPolicy to also prevent Subject header folding, keeping long subjects on a single line (up to 998 characters per RFC 5322 "MUST" requirement, from the 98 "SHOULD" limit). Since at it, include the other "user defined" smtp headers: to, from, ... The solution follows the same pattern already established for identification headers (Message-ID, In-Reply-To, References) where Odoo prevents folding to avoid MTAs rewriting these critical headers and breaking email threading. closes odoo/odoo#250388 See-also: #243119 Backport: #247057
This update fixes an issue where exchange differences weren't correctly recorded when receiving billed products with fluctuating exchange rates. Specifically, it ensures exchange difference journal entries appear in the correct account when a negative exchange rate applies after a bill has been created. This ensures accurate financial reporting.
Original PR description
Issue ----- When receiving product after having billed it already, if: - the product is valuated, - the purchase is in a foreign currency, - there is an underlying exchange diff between time of bill…
Issue
-----
When receiving product after having billed it already, if:
- the product is valuated,
- the purchase is in a foreign currency,
- there is an underlying exchange diff between time of bill and reception
- the diff exchange rate is negative
then the exchange difference account move will occur in the regular exchange account.
Steps to reproduce
-----
- Enable automatic (anglo-saxon) accounting & dropshipping
- Enable the EUR currency and add 2 exchange rates
- today with 2:1 (EUR:USD)
- yesterday with 1:2 (EUR:USD)
- Create a new AVCO product category
- costing method: AVCO
- valuation: automatic
- Create a new product
- type: storable
- category: AVCO
- purchase: 5€
- set dropship route
- Create and confirm a SO
- Confirm PO and validate delivery
- Create bill for the PO
- change bill date to before yesterday & confirm
> Journal entry created in "Exchange Difference" journal
Cause
-----
Thanks to commit 80ff2d2 the flow is well behaved if the new rate is higher (company currency worth more comparatively) because we use the credit aml
https://github.com/odoo/odoo/blob/b57bb1decd46dcbb1fe602bb72b6f8e5382e9b28/addons/account/models/account_move_line.py#L2214-L2215
whose move has a svl
https://github.com/odoo/odoo/blob/b57bb1decd46dcbb1fe602bb72b6f8e5382e9b28/addons/stock_account/models/account_move.py#L335
This is not the case for the debit aml, so we end up using the default currency exchange account.
-----
Ticket:
opw-4797287This update fixes a potential issue where users could inadvertently create incorrect group-view relationships in Odoo. The change prevents assigning inherited views to groups directly, simplifying configuration and avoiding upgrade-related errors. This ensures data integrity and a smoother user experience.
Original PR description
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the…
**Steps to Reproduce:** - Create a new database. - Install any module (for example, Payroll). - Go to Settings → Technical → Security → Groups. - Open any group and assign an inherited view in the Views section. - Upgrade the module. **Issue:** - Odoo already prevents assigning groups directly on inherited view records in ir.ui.view. However, it is still possible to indirectly assign groups to inherited views through res.groups via the view_access relation. - This creates entries in ir_ui_view_group_rel and can trigger a ValidationError during module upgrades. As a result, users may unknowingly create invalid group-view relations, leading to errors and confusion. **Solution:** - Add a validation constraint on res.groups to prevent linking groups to inherited views via the view_access relation. - Raise a ValidationError when such an assignment is attempted, with the message: "Groups should instead be defined using the 'groups' attribute inside the view XML definition." This ensures that inherited views cannot be assigned to groups, avoiding invalid configurations and preventing errors during module upgrades. **opw-6015526** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug where changing the packaging quantity in a quotation unexpectedly altered the calculated product quantity and packaging amount. The fix removes a dependency causing incorrect calculations, ensuring packaging quantities update accurately when adjusting the main quantity.
Original PR description
**Behaviour:** When creating a sale order line for an item with multiple packagings, modifying the packaging quantity will trigger the computation of the product quantity which will trigger the…
**Behaviour:** When creating a sale order line for an item with multiple packagings, modifying the packaging quantity will trigger the computation of the product quantity which will trigger the computation for the packaging itself. This creates a dependency between the chosen package and the quantity selected which can end up triggering unexpected reactions when following specific flows. **Steps to reproduce:** - Enable packages for sales in configuration - Create a product, in the inventory tab, add two packages: Pack of one, and Pack of four and set corresponding unit. - Create a quotation and set the SO line to Quantity to one, this should set Packaging and Packaging Quantity to 1 aswell - Now change Packaging Quantity to 4, this should visually only change the Quantity to 4 - Now if you change Quantity to 5, you should see Packaging switch to packs of 4 and Quantity jump to 20. This is caused because when in` _compute_product_uom_qty` we try to get the `product_packaging_id` which in turn triggers `_compute_product_packaging_id `before completing the previous compute. https://github.com/odoo/odoo/blob/cf9805874722b6729b5301fdea4f107ae221a1d2/addons/sale/models/sale_order_line.py#L397-L411 When we change the packaging_qty to 4, the packaging_id doesnt change as the compute is triggered before assigning 4 to the uom_qty. But when we change packaging_qty to 5, the packaging_id changes to packs of 4 as the compute is triggered before the uom_qty should go to 5 which then results in the uom_qty switching to 20. The solution removes the dependency between package_id and qty.
This update resolves an issue preventing the export of self-billing invoices when using the Factur-X (CII) electronic invoicing format. The fix addresses a missing function within the invoicing process, allowing users to correctly generate self-billing invoices for Factur-X invoices. This ensures seamless integration with Peppol Self-Billing.
Original PR description
# How to reproduce - Install the Peppol Self-Billing module (account_peppol_selfbilling) - Go to any contact - In the accounting tab, set the Electroing Invoicing to "Factur-X (CII)" - Try to access…
# How to reproduce
- Install the Peppol Self-Billing module (account_peppol_selfbilling)
- Go to any contact
- In the accounting tab, set the Electroing Invoicing to "Factur-X (CII)"
- Try to access any Vendor Bill
# The problem
A traceback is shown
# Why
This commit (https://github.com/odoo/odoo/commit/c696a11ee735b0689ef6a00f1a189916724d4854) backported the peppol self-billing feature.
When the user try to access a Vendor Bill, this check is run :
```py
def _is_exportable_as_self_invoice(self):
return (
self.state == 'posted'
and self.is_purchase_document()
and self.commercial_partner_id.ubl_cii_format
and (edi_builder := self.commercial_partner_id._get_edi_builder()) is not None
and edi_builder._can_export_selfbilling()
and self.journal_id.is_self_billing
)
```
In the case of Factur-X invoicing (account.edi.xml.cii), ```_can_export_selfbilling()```is not defined.
opw-6022938
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update fixes an issue where leave hours weren't accurately calculated when employees used calendars with multiple defined dates and times. Previously, the system didn't properly interpret complex calendar schedules, leading to incorrect leave start and end times. This change ensures that leave hours align precisely with the defined calendar events, providing accurate leave tracking.
Original PR description
Define the correct hours in the leaves if the calendar has defined dates (`date_from` and `date_to`) Use case example: - Create a calendar and define on Friday (Morning: from 08:00 to 13.00,…
Define the correct hours in the leaves if the calendar has defined dates (`date_from` and `date_to`) Use case example: - Create a calendar and define on Friday (Morning: from 08:00 to 13.00, Afternoon: from 19:00 to 21:00) with date_to=2025-01-01. - Define another specific Friday (Morning: from 09:00 to 14.00, Afternoon: from 17:00 to 20:00) in the same calendar with date_from=2025-01-01. - Create an employee and define the calendar created for him/her. - Create a leaves for the employee and select a Friday (2025-05-02). - The start hour of the leave must be 2025-05-02 09:00:00 - The end hour of the leave must be 2025-05-02 20:00:00   Please @pedrobaeza can you review it? @Tecnativa TT56218 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208378
This update ensures that attachment files are always linked to a financial transaction simultaneously. Previously, updating the transaction details and attaching a file could lead to inconsistencies. This change guarantees data integrity and prevents errors when sending RS EDI documents.
Original PR description
Was committing the move fields update, then updating the attachment. This might create an issue were the move update commits successfully, but setting the attachment fails and we end up with an inconsistency. Set attachment in the same transaction as the move update. task-6035727 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a problem where users received an incorrect error message when testing their outgoing mail server connection. The change ensures users see the correct error message, improving the overall user experience and preventing confusion. This resolves a minor usability issue.
Original PR description
Current behavior before PR: Wrong error message when clicking the button Test Connection of Outgoing MailServer. Desired behavior after PR is merged: Correct error message. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr