Wednesday, July 23, 2025
21 changes · 18.0
Enhancements to existing features
The Oman localization now separates import supplier invoice bases from customs VAT, matching local VAT treatment more accurately. This helps businesses record import-related VAT and reporting amounts in the right accounts and tax grids.
Original PR description
To align with Omanian VAT treatment of imports, split the 5% EX tax into two: - "5% EX ONLY B" captures supplier invoice base (0% tax, affects base only). - New "5% EX ONLY" captures customs VAT (100% tax incl., with VAT Input account). Also removed VAT Input account & tax grids "+6b_T" from "5% EX ONLY B". task-id: 4909498 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The French invoice report layout has been adjusted to improve readability when many details are shown, such as sales references, delivery addresses, incoterms, customer addresses, and operation types. This helps users review invoice information more easily without crowded or poorly spaced sections.
Original PR description
Backport of: https://github.com/odoo/odoo/commit/7f93cd1c82b0f0250b3f19e4b408775fb211482a This commit https://github.com/odoo/odoo/commit/d10174e49759a58058aed6c44026060a4d293cc3 made a change in the report invoice information block and changed the class to only use col which was not changed in the french localisation. Adapted the layout to be more readable by using proper spacing and column sizing when displaying a lot of information (Sales reference, delivery address, incoterm, customer address, operation type). Task ID: 4555856 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Canadian localization now reflects Nova Scotia's Harmonized Sales Tax reduction from 15% to 14% effective April 2025. This keeps tax calculations, reporting groups, and related accounting setup aligned with current legal requirements while preserving the existing 15% setup for provinces that still use it.
Original PR description
Following a change in April 2025, Nova Scotia's Harmonized Taxes (HST) has been changed from 15% to 14%. As such new taxes, accounts, and groups had to be added to account for this change. As this is only for Nova Scotia and none of the other provinces we cannot archive the taxes and groups since New Brunswick, Newfoundland, and Labrador still use it. task-4937159 Legal reference: https://www.canada.ca/en/revenue-agency/services/tax/businesses/topics/gst-hst-businesses/charge-collect-which-rate.html Forward-Port-Of: odoo/odoo#219117
Resolved issues and error corrections
Point of Sale invoices now use the bank account configured on the selected payment method when available. This prevents invoices from incorrectly showing the company's default bank account, helping ensure customers receive the right payment details.
Original PR description
When generating an invoice for a PoS order we were never using the bank account set on the payment method, but always the one set on the company partner. Steps to reproduce: ------------------- * Create two bank account A and B * Set the bank account A as the company partner bank account * Set the bank account B on any payment method journal * Open PoS and create a new pos_order * Go to the payment screen and check the invoice button * Pay using the payment method linked to bank account B > Observation: The generated invoice will use bank account A Why the fix: ------------ We first try to use the bank account set on the payment method journal if none is present we fallback on the one set on the company partner. opw-4705497
This update corrects how Odoo decides whether website pages and partner records can be published, so users see publish options that better match their actual access rights. It also improves related website behavior and tests for databases without demo data, reducing confusing access warnings when publishing content.
Original PR description
*: website_crm_partner_assign, website_customer, website_membership, website_partner Commit [1] (alongside commits [2] and [3]) introduced a new context key `can_publish_unsudo_main_object` with the…
*: website_crm_partner_assign, website_customer, website_membership, website_partner Commit [1] (alongside commits [2] and [3]) introduced a new context key `can_publish_unsudo_main_object` with the goal of properly computing `can_publish` without sudo... but it missed using it properly. The related test was passing... because it was also not properly written. This commit fixes the issue by using the context key at the proper places. However, this limits the fix to pages and partners at the moment as the bug is not critical in stable versions. It however fixes a test while run in no-demo (which becomes the norm in later versions). With that in mind, this also changes the view (by *adding* things to be as stable as possible) to go around the use of the context key and make new databases properly compute `can_publish` for all records type. Old databases will keep the old behavior for some models, which leads to displaying the "Publish" button but not be able to use it (access right warning). [1]: https://github.com/odoo/odoo/commit/d47d824fc484e1592fc4af8d0d378d5a4a579550 [2]: https://github.com/odoo/odoo/commit/1a83b2508b9383e2b7df192f8641751f71f852da [3]: https://github.com/odoo/odoo/commit/436a167dedb2ed008bcb88e8a4eccafc8d20812c Related to runbot-161791 Forward-Port-Of: odoo/odoo#219636 Forward-Port-Of: odoo/odoo#219389
Users limited to a company branch can now open the Chart of Accounts without being blocked by an access error. This removes an unnecessary interruption for branch accounting users while preserving company access rules.
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-4730107Imported Italian vendor bills now avoid adding a product's default tax on top of the tax specified in the XML. This prevents duplicate or incorrect taxes on supplier bills, improving accounting accuracy and reducing manual corrections.
Original PR description
**Issue**: Importing a vendor bill from XML may lead to two taxes being applied to the same product if: - The product exists in the database. - It matches a product reference in the XML. - The…
**Issue**: Importing a vendor bill from XML may lead to two taxes being applied to the same product if: - The product exists in the database. - It matches a product reference in the XML. - The product has a default service tax (e.g. 22% S). **Steps to reproduce**: - Create a product with a service tax (22% S). - Ensure you have a test XML referencing that product (see tests for an example). - Go to Accounting > Vendors > Bills. - Upload the XML file. - Observe that the product line has two taxes: 22% G (from XML) and 22% S (from product). **Cause**: Two taxes are applied because: - The tax defined in the product: [Line 875 in `account_move_line.py`](https://github.com/odoo/odoo/blob/767341d4ec6aaa4fbd379827da4baf04e561eb32/addons/account/models/account_move_line.py#L875) which is triggered by [L1285C1-L1288C30 in `account_move.py`](https://github.com/odoo/odoo/blob/e705690d2340245a0d18b7e76347575dde9ea2be/addons/l10n_it_edi/models/account_move.py#L1285C1-L1288C30) - Then, the XML tax is also added: [L1012C1-L1016C44 in `account_move.py`](https://github.com/odoo/odoo/blob/e705690d2340245a0d18b7e76347575dde9ea2be/addons/l10n_it_edi/models/account_move.py#L1012C1-L1016C44) An attempt to reset the `tax_ids` after setting the product is already present: [Line 1319](https://github.com/odoo/odoo/blob/e705690d2340245a0d18b7e76347575dde9ea2be/addons/l10n_it_edi/models/account_move.py#L1319), but it is ineffective because the original `tax_ids` are re-applied afterward, dues to side effects. **Solution**: There are two possible ways to fix this: - Make sure `move_line.tax_ids = []` works as intended - Clean the `move_line.tax_ids` recordset. Chose the second option as it's simpler and avoids modifying unrelated code **Additional Notes**: The tax extracted from the XML does not take into account whether the product is a good or a service. For example, if the tax rate is 22%, the logic return taxes[0] if taxes else taxes will always return 22% G, even if the product should be taxed as 22% S. To solve this, an extra domain filter is added based on the product type to ensure only applicable taxes are considered. opw-4844469
This fix prevents configuration updates from accidentally overwriting each other when two hardware-related processes try to edit the same settings file at the same time. It helps keep device and server settings reliable during operations such as updates or checkouts.
Original PR description
In the following scenario, changes to the odoo.conf file could be lost: 1. A long-running process enters a `writable()` block (e.g. git checkout) 2. While it is still running, another process wants…
In the following scenario, changes to the odoo.conf file could be lost: 1. A long-running process enters a `writable()` block (e.g. git checkout) 2. While it is still running, another process wants to update the conf file but gets blocked waiting for `writable()`. However it has already loaded the entire `odoo.conf` file into memory ready to write it back. 3. The first long running process now makes a change to the `odoo.conf` file. In the case of the checkout process, it is changing the `server_wide_modules` key. 4. The first process finishes and releases the `writable()` lock. 5. The second process now writes to the conf file, however it is using the now-stale version it held in memory from step 2. 6. The original changes to the conf file are lost. The fundamental issue is that the `update_conf` function is loading the conf file into memory too early. To fix this, we aquire the `writable()` lock first, and then we can load the conf file knowing that it won't change until we are done. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219928
This change restores the intended behavior for product pricing in Point of Sale when dynamic product variants are used. It helps ensure cashiers and customers see the correct list price during sales, reducing pricing mistakes at checkout.
Original PR description
This reverts commit 8c8449f51d5e327ccd2e4bb7c3c4868d51c6d619
Customers can no longer complete checkout with products that were archived or unpublished after being added to their cart. When a product is archived, it is removed from open carts, preventing invalid orders and reducing checkout issues.
Original PR description
Fix issue where customers could complete purchases of products that where archived or unpublished after being added to cart but before checkout completion. => Step to reproduce bug : - Install website_sale. - Add a product to the cart. - (In an other window) archive the product. - finish the buy from the cart. (don't reload the cart or the product will be gone) => Cause: The bug originate from: https://github.com/odoo/odoo/blob/2d7bb960b00bfeae3e6ab8c0367237f3b08271cb/addons/website_sale/controllers/main.py#L1781-L1793 There is no check up during the last part of the transaction to verify if the product is still available. => Fix: Erase from the product from all cart when it's archived opw-4829872
Early payment discounts are now applied based on the discount deadline saved on the invoice when it was posted, rather than recalculating it from payment term settings that may have changed later. This ensures customers receive the discount terms originally communicated to them and prevents valid discounts from being missed during payment registration or reconciliation.
Original PR description
When a payment term with early payment discount is used on invoice the discount date is set on the payment term line based on the actual configuration of the payment term. When the invoice is posted,…
When a payment term with early payment discount is used on invoice the discount date is set on the payment term line based on the actual configuration of the payment term. When the invoice is posted, this date must not change anymore as it usually is what is communicated to the partner in order to apply EPD. However, if the payment term's delay for discount is modified, the discount date from the move line was not taken into account by the payment register wizard or by the reconciliation widget, as it was instead recalculating a discount limit date, based on the configuration of the payment term at the time the payment is registered on Odoo. Make sure it is the discount date that is stored on payment terms' account move line that is used to define if an early payment discount has to be applied. OPW-4895365 Description of the issue/feature this PR addresses: On runbot, create a new payment term with an early payment discount (eg 10% at 15 days, balance at 30 days). Create a customer invoice with a invoice line (eg 100 USD) for any customer with this payment term and set the date to 10 days before today. Post the invoice, you can see on the payment term line that the discount is valid until 5 days after today. Modify the payment term to set 10% at 5 days. If you go back to the invoice, you'll notice the discount date is still 5 days after today which is fine since this is what was communicated to the customer Current behavior before PR: Register a payment on this invoice and you'll notice the EPD is not applied because it gets the date from the actual configuration of the payment term instead of the date stored on the invoice's payment term line. Desired behavior after PR is merged: Register a payment on this invoice must apply the EPD as it is still valid based on the invoice's payment term line. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a Point of Sale pricing issue where product variants with a zero base price could have their added variant price counted twice. Businesses using variants in POS will see more accurate checkout prices and fewer pricing discrepancies.
Original PR description
When variants have `list_price = 0` it counts the extra price twice as it is considered false in the condition but if set to 0 it should be taken into account. Initial commit: https://github.com/odoo/odoo/commit/8c8449f51d5e327ccd2e4bb7c3c4868d51c6d619 opw-4963530
This fix stops Odoo from creating unnecessary zero-value stock valuation entries when barcode-based receipts or deliveries create a backorder. It keeps inventory valuation cleaner and avoids confusing accounting records that have no business impact.
Original PR description
Description of the issue/feature this PR addresses A stock valuation layer (SVL) with zero quantity and zero value is created when receipts or deliveries are processed with the backroder from the barcode interface. Current behavior before PR When processing an incoming shipment through the barcode view, if part of the quantity is assigned to an inventory loss account and the remaining quantity leads to a backorder, the system generates an SVL with quantity = 0 and value = 0. Desired behavior after PR is merged. The system should not create a stock valuation layer in such cases. PFA behaviour proof from the runbot: https://github.com/user-attachments/assets/d0cf2856-ab32-4e03-ba97-bf7aa4967df2 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Payments using withholding tax now keep the related partner on the generated journal items. This improves accounting traceability and helps reports, audits, and reconciliations show complete partner information.
Original PR description
Fixes an issue where the partner is missing from the journal items generated by the withholding tax on payment system. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
CRM lost leads can now be shown without broadly disabling active-record filtering across related data. This prevents archived activities from being considered when calculating lead deadlines, improving accuracy for sales teams.
Original PR description
The JS for CRM leads had a line adding 'active_test: 0' to the context of the action in order to enable the viewing of lost leads. This resulted in disabling all tests of the field, eventually leading to incorrectly using deadlines from archived activities. This PR removes that behaviour and adds a domain entry to the corresponding view, enabling the action to display lost leads without affecting other queries. This does mean that showing lost leads is the default behaviour of the particular view, but I feel that's more of an improvement than detriment, since leads without activities should't factor in anyway. Related tickets: https://www.odoo.com/odoo/my-support-tasks/4923645 https://www.odoo.com/odoo/project/49/tasks/4946120 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents reconciliation from failing when batch payments involve currency rates that changed between the payment date and reconciliation date. Businesses can now validate affected bank reconciliations without unbalanced accounting entries being created.
Original PR description
Steps to reproduce: - Have the main company in USD - Have 3 different currency rates in date 1, 2 and today - Create a Vendor Bill in EUR in date 1 - Make Payment (EUR) in date 1, it should not have…
Steps to reproduce: - Have the main company in USD - Have 3 different currency rates in date 1, 2 and today - Create a Vendor Bill in EUR in date 1 - Make Payment (EUR) in date 1, it should not have an associated move - Create a Bank transaction, at date 2, matching the payment amount in EUR Bank Journal - Make a batch payment including the created payment - Open bank reconciliation of EUR Bank journal - Select the transaction and the batch payment - Validate Issue: User Error will raise ``` The move (OTR/2017/00001) is not balanced. The total of debits equals $ aaa and the total of credits equals $ bbb You might want to specify a default account on journal "Bank other currency" to automatically balance each move. ``` This occurs because when retrieving the exchange rate values, amounts are converted using the payment values, computed at payment date. Later on, when we aggregate payment amounts, we convert manually the result without specifying a date, creating an issue in case the reconciliation date occurs after a rate change
The Chilean electronic factoring AEC file now always reports the total amount in Chilean pesos, even when the invoice uses another currency. This prevents incorrect tax document values and helps ensure compliant electronic submissions to SII.
Original PR description
In this bug, when a currency other than CLP is selected in invoicing, the generated aec has MntTotal tag with the rate of selected currency, while it must always be in CLP. To reproduce the bug: 1- Create a database with invoice app and a Chilean company 2- Create an invoice with document type of 34 3- Choose a different currency than CLP 3- Click on Send Now to SII and Create AEC 4- Click on Yield Entry smart button 5- Download generated AEC xml file 6- You can see the value of MntTotal is in selected currency which is wrong related: https://github.com/odoo/enterprise/commit/4e97c5d008c2879c5d014203fafc2c125d6c5ae7 opw-4830957
Fixed an issue where confirming an upsell with a non-recurring product could incorrectly increase the quantity on the original subscription. This protects subscription records from unintended changes and keeps customer billing quantities accurate.
Original PR description
**Steps to reproduce:** - Install `sale_subscription` - Create a recurring product (P1) and a non-recurring product (P2) - Create a Sale Order (S1) with P1 (quantity > 0) and confirm it - Create an…
**Steps to reproduce:** - Install `sale_subscription` - Create a recurring product (P1) and a non-recurring product (P2) - Create a Sale Order (S1) with P1 (quantity > 0) and confirm it - Create an upsell of S1 (new child order S2) - In S2, edit the P1 line, and select P2 - Set quantity > 0 for P2 - Confirm S2 **Issue:** After confirming the upsell order (S2), the quantity of P1 on the original subscription (S1) is incorrectly increased by the quantity of P2 from S2. The _compute_parent_line_id method did not reset the parent_line_id when the product was not a subscription Product, which caused it to incorrectly update the subscription This issue is present in all three versions: **16.0, 17.0, and 18.0**. **Solution:** Reset parent_line_id to False if the product is not a subscription product to prevent incorrect subscription updates. [opw-4638955](https://www.odoo.com/odoo/project.task/project.task/4638955) Forward-Port-Of: odoo/enterprise#90619 Forward-Port-Of: odoo/enterprise#88282
Ecuador electronic invoicing now handles empty or incomplete responses from the tax authority without crashing. This helps users process invoices more reliably when the external SRI service returns unexpected data.
Original PR description
The system will crash when we receive nothing in `response` and also tryig to retrieve values from response. **Error:-** `TypeError: 'NoneType' object is not subscriptable` **Root Cause:-** - While…
The system will crash when we receive nothing in `response` and also tryig to retrieve values from response. **Error:-** `TypeError: 'NoneType' object is not subscriptable` **Root Cause:-** - While we are in `EC Company`. - When we click `Process Now` on the invoice. It will call `button_process_edi_web_services` method. And while in execution when at [1], `move.company_id._l10n_ec_is_demo_environment()` is `False`, then it calls `_l10n_ec_send_document` method. - While submitting electronic invoices to SRI, the method `_l10n_ec_get_client_service_response_new()` sometimes returns `None` . - It may also lack expected keys like 'estado' or 'comprobantes', depending on SRI’s behavior. [1] https://github.com/odoo/enterprise/blob/ce9eed675db4de3bcd1b283688c5c44d2e1ecf12/l10n_ec_edi/models/account_edi_format.py#L425-L428 **Solution:-** - Wrapped the access to response and its keys inside a `try...except` block that catches:- - `TypeError`: for cases where the response is `None`. **Sentry - 6708486009, 6728767866**
When creating a credit note for a vendor bill in Peruvian electronic invoicing, Odoo now shows the appropriate purchase journals instead of sales journals. This prevents users from selecting the wrong journal and helps keep vendor credit note accounting entries accurate.
Original PR description
**Issue** When creating a credit note for a vendor bill, the journal selection dropdown incorrectly shows only sales-type journals instead of purchase-type journals. **Steps to Reproduce** 1. Install the modules: Accounting, l10n_pe, and l10n_pe_edi. 2. Navigate to Accounting > Vendors > Vendor Bills. 3. Open a posted vendor bill and click Credit Note. 4. Open the journal dropdown. 5. Notice that only sales journals are shown. **Root Cause** The journal field's domain was hardcoded to type = 'sale' in the inherited view. This forces the dropdown to show only sales journals, even when reversing a vendor bill. **Fix** Removed the hardcoded domain from the XML view. This allows Odoo to apply its standard logic for journal filtering, which correctly selects purchase journals when reversing vendor bills. Opw-4913997 Forward-Port-Of: odoo/enterprise#90445
Appointment booking links with multiple assigned resources now keep the correct filters when users move back through the progress bar. This prevents error pages during public bookings, making shared invitation links more reliable for customers.
Original PR description
Fixes two issues regarding the buttons on the front-end progress bar in the appointment flow, when using an invitation link. Commit messages give steps to reproduce.
1. Fix 500 error when clicking 'Date & time' with more than one resource / user configured on the invitation link.
2. Fix 403 error when using the operator ('meeting' actually) step button with more than one specific resource in the invitation link.
Task-4897098
Forward-Port-Of: odoo/enterprise#88521