Wednesday, May 21, 2025
49 changes · 18.0
Enhancements to existing features
The certificate connection logic used for Spanish electronic invoicing integrations has been centralized so it can be reused more consistently. This reduces duplication and makes certificate-based communication with external services easier to maintain for future updates.
Original PR description
We generalize the CertificateAdapter that is needed to make zeep read our own Certificate model for the session. Necessary for: odoo/odoo#196054 Task [link](https://www.odoo.com/odoo/project/967/tasks/4477745) task-4477745
Payment status tags in Accounting now use more intuitive colors. In Progress appears orange to show that work is still needed, while Paid appears green to clearly indicate completion.
Original PR description
Before this commit: - 'In Progress' payment states were shown with a green tag, which could misleadingly suggest that the payment process was complete. - 'Paid' payment states were shown with a grey tag, implying that some action might still be pending. After this commit: - 'In Progress' tags are now orange, signaling that further actions (such as batching or reconciliation) are still required. - 'Paid' tags are now green, indicating that the process is fully complete and no further user action is needed. Task Id: 4797098 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update stops multiple pending recurring payment transactions from being created for the same document when using Razorpay payment tokens. It helps ensure RBI pre-debit notification timing is respected and reduces the risk of duplicate customer charges or payment confusion.
Original PR description
As per RBI Notification RBI/2019-20/47, ensure a pre-debit notification is sent at least 24 hours before the actual debit for recurring payments. Prevent creation of duplicate pending transactions with token for the same document because every transactions confirm after 24 hours. task - 4678509 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
The mail composer template dropdown now remains within the screen on mobile devices, even when template names are very long. This prevents users from losing access to dropdown options and makes saving or selecting message templates more reliable on smaller screens.
Original PR description
Steps to reproduce ================== - Use a mobile device/viewport - Go to any record with a chatter - Click on Log note - Expand the composer - Click on the template dropdown - Save the current content as a template with a long name - Open the dropdown again => The dropdown is almost entirely off screen Cause of the issue ================== The Dropdown component uses the usePosition hook. It works by doing the following: - It tries the fit the content using the position props (or it's default value) - If it doesn't fit, it tries the four other corners - If it's still doesn't fit, it gives up and uses the first one again Solution ======== Since we cannot show too much content inside a dropdown, we set a max-width on the dropdown content, and truncate the template names. Another possibility would be to allow an horizontal overflow. opw-4675320 opw-4674341 opw-4656725
Miscellaneous changes
### Steps to reproduce: - install fsm_industry - run any of these tests: - test_change_parent_plan - test_change_parent_plan_conflict - test_change_parent_plan_with_intermediate - test_change_plan - test_change_plan_conflict - test_change_plan_no_conflict #### > create access right error for the `account.analytic.line` model ### Cause of the issue: The following three record rules provide the creation of `account.analytic.line` for users related to projec
Original PR description
### Steps to reproduce: - install fsm_industry - run any of these tests: - test_change_parent_plan - test_change_parent_plan_conflict - test_change_parent_plan_with_intermediate - test_change_plan -…
### Steps to reproduce:
- install fsm_industry
- run any of these tests:
- test_change_parent_plan
- test_change_parent_plan_conflict
- test_change_parent_plan_with_intermediate
- test_change_plan
- test_change_plan_conflict
- test_change_plan_no_conflict
#### > create access right error for the `account.analytic.line` model
### Cause of the issue:
The following three record rules provide the creation of `account.analytic.line` for users related to project or timesheet access rights unless the analytic line it self is linked to a project: https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L52-L64 https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L66-L76 https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L78-L83 Since the analytic module is unrelated to the project module, these tests will inevitably fail.
### Note:
These record rules do not stop the record creation once the account module is installed since the following record rules override the creation access rights for `account.group_account_invoice` users: https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/account/security/account_security.xml#L102-L107
Similar issue treated in commit 9d164c1d2cd8e532109b9859ab776fcf2f71d115
### Note 2:
A priori, the same problem would occur if we were to write post install analytic tests for portal users:
https://github.com/odoo/odoo/blob/e7bd20e64e023c279bf574630e2d8c8a45ba2fe2/addons/hr_timesheet/security/hr_timesheet_security.xml#L33-L50
### Forward port additional fix (18.0):
Since Commit 0e997470b7174a187c876d734e38f633223f65ec the test of the `TestAnalyticAccount` class are launched in sudo mode since the environment is set using OdooBot and never associated with an other user:
https://github.com/odoo/odoo/blob/ed38752e55d6bafbc71fac3df249f226a4eba332/odoo/tests/common.py#L979
https://github.com/odoo/odoo/blob/4baf55a5d108063b0b60beddf332b6ae367f1871/odoo/api.py#L568-L571
In 17.0 the environment was reset to a non sudo mode by the user reassignement:
https://github.com/odoo/odoo/blob/d2ea23f252f0f8f329e2b0ff96de6ee2a14b922f/addons/analytic/tests/test_analytic_account.py#L28-L31
In order for the tests to also check access rights we have added our own `setup_independent_user` in the `AnalyticCommon` class.
runbot-160013
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#210001
Forward-Port-Of: odoo/odoo#208978A mail test helper now creates properly formatted message identifiers even when random numbers are small. This prevents occasional test failures and helps keep development and release validation more stable.
Original PR description
Steps to reproduce ================== Run the test `/test_mail.test_message_process_references_multi_parent_notflat` a bunch of times. It will eventually fail. Or simply change the random range from `randint(0, 99998)` to `randint(0, 98)` Cause of the issue ================== ```py "<%.7f-%05d-test@iron.sky>" % (time.time(), randint(0, 99998)) ``` If randint returns a low enough value, the msg_id might look like `'<1747742185.1234567- 42-test@iron.sky>'` Solution ======== We can pad the random int with zeros. runbot-110801
Point of Sale now shows the correct tax-free price when a customer is exempt from tax on products whose listed price already included tax. This prevents customers from being overcharged and keeps receipts and order totals aligned with the customer’s tax status.
Original PR description
**Issue:** When selling a product with a tax-inclusive price to a customer who is tax-exempt (e.g., under a "Rest of the World" fiscal position with a 0% tax mapping), the Point of Sale displayed the…
**Issue:** When selling a product with a tax-inclusive price to a customer who is tax-exempt (e.g., under a "Rest of the World" fiscal position with a 0% tax mapping), the Point of Sale displayed the tax-inclusive price instead of the correct tax-exclusive price. **Steps to Reproduce:** 1. Install the Sales, Point of Sale, and Accounting applications. 2. Create a product with a price configured to include taxes (e.g., a 20% VAT included in the sale price). 3. Create a customer and assign them a fiscal position that maps the product's default inclusive tax to a 0% tax (e.g., a "Rest of the World" fiscal position). 4. Create a fiscal position tax rule for the "Rest of the World" position, mapping the inclusive tax on the created product to a 0% tax. 5. Open the Point of Sale interface. 6. Select the customer created in step 3. 7. Add the product created in step 2 to the order. 8. Observe the total price displayed for the product. Expected Behavior: The Point of Sale should display the price of the product excluding the previously included tax, reflecting the 0% tax rate for the selected customer. Actual Behavior: The Point of Sale incorrectly displayed the original tax-inclusive price, even though the applied tax amount was shown as $0. **Root Cause:** The `get_tax_details` method calculates the base price (tax-exclusive) after the product's taxes have already been potentially remapped to 0% based on the customer's fiscal position. Consequently, when a product with an inclusive price is sold to a tax-exempt customer, the `total_tax_amount` becomes zero. The logic in `get_tax_details`,at line 368, that intends to adjust the base price when taxes are included doesn't trigger correctly because `total_tax_amount` is already zero, leaving the `raw_base` (which is derived from the tax-inclusive `price_unit`) unchanged. **Fix:** To resolve this, when preparing the base lines for tax computation, the code now detects if a product originally had a tax-inclusive price and if the effective tax rate has become 0%. In such cases, the `price_unit` of the order line is explicitly adjusted to its tax-exclusive value by reversing the original tax inclusion. This ensures that subsequent tax calculations and the final displayed price correctly reflect the tax-exempt status of the customer. Opw-4592602 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Indian GST Treatment is no longer automatically filled from country and company type when manually creating a partner. It is now filled through the partner autocomplete service, so users who create partners manually must choose the GST Treatment themselves.
Original PR description
This PR removes the `onchange` logic previously used to auto-set the l10n_in_gst_treatment field based on company_type and country_id. The GST Treatment is now set dynamically by the PartnerAutoComplete service. If a user manually creates a partner (without using autocomplete), they will need to select the GST Treatment manually. Related IAP-https://github.com/odoo/iap-apps/pull/1051
Email templates no longer offer video embedding for pasted YouTube links, avoiding content that would be removed when the template is saved. This prevents broken email layout and invalid saved content for users editing templates.
Original PR description
Problem: When pasting a YouTube link and embedding it as an `iframe`, saving removes the `iframe` element. This happens because `iframe` is listed as a `kill_tag` in `SANITIZE_TAGS`, leading to its removal. As a result, the wrapper `div` becomes empty and is converted to a self-closing element, which produces invalid HTML. Solution: Disable video embedding on `body_html` of email templates to avoid inserting `iframe` elements that will later be stripped. Steps to reproduce: 1. Paste a YouTube link in an email template. 2. Choose "Embed YouTube Video" from the popup. 3. Save the template. → The content is broken due to missing `iframe`. opw-4746178 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures company branches in Italian e-invoicing share the same official connection settings as their parent company. It prevents duplicate-user errors when branches have the same VAT or tax code, making activation smoother in multi-branch setups.
Original PR description
- Prevent duplicate user conflict during official mode activation in multi-branch setups - Handle scenario where branches of the same company use the same Partita IVA (VAT number) or codice fiscale - Avoid "An user already exist in the database" error by validating user association logic - The branch should affect the same record in the db the will have the same proxy user Task [link](https://www.odoo.com/odoo/project/967/tasks/4737181) task-4737181
Group payment memo references now start with PAY instead of BATCH. This avoids confusion with the separate batch payment feature and aligns payment naming across the accounting app.
Original PR description
Current behavior before PR: - Memo prefix was BATCH/XXXX for group payments, but it has nothing to do with the batch feature Desired behavior after PR is merged: - Memo prefix in group payments is now PAY/XXXX. This was already the default syntax for payments without entries (introduced in 18.0), so it seems a good choice for a syntax for all payments Related Task (4356642) : - https://www.odoo.com/odoo/project/967/tasks/4356642 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Confirmed purchase orders now allow users to delete section and note lines, matching the existing ability to edit them. This removes an unnecessary error and makes purchase order cleanup more consistent after confirmation.
Original PR description
This is a continuation of [this fix](https://github.com/odoo/odoo/commit/291518a7e7708690d183b9d1ca53c84d0c56ad90) following a feedback on its working state. --- Description of the issue this commit addresses: On purchase orders, it was decided that sections and notes would still be editable after the order has been confirmed so it would seem logic to be able to delete them too but at the moment, doing so raises an error. --- Desired behavior after this commit is merged: It is possible to delete a section or note line on a confirmed purchase order. --- opw-4744367 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an unwanted horizontal scroll on small screens in the eLearning app. Mobile users can now browse course content without the page shifting sideways unexpectedly.
Original PR description
In the kanban template there is a `row` container that is not wrapped into a `container` DIV, so it has negative margin and produce an overflow (horizontal scroll). This commit adds the `g-0` class on the `row` container. Steps to reproduce: * On Odoo on small screen * Go to the app "eLearning" * Try to scroll horizontally => BUG --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue in Project sharing where the page could show an error if no suggested contacts were returned. Users can now continue working normally even when there are no contact suggestions available.
Original PR description
Before this commit, mapping over `suggestedPartners['res.partner']` without checking caused runtime errors when the RPC returned no data. removed the mapping step and adding data to store as returned by server task-[4737958](https://www.odoo.com/odoo/project/1519/tasks/4737958)
This update ensures attachment deletion is only blocked when the German audit trail setting is actually enabled for the company. Businesses that have audit trail disabled can now delete attachments normally, avoiding unnecessary workflow interruptions.
Original PR description
Description of the issue/feature this PR addresses: The audit trail error is displayed eventhough the audit_trail is disabled for the company. Current behavior before PR: Attachments cannot be deleted with deactivated audit trail feature. Desired behavior after PR is merged: Only prevent deleting audit trail attachments, when audit trail setting is active. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr https://github.com/odoo/odoo/pull/207024
This fix prevents invoice submissions to Malaysia's MyInvois service from failing when a customer reference is present. Businesses using Malaysian e-invoicing can submit invoices more reliably without errors caused by this additional customer information.
Original PR description
*Behavior before this PR* When sending an Invoice to MyInvois, tracebacks could be raised if the `party_identification_vals` dictionary held values other than `id_attrs`. This was the case for the Customer Reference (`ref`), added in PR #206655 *Behavior after this PR* Invoices can be properly submitted to MyInvois, even with Customer References. opw-4807559 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invoice and accounting PDF downloads now use the report name configured for the selected print action. This avoids confusing or incorrect file names when users print or save accounting documents.
Original PR description
Default pdf report name should match the "print report name" set on the action report Task 4646733
This fixes an error that could block users from opening the Paid Seats appointment template if the default booking fee product had been deleted. The system now restores the needed product when loading the template, preventing the crash and keeping appointment setup usable.
Original PR description
Currently a `ValueError` is arising when user try to load the appointment template `paid seat`. To get this error: - Create database without demo data and install appointment_account_payment - Delete the Booking Fee Product from products. - Open Appointment and click the `Paid Seats` to select template options. - The error appears in the console log. Error: ``` ValueError: No record found for unique ID appointment_account_payment.default_booking_product. It may have been deleted ``` To fix this issue, used `convert.convert_file` to restore deleted product while loading appointment template. Sentry ID: 6013528364
This update ensures longer Mexican Payment 2.0 XML files are read correctly when uploaded to EDI documents. As a result, the Fiscal Folio is filled in automatically instead of being left blank, reducing manual correction and document processing issues.
Original PR description
**Steps to reproduce:** With mexican localisation installed: - Open form view for the model 'l10n_mx_edi.document' - Prepare a payment document in the Payment-20 format (https://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos20.xsd) - Remove existing attachment - Change the attachment on the document to the relatively long XML file **Issue:** After saving the change, the attachment_uuid (Fiscal Folio) is left blank. **Cause:** Normally, the uuid should be extracted from the uploaded attachment, but the computation of the 'raw' field on the attachment returns the value "b'56.00 bytes'", leaving the attachment_uuid field empty because the XML is assumed to be in the wrong format. The issue doesn't exist for shorter XML files in the Payment-10 format (https://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd) **Solution:** Before computing the attachment_uuid from the attachment, we set the bin_size to False in the context. opw-4641487
This fix allows existing customers to use the newer pain.001.001.09 ISO20022 payment format beyond SEPA credit transfers. It helps businesses generate compatible payment files for banks that require this newer format, enabled through a system setting.
Original PR description
pain.001.001.09 is a newer version of the ISO20022 format. Before this commit, we only supported it for SEPA Credit Transfer, using the same selection field as the one allowing to choose national variants of SEPA. This fix only intends to solve the issue for existing customers by using a system parameter that needs to be switched from "False" to "True". A cleaner solution will come in the future, after a refactoring of the payment methods. task-4647016
This fix prevents an error when users submit Chilean electronic invoices to SII using certificates that do not include a subject serial number. It helps keep invoice submission working reliably for companies using Chilean localization, even with certificates missing that optional detail.
Original PR description
If the subject serial number is not set in the certificate and the user clicks the ``Send now to SII`` button on the invoice, a traceback will appear. Steps to reproduce the error: - Install ``l10n_cl_edi`` module and switch to CL company - Go to Invoicing > Configuration > Settings > SII Web Services: SII - Test - Create a new invoice > customer: CL company > add a line > Confirm > ``Send now to SII`` Traceback: ``` TypeError: 'bool' object is not subscriptable ``` https://github.com/odoo/enterprise/blob/7acf9b1f0cdd5c0968188ac6c2351ae9ab228689/l10n_cl_edi/models/account_move.py#L290 Here, If ``subject_serial_number`` of certificate is False. It will lead to the above traceback. ``subject_serial_number`` can be False because Some certificates do not provide this number. ref-https://github.com/odoo/enterprise/blob/7acf9b1f0cdd5c0968188ac6c2351ae9ab228689/l10n_cl_edi/models/certificate.py#L19-L20 sentry-6591311577
Doing asynchronous things in the onWillStart can be tricky. Methods that come from services are usually protected against those, and hang up if the component was destroyed during the call, but other calls aren't protected. This commit fixes a race condition where a protected call is done after a component is destroyed and crashes. runbot-error-135245 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I
Original PR description
Doing asynchronous things in the onWillStart can be tricky. Methods that come from services are usually protected against those, and hang up if the component was destroyed during the call, but other calls aren't protected. This commit fixes a race condition where a protected call is done after a component is destroyed and crashes. runbot-error-135245 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#210773
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that
Original PR description
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now,…
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that will send an email we set the 'mail.message' state as System notification by default which leads that this mail will be sent normally to every follower of the record but will be only shown in the chat history for internal users not portal as we are just showing 'comment', 'incoming_email' and 'outgoing_email' messages. ### Fix: Checking if the server action that is being run is sending an email we will set the state of the 'mail.message' as 'auto_comment' -introduced in https://github.com/odoo/odoo/pull/94018/commits/d1dd307555ac78841384d1158de5a0a7787370db - and add 'auto_comment' to the domain of the field website_message_id which is for the messages shown to the portal user in his view P.S. LNA confirmed that we need to show it to the portal user. opw-4459754 Forward-Port-Of: odoo/odoo#210807 Forward-Port-Of: odoo/odoo#194401
Before this patch, it was impossible to resequence vendor bills if already sent to SII/tbai. However, it is required to be able to resequence them, and the move name isn't sent anymore since https://github.com/odoo/odoo/pull/195113 was merged. Thus, here I'm lifting that constraint to allow accountants do the resequencing. @moduon MT-8728 OPW-4567144 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209305 Forward-
Original PR description
Before this patch, it was impossible to resequence vendor bills if already sent to SII/tbai. However, it is required to be able to resequence them, and the move name isn't sent anymore since https://github.com/odoo/odoo/pull/195113 was merged. Thus, here I'm lifting that constraint to allow accountants do the resequencing. @moduon MT-8728 OPW-4567144 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209305 Forward-Port-Of: odoo/odoo#197284
Versions -------- - saas-17.4+ Steps ----- 1. Go to Website / Settings; 2. scroll to Shop - Checkout Process; 3. assign portal user as salesperson for online orders. Issue ----- Portal user shouldn't be allowed as a salesperson. Cause ----- The `salesperson_id` field of `res.config.settings` is set to be related to `website_id.salesperson_id`. The `salesperson_id` field for `website` does have a domain configured, but because the domain is a string, it does not get re-used for
Original PR description
Versions -------- - saas-17.4+ Steps ----- 1. Go to Website / Settings; 2. scroll to Shop - Checkout Process; 3. assign portal user as salesperson for online orders. Issue ----- Portal user shouldn't be allowed as a salesperson. Cause ----- The `salesperson_id` field of `res.config.settings` is set to be related to `website_id.salesperson_id`. The `salesperson_id` field for `website` does have a domain configured, but because the domain is a string, it does not get re-used for related fields[^1]. [^1]: https://github.com/odoo/odoo/blob/87381d316/odoo/fields.py#L3009-L3021 Issue was introduced by commit 2f8c20d7d2385, which moved the domain from the `res.config.settings` field to the `website` field it relates to. Solution -------- Provide the domain as a list. opw-4801697 Forward-Port-Of: odoo/odoo#210612
**Problem:** when doing a refund from pos of an avco (or fifo) product, with the option "ship later" the cost of the product does not appear on the pos order line **Steps to reproduce:** - Enable Settings "Allow Ship Later", "Automatic Accounting" - Navigate to Sales/Configuration/Product Categories - Create a new category with Inventory Valuation field as "Automated" and the Costing Method field as "Average Cost (AVCO)" - Open Point of Sale/Product - Create a new storable product
Original PR description
**Problem:** when doing a refund from pos of an avco (or fifo) product, with the option "ship later" the cost of the product does not appear on the pos order line **Steps to reproduce:** - Enable…
**Problem:** when doing a refund from pos of an avco (or fifo) product, with the option "ship later" the cost of the product does not appear on the pos order line **Steps to reproduce:** - Enable Settings "Allow Ship Later", "Automatic Accounting" - Navigate to Sales/Configuration/Product Categories - Create a new category with Inventory Valuation field as "Automated" and the Costing Method field as "Average Cost (AVCO)" - Open Point of Sale/Product - Create a new storable product - In the general information tab set a cost and select your new category for the product category field - In the Sales tab, make sure that "Available in POS" is checked and select a category - Set an on Hand quantity - Open a point of sale from the Point of Sale Dashboard - Select your product and click on Payment - On the top right of the screen select a customer with an adress, click on Invoice and on Ship later - Select a payment method and validate - Navigate to Point of Sale/Orders - click on the last order created, and click on the "Pickings" smart button - validate the picking - come back to the store in point of sale - select the three horizontal lines on the top right and click on Orders - filter by paid orders - select the last order created and click on refund and then on payment - check Invoice and Ship Later on the top right, select a payment method and validate - Navigate back to Point of Sale/orders and select the last order created **Current behavior:** The total cost is zero on the pos order line Even if the delivery is validated via the Picking smart button the total cost is still zero **Expected behavior:** It should reflect the cost of the product (depending on the costing method) **Cause of the issue:** When the pos order is created from Point of Sale, the process_saved_order method is called this method calls (1)create_order_picking and then (2)compute_total_cost. https://github.com/odoo/odoo/blob/504ef7cdeb1600b86feefbe8668144da9cd5a70b/addons/point_of_sale/models/pos_order.py#L183-L184 **Scenario A** Inside (1) create_order_picking, if the PosOrder doesn't have a shipping_date the if statement is False https://github.com/odoo/odoo/blob/504ef7cdeb1600b86feefbe8668144da9cd5a70b/addons/point_of_sale/models/pos_order.py#L1017 and the method _create_picking_from_pos_order_lines is called. This method then calls _action_done. https://github.com/odoo/odoo/blob/504ef7cdeb1600b86feefbe8668144da9cd5a70b/addons/point_of_sale/models/stock_picking.py#L70 Inside the stock_account override of _action_done, _create_in_svl is called. https://github.com/odoo/odoo/blob/504ef7cdeb1600b86feefbe8668144da9cd5a70b/addons/stock_account/models/stock_move.py#L289 This method sets the value of the stock_valuation_layer_ids attribute of the stock move to a new stock valuation layer. **Scenario B** Inside (1) create_order_picking, if the PosOrder has a shipping_date (in the case where we selected "Ship Later") the method _launch_stock_rule_from_pos_order_lines is called. https://github.com/odoo/odoo/blob/504ef7cdeb1600b86feefbe8668144da9cd5a70b/addons/point_of_sale/models/pos_order.py#L1017-L1018 and nowhere inside this method is _action_done called. This makes sense because the stock move hasn't been validated. When (2) compute_total_cost is then called by process_saved_oder, if the product category is avco, _compute_average_price will be called. If we are in Scenario B there is no stock valuation layer for this stock move. Consequently there will be no candidates and the price will not be computed. https://github.com/odoo/odoo/blob/504ef7cdeb1600b86feefbe8668144da9cd5a70b/addons/stock_account/models/product.py#L795-L798 opw-4614503 Forward-Port-Of: odoo/odoo#210459 Forward-Port-Of: odoo/odoo#207482
Related to https://github.com/odoo/enterprise/pull/85952 Forward-Port-Of: odoo/odoo#210767
Original PR description
Related to https://github.com/odoo/enterprise/pull/85952 Forward-Port-Of: odoo/odoo#210767
**Description of the issue/feature this PR addresses:** Sets aggregator=None on ir.cron's priority field since aggregating this by summing it up (sum is the default aggregator on Integer fields) gives us no useful information. Removing it has a very minimal performance improvement and would partly address the issue where this field's aggregated value clips over the grouped by field Prior to https://github.com/odoo/odoo/commit/3d9a6ac the width of the first column would be increased in case
Original PR description
**Description of the issue/feature this PR addresses:** Sets aggregator=None on ir.cron's priority field since aggregating this by summing it up (sum is the default aggregator on Integer fields)…
**Description of the issue/feature this PR addresses:** Sets aggregator=None on ir.cron's priority field since aggregating this by summing it up (sum is the default aggregator on Integer fields) gives us no useful information. Removing it has a very minimal performance improvement and would partly address the issue where this field's aggregated value clips over the grouped by field Prior to https://github.com/odoo/odoo/commit/3d9a6ac the width of the first column would be increased in case of grouping list views. This would make the label of the grouped field visible by expanding the first column. However after the mentioned commit, we restrict the min and max widths of the columns which leads to the value of this grouped by field getting clipped by the aggregated column's value. Although the issue primarily exists in 17.4, prior stable versions (16.0 and up) could also benefit from this. **Current behavior before PR:** In 17.4 onwards, the grouped field's table row is clipped by the priority field that gets aggregated   **Desired behavior after PR is merged:** The priority field in `ir.cron` is no longer aggregated thus it does not clip the grouped field.  opw-4536133 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209786 Forward-Port-Of: odoo/odoo#200943
Steps to Reproduce: --- 1. Create a tax with the following settings: > - Rate: 12% > - Price Included: True > - Affect Base of Subsequent Taxes: False. 2. Create another tax with the following settings: > - Type: Python Code > - Code: result = 22.503 > - Price Included: True > - Affect Base of Subsequent Taxes: False. > - Ensure the sequence of this tax is greater than the 12% tax (this tax is after the 12% tax in order). 3. Create a product with a sales price of 516.00 and
Original PR description
Steps to Reproduce: --- 1. Create a tax with the following settings: > - Rate: 12% > - Price Included: True > - Affect Base of Subsequent Taxes: False. 2. Create another tax with the following…
Steps to Reproduce: --- 1. Create a tax with the following settings: > - Rate: 12% > - Price Included: True > - Affect Base of Subsequent Taxes: False. 2. Create another tax with the following settings: > - Type: Python Code > - Code: result = 22.503 > - Price Included: True > - Affect Base of Subsequent Taxes: False. > - Ensure the sequence of this tax is greater than the 12% tax (this tax is after the 12% tax in order). 3. Create a product with a sales price of 516.00 and assign both taxes to it. 4. Create a new invoice and add the product to the invoice. The total will show an extra 0.01 due to rounding. Cause: --- When applying price-included taxes with multiple taxes, the rounding difference is carried to the last tax to ensure the total matches the product's tax-included price. However, cached values for Python code taxes were used even for the last tax, preventing the rounding correction from being applied. Fix: --- An additional condition was added to ensure cached values are only used when there is no price total checkpoint, allowing the rounding correction to be applied to the last tax. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210413 Forward-Port-Of: odoo/odoo#207665
DGI only wants units without any decimals. That was already done. But they want these amounts to be the base for the other computations. For instance tax amount is simply ratio * total base for this tax. So we need all the lines to take the rounding into account, which is done with the subformula. We also add the possibility for the client to fix some values by adding an editable second column. The idea is that the sum of the bases for the rates must be equal to the sum of the bases
Original PR description
DGI only wants units without any decimals. That was already done. But they want these amounts to be the base for the other computations. For instance tax amount is simply ratio * total base for this tax. So we need all the lines to take the rounding into account, which is done with the subformula. We also add the possibility for the client to fix some values by adding an editable second column. The idea is that the sum of the bases for the rates must be equal to the sum of the bases for the types. We can't guarantee it due to the rounding and we can't fix it automatically. The client then needs to modify the lines himself. opw-4590719 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208951 Forward-Port-Of: odoo/odoo#203227
Default code 'OO99999999999' should only be used if no VAT number is present. Task [link](https://www.odoo.com/odoo/project/967/tasks/4724520) task-4724520 Forward-Port-Of: odoo/odoo#207850
Original PR description
Default code 'OO99999999999' should only be used if no VAT number is present. Task [link](https://www.odoo.com/odoo/project/967/tasks/4724520) task-4724520 Forward-Port-Of: odoo/odoo#207850
The usecase occurs in x2many lists in form views. The total width of the table's parent div may change, for instance if a scrollbar appears on the sheet at some point. When this happens, the widths must be recomputed, to properly fit with the new available space. Before this commit, we only listened to window resize, not to the parent div itself. This could lead to an horizontal scrollbar being sometimes displayed, for instance: - with the chatter below the form view, as it is loaded asynch
Original PR description
The usecase occurs in x2many lists in form views. The total width of the table's parent div may change, for instance if a scrollbar appears on the sheet at some point. When this happens, the widths…
The usecase occurs in x2many lists in form views. The total width of the table's parent div may change, for instance if a scrollbar appears on the sheet at some point. When this happens, the widths must be recomputed, to properly fit with the new available space. Before this commit, we only listened to window resize, not to the parent div itself. This could lead to an horizontal scrollbar being sometimes displayed, for instance: - with the chatter below the form view, as it is loaded asynchronously, when it contains messages such that there's no (vertical) scrollbar before it is loaded, and there's one after. - with the document previewer, as its width changes when it is loaded. This commit fixes the issue by using a resize observer to listen to the parent div directly, instead of on a window, which is more accurate. Bug reported by our cto 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#210366
Problem: In `getAdjacentCharacter`, accessing `focusNode.textContent[focusOffset - 1]` directly fails when there are child nodes between text nodes. Example: Given `<p>ab<span>\u0009</span>\u200B[]</p>`: - `focusNode.childNodes` → [text("ab"), span, text("\u200B")] - `focusNode.textContent` → ["a", "b", "/TAB/", "/ZWS/"] - `focusOffset` → 3 (nodes offset not text offset) - Accessing `focusNode.textContent[2]` is wrong because `focusOffset` counts nodes, not characters, it should return
Original PR description
Problem:
In `getAdjacentCharacter`, accessing `focusNode.textContent[focusOffset - 1]` directly fails when there are child nodes between text nodes.
Example:
Given `<p>ab<span>\u0009</span>\u200B[]</p>`:
- `focusNode.childNodes` → [text("ab"), span, text("\u200B")]
- `focusNode.textContent` → ["a", "b", "/TAB/", "/ZWS/"]
- `focusOffset` → 3 (nodes offset not text offset)
- Accessing `focusNode.textContent[2]` is wrong because `focusOffset` counts nodes, not characters, it should return `/ZWS/` not `/TAB/`.
Solution:
Align with 18.0+ (`html_editor`) behavior by calling `getDeepestPosition(focusNode, focusOffset)` inside `getAdjacentCharacter`.
Steps to reproduce:
1. Type `ab`
2. Press `Tab`
3. Press `Arrow Left` → Caret does not move left as expected.
opw-4720904
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#205745**Steps to Reproduce:** 1. Install Sales module 2. Create a new quotation in mobile view **Issue:** - The input field of contact is displayed twice due to a missing `t-else` condition, causing both fields to appear simultaneously. **Solution:** - Added the missing `t-else` condition to ensure that only one input field is displayed as intended. opw-4767186 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209017
Original PR description
**Steps to Reproduce:** 1. Install Sales module 2. Create a new quotation in mobile view **Issue:** - The input field of contact is displayed twice due to a missing `t-else` condition, causing both fields to appear simultaneously. **Solution:** - Added the missing `t-else` condition to ensure that only one input field is displayed as intended. opw-4767186 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209017
Steps to reproduce: - Create a quotation in the Sales app. - Apply a coupon with any discount. - Modify the description of the discount SO line. - Confirm the sale order. - The discount line's description is reset. Root Cause: - `_get_reward_values_discount` recomputes discount line values, resetting the description. Fix: - Preserve the manually set name field to prevent unintended recomputation. Affected version-17.0 opw-4653070 Forward-Port-Of: odoo/odoo#203411
Original PR description
Steps to reproduce: - Create a quotation in the Sales app. - Apply a coupon with any discount. - Modify the description of the discount SO line. - Confirm the sale order. - The discount line's description is reset. Root Cause: - `_get_reward_values_discount` recomputes discount line values, resetting the description. Fix: - Preserve the manually set name field to prevent unintended recomputation. Affected version-17.0 opw-4653070 Forward-Port-Of: odoo/odoo#203411
Currently, the `Invoice report` is hidden when the user tries to select the invoice report for 'account.move'. With PR [1], we added the invisible attribute to the `is_invoice_report` field to hide it when the model is not 'account.move'. However, due to mistake, we used `'model'` instead of `model`, which caused the field to always be hidden. This commit fixes the above issue by using `model` instead of `'model'`, so the is_invoice_report field is visible only when the model is 'account.m
Original PR description
Currently, the `Invoice report` is hidden when the user tries to select the invoice report for 'account.move'. With PR [1], we added the invisible attribute to the `is_invoice_report` field to hide it when the model is not 'account.move'. However, due to mistake, we used `'model'` instead of `model`, which caused the field to always be hidden. This commit fixes the above issue by using `model` instead of `'model'`, so the is_invoice_report field is visible only when the model is 'account.move'. [1] https://github.com/odoo/odoo/pull/207635 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210832
## Issue: When converting a lead to an opportunity, a wizard (`crm.lead2opportunity.partner`) is shown. This allows merging duplicated leads. However, if the most recently created lead is selected as the primary, the wizard record may be deleted unexpectedly. This usually goes unnoticed in the UI, as the wizard disappears after the operation. The issue becomes critical when overriding the conversion flow via a custom module or in future changes to the core logic. In those cases, t
Original PR description
## Issue: When converting a lead to an opportunity, a wizard (`crm.lead2opportunity.partner`) is shown. This allows merging duplicated leads. However, if the most recently created lead is selected as…
## Issue: When converting a lead to an opportunity, a wizard (`crm.lead2opportunity.partner`) is shown. This allows merging duplicated leads. However, if the most recently created lead is selected as the primary, the wizard record may be deleted unexpectedly. This usually goes unnoticed in the UI, as the wizard disappears after the operation. The issue becomes critical when overriding the conversion flow via a custom module or in future changes to the core logic. In those cases, the deletion of the wizard can lead to empty recordsets and errors. #### Affected versions: 16.0 and later. ## Explanation The `crm.lead2opportunity.partner` model has a `Many2one` field `lead_id` that is being deleting on cascade which is the default for m2o fields on transient models. During lead conversion, action_apply() calls _action_merge() or _action_convert(). In _action_merge(), non-primary leads are unlinked. If the primary lead is the last created one, it differs from the one referenced by the wizard. This causes lead_id to be unset, triggering the cascade and deleting the wizard. ## Impact: If a custom module overrides action_apply() or _action_merge() and calls super() first, it may operate on an empty recordset, leading to failures when trying to access data or call methods. ## To reproduce: With debugger: - Set a breakpoint on the unlink call inside _action_merge - After unlink, calling self.exists() on the wizard will return an empty recordset With a custom module: - Override action_apply() or _action_merge() - Call super() first - Try to merge leads and select the most recent one as primary - The wizard record will be deleted before your custom logic executes, and will raise a "Record does not exist or has been deleted." OPW-4773172 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209795
Before this PR, the name_search function would perform a search on products by injecting a list of ids in the domain instead of using a subquery. In cases where this list of ids is way too big, the search query becomes extremely slow. This PR uses a subquery instead in the domain to avoid this problem. Benchmarks: |Num. product_ids| Before PR | After PR | |---------------------|---------------|--------------| |28801| 65 s| <1 s| opw-4743566 --- I confirm I have signed the CLA
Original PR description
Before this PR, the name_search function would perform a search on products by injecting a list of ids in the domain instead of using a subquery. In cases where this list of ids is way too big, the search query becomes extremely slow. This PR uses a subquery instead in the domain to avoid this problem. Benchmarks: |Num. product_ids| Before PR | After PR | |---------------------|---------------|--------------| |28801| 65 s| <1 s| opw-4743566 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209506 Forward-Port-Of: odoo/odoo#207953
Summary ----- When you generate an entry via the deferred revenue report, if the original journal item has an analytic distribution at x%, then the lines of the deferred entries have an analytic distribution at -x%. Steps to reproduce ----- 1. In Accounting > Settings, enable the analytic accounting and set the "Generate Revenue Entries" as "Manually & Grouped". 2. Create an invoice with an analytic distribution, a start date and an end date. 3. Generate an entry with the deferred reven
Original PR description
Summary ----- When you generate an entry via the deferred revenue report, if the original journal item has an analytic distribution at x%, then the lines of the deferred entries have an analytic distribution at -x%. Steps to reproduce ----- 1. In Accounting > Settings, enable the analytic accounting and set the "Generate Revenue Entries" as "Manually & Grouped". 2. Create an invoice with an analytic distribution, a start date and an end date. 3. Generate an entry with the deferred revenue report by selecting a period including the created invoice. 4. Observe the negative analytic distribution in the generated entries. opw-4502556 Forward-Port-Of: odoo/enterprise#85039 Forward-Port-Of: odoo/enterprise#82594
Sendcloud and ups_rest miss the override to allow sending the actual type of the carrier (in a recognizable way) to Amazon. opw-4771192 Forward-Port-Of: odoo/enterprise#85993 Forward-Port-Of: odoo/enterprise#84772
Original PR description
Sendcloud and ups_rest miss the override to allow sending the actual type of the carrier (in a recognizable way) to Amazon. opw-4771192 Forward-Port-Of: odoo/enterprise#85993 Forward-Port-Of: odoo/enterprise#84772
Description ----------- Installing the `helpdesk_timesheet` module on databases with millions of `account.analytic.lines` would reach the default memory limit of 2 GiB due to excessive ORM caching. The main memory consumption came from `_check_no_link_task_and_ticket` and `_compute_helpdesk_ticket_id` methods loading large amounts of records into the ORM cache. This commit adds manual column initialization and optimizes constraints to reduce ORM cache memory usage. Reference ------
Original PR description
Description ----------- Installing the `helpdesk_timesheet` module on databases with millions of `account.analytic.lines` would reach the default memory limit of 2 GiB due to excessive ORM caching. The main memory consumption came from `_check_no_link_task_and_ticket` and `_compute_helpdesk_ticket_id` methods loading large amounts of records into the ORM cache. This commit adds manual column initialization and optimizes constraints to reduce ORM cache memory usage. Reference --------- opw-4743742 Forward-Port-Of: odoo/enterprise#85974
This commit adds translations for Luxembourg Annual VAT Declaration in the official languages of Luxembourg. The translation is added for languages Luxembourgish, German, and French. task-4717339 Forward-Port-Of: odoo/enterprise#86043 Forward-Port-Of: odoo/enterprise#85898
Original PR description
This commit adds translations for Luxembourg Annual VAT Declaration in the official languages of Luxembourg. The translation is added for languages Luxembourgish, German, and French. task-4717339 Forward-Port-Of: odoo/enterprise#86043 Forward-Port-Of: odoo/enterprise#85898
This commit fixes an issue where we had been using the UTC start and end times for a work entry when computing the correct duration for a payslip. Specifically, this is necessary when a work entry exceeds the interval of the payslip, which can happen when a work entry starts before the payslip interval or ends after the payslip interval. Previously, the UTC times were used. Consider an EST work entry that starts at 18:00 one night and ends at 01:00 the next morning. The UTC times would be 22:
Original PR description
This commit fixes an issue where we had been using the UTC start and end times for a work entry when computing the correct duration for a payslip. Specifically, this is necessary when a work entry…
This commit fixes an issue where we had been using the UTC start and end times for a work entry when computing the correct duration for a payslip. Specifically, this is necessary when a work entry exceeds the interval of the payslip, which can happen when a work entry starts before the payslip interval or ends after the payslip interval. Previously, the UTC times were used. Consider an EST work entry that starts at 18:00 one night and ends at 01:00 the next morning. The UTC times would be 22:00 and 05:00 respecively, up to a 1-hour difference for daylight savings time. Now suppose that the paysliip for this work entry only goes up to that following morning. Instead of using the local times of 18:00 and 01:00, the payslip would use the UTC times of 22:00 and 05:00, which would only count 2 of those hours instead of 6. This is resolved by converting the UTC times to local before using them to clamp the work entries to the payslip interval. opw-4790119 Forward-Port-Of: odoo/enterprise#85967 Forward-Port-Of: odoo/enterprise#85548
Related to https://github.com/odoo/odoo/pull/210767 Forward-Port-Of: odoo/enterprise#85952
Original PR description
Related to https://github.com/odoo/odoo/pull/210767 Forward-Port-Of: odoo/enterprise#85952
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that
Original PR description
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now,…
### Steps to reproduce: 1. Create a portal user. 2. Create an automation rule to send an email as a message. Example: https://drive.google.com/file/d/1mIa4R7a2Z2fnkngOMD7zN2t9Z2XHhGY7/view 3. Now, add the portal user as a follower on a task. 4. Change the state of a task to execute an automation rule. 5. Email will be received by a portal user but it will not be visible on the messaging history on the portal. ### Cause: This is happening because when running an automation rule that will send an email we set the 'mail.message' state as System notification by default which leads that this mail will be sent normally to every follower of the record but will be only shown in the chat history for internal users not portal as we are just showing 'comment', 'incoming_email' and 'outgoing_email' messages. ### Fix: Checking if the server action that is being run is sending an email we will set the state of the 'mail.message' as 'auto_comment' and add 'auto_comment' to the domain of the field website_message_id which is for the messages shown to the portal user in his view opw-4459754 Forward-Port-Of: odoo/enterprise#85969 Forward-Port-Of: odoo/enterprise#82352
Version: - saas-17.4 Steps to reproduce: - Create a sign request activity from sales or any other app. - Try to send document from activity from kanban view. Issue: - The sign request is created, but it is not linked to the related record. Cause: - The res_model and res_id were being read from the 'props' but it is available inside 'props.activity'. Solution: - Corrected the code to read res_model and res_id from 'props.activity'. task-4788037 Forward-Port-Of: odoo/enterpri
Original PR description
Version: - saas-17.4 Steps to reproduce: - Create a sign request activity from sales or any other app. - Try to send document from activity from kanban view. Issue: - The sign request is created, but it is not linked to the related record. Cause: - The res_model and res_id were being read from the 'props' but it is available inside 'props.activity'. Solution: - Corrected the code to read res_model and res_id from 'props.activity'. task-4788037 Forward-Port-Of: odoo/enterprise#85285
NSSF report columns "NSSF Amount Employee" and "NSSF Amount Employer" display pre-computation values which is the amount of payslip lines instead of total amount after the computation of 6% rate. task-4724292 Forward-Port-Of: odoo/enterprise#83613
Original PR description
NSSF report columns "NSSF Amount Employee" and "NSSF Amount Employer" display pre-computation values which is the amount of payslip lines instead of total amount after the computation of 6% rate. task-4724292 Forward-Port-Of: odoo/enterprise#83613
- Generate a new invoice in the menu ‘Accounting > Customers > Invoices’. - Add any product line. - Additionally, add a line of a Note and a line of Section - Confirm the invoicea and send it to CFDI - Click on the option ‘Cancellation request’ and select the reason ‘01’. Click on ‘Create corrective invoice’. The section and note lines disappear from the newly created invoice. In the action_create_replacement_invoice only the lines with display type product are carried over. After this
Original PR description
- Generate a new invoice in the menu ‘Accounting > Customers > Invoices’. - Add any product line. - Additionally, add a line of a Note and a line of Section - Confirm the invoicea and send it to CFDI - Click on the option ‘Cancellation request’ and select the reason ‘01’. Click on ‘Create corrective invoice’. The section and note lines disappear from the newly created invoice. In the action_create_replacement_invoice only the lines with display type product are carried over. After this commit we also include the notes and the sections. opw-4726350 Forward-Port-Of: odoo/enterprise#83578
Previously, the `referral_state` was not reset when reprocessing an applicant, which could lead to inconsistencies in the referral tracking. This commit ensures that the `referral_state` is explicitly set to `'progress'` when the applicant is reset, maintaining proper state management in the referral process. opw-4523156 Forward-Port-Of: odoo/enterprise#82763 Forward-Port-Of: odoo/enterprise#79767
Original PR description
Previously, the `referral_state` was not reset when reprocessing an applicant, which could lead to inconsistencies in the referral tracking. This commit ensures that the `referral_state` is explicitly set to `'progress'` when the applicant is reset, maintaining proper state management in the referral process. opw-4523156 Forward-Port-Of: odoo/enterprise#82763 Forward-Port-Of: odoo/enterprise#79767