Monday, August 4, 2025
17 changes · saas-18.3
New functionality added to Odoo
A new Cambodia reporting module adds standard financial reports, including the balance sheet and profit and loss statement, plus WT003 withholding tax export support. This helps Cambodian businesses meet local reporting needs more directly within Odoo.
Original PR description
Adds basic reporting module for Cambodia, including: - Balance sheet - Profit & loss - WT003 export task-4383330 Forward-Port-Of: odoo/enterprise#91562 Forward-Port-Of: odoo/enterprise#89831
Resolved issues and error corrections
In multi-website setups, customers will now only see and use payment providers configured for the website they are visiting. This prevents confusion and reduces the risk of payments being started with providers that are not meant for that site.
Original PR description
In a multi-website environment, payment providers are often configured specifically for each website using the `website_id` field. While the checkout page (`/shop/payment`) correctly filters providers by the current website, other routes such as `/my/payment_method` or `/payment/pay` flows do not apply this filtering consistently. This patch ensures that the `website_id` constraint on payment providers is respected across all relevant flows, improving consistency and preventing users from seeing or using providers that are not available for their current website. Without this patch, users may see or select payment providers that are not intended for their site, leading to potential confusion, incorrect transactions, or access to providers that are not supported on the current website. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218985 Forward-Port-Of: odoo/odoo#218089
This update brings the spreadsheet component up to its latest maintenance version and fixes an issue where chart-related extensions could load too late. Users should see more reliable spreadsheet chart behavior, with a small supporting improvement to demo error handling.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/9499d989e [REL] 18.3.15 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/8c41a1bc3 [FIX] chart: chartJS extensions loaded too late [Task: 4954034](https://www.odoo.com/odoo/2328/tasks/4954034) https://github.com/odoo/o-spreadsheet/commit/f921fe1d7 [IMP] demo: Add error handler [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Mehdi Rachico (mera) <mera@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com>
Updating an Odoo chart in a spreadsheet now keeps the spreadsheet's global filters applied. This prevents chart data from unexpectedly ignoring shared filters, helping users see consistent and accurate reporting after edits.
Original PR description
The global filters were not re-applied when updating an oodo chart domain. Task: [4965683](https://www.odoo.com/odoo/2328/tasks/4965683) 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#221534 Forward-Port-Of: odoo/odoo#220764
Past-date inventory reports now avoid counting internal warehouse transfers as customer deliveries. This prevents available stock from being overstated for products using multi-step delivery routes, making historical stock reports more reliable for operations and planning.
Original PR description
Before this commit, the available quantity was incorrect when using the "Inventory At" feature with a past date in the inventory report For products using multi-step delivery routes, the…
Before this commit, the available quantity was incorrect when using the "Inventory At" feature with a past date in the inventory report For products using multi-step delivery routes, the `_compute_quantities_dict()` method incorrectly treated internal moves as outgoing moves As a result, the same outgoing quantity was added multiple times, leading to an overestimation of the available stock This commit adds a filter to the `domain_move_out_done` domain used for past dates, excluding internal moves based on `location_dest_usage`` ## Steps to reproduce: - Create a new product - Active the multi-step routes in Settings - Set the Warehouse's Outgoing Shipments to Pick, Pack, then Deliver - Create a RFQ for 100 products and Receive Products - Create a Quotation for 20 products - Validate each delivery steps - Go to Inventory -> Report -> Stock - Click on Inventory At - Set the date to 2025-01-01 - Search for your product - The `In Hand` quantity should be 0 but is 40 before the fix opw-4848473 Forward-Port-Of: odoo/odoo#217732
Branch-only users can now open the Chart of Accounts without being blocked by an access error. This ensures accounting configuration remains available to users who are correctly limited to a branch, avoiding disruption in multi-company setups.
Original PR description
#### Steps to reproduce
- Create a branch in a company that has a CoA installed.
- Create a user that only has access to the branch
- Login as the user
- Try to open Accounting > Configuration > Chart of Accounts
- You get an AccessError in your face.
#### Analysis
- When calling `web_search_read` on `account.account`, the `company_ids` field is loaded into cache by `search_fetch`.
- Since the user does not have access to the parent company, the parent company will not be in the account's `company_ids` in cache.
- When calling `_check_access` in `fetch`, the `filtered_domain` (even though it is called behind `sudo`) will use the `company_ids` in cache to determine whether the accounts can be accessed, triggering the `AccessError`.
#### Solution
- Set `depends_context=('uid',)` on the `company_ids` field to keep separate sudo / non-sudo caches for the field.
opw-4730107
Forward-Port-Of: odoo/odoo#220294
Forward-Port-Of: odoo/odoo#217752Fixed an issue where the website event “Registered” banner could appear or disappear inconsistently because cached event pages reused the wrong display state. Visitors now see more reliable event registration status across sessions and refreshes.
Original PR description
We had an inconsistent display of the Registered banner for events on the website. The banner would appear or disappear randomly, regardless of whether the user was logged in or not. Steps to reproduce: ------------------- - start the server - log in as a user that does not have access to website editor - get a ticket for an event - go to the event list -> event is marked register - go to the event page in a new browser session (incognito) -> event is still marked register > Observation: On refresh, Registered green banner on events appear and disappear randomly Why the fix: ------------ Keys that are not stored on the table of event should be added to the cache key to force a re-render when they change, or t-nocache should be used opw-4819021 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220053
This fix prevents an error when users receive almost all subcontracted goods and choose not to create a backorder for the small remaining quantity. The system now correctly cancels the leftover manufacturing order instead of trying to set it to zero, allowing the receipt process to finish smoothly.
Original PR description
Steps to reproduce the bug: - unarchive the subcontracting route - Create a storable product C1 with the following route: - Buy + Resupply Subcontractor on Order - Create a storable product P1 with:…
Steps to reproduce the bug:
- unarchive the subcontracting route
- Create a storable product C1 with the following route:
- Buy + Resupply Subcontractor on Order
- Create a storable product P1 with:
- BoM type: Subcontracting - Type: subcontracting - Subcontractor: Azure Interior - Component: C1
- Create a purchase order for 20 units of P1
- Confirm the purchase order
- Validate the resupply transfer
- Go to the receipt of P1
- Record 19.8 units of the component (ignore the remaining 0.2)
- Validate the receipt with no backorder
Problem:
A user error is raised:
```
The operation cannot be completed: The quantity to produce must
be positive!
```
When clicking No Backorder, the `process_cancel_backorder` method is
called:
https://github.com/odoo/odoo/blob/18.0/addons/stock/wizard/stock_backorder_confirmation.py#L75-L77
This triggers the validation of the picking, so updates the subcontract
order quantity:
https://github.com/odoo/odoo/blob/16a1d9b19b8b07435a9c4b4db2cad3c1e37e4e17/addons/mrp_subcontracting/models/stock_picking.py#L53
At this stage, we check whether it should reduce the MO quantity or
cancel the order entirely. However, the logic compares the quantity to
remove against the initial order quantity without using `float_compare`,
which leads to minor rounding differences. This results to update the
MO quantity to zero instead of canceling it, which then triggers an SQL
constraint error because the MO quantity cannot be zero:
https://github.com/odoo/odoo/blob/e7e2a088495eed3c2886a69054af689c01628f32/addons/mrp_subcontracting/models/stock_move.py#L304-L311
https://github.com/odoo/odoo/blob/29d1f637d3ec6f3ebb218d103001a6182af1b8a4/addons/mrp/models/mrp_bom.py#L93-L95
opw-4905031
Forward-Port-Of: odoo/odoo#221451
Forward-Port-Of: odoo/odoo#219650Applying a partnership grade to a company or contact now affects only that specific partner, not its related child contacts. This restores the intended behavior and prevents unintended partnership status changes on linked contacts.
Original PR description
This reverts commit 9d1857e so that applying a grade no longer adds it to the children of the partner as well. TASK-4985900
The activity menu now shows only ongoing activities, so completed items no longer remain visible as late or pending work. This reduces confusion for users and keeps activity counts aligned with what still needs attention.
Original PR description
**Current Behavior:** When users click on the activities icon, both active and archived activities are displayed. This can lead to confusion, as users expect to see only ongoing (i.e., pending or…
**Current Behavior:** When users click on the activities icon, both active and archived activities are displayed. This can lead to confusion, as users expect to see only ongoing (i.e., pending or overdue) activities. **To reproduce this issue:** 1) Install the Contacts module and create two partner records. 2) Create a late activity for each of the two records. 3) Mark one activity as Done by clicking the DONE button. 4) Open the Late Activities for Contacts from the top-right corner. **Issue:** Even after marking one activity as done, both activities are shown. This results in two late activities appearing, instead of just one active one. **Cause:** When an activity is marked as Done, the `action_feedback` method is called via `markAsDone`. https://github.com/odoo/odoo/blob/7fa14f9b8e2e886243d68d8e04b0798cd801615b/addons/mail/static/src/core/web/activity_model_patch.js#L44-L48 This method archives the corresponding `mail.activity` record. https://github.com/odoo/odoo/blob/7fa14f9b8e2e886243d68d8e04b0798cd801615b/addons/mail/models/mail_activity.py#L556-L557 But because of the recent changes from the below-mentioned commit, we are now showing the archived records. https://github.com/odoo/odoo/commit/f05c2f9c7942943140c98174f8c86917fc72fc9b#diff-cacfccf65b597df222b166a1c6d80d125bb75a1f2aeabf2eed2e88e189c144f0R59 However, this change was intended to display archived model records that still have active activities, not to show archived or completed activities themselves. **Solution:** Apply a domain filter to ensure that only active (non-archived) activity records are displayed. opw-4946120
The French POS inalterability check report now loads only the data it needs when verifying order integrity. This greatly improves performance and reduces memory pressure for businesses with large volumes of POS orders, helping audits complete reliably instead of timing out.
Original PR description
### Problem: Pos inalterability Check report is specific to French localization. It verifies whether POS orders have been modified by computing a hash of the order data and comparing it to the previously stored hash. _compute_string_to_hash method is computationally expensive and leads to significant performance and memory issues when processing more than 50,000 orders. ### Benchmark Before: | Orders | Time | Memory | |--------|---------|--------| | 1k | 15s | 10MB | | 10k | 77s | 81MB | | 20k | 102s | 110MB | | 40K | timeout | 256MB | After: | Orders | Time | Memory | |--------|------|--------| | 1k | 5s | 7MB | | 10k | 9s | 42MB | | 40K | 20s | 174MB | | 100k | 42s | 550MB | | 330k | 126s | 1.2GB | ### Solution: Fetching only required fields to compute _compute_string_to_hash opw-4901994 Forward-Port-Of: odoo/odoo#221218 Forward-Port-Of: odoo/odoo#217348
Payment links for recurring sales orders now use the next invoice amount instead of adding past payments or transactions. This prevents customers from seeing incorrect payment amounts after previous subscription billing cycles.
Original PR description
Before this commit,when a payment link was generated for a recurring SO already invoiced, the default values of amount and amiunt_max would take into account all previous transactions. As a result, the amount would be badly computed as recurring order have many transactions (at least once or each period). This commit ensure to use the next invoice amount. taskid: 4352396 Forward-Port-Of: odoo/enterprise#83934
Bank reconciliation now preserves the original foreign currency amount when recalculated values are close enough, avoiding artificial one-cent differences caused by exchange-rate rounding. This helps invoices reconcile correctly and reduces unnecessary accounting discrepancies for multi-currency transactions.
Original PR description
The aim of this commit is to keep the original foreign amount currency if the computation ends up close enough to it. Before this commit: The reconciliation process was losing so much precision that…
The aim of this commit is to keep the original foreign amount currency if the computation ends up close enough to it. Before this commit: The reconciliation process was losing so much precision that it could mess up the reconciliation of one single invoice. After this commit: We keep the original amount as it is most probably the correct one. Context: With a rate of 1 US$ = 5.421327349 R$ and an invoice of 143.62 R$, we convert the amount in US$ which is 26.491668921649627 US$. As we have to round it for the accounting, we end up with 26.49 US$ as company currency amount, losing the rest of the decimals. During the reconciliation process, we convert back the US$ to R$ ending up with 143.61096147501 R$ that have to be rounded to 143.61 R$. This creates a difference of 0.01 R$ which surfaces later on. Chosen solution: As we still have the original currency amount and the rate, we are able to recompute the raw numbers and we are able to make "fairer" comparison between the amounts. If we can confidently tell that the amounts are close enough, we can just keep the original amount and prevent all those rounding errors to be taken into account. opw-4937508
Fixes several cases where importing WinBooks accounting files could fail because of account, tax, journal, or deprecation validation rules. This helps businesses complete accounting data imports more reliably, even when source files contain inconsistent references.
Original PR description
When importing a winbooks file the following issues and or inconsistencies may be found **Issue 1** We may import an account with CENTRALID 'V03' and code 45100000 Having this centralID means that it…
When importing a winbooks file the following issues and or inconsistencies may be found **Issue 1** We may import an account with CENTRALID 'V03' and code 45100000 Having this centralID means that it will be set as tax payable account id according to https://github.com/odoo/enterprise/blame/d8d4812414dba8825a1c785c29d00f7d0fd98360/account_winbooks_import/wizard/import_wizard.py#L174 However, this means it needs to be a `liability_payable` account with reconcile enable, in order to comply with the following check https://github.com/odoo/odoo/blame/ad6c9001b447f5ffebafe1581512f48708c7d746/addons/account/models/account_tax.py#L80 *Note* Even if we set it as liability_payable, the import may fail later on in case the same account is used in a sales move where those types of account are not allowed https://github.com/odoo/odoo/blame/1b657cf1e1ce43874a3ede307b2f8ad68216aa56/addons/account/models/account_move_line.py#L1247 A solution is to skip the `_check_payable_receivable` check for winbooks lines **Issue 2** Move line data may reference an unkown journal, causing a validation error because no journal is retrieved from the database and a move always need a journal **Issue 3** Account created during import may be marked for deprecation, which occurs at the end of the import process. However, if the account has been used in a tax repartition line, trying to set it as deprecated will raise an error. https://github.com/odoo/odoo/blame/2cdc41c012f637849ba030989ce928b6b1152e7e/addons/account/models/account_account.py#L1028 opw-4850314 Forward-Port-Of: odoo/enterprise#89426
This fixes partner commission and subscription partnership behavior so applying a grade to a company or contact no longer automatically applies it to related child contacts. It also restores the needed module dependency so partnership removal works correctly when installing partner commission.
Original PR description
This reverts commit 14001a8a0216750be0c897d0e1bf31fccfc51c6a so that applying a grade no longer adds it to the children of the partner as well. This commit also fix the issue of not having sale_subscription_partnership in the manifest of partner_commission, which results in the _remove_partnership method not working when installing partner_commission. TASK-4985900
This fix prevents barcode scanning from failing on iOS when the confirmation sound is unsupported or blocked by browser permissions. Users can continue scanning normally, while any sound playback issue is safely logged instead of interrupting the workflow.
Original PR description
Issue ----- On iOS 18.5, users can get a `NotSupportedError` when trying to scan a barcode from the (barcode) main menu. Steps to reproduce ----- - Open barcode - Click the center scan button - Scan…
Issue ----- On iOS 18.5, users can get a `NotSupportedError` when trying to scan a barcode from the (barcode) main menu. Steps to reproduce ----- - Open barcode - Click the center scan button - Scan a barcode --> Traceback Discussion ----- There are 2 issues occuring here. 1. We play either an ogg or mp3 file. However, the method to know if the format is supported by the browser returns one of 'probably', 'maybe', ''. https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType#return_value This means that when we do https://github.com/odoo/enterprise/blob/70e5013ea022ed04ff27db71ea3ecccb55ae1f70/stock_barcode/static/src/main_menu/main_menu.js#L37 We might end up using ogg even if the browser doesn't actually support it, as 'maybe' is truthy. To reduce the risk of this happening, we can specify the codec as "vorbis" (all ogg files of Odoo are vorbis). This is already done in mail: https://github.com/odoo/odoo/blob/cd4c1d599ea9403ce3791e239ad765d946446a47/addons/mail/static/src/core/common/sound_effects_service.js#L46 2. The browser might not have the permission to play the sound. In such cases, the best we can do is try to play the sound and log potential errors. ----- Ticket: opw-4820022 Forward-Port-Of: odoo/enterprise#91158
Restaurant bookings made through the website now show the correct number of guests when opened in the PoS booking view. This prevents staff from seeing a misleading zero guest count and helps them prepare tables accurately.
Original PR description
Steps to reproduce: --- - Install `pos_restaurant`, `pos_appointment`, and `website` modules. - Book a table appointment via the website for X people. - Open the Restaurant PoS and go to the "Booking" tab. - Open the appointment created above. Issue: --- - The people count shows as 0, even though the appointment was booked for X people. Cause: --- - In version 18.3, a new field was introduced to track the number of people. - This field was not being populated when the appointment was created outside the PoS UI. Fix: --- - Ensure the new people count field is set correctly when the booking is not created from the PoS interface. task-4848208