Daily updates from Odoo
Tuesday, August 5, 2025
31 changes · saas-18.3
Resolved issues and error corrections
When multiple vendor bills are paid by check at the same time, each journal entry now keeps the correct check number in its label. This prevents accounting records from showing duplicated or misleading check references, making reconciliation and audit review clearer.
Original PR description
Steps to reproduce: 1. Install `accounting` and `account_check_printing` modules. 2. Configure a bank journal: - Enable the `Manual Numbering` option for checks. - Set an `Outstanding Payments…
Steps to reproduce: 1. Install `accounting` and `account_check_printing` modules. 2. Configure a bank journal: - Enable the `Manual Numbering` option for checks. - Set an `Outstanding Payments Account` for checks under the `outgoing payments` tab on the journal. - Ensure the Check Sequence is properly configured. 3. Create three vendor bills (two for the same vendor and one for a different vendor). 4. Go to the list view of vendor bills and select all three of them. 5. Click the `Pay` button and in the payment wizard: - Enable the `Group Payments` option. - Choose `Checks` as the payment method. - Confirm the wizard to register the payment. Observed Behavior: - Multiple payments are created simultaneously. - Each payment has its own check number (e.g., 0001, 0002), correctly assigned. - However, all the related journal entries (account.move) have journal item labels that incorrectly use the same check number (e.g., all journal items have label Check - 0001 instead of Check - 0001, Check - 0002, etc.). Issue: - Journal entries are created during payment creation `create()`, at which point the payments are still in draft state. - The check_number is only computed and the check sequence is incremented when the payment is posted `action_post()`. - As a result, all journal entries generated during draft state receive the same initial check number. Solution: - Override the `_get_trigger_fields_to_synchronize` method to include the `check number`, ensuring that any updates to the check number on a payment are also reflected in the related journal entries. opw-4886452 Forward-Port-Of: odoo/odoo#220150
This update restores the ability to edit media such as images even when they sit inside areas where text editing is disabled. It makes image replacement, transformation, toolbar actions, and keyboard deletion behave more consistently in the HTML editor.
Original PR description
Backport relevant commits from PR [1], as well as commit [2]. This allows us to use the editable media feature in 18.0. [1]: https://github.com/odoo/odoo/pull/209228 [2]: https://github.com/odoo/odoo/pull/186917/commits/1c7e05ca26a7fe5db4f7b5aa69c56c5811d20256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221798 Forward-Port-Of: odoo/odoo#220408
Bank reconciliation rules that only specify a matching amount can now be suggested correctly for statement lines. This helps accounting teams rely on automatic matching in more cases, reducing manual reconciliation work.
Original PR description
Before this commit, having a reco model with a match amount alone was never applied to statement line since the can_be_proposed field was False. This commit will add the match_amount to the compute notask-id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Survey timers now account for much smaller differences between a user's device clock and the server clock. This prevents surveys from being submitted too early or incorrectly blocked, making timed surveys more reliable and fair for participants.
Original PR description
Description of the issue/feature this PR addresses: This commit addresses early submissions of surveys due to timer expiry. Differences in server/client clocks can leave the survey in an incorrect…
Description of the issue/feature this PR addresses: This commit addresses early submissions of surveys due to timer expiry. Differences in server/client clocks can leave the survey in an incorrect state. Current behavior before PR: The server, seeing a submission come before the time limit that was triggered by the client timer, lets the survey continue. Clients are receiving error messages when trying to do more submissions, which bump against the cheating prevention. This is true if the client is "ahead" of the server. Currently, a difference would only be addressed if above 5 s. This is not enough as the client being "ahead" by 1 s can cause this issue. This was detected in real use. Looking at server logs has led me to this cause. Here's a diagram that could help understand the issue with the current behaviour: <img width="455" alt="Survey Timer bug" src="https://github.com/user-attachments/assets/1804f848-ad4b-4b8a-97fe-7562b76ea66c" /> The above diagram shows how, for a survey with a 30 min timer, a 1 sec difference between the clocks can lead to an early submission. Desired behavior after PR is merged: The fix here is to tighten when to apply the time difference to when it is above 500 ms. This should help avoid the early submission bug but conversely also not allow late submissions, even below 5 s, making the timer fair across users. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220431 Forward-Port-Of: odoo/odoo#207485
This fix prevents tiny currency rounding differences from creating unnecessary stock valuation entries on vendor bills. As a result, affected bills can be reset to draft when there is no real valuation change, improving reliability for purchases in foreign currencies.
Original PR description
**Current behavior:** Modifying the "Product Price" global precision and purchasing some product in a foreign currency sometimes leads to problematic SVL creation, which will make a posted vendor…
**Current behavior:** Modifying the "Product Price" global precision and purchasing some product in a foreign currency sometimes leads to problematic SVL creation, which will make a posted vendor bill unable to be reset to draft when it logically should be permitted. **Expected behavior:** No SVL, can reset vendor bill. **Steps to reproduce:** 1. Activate a foreign currency, set the "Product Price" precision from 2 -> 3, make an exchange rate to the foreign currency with a rate: `0.2710027100271003` 2. Make a product with avg costing, real time valuation, with a standard price = `0.875` 3. Create a purchase order in the foreign currency for the avco product: * `price_unit: 0.237` * `product_qty: 5500` 4. Confirm -> receive -> create invoice -> post * Can't reset the bill to draft * There is an additional SVL that shouldn't have been generated **Cause of the issue:** There will be a negligible rounding diff between the price units of the journal item and SVL created on reception. When the invoice is posted, this will captured and when multiplied by a large enough invoicing qty, will create a large enough value to trigger creation of pdiff SVL. **Fix:** Zero out the price unit difference if it is functionally equivalent to zero when rounded according to the maximally precise "precision record" involved in the sequence, that is: A) The bill currency B) The SVL currency C) The "Product Price" global precision value opw-4873246 Forward-Port-Of: odoo/odoo#221023 Forward-Port-Of: odoo/odoo#217650
Point of Sale now correctly converts quantities and prices when importing confirmed sales orders that use different units of measure, such as dozens. This prevents incorrect order quantities and pricing at checkout, reducing billing and fulfillment mistakes.
Original PR description
**Steps to reproduce:** - Install `pos_sale`. - Create a sale order for a POS product with quantity 1 and UoM `Dozens`. - Confirm the order. - Go to Point of Sale → open a session. - Click Actions →…
**Steps to reproduce:** - Install `pos_sale`. - Create a sale order for a POS product with quantity 1 and UoM `Dozens`. - Confirm the order. - Go to Point of Sale → open a session. - Click Actions → Quotation/Order and select the recently created sale order. - Check the POS order line quantity. **Issue:** - The POS order line shows quantity as 1 unit, while the sale order line used 1 Dozen, so it should be 12 units. **Cause:** - The POS order line was directly using the quantity and price from the sale_order_line without applying the proper UoM conversion. https://github.com/odoo/odoo/blob/8f937d4c4a6c4cece698a5e904ba7a0cf2fbb24c/addons/pos_sale/static/src/overrides/models/pos_store.js#L152-L153 Solution: - Updated logic to set quantity and price_unit in the POS order line based on the converted sale order lines after UoM calculations. https://github.com/odoo/odoo/blob/8f937d4c4a6c4cece698a5e904ba7a0cf2fbb24c/addons/pos_sale/static/src/overrides/models/pos_store.js#L84-L86 - Also updated the value assigning of 'has_valued_move_ids' to converted line because quantity calculation is based on 'converted_line'. https://github.com/odoo/odoo/blob/8f937d4c4a6c4cece698a5e904ba7a0cf2fbb24c/addons/pos_sale/static/src/overrides/models/pos_order_line.js#L50-L53 opw-4900767 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219985 Forward-Port-Of: odoo/odoo#217734
The remote work location setup now handles cases where the date field is left empty instead of showing an error. This prevents calendar-based location updates from crashing and gives employees a smoother experience when configuring work locations.
Original PR description
Currently, an error occurs if the date is missing when setting a work location via the calendar. **Steps to reproduce:** - Install the `hr` module. - Activate the **Remote Work** feature from the…
Currently, an error occurs if the date is missing when setting a work location via the calendar. **Steps to reproduce:** - Install the `hr` module. - Activate the **Remote Work** feature from the employee settings. - Open the Calendar (Month view), hover over a date, and click **Set Location** (or location icon). - Remove the date in the wizard and unfocus the field. **Error:** `AttributeError - 'bool' object has no attribute 'strftime'` This error occurs when the `date` field is `False`, and `_compute_day_week_string` attempts to call `strftime()` on a boolean value - [1]. After addressing the compute function issue, saving the record without a date results in another issue during employee location setup, where `weekday()` is called on a boolean - [2]. [1] - https://github.com/odoo/odoo/blob/e787d0a642bd710a8a80f8abc660c3ff4a385740/addons/hr_homeworking/wizard/homework_location_wizard.py#L25 [2] - https://github.com/odoo/odoo/blob/e787d0a642bd710a8a80f8abc660c3ff4a385740/addons/hr_homeworking/wizard/homework_location_wizard.py#L35 This commit prevent the computation if the `date` field is not set. Sentry - 6658596690 Forward-Port-Of: odoo/odoo#213308
This update fixes an issue that prevented Point of Sale automated tests from running correctly without an internet connection. It helps keep internal quality checks reliable, reducing the risk of delays or missed issues during development.
Original PR description
Ensure hoot tests are correctly running offline. rb-error: 229927 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change splits long editor list tests into smaller checks so automated validation is less likely to time out on slower test servers. It helps keep release testing stable without changing the customer-facing editor experience.
Original PR description
Those tests were too long to be grouped in a single `it` as it would sometime hit the time limit when the runbot was too slow. Putting each of them in separate `it` significantly reduces the likelihood of the issue to occur. runbot-230411 Forward-Port-Of: odoo/odoo#221354 Forward-Port-Of: odoo/odoo#221197
Customers can now choose shipping methods for orders that include combo products, as long as the actual combo items have weight information. This prevents incorrect checkout or sales order blocks caused by the parent combo product not having its own weight, and also avoids similar issues with zero-quantity lines such as down payments.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a shipping connector; 4. add combo product to cart; 5. go to…
Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a shipping connector; 4. add combo product to cart; 5. go to checkout; 6. attempt to select shipping connector as delivery method. A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines. Issue ----- > The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo Cause ----- The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items. The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight. Solution -------- When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`. Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines. Enterprise PR: https://github.com/odoo/enterprise/pull/91243 opw-4940973 Forward-Port-Of: odoo/odoo#221696
This fixes an issue where updating a public holiday could cause an error if two employees had time off on the same dates with different public holiday handling. The change helps keep leave management reliable when calendars and time off requests overlap.
Original PR description
When two timeoff (one with Ignore Public Holidays and the other without) have the same dates, if you modify a public holidays that happend during that time, it will trigger a traceback. Steps to…
When two timeoff (one with Ignore Public Holidays and the other without) have the same dates, if you modify a public holidays that happend during that time, it will trigger a traceback. Steps to reproduce: ------------------- * Marc demo and Abigail Peterson using the same calendar * Create a "Paid time off" leave for marc demo: June 19 - June 20 * Create a "Extra time off" for abigail: same date * Update Time off type "Extra Time Off" to "Ignore Public Holidays" * Approve both leave request previously created * Create public holidays on June 19 --> traceback Observation: When both time off have the same dates it will overide the value in the dictonary https://github.com/odoo/odoo/commit/0d846ecd1ec7ff5149d580d3494b1a4bab1e68d2#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R464 and when it will try to call the employe_id it will trigger the traceback https://github.com/odoo/odoo/commit/f72ac3a14d76d4fb53ec3a092d08afafe4c35888#diff-38469def2f870bb866f971f57797dd7c21b6a95d52a8eae72f832f0eea2434f9R561 Why the fix: ------------ Avoid collision between two similar Timeoff opw-4933820
Fixed an issue that could prevent gamification challenge reports from being sent when using Individual Goals display mode. Reports now handle missing optional suffix information gracefully, reducing interruptions for users managing challenges.
Original PR description
[FIX] gamification: prevent key error exception
To reproduce:
=============
1. Navigate to Settings > Gamification Tools > Challenges.
2. Create a new challenge or open any existing active challenge.
3. Set the Display Mode to Individual Goals, and then click on Send Report.
Problem:
=========
Accessing line['full_suffix'] directly raised an exception
when the key was missing, causing the template rendering to fail.
https://github.com/odoo/odoo/blob/cd5f29b8b50ef4228be8f58a02bb328548208f77/addons/gamification/data/mail_template_data.xml#L175C1-L175C92
Solution:
=========
Use line.setdefault('full_suffix', '') to ensure the key exists with
a default empty string, preventing errors and allowing the template
to render smoothly.
opw-4909617.
Forward-Port-Of: odoo/odoo#219018Fixed an issue in Point of Sale where physical gift card codes could be assigned to the wrong gift card program when multiple programs existed. This ensures the customer receives the intended gift card code instead of an automatically generated one.
Original PR description
### Problem: When selling a gift card via PoS, if multiple loyalty programs of type *Gift Card* exist, assigning a physical gift card code does not always link it to the correct program. As a result, the created gift card receives an automatically generated code instead of the one entered. ### How to reproduce: * Create multiple loyalty programs of type *Gift Card*. * Open a PoS session. * Add a gift card product from one of the created programs. * Assign a physical gift card code to it. * Complete the sale. * The created gift card will have a generated code. opw-4910647 Forward-Port-Of: odoo/odoo#221624 Forward-Port-Of: odoo/odoo#220792
This fix ensures the Point of Sale loyalty setup always has the needed price list information available. It prevents loyalty point display and calculation issues in certain POS test scenarios, improving reliability for promotions and rewards.
Original PR description
-- Error
FAILED: [9/16] Tour PosLoyaltyTour6 → Step .loyalty-points-won:contains("26.5"). Element (.loyalty-points-won:contains("26.5")) has not been found.
>> https://runbot.odoo.com/odoo/runbot.build.error/182003
-- Qualifiers
{
"module": "pos_loyalty",
"test_path": "/pos_loyalty/tests/test_frontend.py",
"tour_name": "PosLoyaltyTour6",
"tour_step": ".loyalty-points-won:contains(\"26.5\")",
"test_class": "TestUi",
"test_method": "test_point_per_money_spent",
"test_module": "pos_loyalty"
}
-- Fix
In some cases, the POS config's `pricelist_id` was not available in the frontend, causing some issues. By explicitly setting `use_pricelist` to True on the POS config, we ensure that `config.pricelist_id` is properly loaded.Jordanian e-invoices now automatically remove spaces, plus signs, and other non-number characters from buyer phone numbers before submission. This helps invoices pass JoFotara validation and reduces failed electronic invoice submissions caused by common phone number formatting.
Original PR description
Strip all non-digit characters from the partner phone so that the UBL XML complies with JoFotara’s XSD which requires `^[0-9]{1,15}$`. This prevents validation errors when submitting e‑invoices.
Steps to reproduce:
- Install l10n_jo_edi
- Set partner phone to “+962 79 123 4567”
- Create & post an invoice
- Send to JoFotara
OPW-[4945688](https://www.odoo.com/odoo/my-tasks/4945688)
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#221484
Forward-Port-Of: odoo/odoo#220357Italian electronic vendor bill imports now ignore a product's default tax when the XML already provides the correct tax. This prevents duplicated tax amounts on bill lines and improves accounting accuracy for imported supplier invoices.
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 Forward-Port-Of: odoo/odoo#220261 Forward-Port-Of: odoo/odoo#218309
Fixed an issue where reopening the website editor could fail when a carousel was placed inside a table of contents block with its navigation hidden on desktop. This makes editing affected website pages more reliable and prevents an interruption for content managers.
Original PR description
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback.…
Problem: When `s_carousel` is placed inside an `s_table_of_content` and the navbar of the TOC is hidden (visibility set to "Hide" on desktop), saving and reopening the editor results in a traceback. Cause: The traceback occurs due to the following sequence: In `WysiwygAdapterComponent.startEdition`, calling `await super.startEdition()` will invoke `createInvisibleElement()` if the navbar is hidden. This, in turn, activates the scroll spy by calling `_activateScrollSpy()` while starting the TOC snippet. That triggers `widgets_start_request`, which starts the `s_carousel` snippet. However, at this point the `wysiwyg` instance has not yet been attached to the `wrapwrap` element. That happens later, at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L318 and only after the `await super.startEdition()` call at: https://github.com/odoo/odoo/blob/f12050f75ae9ae1125c0c01ec504a24bd401b1ea/addons/website/static/src/components/wysiwyg_adapter/wysiwyg_adapter.js#L232 This delay causes a race condition when starting widgets like `s_carousel` that rely on the presence of the `wysiwyg` instance. Solution: Attach the `wysiwyg` instance to the DOM before `await super.startEdition()` in `WysiwygAdapterComponent.startEdition`. Steps to reproduce: - Add a Table of Content block - Insert a Carousel inside the content - Set the TOC navbar visibility to "Hide" on desktop - Save the page - Reopen the editor - A traceback occurs opw-4971409 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221200
In shared editing, another user's avatar is now positioned so it does not hide the toggle list button. This keeps collaboration indicators visible without blocking document controls, making co-editing smoother.
Original PR description
Problem: In collaboration mode, if another user's selection is on a toggle list, their avatar may overlap and hide the toggle button. Solution: When handling toggle lists, calculate the avatar position based on the toggle block itself rather than the nearest block. Before: <img width="743" height="368" alt="image" src="https://github.com/user-attachments/assets/72363e2b-184c-40ad-aff9-848b6c784783" /> After: <img width="601" height="386" alt="image" src="https://github.com/user-attachments/assets/4eb5549e-cbf0-45c3-8b7a-c78b6dd6ce3c" /> Steps to reproduce: - Add a toggle list - Open the same document in a second tab - In one tab, select content inside the toggle list - In the other tab, observe the avatar position - The avatar overlaps the toggle button opw-4921845 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221028
Invalid GS1 barcode dates are now handled safely instead of causing an error screen. This prevents interruptions when users scan malformed or incomplete barcodes that match date-based barcode rules.
Original PR description
**Current behavior:** Traceback if an invalid date is input in the barcode scanner where a gs1 rule is matched and expects a numerical date representation. **Expected behavior:** No traceback **Steps to reproduce:** 1. enable gs1 nomenclature, scan a barcode from the main menu like: `15123456` -> `15` should preceed a date like: 'yy-mm-dd' opw-4825538 Forward-Port-Of: odoo/odoo#217663
Commission achievements recorded on the last day of a period are now included in the correct commission report. This ensures sales teams and managers see accurate monthly commission amounts and detail records, avoiding missed credit for end-of-period sales.
Original PR description
**Issue** Achievements realised on the last day of the period were not taken into account (neither in the expected one, or the next period). **Steps to reproduce** - Create a commission plan with a monthly target frequency and an achievement on "Amount sold" - Have a Sale order with a `date_order` on the last day of a month - Click on the "Commissions" smart button to open the `sale.commission.report` list view -> achieved amount for the SO's month is missing. - Click on "Details" for the line -> there should be one `sale.commission.achievement.report` record. **Cause** We were comparing a Timestamp coming from the commission line with the start/end date of the period. To perform the comparison, the date was cast to a Timestamp with 0:00:00 as the hour, resulting in all commission lines on the last day of the period to be missed. opw-4857936 opw-4934168 Forward-Port-Of: odoo/enterprise#91566 Forward-Port-Of: odoo/enterprise#90658
This fixes an internal test setup issue in the barcode inventory area by ensuring test users have lot and serial number tracking enabled. It helps prevent false test failures and supports more reliable delivery of inventory barcode updates.
Original PR description
Add group 'stock.group_production_lot' to user to enable lots/SN runbot-error-230495
This fix ensures the Indian GSTR1 report can be created during automated checks without being blocked by access permissions. It helps keep tax reporting validation reliable and prevents avoidable build failures.
Original PR description
steps to reproduce: 1. Install l10n_in_reports module. 2. Run the test `TestReports.test_hsn_schema_change_gstr1_json`. this is required to avoid permission issues when creating the GSTR1 report in the test. build_error-223245 Forward-Port-Of: odoo/enterprise#90969 Forward-Port-Of: odoo/enterprise#89116
Corrects how depreciation edits are recorded for assets with negative values, so debit and credit amounts stay on the proper side. This helps ensure accounting entries remain accurate after users adjust a negative asset's depreciation schedule.
Original PR description
Before this commit, creating an asset with a negative value then editing the depreciation caused a inversion between credit and debit in the Journal entries The account_depreciation_id and account_depreciation_expense_id were not inverse for negative depreciation, in the function `_inverse_depreciation_value()` We add that missing account inversion for negative assets Steps to reproduce: - Create an asset with negative Original Value - You can choose any Depreciation Account and Expense Account - Click on Compute Depreciation - Check the Posted Entries and note the values position (credit/debit) - Go back to the Asset > Depreciation Board - Add 10 to the first line Depreciation - Remove 10 to the second line Depreciation - Save the Asset - Check the Posted Entries again - The changes ones should have credit/debit inversion before the fix opw-4759988 Forward-Port-Of: odoo/enterprise#91340 Forward-Port-Of: odoo/enterprise#88907
Customers can now select supported shipping methods when their cart includes combo products, as long as the individual combo items have weights. This prevents incorrect “missing weight” errors and also avoids similar issues for zero-quantity order lines such as down payments.
Original PR description
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest} Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a…
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest}
Versions
--------
- 18.0+
Steps
-----
1. Have a combo product Foo;
2. ensure the combo items have a weight set;
3. enable & publish a shipping connector;
4. add combo product to cart;
5. go to checkout;
6. attempt to select shipping connector as delivery method.
A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines.
Issue
-----
> The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo
Cause
-----
The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items.
The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight.
Solution
--------
When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`.
Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines.
Community PR: https://github.com/odoo/odoo/pull/221696
opw-4940973
Forward-Port-Of: odoo/enterprise#91243Fixed an issue where editing a signing field placeholder could overwrite the field popup title in reusable sign templates. This prevents template corruption and keeps labels like Name, Text, or Signature clear when the template is reused.
Original PR description
### Steps to reproduce:
- Create a document using a sign template.
- Add a new field or modify the placeholder of an existing one.
- Validate the changes.
- Notice title is replaced by the value entered in placeholder.
### Issue:
After editing a template that has already been used in a signed document, the title of each sign item popup is unexpectedly replaced with the value
entered in the placeholder for that item. This corrupts the template and results
in incorrect title of sign itme being shown when the template is reused.
### Cause:
The issue occurs because the title was being updated with the placeholder of that particular sign item.
### Solution:
Added a prop for title of sign item in SignCustomPopover so that we can make the title as name of the sign item or the type like ('Name', 'Text', 'Signature') rather than the placeholder of the sign item.
---
task-4872963
Forward-Port-Of: odoo/enterprise#91551
Forward-Port-Of: odoo/enterprise#90348Chilean vendor bill imports now work for accounting users who do not have administrator rights. This prevents import failures that left supplier bills empty and showed an error message, helping accounting teams process bills without needing elevated access.
Original PR description
### Issue: Vendor bills are not importing when the user has no administration rights. ### Steps to reproduce: - Install `l10n_cl_edi` and switch to a Chilean company - Create a new user without Administration access rights but with Accounting rights - Switch to this user - Go in Accounting > Vendor Bills - Import a Chilean vendor bill - On the created bill, we can see an error in the chatter, no fields have been filled ### Cause: This [commit](https://github.com/odoo/enterprise/commit/b26a7905cbcbfdb59d55a7ecf9e963e267b8f0a5) aadded a line writing on `l10n_cl_dte_file` but the field is only accessible to [`base.group_system`](https://github.com/odoo/enterprise/blob/bcd42d624587a968ec0b7023855ba4083894baf7/l10n_cl_edi/models/account_move.py#L1071). ### Solution: Use `sudo()` like everywhere in the file. opw-4943499 Forward-Port-Of: odoo/enterprise#91254
Spanish tax report Model 349 now calculates rectification amounts using only linked credit notes, rather than payment-adjusted balances. This prevents partial payments or unrelated transactions from reducing reported rectification values and improves accuracy in the official BOE export.
Original PR description
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on…
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on this bill. - In the tax report, go to model 349. Under the Rectificationes section, the new rectified value will be 250. This is incorrect, as the rectifications in this report should only reflect the value of the original move from a past period after applying the credit note. Payments or other transactions should not impact this report. This commit adjusts the computation of the report (and the BOE export) to ensure that, instead of using `amount_residual` (which includes payments and other transactions), the report uses the sum of the credit notes linked to the move included in the rectification report. Also changed the test test_mod349_credit_note. The rectification section is supposed to show the adjusted amount after rectification. In the test a bill of 400 is fully refunded. Instead of 400, the report should show 0. (https://www.boe.es/buscar/doc.php?id=BOE-A-2010-5098 in TIPO DE REGISTRO 2: REGISTRO DE RECTIFICACIONES. in 153-165 Numérico Base Imponible Rectificada section) opw-4895636 Forward-Port-Of: odoo/enterprise#91350 Forward-Port-Of: odoo/enterprise#89431
This fixes an issue that prevented Mexican point-of-sale refunds from being completed when a gift card was used. Refunds can now correctly return value to the gift card, avoiding checkout errors and supporting the expected refund flow.
Original PR description
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift…
**Problem:** When trying to make a refund in Mexico, with a gift card in the order, the order should be refunded on said gift card. But when doing so, two problems arise: - In the case of a gift card, *line[2].refunded_orderline_id* is not set, so we are trying to read the property of an undefined variable. - Another problem is that the order can not have any line that have a positive subtotal in the case of a refund. This was not taking the gift cards into accounts, as it makes sense for them to be positive in such a case. **Steps to reproduce:** - Set your company to a Mexican company - Make a purchase for a gift card - Make another purchase for a random product - Start the refund process and enter the gift card code we created before - Try to finalize the purchase, a traceback appears - If we were not trying to read an undefined variable, the purchase would still not go through as some lines are positive in a refund **Why the fix:** When refunding with a gift card, we should refill the gift card by the order's cost instead. With this in mind, it makes sense for the gift card to have a positive price even though we are in the context of a refund, which usually only permits negative priced lines. opw-4892935 Forward-Port-Of: odoo/enterprise#91385 Forward-Port-Of: odoo/enterprise#89892
Upsell invoices for aligned yearly subscriptions now show the correct billed period instead of simplifying it to one year. This helps customers and sales teams see accurate invoice descriptions when an upsell spans both a remaining partial period and the next full period.
Original PR description
**Steps to Reproduce:** - Install `sale_subscription`. - Create a product (recurring product) with: - Type: Service - Invoicing Policy: Prepaid/Fixed Price - Create a subscription plan Yearly with: -…
**Steps to Reproduce:**
- Install `sale_subscription`.
- Create a product (recurring product) with:
- Type: Service
- Invoicing Policy: Prepaid/Fixed Price
- Create a subscription plan Yearly with:
- Billing Period: 1 year
- Align to period start: enabled
- Create and confirm a subscription for the product using the Yearly plan.
- Create and confirm the first invoice (shows remaining days like
185 days – 06/30/2025 to 12/31/2025 in product description).
- Create and confirm second invoice (check 1 year – 01/01/2026 to 12/31/2026).
- Go back to the subscription and create an upsell.
- Confirm the upsell and generate its invoice.
**Observation:**
- The upsell invoice line shows the wrong duration:
1 year (06/30/2025 to 12/31/2026).
- This is incorrect because the expected duration is:
185 days (from 06/30/2025 to 12/31/2025) + 1 year (01/01/2026 to 12/31/2026)
**Issue:**
- The duration calculation is based on the ratio of the first date and the end
date, but for the Upsell's ratio is always 1, so it considers fix duration,
i.e 1 year, 1 month
https://github.com/odoo/enterprise/blob/4bb43da79dba7ac1d0772fde814b3da6bade7db6/sale_subscription/models/sale_order_line.py#L346-L347
**Solution:**
- Corrected the logic to calculate the upsell duration by combining the remaining
current period (e.g., 185 days) with the standard 1-year period ratio.
Reference PR: https://github.com/odoo/enterprise/pull/68163/commits/cfed2d369960896f0f4d91a90eb24f3641627419
opw-4853426
Forward-Port-Of: odoo/enterprise#91362
Forward-Port-Of: odoo/enterprise#88963Users with the right permissions in Sign can now cancel sign requests even if they do not have direct access to related salary package offer records. This prevents an access error that blocked administrators from completing a normal document management action.
Original PR description
After this commit https://github.com/odoo/enterprise/commit/40d3314d1b06c8110b476690d2264e86b3492b3e we are not able to cancel a sign request, if user do not have read/write access on…
After this commit https://github.com/odoo/enterprise/commit/40d3314d1b06c8110b476690d2264e86b3492b3e we are not able to cancel a sign request, if user do not have read/write access on `hr.contract.salary.offer` model **step to reproduce:** - install `hr_contract_salary` - create a new user with following right: `Sign -> Administrator` `Contracts -> Employee Manager` `Recruitment -> Interviewer` - login with test user - open sign -> All Documents (with demo data 2, there should be 2 documents) - try to cancel one of them <img width="1572" height="689" alt="config for user" src="https://github.com/user-attachments/assets/72e89ac7-fed3-4a38-918f-5dbb198bd1e3" /> **Observation:** - even with Admin rights of Sign, we are not able to cancel a sign request and we receive a Access Error `You are not allowed to access 'Salary Package Offer' (hr.contract.salary.offer) records` **Fix:** we use `sudo()` to allow everyone to cancel their sign request opw-4859774 Forward-Port-Of: odoo/enterprise#89865
The Luxembourg and Romania reporting apps will no longer automatically install Accountant when users select another free app. This keeps app installation aligned with the user's choice and avoids adding accounting features unless Accountant is already selected.
Original PR description
When choosing one app free in these countries, Accountant is automatically installed. This should only be the case when Accountant is the one app free. Fix: Change the auto-install dependencies to ensure that these modules are only installed when Accountant is already installed. Forward-Port-Of: odoo/enterprise#91627