Wednesday, November 19, 2025
23 changes · saas-18.3
New functionality added to Odoo
This change adds a new EC Sales List report for Finnish businesses, along with the export file needed to submit it. It helps companies in Finland prepare and provide required EU sales reporting more easily.
Original PR description
The aim of this commit is adding the Finnish EC Sales List report. task-5126664 Forward-Port-Of: odoo/enterprise#95901
Enhancements to existing features
The Point of Sale sales report now includes a more detailed view of payments, grouped by payment method. This makes it easier for teams to understand how customers paid and to review sales performance more clearly.
Original PR description
In this commit: ----------- - Enhances the PoS sales report by adding detailed breakdowns of payments grouped by payment method. task-5184319 Forward-Port-Of: odoo/odoo#234486
Resolved issues and error corrections
This change removes a unit test that depended on a different module setup and on enterprise-only fields. Removing it prevents automated build checks from failing and keeps the codebase aligned with the correct module boundaries until a proper replacement is added.
Original PR description
The unit test `test_can_reset_deferred_invoice()` has several issues. 1. It should be in the `account_audit_trail` module, as the test requires this module. [Unit test documentation: modules](https://www.odoo.com/documentation/19.0/developer/tutorials/unit_tests.html#modules). 2. The test references fields from the Enterprise module `account_accountant`, `account.move.line.deferred_start_date` and `account.move.line.deferred_end_date`. This causes build tests to fail. As such, the test should be removed now and replaced later if necessary. Fixes [PR 235223](https://github.com/odoo/odoo/pull/235223) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235813
The mail plugin now includes a way to identify the Odoo version it is connecting to. This lets Odoo display a clear message when the add-in is used with an older, unsupported version instead of failing without explanation.
Original PR description
Purpose ======= The new addin has been refactored and doesn't work with older Odoo version, and so we add an endpoint to be able to show a message if we don't support that Odoo version. Task-4727609 Forward-Port-Of: odoo/odoo#236286 Forward-Port-Of: odoo/odoo#236047
Invoice delivery to customers and government EDI systems is now deferred until after the payment transaction is fully committed. This reduces the risk of invoices being sent and then lost due to a rollback, helping keep Odoo records aligned with external government numbering and customer communications.
Original PR description
When the payment transactions trigger the creation of invoices and then the sending of those invoices by mail and through the EDI to the government, any concurrent update can make that entire process…
When the payment transactions trigger the creation of invoices and then the sending of those invoices by mail and through the EDI to the government, any concurrent update can make that entire process fail all at once. This mainly happens when the user himself is paying through the portal as this will create the invoice from the payment. When invoices are sent to the government however, we want to be sure that when sent, it gets updated in Odoo as well, so we are aware what is happening. The problem we got is that invoice 1 is sent to the government (l10n_in_edi) as number 01 and then that transaction is totally rolled back that the invoice is not even there anymore, it risks that the government's numbers and your numbers do not correspond anymore. So, we should avoid that that invoice can be sent when before there is a concurrent update (on payment transaction in this case) waiting for destroying it when committing. So, the simple idea would be to only do the invoice sending through a post commit. As we are locking the invoice itself for the sending to the government that should be enough to avoid the invoice sending for not being registered in Odoo. 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
Finnish tax reporting now includes triangular taxes, which helps generate the EC Sales List more accurately. This improves compliance and reduces manual adjustments for businesses operating across EU borders.
Original PR description
The aim of this commit is adding the triangular taxes into the tax report to use it in EC Sales List report. task-5126664 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229269
This update prevents an error that could happen when a salesperson quickly adds a product from the catalog and immediately removes it. If no order line exists yet, the system now falls back to the sale order’s pricelist instead of failing, keeping the sales flow smooth.
Original PR description
Currently, an error occurs when the user immediately removes a catalog product after adding it. Steps to Reproduce ([Video](https://drive.google.com/file/d/12hOavt1zCa6hbG0EWHsIDGxfgVkxJmLW/view)): -…
Currently, an error occurs when the user immediately removes a catalog product after adding it. Steps to Reproduce ([Video](https://drive.google.com/file/d/12hOavt1zCa6hbG0EWHsIDGxfgVkxJmLW/view)): - Install the `sale_management` module. - Go to `Sales Orders` and create a new `sale order`. - In the order line, click on the `Catalog` button. - `Add` a product and then immediately `remove` it. `ValueError: Expected singleton: sale.order.line()` After [this commit], when the user clicks the Remove button immediately after clicking the Add button (within 500 ms). In this case, the system proceeds with the last request due to the useDebounced delay [1], which removes the product. However, since there is no order line yet for that product [2] and the quantity is 0, the order line [3] is not created. When it attempts to retrieve the discounted price, it raises the error [4]. This commit ensures that if no order line exists, the product's price is returned according to the sale order's pricelist. [this commit]: https://github.com/odoo/odoo/pull/233098/commits/697c559791fdf00b5602b9459bbdf21f392757d8 [1]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/product/static/src/product_catalog/kanban_record.js#L17-L19 [2]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/sale/models/sale_order.py#L2202 [3]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/sale/models/sale_order.py#L2218-L2219 [4]- https://github.com/odoo/odoo/blob/ec212f38e50520edf612522717952855c8c09a80/addons/sale/models/sale_order_line.py#L1602-L1603 sentry-7019831319 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235470
This update improves the message shown when accounting entries are not balanced. Instead of stopping after the first issue, it now collects all affected entries so users can see the full list of problems at once and fix them more efficiently.
Original PR description
The commit 3467b5971423f70581c6be2caf7f8a8d86ee70f1 intended to improve the error message in `_check_balanced()` by tailoring it based on the number of affected entries. However, in the case of multiple affected entries, the error was raised after the first iteration, preventing the full list of unbalanced entries from being collected and displayed to the user. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236212
This fix lets users refuse a validated leave allocation even if leave records already exist for the same period. It prevents a false error that incorrectly told users to remove the leave first, even when that leave should belong to an earlier allocation.
Original PR description
## Issue: When you have an allocation and set a leave for that period, if you add a new allocation for that period and you validate it, it will be impossible to Refuse this allocation later A…
## Issue: When you have an allocation and set a leave for that period, if you add a new allocation for that period and you validate it, it will be impossible to Refuse this allocation later A UserError was raised asking to remove the leave even if it should be linked to the first allocation created ## Cause: The `action_refuse()` method for `hr.leave.allocation` uses the `virtual_leaves_taken` value inside the `_get_consumed_leaves()` function's result That parameter is calculated for the allocation as far as it state is `validate`, for all the leaves in that time interval, including previously created leaves The leaves will be allocated to the last allocation created, so the last one can't be removed later As a result, the allocation is considered as already used by these pre-existing leaves, even if the leave can still be modified to return to the state prior to the allocation's validation ## Steps to reproduce: - Create an initial Allocation (that should end after the next created Allocation) - Create a Leave from 22/12/2025 to 31/12/2025 - Create an Allocation including the leave period (01/12/2025 to 31/12/2025) - Validate, then Refuse opw-4900686 Forward-Port-Of: odoo/odoo#235711 Forward-Port-Of: odoo/odoo#222171
This fix prevents imported bank statement lines from being lost when a validation error occurs during automatic reconciliation. Instead of cancelling the whole import, the system now keeps the lines so users can review and reconcile them manually afterward.
Original PR description
### Issue: When importing a CSV file with bank statements, if an error is raised during the reconciliation, the creation of the bank statement lines is roll backed. ### Steps to reproduce: - Install…
### Issue: When importing a CSV file with bank statements, if an error is raised during the reconciliation, the creation of the bank statement lines is roll backed. ### Steps to reproduce: - Install "account_bank_statement_import_csv" - In the bank journal configuration: - Set the "Outstantding Receipts accounts" of "Manual payments" to a "Bank" account - Set the "Outstantding Payments accounts" of "Manual payments" to the same "Bank" account - Create a new transaction for $333.0 for example - Find its Journal Entry and change its reference to 'testref' - have a CSV file like this: ``` label, amount testref,333 ``` - Import this file - Make sure label is linked to label and amount to amount - Import - An error shows, no lines are imported ### Cause: On import, we try to auto reconcile the lines using `_cron_try_auto_reconcile_statement_lines` ([here](https://github.com/odoo/enterprise/blob/843a17367525c80653d37ecdd9d87434d3e92454/account_bank_statement_import_csv/wizard/account_bank_statement_import_csv.py#L146)). If an error occurs during the reconciliation, we call `self.env.cr.rollback()` [here](https://github.com/odoo/enterprise/blob/843a17367525c80653d37ecdd9d87434d3e92454/account_accountant/models/account_bank_statement.py#L190-L192). This rollback cancels the transaction, including the creation of the statement lines. ### Solution: If the error raised is a `UserError` then we don't roll back and just ignore it. This causes no issues as we caught all exceptions to always continue the reconciliation with the next batch. For UserErrors we should let the user reconcile manually afterward. Also, as the rollback can undo the creation of `st_lines`, we add `if st_lines.exists():` before writing on the variable. Test is not possible as we don't roll back during tests. opw-5138855
This fix ensures that when a single payment settles multiple invoices, each invoice is linked to the correct foreign-exchange adjustment. It prevents exchange differences from being assigned to the wrong invoice, improving the accuracy of accounting records and invoice reconciliation.
Original PR description
# How to reproduce the issue: - Create two currency rates: one for today and one for the day before. - Create two invoices with different `amount_total`, both using the rate from yesterday. - Create…
# How to reproduce the issue: - Create two currency rates: one for today and one for the day before. - Create two invoices with different `amount_total`, both using the rate from yesterday. - Create a group payment dated today. Check the generated payment, its journal entry, and the reconciled items. Two exchange moves are created — one for each invoice. However, on the invoices themselves, only one of those exchange moves is associated with both invoices. Since commit 5420e40ff337080912edf7414257e03853be026a, the logic that associates exchange moves to `account.partial.reconcile` records was changed. It links an exchange move to a partial if any of its reconciled lines match either the partial's `debit_move_id` or `credit_move_id`. In a group payment scenario: - Two partials are created (one per invoice). - Each has a different `debit_move_id` (the invoice lines) but shares the same `credit_move_id` (the single payment line). - As a result, both partials match the same exchange move via the shared credit line — leading to incorrect assignment. opw-5147281 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
Fixed an issue where filtering replenishment records by zero quantity could still show items that actually needed to be ordered. This makes the list view match the displayed order quantity, so users can trust their filters and review the right items.
Original PR description
**Issue** In replenishment, filtering with `to_order = 0` does not correctly exclude records where `to_order != 0`. **Steps to reproduce** 1. Go to Inventory > Operations > Procurement >…
**Issue** In replenishment, filtering with `to_order = 0` does not correctly exclude records where `to_order != 0`. **Steps to reproduce** 1. Go to Inventory > Operations > Procurement > Replenishment 2. Create a replenishment with a forecast quantity smaller than the min and max quantity (without editing the To Order) 3. Apply a custom filter `to_order = 0` → Records with non-zero `to_order` are incorrectly included **Cause** `qty_to_order` was split into `qty_to_order_computed` and `qty_to_order_manual` in [this commit](https://github.com/odoo/odoo/commit/156bed3f430d706e13822bbd95d91c8dfd3ea42d#diff-0eb18a8d7773b5f99b402392188594178c3ba2004e4bcab26dbc84b1c8d7256a). In the [`_search_qty_to_order` method](https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_orderpoint.py#L338), all records with `qty_to_order_manual = 0` are included. Since `qty_to_order_manual` defaults to 0 when untouched by the user, this causes incorrect results. Additionally, [`to_order`](https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_orderpoint.py#L323) displays `qty_to_order_computed` if `qty_to_order_manual = 0`, creating inconsistency. **Solution** Fix the inconsistency by ignoring `qty_to_order_manual` when searching for zero `to_order` values. opw-5150643 Forward-Port-Of: odoo/odoo#234908
This update corrects a printing setting in the Windows IoT driver that caused PDF labels to be resized incorrectly. As a result, labels should now print with the proper alignment on Zebra printers.
Original PR description
Adding the argument "-dPDFFitPage" in the printer driver for the windows IoT broke the alignment when printing PDF labels on Zebra printers. Issue introduced in #232866 opw-5220275 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236041
This update fixes a problem where some Sendcloud delivery services did not offer drop-off point selection, even when they should have. Users can now choose locker or service point delivery locations correctly on the map, improving checkout options for affected carriers.
Original PR description
Steps to reproduce ----- - Create a Sendcloud delivery method - Select a delivery service with "Locker or service point" as "Last mile" (eg "bpost @ bpack") > "Use Sendcloud locations" is set to…
Steps to reproduce ----- - Create a Sendcloud delivery method - Select a delivery service with "Locker or service point" as "Last mile" (eg "bpost @ bpack") > "Use Sendcloud locations" is set to false Cause ----- There is a problem with the values retrieved from the Sendcloud API call, more specifically the `available_functionalities` > `last_mile` value. The Sendcloud API (of both previous and current beta version) specifies the possible values to only be the following - `home_delivery` - `mailbox` - `pobox` - `service_point` - null https://api.sendcloud.dev/docs/sendcloud-public-api/shipping-options/operations/create-a-shipping-option https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/shipping-products/operations/list-shipping-products However, it seems like they have added some new undocumented values `locker` and `locker_or_service_point`. To detect whether to use drop-off locations, we do https://github.com/odoo/enterprise/blob/5b64c63301bc814c7c9d99146af6a86d37563762/website_delivery_sendcloud/models/delivery_sendcloud.py#L51-L53 Where we compare the retrieved value with the string 'Service point' https://github.com/odoo/enterprise/blob/5b64c63301bc814c7c9d99146af6a86d37563762/website_delivery_sendcloud/models/delivery_sendcloud.py#L13 In our "Locker or service point" case, this does not work because the `in` operator makes a case sensitive comparison. Solution ----- Functionally, both lockers and service points work the same. The user should be prompted a map on which they choose where the delivery should be dropped off. So we can add `Locker` and `Locker or service point` as accepted values and enable the use of sendcloud locations for both. ----- Ticket: opw-5217796 Forward-Port-Of: odoo/enterprise#98875
This update corrects how invoice and credit note amounts are handled when storno is enabled. When users switch between an invoice and a refund, the values now stay in the proper debit or credit position and only the sign changes, preventing incorrect amounts.
Original PR description
This commit fixes the amounts of move lines when converting from invoice to credit note and vice versa when storno is enabled. Previously, when converting from invoice/credit note, the amounts remained negative and switches from debit/credit. The quantities should remain in same debit/credit position and only change sign as I switch from invoice/credit note. task-5226311 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#234027
This change fixes WebSocket timeout handling so stalled or unresponsive connections are detected and closed properly. It improves reliability by making sure the system does not leave broken connections open, which helps prevent communication issues for users.
Original PR description
This PR fixes several issues with WebSocket timeouts: - Waiting for more than one response was not handled properly, resulting in missed timeouts. - The closing handshake did not strictly follow the RFC when initiated on the server side (it closed without waiting for the other peer). - Close timeouts were not enforced (the connection was not terminated when the other peer did not respond to the close frame). Forward-Port-Of: odoo/odoo#236016 Forward-Port-Of: odoo/odoo#234881
Italian POS receipts can now be reprinted from past orders correctly. Previously, selecting an older order could print the last receipt instead, which caused confusion and incorrect customer copies.
Original PR description
before this commit, when trying to reprint a past order it would not work. Instead it would print the last order no matter what order is selected. Steps to reproduce: 1. setup an DB with an italian…
before this commit, when trying to reprint a past order it would not work. Instead it would print the last order no matter what order is selected. Steps to reproduce: 1. setup an DB with an italian POS 2. make 2 sales with a different product (easier tracking) 3. open the "orders" view 4. try to reprint the ticket of the firt order result: the receipt of the second order is printed the reason for this is that we were using the printer's built in command "printDuplicateReceipt" which is inteded for printing the very last receipt. With this commit, we changed the behavior and invoke another printer command. That command is meant to reprint any receipt, based on the provided reference. After this commit, trying to print any past receipt will print that exact receipt. IMPORTANT NOTE: In theory, the printer command can reprint any number of receipts. We decide that we will only use it to reprint the one receipt selected by the user. This moves the complexity of parsing date strings and ranges to the command component and therefore will keep the rest of the code cleaner. opw-5008702 opw-4882480 Forward-Port-Of: odoo/enterprise#96122
This change makes Stripe-related payment errors visible to cashiers in the Point of Sale instead of being hidden. It helps users understand why a card payment failed and reduces confusion during checkout.
Original PR description
Before this commit: =================== Previously, Stripe-related RPC calls used `silentCall`, which suppresses backend errors and prevents them from being displayed in the POS UI. As a result, users were unable to see important validation or API failure messages coming from the server After this commit: ====================== Use `call` instead of `silentCall`. Using `call` allows backend exceptions and validation errors to be propagated to the POS frontend, ensuring that the user receives clear feedback when a Stripe request fails. Task-4976972
This fix removes an overly strict company check that blocked adding a user to a Sales Team when the team belonged to a company the user could access, but which was not their default company. It improves multi-company usability and prevents unnecessary errors when assigning team members.
Original PR description
### Steps to reproduce the issue: (Easier to reproduce client side with CRM installed) 0. Install crm 1. Create Second Company 2. Create New User with Current Company as Default Company and Second…
### Steps to reproduce the issue: (Easier to reproduce client side with CRM installed) 0. Install crm 1. Create Second Company 2. Create New User with Current Company as Default Company and Second Company in Allowed Companies 3. Create CRM Team belonging to Second Company 4. Add New User to Members of CRM Team 5. Receive error: > [New User] belongs to company [Current Company] and "Sales Team" (crm_team_id: [CRM Team]) belongs to another company. ### Explanation: `crm.team.member` is created when adding `res.users` to `crm.team.member_ids`. Contrary to `res.users`, a company_check is done when linking `crm.team` and `crm.team.member` together. `crm.team.member.company_id` is related to `user_id.company_id` and, in the case above, does not match `crm.team.company_id`, raising an error because of it. ### Fix reasoning: Removing restriction, as we want to avoid other multi-company issues by changing the behaviour. opw-4214192 --- @nd-dew note: Situation recap  So it was proposed to modify the field definition, seems to me that removing `check_company` from the field definition is a legal move, since it is an ORM level constraint (doesn't change db schema). However looking at the tests it seems like this is desired limitation. Note that https://github.com/odoo/odoo/pull/171079 introduced checking for allowed companies, but the **default company** still takes priority. Forward-Port-Of: odoo/odoo#189441
This fix ensures that when staff transfer, merge, link, or unlink tables, the kitchen preparation screens are updated right away. It also prevents duplicate preparation records when orders are merged or linked and some items are cancelled, helping keep POS and kitchen information consistent.
Original PR description
Task: [#5005179](https://www.odoo.com/odoo/1737/tasks/5005179) --- When executing table actions such as transfer, merge, link, or unlink, the related Preparation Displays (PDIS) were not being updated. This caused inconsistencies between the POS orders and the kitchen screens. Also, when merging or linking orders and cancelling some lines, a new `pdis_order` was created instead of reusing the existing one. This fix ensures that PDIS are correctly synchronized and notified on any table actions.
This fix keeps the kitchen preparation screens in sync when staff transfer, merge, link, or unlink tables in POS. It also prevents duplicate preparation records when orders are combined and some lines are cancelled, reducing mismatches between the cashier view and the kitchen display.
Original PR description
Task: [#5005179](https://www.odoo.com/odoo/1737/tasks/5005179) --- When executing table actions such as transfer, merge, link, or unlink, the related Preparation Displays (PDIS) were not being updated. This caused inconsistencies between the POS orders and the kitchen screens. Also, when merging or linking orders and cancelling some lines, a new `pdis_order` was created instead of reusing the existing one. This fix ensures that PDIS are correctly synchronized and notified on any table actions.
This change blocks live chat visitors from initiating calls, closing a gap in the server-side protection. It helps ensure only allowed users can start calls, improving control over customer interactions and avoiding unwanted call requests.
Original PR description
In [1], we fixed an issue where the start call button would be visible to portal partners. We do not want visitors to initiate calls on live chats. However, there also is a guard in the `rtc` controller which only checks that public users cannot start calls. The server code should also be adapted to properly ensure no live chat visitor can start a call. [1]: https://github.com/odoo/odoo/pull/236272 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 fix restores the proper writable mode when validating Wi‑Fi settings. As a result, configured Wi‑Fi details are saved correctly and remain available after the device restarts.
Original PR description
In odoo/odoo#233813, the writable context was mistakenly removed. This commit adds it back to ensure Wi-Fi configuration is saved after reboot. Forward-Port-Of: odoo/odoo#234293