Daily updates from Odoo
Tuesday, August 5, 2025
39 changes · saas-18.4
Resolved issues and error corrections
When several vendor bills are paid by check at the same time, each related accounting entry now keeps the correct check number in its label. This avoids duplicate or misleading labels and makes payment records easier to reconcile and audit.
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 fixes a missing test setup for the Romanian e-invoicing module that caused an automated web test to fail. It helps keep quality checks stable so future changes can be validated reliably without false failures.
Original PR description
A legacy JS test is currently failing due to a server request not being mocked. This commit thus adds the mocked request. Run the following test to trigger the error: .test_qunit_desktop[web_editor > web_editor > insert a new banner] error-build-230029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Point of Sale now correctly converts sales order quantities and prices when products use different units of measure, such as dozens. This prevents undercounted quantities and incorrect pricing when confirmed sales orders are brought into a POS session.
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#221123 Forward-Port-Of: odoo/odoo#217734
This fix prevents an error when users start a product return from Helpdesk and then clear the selected delivery. The return workflow now handles an empty delivery field gracefully, reducing interruptions for support and warehouse teams.
Original PR description
step to reproduce : create a sales order with a service and a consumable product deliver the consumable product enable the 'returns' feature on your helpdesk team create a helpdesk ticket in this team select the customer and the SOL you created click on return empty the delivery field => traceback source of the issue : Setting the delivery_id field to false triggers a compute, in which an ensure one is later call on the delivery_id. Since the delivery is empty, it triggers an error. Solution : When the compute is triggered, we can prevent the rest of the code execution when the picking is set to False. task - 4935957 Forward-Port-Of: odoo/odoo#221160
Fixes an issue where changing the website cookie banner from the classic layout to a popup could corrupt part of the displayed message. This keeps the cookie notice content intact when editors switch layouts, preventing confusing text from appearing on published pages.
Original PR description
Before this commit, switching from the classic cookie layout to popup caused the text contained in the cookie to be lost. It replaced part of it with [Object list]. Reason: When switching from jQuery to native JS, some bugs were introduced into the code base. - ReplaceChild does not accept lists as input. - QuerySelectorAll does not return TextNodes. How to reproduce: - Go to edit mode on the website. - Click on the cookie bar. - Switch the layout to discreet. - Switch the layout to popup. Before this commit: Part of the cookie navbar content is replaced by “[Object list]”. After this commit: The content is not modified. 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
Applying a partnership grade to a company or contact now affects only that selected partner, not its related child contacts. This restores the intended behavior and prevents unintended partnership status changes for 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 Forward-Port-Of: odoo/odoo#221424
This fixes cases where hidden website sections or popups could appear out of sync after using undo and redo. Business users editing pages should now see more reliable visibility controls, cleaner hidden-element lists, and fewer confusing overlays while building website content.
Original PR description
> [FGE] add Popup section, play with visibility + undo/redo. Visibility eye is not update correctly > [BLSE] Click on a section, hide it in desktop, click on the eye to make it visible, undo => the section still has the overlay to tell it is invisible (but with the icon for the phone)
Portal users can now open project task links sent by email using the "View Task" button. The fix restores access to the information needed to generate working task links, improving collaboration with external users.
Original PR description
To reproduce: ============= - on a project task where a portal user is follower send a message - the portal user should receive an email with a link to the task on the button "View Task" -> the link is not working Problem: ======== starting from 18.3, a method to check field access was added to the project task model, `access_token` and `access_url` were not in set of readable fields for portal users, so the link was not working. Solution: ========= add `access_token` and `access_url` to the set of readable fields for portal users. opw-4939913 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221506
This fix prevents negligible rounding differences in foreign-currency purchase prices from creating unnecessary stock valuation entries. As a result, affected posted vendor bills can be reset to draft when they should be allowed, reducing accounting workflow disruptions.
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
This fix prevents the website/page editor from crashing when users type a minus sign at the end or middle of a numeric field. Numeric entries are now cleaned more consistently, making sidebar editing more reliable and reducing interruptions while configuring page elements.
Original PR description
Before this commit, adding a "-" in a numeric input in the edit mode sidebar would sometime open a traceback. This was due to the "-" that was allowed for negative value, but could be present anywhere in the string and wouldn't be removed.
This commit removes all non-leading "-" in the input to solve the issue.
Steps to reproduce:
- Drop a form
- Click on it
- In the "width" field, put "-300"
nothing happen
- In the "width" field, put "300-"
an error occur when you type "-"This fixes an issue where restaurant point-of-sale sample data could fail to load when starting from a database without demo data. Pizza extra options are moved back into the restaurant setup flow so businesses can test or demonstrate the restaurant POS without errors.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Set up a database without demo data; 2. open restaurant POS; 3. go to register; 4. load sample data. Issue ----- Data doesn't load. Cause ----- Commit ffb976c3ed5fb moved demo data from `pos_restaurant` to `product`. Issue is that `pos_restaurant` uses a custom "scenario" flow where demo data gets loaded for a specific scenario. As a consequence, any reference to demo data from `product` will cause an error. Solution -------- Commit b15cf569c766f already moved back the burger sides data. This commit does the same for the pizza extras data. opw-4989005
This fix prevents timed surveys from being submitted too early when a participant's device clock is slightly ahead of the server. By accounting for much smaller time differences, survey timers behave more fairly and avoid confusing error messages 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
Fixes a checkout and sales order issue where shipping methods could be blocked for combo products because the combo itself has no weight. Delivery weight validation now ignores combo lines and zero-quantity lines, allowing customers and sales teams to select shipping when the underlying products are valid.
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
The remote work location setup now handles cases where the date field is left empty instead of showing an error. This helps employees and managers use the calendar location wizard without interruptions from accidental missing dates.
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
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 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#220357The website builder now responds more reliably to touch, pen, and mouse input across different devices. This fixes interaction issues that could affect users working on hybrid laptops or tablets.
Original PR description
Before this commit, builder components used mouse events (e.g. `onMouseEnter`) which could fail on hybrid devices like laptops used in tablet mode. After this commit, builder components use pointer events (e.g. `onPointerEnter`) supporting a broader class of inputs. task-4367641
This update reorganizes lengthy automated tests for list editing so they are less likely to fail because of slow test infrastructure. It does not change customer-facing behavior, but helps keep development validation more stable and dependable.
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
Sending a gamification challenge report in Individual Goals mode could fail when some goal data was missing. The update adds a safe default so the report email can be generated reliably instead of showing an error.
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#219018Point of Sale now links manually entered physical gift card codes to the correct gift card program when multiple programs exist. This prevents customers from receiving cards with unexpected generated codes and helps ensure sales staff issue the intended gift card.
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 improves how editable content is handled inside website page sections. It helps prevent editing controls or content areas from being placed incorrectly when a section itself is not editable, reducing layout or editing issues for users building pages.
Original PR description
… if section is in an editable
Spreadsheet charts now keep global filters applied when their chart criteria are updated. This prevents reports and dashboards from showing unfiltered or inconsistent chart data 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#221729 Forward-Port-Of: odoo/odoo#220764
The accounting matching widget now excludes bank statement lines that have already been assigned to a regular account. This prevents users from seeing already-handled statement lines as possible invoice matches, reducing confusion and reconciliation mistakes.
Original PR description
Create a bank statement line with partner A Assign it to a random account Create an invoice with partner A Confirm it. => The statement line appears It should not, it has been assigned. Only lines that are still on the suspense account should be taken into account --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220356
Barcode scanning with GS1 rules now handles invalid date values without causing an application error. This prevents interruptions for users when a malformed barcode is scanned and keeps the workflow moving smoothly.
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 precede a date like: 'yy-mm-dd' opw-4825538 Forward-Port-Of: odoo/odoo#217663
In collaborative editing, another user's avatar is now positioned so it does not cover the toggle control in toggle lists. This keeps shared document editing clearer and prevents users from losing access to the toggle button while collaborating.
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
This fixes an issue where reopening the website editor could fail after placing a carousel inside a table of contents block with its navigation hidden. The change makes the editor initialize in the right order, preventing the crash and helping users continue editing pages normally.
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
Invoice and sales email notifications no longer show “False” in the subtitle when sent to invoice-address contacts without a contact name. This keeps customer-facing emails professional and avoids confusion for recipients.
Original PR description
**Steps to reproduce:** 1. Install *Accounting* and *Contacts*. 2. Create a company contact with a name & address. 3. Add a child contact: Type = “Invoice address” **Leave the Contact Name blank** 4. Configure an outgoing mail server. 5. Create & confirm a customer invoice for created invoice‑address contact. 6. Click Send, send the invoice email, and check subtitle — it displays `False`. **Issue:** - When the invoice is emailed to a contact without a name, the email subtitle shows False, for example: `INV/2025/00006 - False` **Note: Same issue for Sales** **Cause:** - The rendering logic only checked that `partner_id` existed, not whether `partner_id.name` was non‑empty - Since name was not mandatory for address-type Invoice Address, this resulted in `False` appearing in the email subtitle. **Solution:** - Add an check for the validity of partner_id.name when generating the email subtitle. **opw-4939158** Forward-Port-Of: odoo/odoo#219881
A missing step was added to the employee skills walkthrough so it opens the Resume tab before continuing. This helps ensure the automated check runs reliably in configurations without demo data, reducing false build failures.
Original PR description
step to reproduce: 1. install l10n_ch_hr_payroll_account 2. without demo 3. run test SkillsTestUI.test_ui added missing step is to go to resume tab in the tour build_error_181683 Forward-Port-Of: odoo/odoo#221364 Forward-Port-Of: odoo/odoo#214578
Spanish Model 349 rectification reporting now excludes payments and other unrelated transactions when calculating corrected amounts. This ensures the tax report and official BOE export reflect only the impact of linked credit notes, reducing the risk of inaccurate regulatory filings.
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 fix prevents an error when users clear the delivery field while processing a product return from a helpdesk ticket. It keeps the return workflow stable by waiting until a valid delivery is selected before recalculating related information.
Original PR description
step to reproduce : create a sales order with a service and a consumable product deliver the consumable product enable the 'returns' feature on your helpdesk team create a helpdesk ticket in this team select the customer and the SOL you created click on return empty the delivery field => traceback source of the issue : Setting the delivery_id field to false triggers a compute, in which an ensure one is later call on the delivery_id. Since the delivery is empty, it triggers an error. Solution : The field 'delivery_id' is required. So we can simply prevent the execution of the compute when the delivery is set to false and wait for the user to put a new value to trigger the compute correctly. task - 4935957 Forward-Port-Of: odoo/enterprise#90496
This update prevents partner grades from being automatically applied to child contacts when that behavior is not intended. It also fixes commission plans so they are not removed when a cancelled sale order is no longer relevant to the partner, helping preserve accurate partnership and commission data.
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 PR also fix the issue of a commission plan being removed even if the cancelled sale order was not used by the partner anymore. TASK-4985900 Forward-Port-Of: odoo/enterprise#91456
Customers can now choose supported shipping carriers at checkout when their cart includes combo products. The fix prevents combo products and zero-quantity order lines such as down payments from being incorrectly flagged as missing weight, reducing checkout and sales order errors.
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#91243This fix ensures the Indian GST reports test can create the GSTR1 report without being blocked by access permissions. It helps keep automated validation stable for India localization reporting, reducing false 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
This fix removes duplicated rental planning logic so rental order lines use one consistent process for creating planning slots. It helps preserve expected rental scheduling behavior and reduces the risk of inconsistent planning results after recent changes.
Original PR description
Before this commit, since the merge of #91164, `_planning_slot_vals_list` method is duplicated in sale_renting_planning/models/sale_order_line.py file. This commit merges the both methods together to keep the behavior added in the one initially introduced before the fix merged.
Mexican point-of-sale refunds can now be completed when the refund is issued back to a gift card. This prevents checkout errors and correctly allows the gift card balance to be refilled during the refund process.
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
The stool demo data now uses the correct color attributes instead of mismatched material values. This makes the demo Bill of Materials and assembly steps clearer and prevents incorrect product variant links in demonstrations or testing.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Install demo data; 2. open the Stool BoM; 3. check assembly steps. Issue ----- Mismatch between product attribute colors & materials. Cause ----- Commit f7ad739fd4b4 updated product attribute demo data. It replaced color with materials, and didn't account for attribute ordering being alphabetical instead of by time of creation. Solution -------- Change material attributes back to color attributes for stool demo data, and order attributes alphabetically to prevent confusion. Also provide unique references to product attribute value records to ensure the correct attribute value gets linked to the BoM lines. opw-4989005
Subscription sales orders can now be previewed even when no salesperson is assigned. This prevents an error that blocked administrators from reviewing customer orders created through the website checkout.
Original PR description
**Steps to reproduce:** 1. Install sale_subscription, payment_demo and eCommerce 2. Go to Website → Configuration → Settings and clear the Salesperson field 3. Create a subscription product with…
**Steps to reproduce:** 1. Install sale_subscription, payment_demo and eCommerce 2. Go to Website → Configuration → Settings and clear the Salesperson field 3. Create a subscription product with recurring plan and publish it. 4. Place an order for this product as a portal user and complete payment. 5. Log back in as admin, open the related Sale Order, and click Preview **Issue:** A traceback occurs:- ```"ValueError: Expected singleton: res.users()"``` This happens in _prepare_partner_addresses because user_id is not set on the Sale Order. **Cause:** https://github.com/odoo/enterprise/blob/6b449769d4bf2cdf6517a026706fd6ea55832975/sale_subscription/controllers/portal.py#L233 The code calls has_group on order_sudo.user_id without checking if user_id exists, leading to an empty recordset and singleton error. **Solution:** Add a fallback to handle cases where user_id is not defined, defaulting to False for multiple_addresses_enabled. opw-4947508 Forward-Port-Of: odoo/enterprise#91013
Upsell invoices for yearly subscriptions now show the correct service period when billing is aligned to the start of a period. This prevents confusing invoice descriptions by separately accounting for the remaining current period and the next full billing 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#88963The Luxembourg and Romania reporting modules now only install automatically when the Accountant app is already selected. This avoids unexpectedly using the free app choice for Accountant when users choose another app in those countries.
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#91662 Forward-Port-Of: odoo/enterprise#91627
This fixes an issue where editing a signing template could replace a field popup title with the field's placeholder text. Users reusing templates will now see the correct field names or types, reducing confusion and preventing template corruption.
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#90348