Daily updates from Odoo
Tuesday, August 19, 2025
18 changes · master
Resolved issues and error corrections
Manual tax calculations now also keep the original taxable base amounts, not just the tax amounts. This helps external tax integrations such as AvaTax and Brazil AvaTax produce more complete and reliable accounting data, reducing discrepancies in invoices and tax reporting.
Original PR description
…unts Forward-Port-Of: odoo/enterprise#92478
A payroll-related test was moved to the correct accounting test area so payroll can be tested independently. This helps prevent test failures when only the Belgian payroll app is checked, improving release reliability without changing user features.
Original PR description
Previously a test created on l10n_be_hr_payroll depended on account module, which broke single app tests. This commit moves the test from l10n_be_hr_payroll to test_l10n_be_hr_payroll_account [Old PR](https://github.com/odoo/enterprise/pull/89149) Task: 4942293 Forward-Port-Of: odoo/enterprise#90144
Egyptian payroll now applies the exempt amount before calculating income tax. This helps prevent employees from being charged too much tax and improves payroll accuracy.
Original PR description
Issue: - The income tax calculation in Egyptian payroll did not properly account for the exempt amount. - This could result in over-calculating tax for employees by not applying the exemption. Fix: - Updated the 'Taxable Amount' salary rule to correctly apply the exempt amount before tax is calculated. Task-4815156 Forward-Port-Of: odoo/enterprise#86395
Payroll users can now filter employees by name when creating a new pay run. This fixes a broken search filter, making it easier to find the right employees and reducing manual effort during payroll preparation.
Original PR description
Originally, when creating a new payrun, if you filter by employee name, the filter doesn't work. The filter logic has been adjusted to search for the correct field. Forward-Port-Of: odoo/enterprise#89877
Swiss payroll-specific employee fields are now only shown for Swiss companies. This avoids confusion in multi-company setups where users work with companies from other countries.
Original PR description
When using odoo in multi company with Swiss installed, we can see the fields from any other company. They should be hidden if the country is not Swiss. Task: 4788657 Forward-Port-Of: odoo/enterprise#89893
The Belgian payroll salary configurator now calculates the laptop benefit in kind consistently with other benefits such as internet and mobile phone. This helps ensure employee salary offers and payroll-related values show the correct laptop benefit amount.
Original PR description
The benefit in kind laptop salary rule was not adapted for the salary configurator. This commit fixes the issue by always returning the correct laptop value if the salary rule is used in a salary configurator, like it is already the case for the internet and mobile benefits. task-4971722 Forward-Port-Of: odoo/enterprise#92520 Forward-Port-Of: odoo/enterprise#91201
This fix ensures payments made through the customer portal for subscriptions are properly connected to the invoice that is created afterward. Business users can now see the related payment from the invoice, improving payment tracking and reducing confusion during subscription billing follow-up.
Original PR description
### Steps to reproduce: - Activate a payment method - Create a subscription and preview it in portal view - Pay this order through the order's portal view - Navigate to the invoice got generated -…
### Steps to reproduce: - Activate a payment method - Create a subscription and preview it in portal view - Pay this order through the order's portal view - Navigate to the invoice got generated - Notice there is not 'Payments' smart button ### Cause: Since https://github.com/odoo/enterprise/pull/77432/commits/02f72f94b7c996fa19c6bfc70a704d27aa677245 we stopped creating the invoice before the payment and the transaction in the controller and we let _post_process do this invoice creation. So the invoice actually gets created after the payment not before and when preparing the payment values the invoice_ids will be False https://github.com/odoo/odoo/blob/6c88e6ffd2c906b72b31d3c34ad3d6da5efba204/addons/account_payment/models/payment_transaction.py#L155-L170 Then we create the invoice for the transaction and we don't propagate it to the payment. https://github.com/odoo/enterprise/blob/20fd574367757c06f30c344056e8b8d91ba8244c/sale_subscription/models/payment_transaction.py#L72-L84 ### Fix: Link the payment to the invoice after creating the invoice and link it to the transaction. opw-4867631 Forward-Port-Of: odoo/enterprise#91690
Employee approval contacts are now recalculated based on the employee's current manager. This helps keep timesheet approval responsibilities accurate when reporting lines change.
Original PR description
To update the approvers information for employee according to his manager, the logic of computing each field has been modified.
Adding a column to a customized report table now uses a layout element that does not add unwanted spacing. This prevents table alignment issues and helps edited reports keep a cleaner, more consistent appearance.
Original PR description
Before this commit when adding a column into a modified qweb table (q-table node) we inserte a `p` as the cell's first child. This was problematic as a margin was always present, messing with the whole table alignment. After this commit, we put a simple DIV. task-5005441 Forward-Port-Of: odoo/enterprise#92085
Tickets created from Timesheets now automatically use the helpdesk team linked to the selected project. This prevents new support tickets from being assigned to the wrong team and limits team choices to those configured for timesheets.
Original PR description
Steps to Reproduce: - 1. Go to Timesheets > My Timesheets, start the timer, and select the project linked to the helpdesk team. 2. In the timer header, quick-create a new ticket via the "Ticket" field dropdown 3. Observe that the default helpdesk team on the new ticket is incorrect. Issue: - - When creating a ticket from the Timesheets module (e.g., via timer header or views), the system selects an incorrect default helpdesk team, leading to misassigned tickets. Cause: - - The core default logic for team_id prioritizes user membership or the first team without considering the selected project's linked helpdesk team. Fix: - - Override `_default_team_id` to set the correct Helpdesk Team based on the selected project. - A domain has been added to the team selection field within the timesheet views to only show teams that have the timesheet feature enabled. task-4885679 Forward-Port-Of: odoo/enterprise#92227 Forward-Port-Of: odoo/enterprise#89503
This fix prevents errors during fast payment when the order is not yet available on the payment screen, especially with automatic receipt printing and refunds. Businesses using affected POS localizations and payment integrations should see smoother checkout flows with fewer interrupted transactions.
Original PR description
*: l10n_cl_edi_pos, l10n_ke_edi_oscu_pos Before this commit: ---------- - TB appears when the order is not available on the payment screen, while fast payment is running on the product screen with automatic receipt printing, and getting refund lines. - Shifted logic before validation from the payment screen to the POS store. After this commit: ----------- - Fast payment is working seamlessly with automatic receipt printing. Related: - https://github.com/odoo/odoo/pull/216523 task-4874273
Expense reports created from uploaded receipts can once again have their names filled in automatically by OCR. This prevents users from being left with generic “Untitled Expense” labels and improves test coverage to avoid the issue returning.
Original PR description
The combination of the following recent changes prevented the OCR from filling the name of the expense: - New expenses are named "Untitled Expense {date}" by default instead of the name of the…
The combination of the following recent changes prevented the OCR from filling the name of the expense:
- New expenses are named "Untitled Expense {date}" by default instead of the name of the attachment (see commit odoo/odoo@ca1f644).
- The OCR doesn't override the name if it's not set to the default value (see commit 5c813dc).
The first commit didn't update the default expense name that was used in the OCR code, it was still computed from the attachment name.
After the second commit, the OCR couldn't fill in the name of the expense anymore, since it was expecting the name to be the attachment name, but it was "Untitled Expense {date}" instead.
This is fixed by checking that the expense name contains "Untitled Expense" (and taking translation into consideration).
This commit also improves the tests in multiple ways:
- For the `test_auto_send_for_digitization` test, it now mimicks an upload of the document to force the creation of the expense with the default name, this should prevent this from happening again.
- It now uses an actual PDF document instead of "fake" attachments.
- Minor clean up.
task-[4684825](https://www.odoo.com/odoo/project/967/tasks/4684825)
Forward-Port-Of: odoo/enterprise#92324This fixes an issue where partially processing lot-tracked receipts in the barcode app could incorrectly increase the expected quantity when users returned to the receipt later. The change keeps backorder and grouped barcode lines aligned so inventory demand remains accurate.
Original PR description
### Steps to reproduce: - Create a storable product tracked by lot - Create and confirm a receipt for 10 units of that product - Go to the barcode app and regiter 1 unit - Exit the picking - Go back…
### Steps to reproduce: - Create a storable product tracked by lot - Create and confirm a receipt for 10 units of that product - Go to the barcode app and regiter 1 unit - Exit the picking - Go back to the picking register the 9 remaining units - Exit the picking and comeback #### > The demand of the receipt has been updated from 10 to 19. ### Cause of the issue: Exiting the picking will launch a call of the `post_barcode_process` in order to keep track of the changes you made without changing the initial demand: https://github.com/odoo/enterprise/blob/c26c21cec14a234021bb13bbc2684334bc64b70b/stock_barcode/models/stock_move.py#L50-L53 THe first time you enter the picking you have a single move with a quantity of 10. The first time you exit, since you have set a qty_done of 1 (and hence have updated the quantity of the associated move to 1), the `split_uncompleted_moves` will then create a move for a quantity of 9 in order to keep 10 units assigned. The second time you enter the picking both moves are grouped in a single line since the product is tracked by lot, however, when you update the qty_done of that grouped line you will actually only update the quantity of the first move line and its related move. Since the `_truncate_overreserved_moves` was not designed to handle these grouped lines, it does not notice that the combined reservation overcomes the actual demand. opw-4731803 Forward-Port-Of: odoo/enterprise#91381 Forward-Port-Of: odoo/enterprise#89967
Odoo now avoids showing an incorrect activity note that a payment was removed from a batch when it actually remains there. This keeps payment batch records clearer and helps users trust the history shown during batch validation.
Original PR description
When validating a batch that includes payments in process (e.g., without journal entries), Odoo incorrectly logs that the payment was removed from the batch, even though it remains. This commit fixes the chatter message by not possessing the write method of the account_payment if batch_payment_id not in vals. task-5011672 Forward-Port-Of: odoo/enterprise#92197
The VoIP softphone now shows the correct place to configure the PBX server when setup is incomplete or incorrect. This helps users resolve connection issues faster by pointing them to the right settings area.
Original PR description
Previously, the error message shown to fix setting in general setting. After this commit, the error message shows the correct location of the PBX server. task-5022401
Non-recurring products sold through upsell sales orders are now included in the Sales Analysis Report. This helps businesses see complete delivered quantities and revenue for one-time products, improving reporting accuracy.
Original PR description
Problem: The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate…
Problem:
The non-recurring products added through upsell Sales Orders are not included in the Sales Analysis Report. This results in missing sales data for those products, leading to inaccurate reporting.
Purpose:
To ensure that non-recurring products added through upsell Sales Orders are correctly included in the Sales Analysis Report (report_all_channels_sales_action). This fix updates the report's domain filter to include upsell orders when the product is not recurring, resolving the issue of missing sales data for such products.
Steps to reproduce the bug:
1. Create a Sales Order (SO):
Add two products to the order:
- One recurring product (e.g., a subscription-based product with a recurring billing policy).
- One non-recurring (standard) product.
2. Confirm the SO
3. Generate an Invoice for the confirmed SO.
4. Validate the Invoice and deliver the non-recurring product (process the delivery order fully).
5. Create an Upsell Sales Order:
- From the original SO, create a new upsell SO.
- Add the same non-recurring product again.
6. Navigate to the Non-Recurring Product Page:
- Open the Product form for the non-recurring item.
- Click on the "Sold" smart button (shows delivered/sold quantities in the past 365 days).
- This opens the Sales Analysis Report (report_all_channels_sales_action) filtered by this product.
Issue:
The upsell Sales Order is not included in the Sales Analysis Report for the non-recurring product. As a result, the delivered quantity or revenue from upsell SOs is missing from the report for non-recurring products.
opw-4940977
Forward-Port-Of: odoo/enterprise#92559Fixes an issue where running the same WhatsApp marketing automation test more than once could cause an error. This helps users validate campaigns repeatedly without interruptions before launching them.
Original PR description
Currently an error occurs when trying to run whatsapp marketing automation test more than once. **Steps to replicate:** * Install `marketing_automation_whatsapp` * Setup whatsapp integration *…
Currently an error occurs when trying to run whatsapp marketing automation test more than once. **Steps to replicate:** * Install `marketing_automation_whatsapp` * Setup whatsapp integration * Marketing Automation > New > Start From Scratch > Add a new activity * Select Activity Type as Whatsapp Message and a Whatsapp Template * Launch a Test > Pick a contact > Launch > Run (Do this step twice) **Error:** `ValueError: Expected singleton: marketing.trace(6, 4, 3, 2, 1)` **Cause:** This error occurs because the variable `trace` contains multiple records, but the `process_event` method is being called on the entire recordset. Since `process_event` uses `self.ensure_one()`, it expects exactly one record, and therefore raises an error at [1] when multiple records are passed. **Solution:** * Handle trace records one by one using a loop. [1]: https://github.com/odoo/enterprise/blob/624b18bdb5dff0df4756c4e1d37a696631e57a05/marketing_automation_whatsapp/models/marketing_trace.py#L20 **Sentry-6772553612** Forward-Port-Of: odoo/enterprise#91207
WhatsApp template previews now avoid treating underscores inside URLs or similar text as italic formatting. This prevents portal links and access tokens from being displayed incorrectly, while still allowing intended italic formatting when underscores are separated by spaces.
Original PR description
Steps to reproduce: 1. Go to a WhatsApp template, for e.g. Sale Order. 2. Update the sample value for the Portal Link variable to include an underscore. 3. Click on Preview Issue: Due to the current…
Steps to reproduce: 1. Go to a WhatsApp template, for e.g. Sale Order. 2. Update the sample value for the Portal Link variable to include an underscore. 3. Click on Preview Issue: Due to the current regex, we will apply italic to any underscore we find which is not ideal, mostly when we work with URLs that can contain underscores like "acces_token" which we will try to apply italic to it too. Solution: Following the most common logic for italic formatting, we will only apply italic formatting when the underscore is surrounded by whitespace. This is the same way it already behaves in Whatsapp. If we write it like_this_for example, it will not apply italic formatting, but if we write it like this _this_ it will apply italic formatting. So this for example: **"If we write it like_this_for example"** Will be like - before the fix: **"If we write it like<i>this</i>for example"** Will be like - after the fix: **"If we write it like_this_for example"** opw-4720017 Forward-Port-Of: odoo/enterprise#91217