Wednesday, April 8, 2026
12 changes · saas-19.2
Enhancements to existing features
This update improves how Odoo handles VAT information for Thai businesses. It now correctly identifies companies based on their Tax Identification Number (TIN) prefix – a '0' indicates a corporate entity, while other digits signify an individual. This ensures accurate reporting and compliance with Thai tax regulations.
Original PR description
In this commit: - For Thailand, TIN is distinguishable between an individual and a company by a prefix. - TIN starting with '0' means the contact is a registered corporate entity, such as a company or partnership. If TIN begins with any digit from 1-9, it indicates that the contact should be treated as an Individual. task-6002111 Forward-Port-Of: odoo/odoo#256027
This update adds a reference field to journal entries generated from stock movements, making it easier to track the origin of transactions. Previously, users had to manually examine individual lines to identify the source document, which created an auditability challenge. This change simplifies the audit process and improves financial reporting.
Original PR description
To make auditing easier, this commit ensures that journal entries generated from stock movements include the source document reference. Currently, the 'ref' field on these account moves is often empty, forcing users to inspect individual lines to identify the origin. - updates `_create_account_move` in `stock_move`. - collects unique references from the stock moves using `mapped`. - populates the `account.move` 'ref' field with a comma-separated list of these references. task-5499000 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#254889
Resolved issues and error corrections
This update ensures that account moves are automatically created when closing a POS session containing Urban Piper future orders (orders with a delivery date). Previously, these orders were excluded, preventing proper accounting record generation. This change improves financial reporting accuracy for orders processed through the Urban Piper integration.
Original PR description
Before this commit, when all orders coming from Urban Piper in a POS session are paid future orders (i.e. have a delivery_datetime), closing the session would not generate an account move. The cause was that the code was excluding future orders when creating the account move. The fix is to exclude only unpaid orders instead. How to reproduce: - Set up Urban Piper (a test account needed). - Place an order from the Urban Piper platform. - Receive the order, accept it, and mark it as ready. - Close the session. - The session will not have an account move. opw-5995985 Forward-Port-Of: odoo/enterprise#113078 Forward-Port-Of: odoo/enterprise#111137
This update fixes an issue where users couldn't validate delivery orders when using the 'To Pickup' button. The fix removes a technical restriction that prevented opening the form view from the list, now enabling users to properly complete the delivery order process. This improves efficiency and accuracy in order fulfillment.
Original PR description
Steps to reproduce: - Install `industry_fsm_stock` - Create a task and add a product - Click on the "Sale Order" button - Add another product with the Invoicing Policy set to "Delivered quantities" - Click on the "To Pickup" button Issue: Users are unable to validate the delivery order from the products pick up button. Cause: In pr https://github.com/odoo/odoo/pull/227630 the parent view is set with `editable="bottom"`, which prevents opening the form view from the list. Fix: Allow opening the form view from the list view so users can validate the delivery order. Task-5969303 Forward-Port-Of: odoo/enterprise#110125
This update corrects a bug where discounts were applied twice to service tasks, resulting in incorrect pricing. The fix ensures discounts are applied correctly based on sales order settings, preventing overcharging and improving accuracy for service order calculations. This impacts how discounts are applied to field service tasks.
Original PR description
Currently, when the user creates a task for a customer with a discount pricelist, the discount is applied twice for the service. <h2>Steps to produce:</h2> * Install `industry_fsm_sale` and enable…
Currently, when the user creates a task for a customer with a discount pricelist, the discount is applied twice for the service. <h2>Steps to produce:</h2> * Install `industry_fsm_sale` and enable `Discounts` and `Pricelists` in settings. * Create a pricelist with a price rule of type discount that applies 10 percent discount to every product. * Go to Customers > Acme Corporation > Sales & Purchase and set the pricelist. * Go to Field Service > Create a Task, and set `Customer` to Acme Corporation. * Add a timesheet with Time Spent 1 > Mark the task as Done > Sale Order <h2>Observed behavior:</h2> The discount is applied twice to the product on SO: **Product**: Service on Timesheets **Unit Price**: `$40` (excluding tax) **First discount:** The 10 percent discount on the unit price of the product. Product unit price is set from `$40 -> $36 ` **Second discount:** The 10 percent discount on the SO line itself. `$36 -> $32.4 ` The untaxed amount is: `$32.40` which should be `$36.00` <h2>Root cause:</h2> This happens because, at line [1], the unit price is already set to the final price from the pricelist when the sale order line is created. Since discounts are enabled, [2] applies an additional discount to that same price, causing the discount to be applied twice. <h2>Solution:</h2> When creating the sales order: * **Discount setting is on:** use list price so the discount is applied from the sales order. * **Discount setting is off:** set the product unit price to the discounted price. [1]- https://github.com/odoo/enterprise/blob/224d2453cc975a3e333825370beaf30d27d89f10/industry_fsm_sale/models/project_task.py#L658 [2]- https://github.com/odoo/odoo/blob/76717e588bfd012b42e859bfc829257d899c6165/addons/sale/models/sale_order_line.py#L788 opw-5432088 Forward-Port-Of: odoo/enterprise#112948 Forward-Port-Of: odoo/enterprise#103950
This update resolves an issue where the breadcrumb navigation within the Barcode app was sometimes showing blank entries instead of the originating document's name. Now, when navigating from Barcode actions to related records, the breadcrumb correctly displays the document name, improving user clarity and ease of navigation. This ensures users can quickly identify the source document when working within the Barcode interface.
Original PR description
*: stock_barcode_mrp, stock_barcode_picking_batch ## Issue Before This PR: When navigating from the Barcode client action (e.g. picking, inventory, etc.) to related form views (such as lot, product,…
*: stock_barcode_mrp, stock_barcode_picking_batch
## Issue Before This PR:
When navigating from the Barcode client action
(e.g. picking, inventory, etc.) to related form views
(such as lot, product, or company), the breadcrumb
would sometimes display an unnamed entry instead
of the originating document name.
This caused confusion for users, as they could not
easily identify which document they were coming from
when navigating to related records from the Barcode interface.
## Steps to Reproduce:
- Install the Barcode module.
- Open the Barcode app and navigate to:
- Delivery Orders.
- Manufacturing Orders
- Batch Pickings
- Inventory Count
- From any of these open a record
(e.g. picking, MO, batch, inventory line)
- Click on document name or edit button on the line.
- Click on an external link (e.g. product, lot, company).
- Observe that the breadcrumb shows an unnamed entry.
## Cause of the Issue:
- When switching views inside the Barcode client action,
the FormController calls `setDisplayName(this.displayName())`.
In some cases, this returns an empty string, overwriting the
previously set breadcrumb name.
- In several form views, the `display_name` field was not present,
preventing the controller from retrieving a proper name.
## With This PR:
The Barcode views now display the correct document names in the
breadcrumb when navigating to external links, allowing users to easily
identify the originating document when opening related records from
the Barcode app.
TaskID: 4978997
Forward-Port-Of: odoo/enterprise#112988
Forward-Port-Of: odoo/enterprise#99165This update resolves an issue where multi-day 'Half Day' time off requests were incorrectly generating a single timesheet entry instead of individual daily entries. The fix ensures that time off requests are accurately reflected in timesheets, regardless of the duration, improving the accuracy of employee time tracking.
Original PR description
Steps to reproduce: ------------------- 1. Install Timesheets and Time Off. 2. Create a new Time Off type with duration type "Half Day" (disable "Require allocation" to skip allocations). 3. Enable…
Steps to reproduce: ------------------- 1. Install Timesheets and Time Off. 2. Create a new Time Off type with duration type "Half Day" (disable "Require allocation" to skip allocations). 3. Enable "Timesheets" in Timesheets > Configuration. 4. Ensure the employee is configured with a "Flexible" working schedule. 5. Create a multi-day Time Off request (2 days) using this type and approve it. 6. Check the timesheet entries for the employee. Issue: ------ When a multi-day time off request is submitted for a "Half Day" time off type, the system fails to generate individual daily timesheet entries. Instead, it generates a single timesheet entry with a duration calculated as leave_version_sudo.hours_per_day / 2, regardless of the actual number of days requested. (e.g., if hours_per_day is 8, it generates one entry of 4 hours for a 2-day leave), Cause: ------ After this commit 9512832, multi-day requests were allowed for time off types where the **request_unit** is "half day" or "hours". However, the logic in `_generate_timesheets` for flexible calendars was not updated to account for this. if `work_entry_type_request_unit == 'half_day'`, the following condition in `_generate_timesheets`: https://github.com/odoo/odoo/blob/6ec97349d998701373920b883a95be7132648e03/addons/project_timesheet_holidays/models/hr_leave.py#L45 always evaluates to True. This traps multi-day requests in the "single-day" logic, preventing the code from reaching `_list_work_time_per_day`. Solution: --------- Update the condition to strictly check if the request is a single day before applying the simplified single-entry logic. If the request spans multiple days, it will now correctly fall into the else block, utilizing `_list_work_time_per_day` to generate one timesheet entry per day of the leave. opw-5715197 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#257456 Forward-Port-Of: odoo/odoo#248605
This update fixes a reporting issue in Point of Sale orders using different currencies. Previously, the margin calculation didn't account for the currency rate, leading to incorrect margin values in the reports. Now, the margin calculation correctly incorporates the currency rate, ensuring accurate reporting for all PoS transactions.
Original PR description
When making a pos order in a PoS that uses a different currency, the margin in the pos order report would not take the currency into account Steps to reproduce: ------------------- * Create a product with a price of 100€ and cost 0€ (margin = 100€) * Setup a PoS to use a different currency with a rate of 2 (so 1€=>0.5) * Create a PoS order for this product and validate it * Go to the pos order report and select the order you just made > Observation: The value of the margin is 200 expressed in the different currency, when the rest of the report is using the company currency. Why the fix: ------------ The currency was only applied on the product cost, we now apply it on the whole margin. opw-5927473 Forward-Port-Of: odoo/odoo#257642 Forward-Port-Of: odoo/odoo#255344
This update fixes an issue where invoices created with the 'pay later' payment method in Switzerland didn't generate QR codes for payment. The fix ensures that the invoice correctly identifies a bank partner, resolving this problem and enabling proper payment QR code generation. This improves the user experience for customers using this payment option.
Original PR description
Step to reproduce: - Install l10n_ch_pos and make sure swiss company has tax id filled - Create a swiss customer with an email address and vat, add full address - Open a pos session, and make an invoice for a product with tax, - select payment method, which allows `pay_later`, i.e. payment without journal_id Observation: - the invoiced order, do not have qr for payment, because the invoice do not have `bank_partner_id` Cause: - `_get_partner_bank_id` is recently updated in commit[1], which do not considered `pay_later` option [1] https://github.com/odoo/odoo/commit/7e63991dceb6e443b950e6a1b94454a82d5668c7 Fix: - Fixed the fallback logic for `_get_partner_bank_id` opw-6023060 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#255678 Forward-Port-Of: odoo/odoo#254117
This update fixes a usability issue in the subthread list within Odoo, making it easier to read and understand conversations. The list has been widened and now displays the last message's full body on hover, resolving truncation problems and improving clarity.
Original PR description
Before this commit, the sub thread list had two issues: - It was too small, making it hard to grasp the content of the thread. The last message of the thread was shown, but due to limited space, it was often truncated so much that displaying it was not useful. This commit slightly increases the width of the sub thread list and adds the last message body as a title, displayed on hover. |Before|After| |--|-| |<img width="396" height="627" alt="image" src="https://github.com/user-attachments/assets/f329cbe2-07d7-48d5-a114-0b2528a77848" />|<img width="512" height="637" alt="image" src="https://github.com/user-attachments/assets/cf08d099-6fb5-4b62-97f2-39660014c5f2" />|
This update fixes an issue where combo orders in the self-order mode were calculating prices incorrectly in the backend. The fix ensures accurate pricing for combos with multiple quantities, resolving a discrepancy between the frontend and backend displays. This improves the reliability of self-order transactions.
Original PR description
**Steps to reproduce:** - Create 2 products, set their price to 0 - Create a combo product, set it's price to 10 - The combo choices should be the 2 products created before - Go to the self order,…
**Steps to reproduce:** - Create 2 products, set their price to 0 - Create a combo product, set it's price to 10 - The combo choices should be the 2 products created before - Go to the self order, order the combo and change the qty to 3 - The price is 30, correct in the frontend - Go to the order in the backend, the price is 0 **Why the fix:** In the backend, during the price recomputation, we did not account for the fact that we could have a parent line with multiple quantity during the split between the free and the extra lines. This means that we counted too many lines, and had to put some in the extra lines. We then override the price_unit with the total_price in this code https://github.com/odoo/odoo/blob/f73c32960721b046076b91e4bc017ddb924e0837/addons/pos_self_order/models/pos_order.py#L341-L342 But the total price has been computed to zero, so the previously computed price_unit is overriden and set to zero. We now divide the line's qty by the parent line's qty to get the qty per parent line, allowing us to have a qty of more than 1 for the parent line. The same is done for the computation of the remaining amount to pay, as **child.qty** is the number of time the item is selected in the combo * the number of combo ordered, meaning it was messing up the computation. opw-6032408 Forward-Port-Of: odoo/odoo#254443
This update fixes a bug that caused duplicate orders to be created when a default customer was assigned. The change ensures that orders are correctly identified as empty, even with a default partner, preventing the creation of redundant orders. This improves order processing efficiency and data accuracy.
Original PR description
When a default partner is assigned to new orders, `getEmptyOrder()` failed to find the existing empty order because it filtered on `!order.partner_id`, causing a duplicate order to be created after each validation. Add a `getDefaultPartnerId()` hook returning `null` by default. `createNewOrder()` uses it to assign the default partner centrally, and `getEmptyOrder()` uses it to correctly identify orders still considered empty despite having a default partner set. Also update l10n_ar_pos and l10n_pe_pos to override `getDefaultPartnerId()` instead of `createNewOrder()`. opw-6077656 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#256618