Wednesday, April 15, 2026
36 changes · saas-19.1
Resolved issues and error corrections
This update corrects a minor issue in the Batch Payment report. Previously, the report would incorrectly display placeholder text ('ABC Holder Name' and 'Demo Ref') when the Account Holder Name field was left blank. This change ensures the report accurately reflects the payment details, providing a cleaner and more professional output.
Original PR description
**Steps to reproduce:**
- Install the `account_batch_payment` module.
- Navigate to Invoicing > Customers > Payments.
- Create a new payment with `Payment Type: Send` and
select a customer without setting an `Account Holder Name`.
- Create a batch payment including this payment.
- From the gear icon, click `Print Batch Payment`.
**Observation:**
In the generated report:
- `Account Holder Name` shows `ABC Holder Name`.
- `Memo` shows `Demo Ref`.
**Root Cause:**
At [1], the default demo values ("ABC Holder Name", "Demo Ref") are rendered
when the fields are empty, instead of being left blank.
**Fix:**
This commit ensures that the `Account Holder Name` and `Memo` are `blank`
in the printed Batch Payment report when their values are not set.
[1]:
https://github.com/odoo/enterprise/blob/327d4478128f33fb2e0c477533bd4983178abf17/account_batch_payment/report/account_batch_payment_report_templates.xml#L36-L38
opw-6092595
Forward-Port-Of: odoo/enterprise#113515A recent change in the sign request process caused a technical error that prevented users from accessing sign requests. This fix ensures that the system correctly checks for the existence of sign items before attempting to compare their types, resolving the underlying issue. This improves the reliability of the sign request functionality.
Original PR description
This issue occurs because, in the recent [commit], `sign_request` was changed to `sign_item`, but the `sign_item.exists()` check is performed after the type comparison, resulting in a `TypeError`.…
This issue occurs because, in the recent [commit], `sign_request` was changed to `sign_item`, but the `sign_item.exists()` check is performed after the type comparison, resulting in a `TypeError`.
Traceback:
```py
File "/home/odoo/src/odoo/saas-19.2/odoo/addons/base/models/ir_http.py", line 415, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/src/odoo/saas-19.2/odoo/http/routing_map.py", line 207, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/src/enterprise/saas-19.2/sign/controllers/main.py", line 708, in get_sign_request_items
if not sign_request.exists() or not consteq(sign_item.access_token, token) or not sign_item.exists() or not sign_item.signer_email:
TypeError: unsupported operand types(s) or combination of types: 'bool' and 'str'
```
Solution:
We first perform the existence check and then compare the types.
[commit]: https://github.com/odoo/enterprise/pull/111786/changes/f40082f4e6f50dccbfa639edbef08428868cb31d
sentry-7376866293
Forward-Port-Of: odoo/enterprise#112659This update corrects a bug in how Odoo calculates depreciation for companies with non-standard fiscal years (e.g., May-December). The fix ensures that depreciation entries are correctly generated for all months, regardless of the company's fiscal year start date, preventing missed accounting periods.
Original PR description
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next…
When a company has a shortened fiscal year defined via account.fiscal.year (e.g. May-December), the depreciation board computation for degressive assets incorrectly computes the start of the next fiscal year using `date_from + 1 year` instead of querying the actual next fiscal year. This causes entries for the months between the wrong and correct FY start (e.g. January-April) to be skipped entirely. Step to reproduce: - Create a company with a fiscal year starting in May (e.g. May 1st 2025 to 31st December 2025) - Create an asset with a start date in the 1 December 2025, with a 24 months duration and degressive method - Compute the board and observe that entries from January to April 2026 are missing Fix the FY boundary detection in _recompute_board to query the fiscal year containing the day after the current period end, revert the effective_start_date logic in _compute_board_amount that was masking the root cause, and move the prorata date clamping to _create_move_before_date where it is needed for disposal. opw-6016834 Forward-Port-Of: odoo/enterprise#113521
This update resolves a test failure related to inter-company stock transfers. The test required demo data to function correctly, which is no longer present. This change ensures the test runs reliably in a production environment without relying on the demo database.
Original PR description
*: sale_purchase_stock_inter_company_rules ### Steps to reproduce: - Create a DB without demo data - Install stock_dropshipping, sale_purchase_stock_inter_company_rules - Run the test `test_08_dropship_inter_company_vendor_to_customer` ### Issue: The test `test_08_dropship_inter_company_vendor_to_customer` fails here: https://github.com/odoo/enterprise/blob/fd3c9d894d8821ed1d1a110cdffb5e16fb54590a/sale_purchase_stock_inter_company_rules/tests/test_inter_company_po_to_so.py#L497-L501 since the `lot_ids` are only visible for users with the `stock.group_production_lot` group: https://github.com/odoo/odoo/blob/544961c1c6db254c4292d88096bdf9363e35f0bc/addons/stock/views/stock_picking_views.xml#L310-L318 And this group is only implied with demo data: https://github.com/odoo/odoo/blob/544961c1c6db254c4292d88096bdf9363e35f0bc/addons/stock/data/stock_demo.xml#L190-L193 opw-6085811 Forward-Port-Of: odoo/enterprise#113120
This update fixes a calculation error in the employment bonus payments processed for Belgian employees. The change ensures that the bonus calculations now fully comply with specific requirements outlined by Belgian social security regulations, as detailed in the provided documentation. This correction improves accuracy and compliance with local laws.
Original PR description
The employment bonus computation was missing two roundings steps that are explicitely asked for in the following documentation: https://www.socialsecurity.be/employer/instructions/dmfa/fr/latest/instructions/deductions/workers_reductions/workbonus.html Forward-Port-Of: odoo/enterprise#113776
This update simplifies the user interface by standardizing the term 'Audit Report' to 'Annual Report'. Previously, the inconsistent use of both terms created confusion for users. This change improves clarity and ease of use within the accounting module.
Original PR description
The user interface currently uses both the terms "Audit Report" and "Annual Report", which can be confusing for users. To eliminate this confusion, "Audit Report" will be renamed to "Annual Report". backport of https://github.com/odoo/enterprise/commit/c2fc5a1643f2e005007437f7ae655d2329ac49ad [feeback-6088379](https://www.odoo.com/odoo/project.task/6088379) Forward-Port-Of: odoo/enterprise#112989
This update fixes an issue where subscription invoices were being incorrectly set to a future date due to upsell orders. The change prevents the calculation from considering upsell order lines, ensuring accurate and timely invoice generation. This improves billing accuracy and reduces potential invoicing delays.
Original PR description
When we compute the next invoice date of a subscription, we are checking all account move lines of the invoices linked to the subscription. But if we have an upsell with a deffered date higher than the next invoice date that should be calculated, it will set a too high next invoice date. To avoid this issue, we don't take into account the invoice lines linked to upsell to compute the next invoice date
This update resolves an issue preventing Point of Sale (PoS) users from accessing the ‘sinvoice’ symbol within the Odoo system. By granting the necessary access rights, this change ensures PoS users can utilize this feature, improving operational efficiency. This fix was implemented as part of a larger effort to enhance functionality for retail operations.
Original PR description
Add access right for sinvoice symbol so that PoS user can access to it. Forward-Port-Of: odoo/odoo#259045
This update fixes an issue where kit products were incorrectly included in stock valuation calculations. Previously, the total cost of a kit was added to its components, resulting in inflated inventory values. The fix ensures that only the individual components of a kit are valued, providing accurate inventory reporting.
Original PR description
Currently, when a user creates a kit, the price of the kit itself is included in stock valuation. ## Steps to produce: * Install `mrp_account` without demo data. * Create a product with inventory…
Currently, when a user creates a kit, the price of the kit itself is included in stock valuation. ## Steps to produce: * Install `mrp_account` without demo data. * Create a product with inventory tracking enabled. * Create a BoM of type kit for that product. * Add component products with a defined cost and on-hand quantity greater than 0 to the BoM. * Recompute the kit product’s cost from its BoM on the product page. * Go to Inventory > Reporting > Stock. ## Observed Behavior: The cost of the kit is currently being included in the stock valuation. For example, consider a kit product called **“Computer”** that is composed of the following components: | Product | Quantity | Cost | |--------|--------|--------| | CPU | 1 | $300 | | Motherboard | 1 | $300 | The total cost of the Computer kit is therefore $600. Since the Computer is made up of the CPU and Motherboard, the total inventory value should be $600. However, the system is currently calculating the total inventory value as $1,200 , which is incorrect because it is counting both the kit and its components. ## Root cause: This behavior started after the refactor in [1], where the `_compute_value_svl` function was replaced by the `compute_value` function to calculate both average and total value for inventory valuation. With this change, the new compute function in [2] now also includes kit products when calculating inventory valuation based on their costing method. In earlier versions, this did not occur because `_compute_value_svl` depended on valuation layer groups. Kit products were excluded at [3] through the `_get_valuation_layer_groups()` call, as illustrated in image [4]. [2]- https://github.com/odoo/odoo/blob/1b9937a702fbeb47cd6d42d8119cead5828fd3fe/addons/stock_account/models/product.py#L139-L169 [3]- https://github.com/odoo/odoo/blob/a9d2e54201173d1d2d5ab97de0904d63a4b6b82b/addons/stock_account/models/product.py#L284 ## Solution: To ensure correct total inventory valuation, kit products should be excluded from valuation and only their individual components should be calculated. This can be achieved by modifying the domains used in 'action_product_stock_view` and `_get_accounts_by_product` to exclude the kits so that the kit products get filtered out, allowing the report to consider only its components. **Before:** <img width="1857" height="938" alt="image" src="https://github.com/user-attachments/assets/bbd4eb94-ba1a-429a-a61c-afbe33729ac0" /> **After:** <img width="1915" height="883" alt="image" src="https://github.com/user-attachments/assets/c93d55c8-8197-4e57-9f87-b2159fe67d87" /> [1]: https://github.com/odoo/odoo/pull/222169/commits/6e694b79b8892d693117f6c79df1a2d3a4759f4f [4]: https://drive.google.com/file/d/1g4BzGscCW2K0rf5iDKrq-psYRlKhYkDP/view?usp=sharing opw-5462515 Forward-Port-Of: odoo/odoo#244030
This update resolves a visual bug where the HTML editor incorrectly applied a gradient background when using solid text colors. The fix ensures that gradients are properly removed regardless of how the text color is applied (inline style or class), resulting in consistent and accurate text display.
Original PR description
Steps to reproduce: - Go to a To-do note - Select a word - Apply a gradient as the text color - Re-open the color picker - From the Solid tab, select the primary color (o-color-1) Description of the issue: - The gradient is not removed and ends up being displayed as a background color Cause: - In the `colorElement` method, the gradient is removed when applying a text color via inline styles. However, when applying a color via class (e.g., text-*), the gradient is not properly cleared. Only the text-gradient class is replaced, while the gradient style remains, causing it to appear as a background color. Solution: Ensure the gradient is removed in both cases: - when applying a color via class and when applying a color via inline styles in `colorElement`. task-6045533 Forward-Port-Of: odoo/odoo#257045 Forward-Port-Of: odoo/odoo#254654
This update fixes a potential issue where website tours could incorrectly proceed if the chat feature was temporarily empty. The change implements a more reliable check to ensure the chat is truly empty before the tour continues, enhancing the overall user experience. This ensures tours run smoothly and consistently.
Original PR description
The previous negative assertion could pass prematurely during fast tour execution. Switching to a specific text based assertion ensures the step only proceeds once the empty conversation is explicitly confirmed. Forward-Port-Of: odoo/odoo#258921
This update fixes an issue where icons were removed when creating links from selections within the HTML editor. The change ensures icons are treated like images during link creation, maintaining their appearance in the final linked content. This improves the user experience and consistency of the HTML editor.
Original PR description
Problem: When a selection contains both text and an icon, creating a link removes the icon from the content. Cause: Icons should be treated the same way as images during link creation. If an icon is present in the selection but not handled like an image, it gets removed when the link is applied. Solution: Handle icons in the same way as images when processing selections for link creation, ensuring they are preserved. Steps to reproduce: - Add text "abc" followed by an icon. - Select both the text and the icon. - Create a link. - Observe that the icon is removed and only the text remains. opw-6066195 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256631 Forward-Port-Of: odoo/odoo#256002
This update corrects a reporting issue where employee leave balances incorrectly displayed outdated department information. The fix ensures that leave balances always reflect the employee's current department, preventing duplicate entries in reports and providing accurate data for management. This improves the reliability of our time-off reporting.
Original PR description
Steps to reproduce: ------------------------- 1. Install the Time Off module. 2. Go to Time Off > Management > Allocations, create an allocation for an employee, and approve it. 3. Go to Reporting >…
Steps to reproduce: ------------------------- 1. Install the Time Off module. 2. Go to Time Off > Management > Allocations, create an allocation for an employee, and approve it. 3. Go to Reporting > Balance and apply the filter Department > Employee. 4. Change the employee’s department. 5. Create an allocation for the same employee and approve. 6. Apply the Department > Employee filter again. Observed behaviour: ---------------------------- After a department change: * Existing allocations keep the old department * New allocations use the new department As a result, duplicate employee entries appear in the report Cause: ---------- It is using allocation.department_id. Allocations store the department at creation time, which may differ from the employee’s current department, causing an incorrect report filtering. Solution: ------------ Fetch department_id from hr_version instead of hr_leave_allocation in the hr_leave_employee_type_report. This ensures: * Leave balances always follow the employee’s current department * Correct aggregation when grouping by Department → Employee opw-5220577 Before: <img width="1238" height="857" alt="image" src="https://github.com/user-attachments/assets/15e1293b-dc50-4067-a12f-079c046c2074" /> After: <img width="1247" height="824" alt="image" src="https://github.com/user-attachments/assets/feea32de-0d9c-4eef-9ae5-639f4658560c" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#258562
This update fixes an issue where employees with past department assignments were incorrectly appearing in holiday reports. The change now only considers current department assignments, ensuring more accurate reporting of employee holiday availability. This improves the reliability of time-off data.
Original PR description
Reproduce the issue: - Create an employee linked to a user with department A - Create a second employee with 2 versions: - a past one with department A - a current one with department B - create a leave for both employees - go to Time Off > Overview, keep the group by employee and select the filter "My department" - both employee appear Before this commit, the search on "member_of_department" was looking for all versions with a similar department (same or child of) regardless of the version validity. This commit limits that search to current versions only task-6076014
This update fixes a visual issue on the self-order combo screen where product images were being distorted. We've adjusted the image styling to ensure all images, regardless of their aspect ratio, display correctly and consistently. This improves the overall user experience and presentation of products on this screen.
Original PR description
Before this commit, the product image shown in the header of the combo screen in the self order interface was squished to fit the container, resulting in distortion for non-square images. After this commit, we add the `object-fit: cover` style to match the how the images are displayed elsewhere in self order. Before the change: <img width="595" height="536" alt="image" src="https://github.com/user-attachments/assets/fb90167c-8c28-46c9-9ab5-3ac472299c67" /> After the change: <img width="597" height="538" alt="image" src="https://github.com/user-attachments/assets/44d5c5a6-037b-46e2-8a28-5ef9df4d5e58" /> Product screen for reference (no change): <img width="561" height="143" alt="image" src="https://github.com/user-attachments/assets/4ee20d8c-9cde-4cc8-bcf1-8179f878a517" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257489
This update resolves a validation error that occurred when the partner autocomplete feature attempted to use incorrectly formatted VAT numbers. The fix automatically ignores invalid VAT data returned during autocomplete, ensuring a smoother user experience. This change requires the `base_vat` module to be installed.
Original PR description
### Issue: When autocompleting some partners, the returned VAT could be in an invalid format, leading to a validation error You need `base_vat` installed to get the issue ### Cause: The partner autocomplete feature relies on IAP credits for full data retrieval When no credits are available, only the VAT is returned if it was already fetched before In some cases, this VAT value is incorrectly formatted, which triggers a validation error when applied to the partner ### Fix: Invalid VAT values returned by the autocomplete are now ignored to prevent errors Since the correct VAT cannot be retrieved without IAP credits, the value is simply removed ### Steps to reproduce: - Install `l10n_cy` (we need a localization to enable base_vat) - Create a new partner from an invoice - Enter TONYO 360 and select the autocomplete suggestion Before the fix: The VAT field is filled with an invalid value, causing a validation error opw-6030164 Forward-Port-Of: odoo/odoo#255476
The color picker preview was previously inaccurate when applying gradient backgrounds to header themes. This update fixes a technical issue where the preview didn't reflect the actual gradient styles, ensuring a correct preview for all theme options.
Original PR description
### Issue: Color picker preview not showing correctly when a theme with a gradient background is applied to the header. ### Steps to reproduce: 1. Go to the Theme tab and open the color presets…
### Issue: Color picker preview not showing correctly when a theme with a gradient background is applied to the header. ### Steps to reproduce: 1. Go to the Theme tab and open the color presets dropdown. 2. Select any preset and set its background to a gradient. 3. Apply this theme to the header. ### Reason: - The color picker preview relies on `getComputedStyle` of the current editing element to determine what background to show. - For the header, the targeted editing element is `#wrapwrap > header`, but the actual gradient styles are applied to its inner `<nav>` elements (e.g., via `customizeWebsiteColorAction`). - Since the `background-image` property is never applied directly to the header element itself, computing its style does not capture the gradient defined on its inner elements, resulting in an incorrect or missing preview. ### Fix: - Avoid depending strictly on the computed style of the main editing element for generating the preview. - Ensure the preview accurately reflects the applied styles by utilizing CSS variables, even when certain builder actions apply those styles to inner elements rather than the primary targeted element, as demonstrated in the header example with `customizeWebsiteColorAction`. task-[6075788](https://www.odoo.com/odoo/project/974/tasks/6075788) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256566
This update resolves a validation error that occurred when users attempted to reconcile payments from different companies within Odoo's accounting system. The change ensures the 'Outstanding Credits/Debits' widget only displays relevant payments for the current invoice's company, improving user experience and preventing errors.
Original PR description
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments,…
The invoice outstanding credits/debits widget currently displays all reconcilable items for a partner across the same account, regardless of the company they belong to. In multi-company environments, specifically when accounts have been merged, this allows users to see and try to reconcile payments from Company A into an invoice from Company B. This action eventually triggers a validation error stating that entries must belong to the same company. This commit adds a company filter to the widget's logic to ensure only relevant outstanding payments are suggested, preventing cross-company reconciliation errors and improving UX. **Description of the issue/feature this PR addresses:** This PR fixes a validation error in multi-company environments where the invoice_outstanding_credits_debits_widget suggests payments or credit notes belonging to a different company than the current invoice. The issue typically arises when a partner has outstanding transactions in multiple companies and the accounts (e.g., Account Receivable) have been merged, allowing the widget to query lines that are not valid for the current record's company context. **Current behavior before PR:** When viewing an invoice for Company A, the "Outstanding Credits/Debits" widget displays all reconcilable account.move.line records for that partner that match the account type, regardless of their company_id. If a user clicks "Add" on a payment that belongs to Company B, Odoo attempts to reconcile them, resulting in a traceback or a validation error: "Invalid Operation: All tracebacks/entries must belong to the same company." This creates confusion for the end-user, as they are presented with "ghost" credits that cannot actually be applied. **Desired behavior after PR is merged:** The invoice_outstanding_credits_debits_widget (and the underlying logic in account.move) will strictly filter the suggested outstanding items by self.company_id. Users will only see and be able to reconcile payments, credit notes, or debits that belong to the same company as the invoice they are currently processing. This ensures data integrity and a seamless UX in multi-company setups. **Steps to reproduce:** 1) Enable Multi-Company: Ensure you have at least two companies (e.g., Company A and Company B) active in your database. 2) Chart of Accounts Setup: In both companies, use the same account for Receivables (or merge them so they share the same ID/Code if testing a migrated environment). 3) Ensure the account is marked as Allow Reconciliation. 4) Create a Payment in Company B: 5) Post the payment so it remains as an "Outstanding Receipt". 6) Create an Invoice in Company A 7) Confirm/Post the invoice. 8) Check the Widget: Scroll down to the bottom of the Invoice form in Company A. 9) Observe the "Outstanding Credits" widget. The Error: The payment from Company B will appear as an available credit for the invoice in Company A. 10) Click on "Add". A validation error (UserError) will pop up: "All entries must belong to the same company." **video** https://drive.google.com/file/d/1PfBxupP8t-t21wsP2FIgNXFnTP0Zq140/view --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255875
This update fixes an issue where the 'Back to edit mode' link in the land portal invoice was incorrectly directing users to the wrong app (like Website). Switching to the correct Invoicing app ensures users always access the intended invoice editing functionality. This improves the user experience and prevents errors.
Original PR description
The "Back to edit mode" link used action_move_out_invoice_type, which isn't bound to any menu, so the backend fell back to whichever app happened to match (e.g. Website when installed) instead of Invoicing. Switch to action_move_out_invoice (the one referenced by the Invoicing menu) so the webclient resolves the correct app automatically. task-5882256 Forward-Port-Of: odoo/odoo#257841
This update resolves an issue where uploading an empty PDF file caused a crash in the accounting module. The fix adds a validation check to ensure uploaded file content is valid, preventing errors and improving system stability. This ensures users can consistently upload documents without experiencing unexpected application failures.
Original PR description
Issue: - Uploading an empty PDF triggered a stack trace. - The uploaded file content sometimes returned False instead of bytes. - Passing this value to io.BytesIO() raised a TypeError. Fix: - Added a check to ensure the content is valid. Impact: - Prevents crashes when users upload empty or invalid PDF files. TaskID-6004471 Forward-Port-Of: odoo/odoo#252208
This update fixes an issue where the delivered quantity for kit products with dropshipped components was incorrectly calculated. The fix ensures accurate delivery tracking by addressing a flaw in the system's logic related to dropshipping routes and warehouse configurations. This ensures accurate reporting of delivered goods for kits.
Original PR description
### Steps to reproduce: - In the settings Dropshipping - Put you warehouse in 2 steps delivery - Create a kit product with 2 components: COMP1, COMP2 - Set a vendor on COMP2 and the dropship route -…
### Steps to reproduce: - In the settings Dropshipping - Put you warehouse in 2 steps delivery - Create a kit product with 2 components: COMP1, COMP2 - Set a vendor on COMP2 and the dropship route - Create and confirm an SO for 1 unit of your kit - Validate the ship and pick for COMP1 - Confirm the PO for COMP2 and validate the associated dropship #### > The qty_delivered on the sol is still at 0 ### Cause of the issue: The `delivered_qty` is computed via the `_prepare_qty_delivered`: https://github.com/odoo/odoo/blob/9b9ff3ddcba6f0c9d37d08fb4fb900bed3b396a4/addons/sale/models/sale_order_line.py#L887-L902 However, since at least on of the component is dropshipped, the qty_delivered is computed by this condition: https://github.com/odoo/odoo/blob/9b9ff3ddcba6f0c9d37d08fb4fb900bed3b396a4/addons/sale_mrp/models/sale_order_line.py#L54-L63 Which is 0 since the pick `location_dest_id.usage` is not `customer`. ### Additional issue: The delivered quantity of a Kit with at least one dropshipped component can only be 0 or the full demand. - In the settings enable Dropshipping - Create a kit product with 2 components: COMP1, COMP2 - Set a vendor on COMP2 and the dropship route - Create and confirm an SO for 3 unit of your kit - Validate the delivery for COMP1 for 2 units and backorder - Confirm the PO for COMP2 and validate the associated dropship for 1 unit and do not backorder #### > The qty_delivered on the sol is 0 instead of 1 - Cancel the backorder for COMP1 ### > The qty_delivered on the sol is 3 instead of 1 ### Cause of the issue: This is caused by the exact same dropship computation: https://github.com/odoo/odoo/blob/9b9ff3ddcba6f0c9d37d08fb4fb900bed3b396a4/addons/sale_mrp/models/sale_order_line.py#L63-L66 ### Note: The behavior should be consistent if the components are fully dropshipped or MTO buy and as such they should not be considered to be in all or nothing shipping policy. opw-6040640 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257617
This update resolves an issue preventing administrators from editing their profiles on mobile devices. The team corrected a technical error where a missing mobile view component was causing a system error. The fix ensures a consistent and functional profile editing experience across all device types.
Original PR description
# How to reproduce - Install the eLearning module - On the website, go to the Courses tab - View a user (Administrator for example) - In mobile view, click on Edit # The problem An traceback is shown and the user cannot edit their profile # Why This commit (https://github.com/odoo/odoo/commit/69785c1a64d61f2831804bcdcc4887ad43d27fbb) improved the profile edition. It is mentioned that they moved away from the simple bootstrap modal and used an OWL view instead. However, for the mobile view, they left a call to a modal that does not exist. This fix removes the call to the undefined modal and replaces it with the same OWL Dialog used in the desktop view (thanks to the .o_wprofile_editor class) opw-5960586 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251503
This update fixes a problem where multiple email aliases could lead to duplicate records being created when emails are processed concurrently. The change adds a temporary lock to ensure only one record is created for each email, improving data accuracy and reliability. This resolves a potential issue with helpdesk teams receiving duplicate notifications.
Original PR description
Concurrent processing of emails with the same `Message-Id` can create duplicate records. ### Steps to reproduce 1. Configure multiple mail aliases (e.g., two helpdesk teams). 2. Send one email with…
Concurrent processing of emails with the same `Message-Id` can create duplicate records. ### Steps to reproduce 1. Configure multiple mail aliases (e.g., two helpdesk teams). 2. Send one email with both aliases as recipient. The Mail Transfer Agent may invoke `odoo-mailgate.py` once per recipient, resulting in concurrent processing of the same email in separate transactions. We expect one record per alias/team, but duplicates may be created. ### Cause This is a race condition in the `Message-Id` deduplication logic, caused by concurrent transactions and PostgreSQL snapshot isolation. Odoo uses the `REPEATABLE READ` isolation level. This means that each transaction takes a snapshot of the database at its first query and cannot see changes committed by other concurrent transactions. When two concurrent transactions process the same email: 1. Both enter `message_process` and take their snapshot. 2. Both search for the `Message-Id`. Because their snapshots don't include each other's work, both find nothing. 3. Both create records. Even if one transaction commits before the other performs the check, the second transaction still uses its original stale snapshot and create duplicates. ### Fix After the initial duplicate check, attempt to acquire a transactional advisory lock on a hash of the `Message-Id` using `pg_try_advisory_xact_lock`. If another transaction is already processing the same email and holds the lock, the call returns false and the email is treated as a duplicate. If the lock is acquired, processing continues as normal. opw-5116492 Forward-Port-Of: odoo/odoo#258847 Forward-Port-Of: odoo/odoo#250027
This update fixes an issue where dropdown menus in the Odoo interface appeared cramped due to missing vertical spacing. The change restores natural spacing by adjusting margins on the menu items, ensuring a cleaner and more user-friendly experience. This improves the visual consistency of the application.
Original PR description
Recent structural changes added `p-0` to the menu class, removing the vertical padding from the dropdown. Rather than padding the scroll container directly (which would conflict with sticky group headers), apply `margin-top/bottom` on the first/last children of `.o_select_menu-choices` so the spacing scrolls naturally without creating a gap items could bleed through when a group header is stuck. task-6095912
This update fixes an issue where refund orders paid with eWallet top-ups (resulting in a net total of $0) were incorrectly processed. The change ensures accurate invoice generation and tax calculations for these refund flows, preventing errors in accounting documents. It improves the reliability of refund processing for a key POS feature.
Original PR description
[FIX] point_of_sale: detect refund+eWallet orders as refunds for invoice signs Refund orders paid through eWallet top-up can have a net total of 0, which made refund detection based only on negative…
[FIX] point_of_sale: detect refund+eWallet orders as refunds for invoice signs Refund orders paid through eWallet top-up can have a net total of 0, which made refund detection based only on negative totals inconsistent. As a result, some refund flows were treated as normal invoices and refund tax/invoice signs were incorrect. Steps to reproduce: ------------------- * Configure an eWallet program in POS. * Create and pay a POS order for one product, then invoice it. * Refund that order and choose eWallet as refund payment method (refund + top-up). * Validate and inspect the generated accounting document. > Observation: The refund flow may not be consistently treated as a refund when the order’s net amount is 0, causing incorrect invoice move type/sign handling and wrong tax booking behavior. Why the fix: ------------ Refund detection now also relies on `refunded_order_id` in key paths: * `_compute_prices`: apply refund factor when order is linked to a refunded order (or already negative), so totals/taxes keep refund semantics. * `_prepare_invoice_vals`: create `out_refund` when the order is linked to a refunded order (or has negative total), ensuring a credit note is produced. * `_prepare_base_line_for_taxes_computation`: consider refund context with `is_refund` or negative total for tax base sign consistency. This keeps existing negative-total refund behavior while correctly handling refund+eWallet cases where the arithmetic total can be 0. opw-5426818 Forward-Port-Of: odoo/odoo#247948