Daily updates from Odoo
Tuesday, November 18, 2025
261 changes
20 changes
Enhancements to existing features
This update improves internal documentation for the website and HTML editor plugin system, including shared methods, services, and resource registries. It helps developers work faster with better code completion and clearer integration points, which should reduce implementation mistakes and maintenance effort.
Original PR description
Backport of https://github.com/odoo/odoo/pull/234203
Resolved issues and error corrections
The salary configurator no longer rewrites the contract template when creating a new version. This prevents missing recalculations and helps ensure contract-related values update correctly.
Original PR description
Writing the contract template on the new version created by the salary configurator is not necessary and caused some computes to not trigger.
This update fixes several Viva Wallet payment issues in Point of Sale, including incorrect payment matching when multiple terminals are used at once, payments affecting the wrong order, and payments getting stuck after a page refresh. It makes confirmations more reliable so customers and staff see the correct payment status.
Original PR description
This commit fixes various issues when using Viva Wallet, including the following: - When two Viva Wallet terminals had a payment in process at the same time in the same POS, one of the payments would…
This commit fixes various issues when using Viva Wallet, including the following: - When two Viva Wallet terminals had a payment in process at the same time in the same POS, one of the payments would fail on Odoo even when it succeeded on the terminal. - When a previous Viva Wallet payment was stuck (never completed or failed), trying to make a new payment would mistakenly affect that previous order instead of the new order. - When refreshing the page during a payment, it becomes stuck and never confirms or fails. To fix these issues, there are two main changes: 1. Stop using the `getPendingPaymentLine` method to retrieve the Viva Wallet payment line. This method is flawed as it assumes there is only one pending payment at a time. 2. Store the Viva session ID for a payment in the payment line's UI state, instead of on the plain JS object. This allows it to persist after a refresh. opw-5226966 opw-5248178 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236004 Forward-Port-Of: odoo/odoo#235695
This update prevents an error that could appear when opening a stock quantity record without a location selected. It makes the Inventory screen more reliable by handling incomplete records safely instead of crashing.
Original PR description
Currently, an error is produced when accessing the stock quant form view without a location set. **Steps to Reproduce:** 1. Install the Inventory module. 2. Create a product with tracking enabled (By Unique Serial Number). 3. Click **"Update Quantity"** (opens list view). 4. Click **New**, click View on the unsaved record (opens form view). 5. Remove the Location field. **Error:** `TypeError - sequence item 0: expected str instance, bool found` **Cause:** In the display name computation at [1], the system attempts to join name parts where one of them can be `False` if the location is not set. **Fix:** Before generating the display name, it now checks whether the record is saved (record.ids). If the record is unsaved (no ID), it sets an empty `display_name` and skips the name-joining logic. [1] - https://github.com/odoo/odoo/blob/16e889bf5885c4d827b8c2c5dce102f98aad689f/addons/stock/models/stock_quant.py#L599 sentry-6717759358 Forward-Port-Of: odoo/odoo#234552
The POS floor plan will now only show booking notifications for the appointment type configured in that POS setup. This prevents incorrect bookings from appearing briefly and disappearing after refresh, making table management more reliable for staff.
Original PR description
Task: [#5005216](https://www.odoo.com/odoo/my-tasks/5005216) Enterprise v17.0: [#93714](https://github.com/odoo/enterprise/pull/93714) --- **Before:** If no appointment type is specified in the POS config and a table is booked via the website, the floor plan is notified of a new booking because the resource used is one of the POS config resources. However, if the page is refreshed, the booking disappears since no appointment type is defined in the POS config **After:** The floor plan is notified of a new booking only if the appointment type of the booking matches the one specified in the POS config. If no appointment type is set in the POS config, no booking notifications are sent. Additionally, when the "Table Booking" field is unchecked in the POS config, the appointment type is automatically unset. Forward-Port-Of: odoo/enterprise#98887 Forward-Port-Of: odoo/enterprise#93636
This update prevents hidden line breaks from being included in Swiss QR code fields. That helps ensure the QR code is formatted correctly and accepted by banks or payment systems.
Original PR description
Swiss QR codes have required information for each line of the QR code. Newline characters present in a field's content shift the content to a different line than intended, causing the QR code to be rejected. This commit removes newline characters from the field elements and alters a unit test to check if this issue occurs again. opw-5095997 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233880
This update fixes the Reviews smart button on employee profiles so it now shows the relevant contract review records instead of an empty page. It restores the expected behavior for both active and inactive records, making it easier to review employee contract history.
Original PR description
Issue:
When an offer is created and signed by the employee, the `Reviews` smart button appears on the employee profile. Although it indicates that there are records, clicking the button redirects to an empty list.
Reason:
After converting contracts to the versioning system, the action for the Reviews button does not properly display contract versions, regardless of whether they are active or inactive, as it did in the previous version.
Fix:
Added a context `{"active_test": False}` to show active or inactive records.
task-5155455This change fixes an issue where imported French accounting entries could stop being automatically reconciled in some accounts after a previous reconciliation. It helps ensure the matching process works consistently, so imported records are reconciled as expected and accounting data stays in sync.
Original PR description
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the entries are posted, the system will create odoo reconciliation records for those journal items. The issue lies in this part of the code removing the matching when performing reconciliations for the same matching number https://github.com/odoo/odoo/blob/9d34c7ee85d105a56c3393a3dbb3e5d62d4d634a/addons/account/models/account_partial_reconcile.py#L206 Most of the time it's not a problem for the auto reconcile mechanism of FEC. However since this mechanism reconciles grouped on matching + account, we can end up in a case where a first reconciliation on account A will remove all matching number similar but on account B leading to no automatic reconciliation for them. This commit provides a test to reproduce this issue. opw-5086823 Forward-Port-Of: odoo/enterprise#98855
Odoo now matches Mollie’s actual account setup more closely by no longer enabling iDEAL as a default payment option for new Mollie accounts. It also removes Sofort from the linked payment methods because that payment method has been deprecated by Mollie, helping avoid confusion and unsupported options.
Original PR description
**[FIX] payment_mollie: remove iDEAL from the default payment methods** When a new Mollie account is created, it only accepts card payments out of the box. In Odoo, both the Cards and iDEAL payment methods were activated by default upon enabling the payment provider, while iDEAL required manual activation from Mollie's dashboard. --- **[FIX] payment_mollie: remove Sofort from the linked payment methods** See https://help.mollie.com/hc/en-us/articles/20904206772626-SOFORT-Deprecation-30-September-2024ard. Forward-Port-Of: odoo/odoo#236044
This change prevents imported accounting entries from losing their import-related matching markers too early. As a result, automatic reconciliation now works correctly for all relevant entries, even when similar imported items exist on different accounts.
Original PR description
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the…
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the entries are posted, the system will create odoo reconciliation records for those journal items. The issue lies in this part of the code removing the matching when performing reconciliations for the same matching number https://github.com/odoo/odoo/blob/9d34c7ee85d105a56c3393a3dbb3e5d62d4d634a/addons/account/models/account_partial_reconcile.py#L206 Most of the time it's not a problem for the auto reconcile mechanism of FEC. However since this mechanism reconciles grouped on matching + account, we can end up in a case where a first reconciliation on account A will remove all matching number similar but on account B leading to no automatic reconciliation for them. This commit aims to fix that by removing amls imported matching number (starting with "I") from the reconciled amls to consider. opw-5086823 Forward-Port-Of: odoo/odoo#234481
This change fixes an issue where Bancontact payments could be marked as failed when the customer needed to complete an extra verification step. With this update, those payments stay pending during the check, so the customer can finish the payment normally and avoid unnecessary errors.
Original PR description
When paying with Bancontact, in case a 3DS validation is required (challenge flow), Wordline will send a webhook (see below) to indicate that an external (asynchronous) validation was requested.…
When paying with Bancontact, in case a 3DS validation is required (challenge flow), Wordline will send a webhook (see below) to indicate that an external (asynchronous) validation was requested.
Example of recevied webhook:
```
{
'apiFullVersion': 'v1.1',
'apiVersion': 'v1',
...
'payment': {
'status': 'AUTHORIZATION_REQUESTED',
'statusOutput': {
'isAuthorized': False,
'isCancellable': False,
'isRefundable': False,
'statusCategory': 'PENDING_CONNECT_OR_3RD_PARTY',
'statusCode': 51
}
},
'type': 'payment.authorization_requested'
}
```
Since efc2788dfccd, when receiving such webhook we set the transaction as error then force the user flow to `redirect`; this was done to handle payment w/ token (`online_token`) where a 3DS challenge is still required.
But for Bancontact - which is non-tokenizable - we will always be in the "redirect" mode, so we must keep the transaction as `pending`.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235847The VoIP app now avoids trying to reconnect when a page is being closed normally. This prevents a registration conflict that could cause errors during logout or when leaving the page, improving call service reliability.
Original PR description
On page unload, two conflicting things happen: - A REGISTER request with expires=0 is sent to invalidate the registration - The WebSocket disconnects, triggering the reconnection mechanism that attempts to reissue a registration These two concurrent and conflicting REGISTER requests result in the following error: > RequestPendingError: REGISTER request already in progress, waiting for final response This commit prevents the reconnection mechanism from occurring in the event of a "natural" disconnection, such as one triggered by a page unload. This way, the two conflicting REGISTER requests aren't sent on page unload. [Task-5261940](https://www.odoo.com/odoo/project/5778/tasks/5261940) Forward-Port-Of: odoo/enterprise#99560 Forward-Port-Of: odoo/enterprise#99376
This change fixes an intermittent issue in the manufacturing work order tour by making the “Add Component” flow more stable. It also ensures the intended product appears first, which helps the process run consistently during tests and for users following the same steps.
Original PR description
The search in the "Add Component" dialog caused a re-render race, making the tour ``test_add_component_from_shop_foor_in_multi_step_manufacturing`` fail intermittently. This fix removes the search steps and marks the “Courage” product as favorite so it appears first in the catalog. runbot-227694 Forward-Port-Of: odoo/enterprise#92403
This fix prevents quality checks from appearing for items that were not actually selected for delivery or receipt, including cases where a lot or serial number has not yet been assigned. As a result, users only see and complete the checks that apply to the goods that will really be processed, avoiding confusion and unnecessary work.
Original PR description
*: {stock_barcode_,}quality_control #### There are two issues addressed in this PR: 1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.…
*: {stock_barcode_,}quality_control
#### There are two issues addressed in this PR:
1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.
2) Quality check related to product without set lots are triggered.
### Steps to reproduce:
- Create a storable products product A tracked by SN
- Create a control points of type pass/fail on receipts control by
quantity on product A
- Create and confirm a receipt with a move 2 x product A
- Open the receipt in the barcode app
- Scan product A > Scan SN001
- Click on Quality Check
#### > Both QC's are displayed to be processed
### Expected behavior:
Only the QC related to the scanned SN should be processed as it is the only unit that will be moved at validation.
### Cause of the issue:
Only picked move lines are considered to be processed in the barcode app. However, the `check_quality` triggered by clicking on the quality check button only check if the move related to the move line is picked:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L64-L72
### Fix:
Relying the `barcode_trigger` context key will ensure a uniform behavior between the QC's displayed to be processed directly from the QC button and from these displayed at validation since this context key is already used at validation:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/stock_barcode/static/src/models/barcode_model.js#L581-L590
Note we all changed the default return value of the `check_quality` from `False` to `True` here:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L71-L73
because this method is called in the `pre_action_done_hook` during the `button_validate` of the picking:
https://github.com/odoo/odoo/blob/a97d3c772001f4f0b9df66d28c1c8f19358898e0/addons/stock/models/stock_picking.py#L1415-L1421
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L91-L96
and since a result that is not `True` is expected to be an action that should be processed prior to validation, returning `False` would make it impossible to proceed with a validation in case the `check_quality` is called and there is no check to process.
Task: 4716252
opw-5010764
Forward-Port-Of: odoo/enterprise#99565Website editor now correctly saves style settings for every mega menu on a page, not just the first one. This ensures design changes like menu size are applied consistently across multiple mega menus after saving.
Original PR description
The implementation of `save_handlers` for mega menus only saved the classes of the first mega menu found. Thus, customization of the "Size" of the second menu was not saved. This commit change the handler to select all mega menus. Steps to reproduce: - Open website builder - Create multiple mega menus - Set "Size" to "Narrow" on each mega menu - Save - Bug: Only the first mega menu is narrow task-5248206 Fixes #234222
Products that are not available on the current website will no longer appear in the add-to-cart pop-up. This prevents shoppers from seeing optional products they cannot actually buy on that website, reducing confusion and improving the shopping experience.
Original PR description
Steps to reproduce: =================== 1- Create another website 2- Sales app > Products > Open any product's form 3- In the Optional Products field, select any other product in your database for this field 4- Open the product form of the optional product you selected 5- Set the Website field to only be one of your websites, rather than All 6- Navigate to the Website app > Select the non set website in the other Steps 7- Open your shop > Select your main product > Click the add to cart button -> See the optional product appear in the pop-up. Cause: ====== _should_show_product function doesn't validate if a product is available on the website from which the request originates when handling multiple websites. Solution: ========= Update the function to take multiple websites into consideration opw-5179894 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233170
When changing the account on a vendor bill line, the linked non-deductible product line now updates to match it automatically. This keeps related accounting entries consistent and avoids mismatches that could affect invoice processing and follow-up work.
Original PR description
When you have a vendor bill with an invoice line linked to a journal item with the display type "non_deductible_product", if you modify the account_id of the invoice line, then the account_id of the…
When you have a vendor bill with an invoice line linked to a journal item with the display type "non_deductible_product", if you modify the account_id of the invoice line, then the account_id of the linked line should change to have the same value.
How to reproduce?
1. Create an asset model (Accounting > Configuration > Accounting > Asset Models)
2. Set the asset_model_id on an account (on the tab "Automation", set "Automate Asset" as "Create in draft" then set the "Asset Model" field with the created asset model
3. Duplicate the account having the created asset model
4. Create a vendor bill with an invoice line having:
- A strictly positive price unit
- A deductible_amount (Professional %) lower than 100 (this field is hidden by default)
5. Modify the account_id of the invoice line
6. Observe the journal items: the line with the non- deductible product should have the same account_id than the invoice line but it's not the case.
task-5156256
Forward-Port-Of: odoo/odoo#232121This update corrects how exchange rates are calculated in the Uruguay electronic invoicing flow. It now always uses the Uruguayan peso as the reference, which helps ensure consistent and accurate values regardless of the company’s main currency.
Original PR description
This PR fixes the currency rate calculation in the Uruguay EDI module to always compute the rate relative to UYU (Uruguayan Peso) regardless of the company's base currency. * Replaces the previous logic that calculated rates based on company currency with a direct UYU conversioni * Simplifies the rate calculation by removing the amount-based fallback logic * Ensures consistent UYU rate computation for all non-UYU currencies LATAM Task 1358 / Adhoc task 51716 Forward-Port-Of: odoo/enterprise#99374 Forward-Port-Of: odoo/enterprise#93144
This update makes Flutterwave payment references automatically unique by adding a timestamp to each one. It helps prevent payment requests from being rejected when the same reference could otherwise be reused, especially in test or reset environments.
Original PR description
The `/payments` endpoint of the Flutterwave v3.0.0 API expects unique `tx_ref` parameters (matching Odoo's payment transaction `reference` field) to be passed. This is guaranteed by a UNIQUE() SQL constraint in Odoo, but testing sometimes involves dropping the database, leading to transaction references being repeated at the provider level for a given merchant account. This commit singularizes all transaction references by suffixing them with the current timestamp, ensuring that the `tx_ref` API parameter remains unique across transaction reference sequences. Forward-Port-Of: odoo/odoo#235799
This change fixes an automated HR test that was failing because it did not set a contract start date before running date calculations. It ensures the test runs reliably on the targeted branch and helps prevent false failures in the validation pipeline.
Original PR description
The test_version_cron_update_no_fields from hr/tests/test_hr_employee.py didn't pass on runbot saas-18.4 due to the lack of explicitly defined start date of contract leading to an error when trying to substract False to a datetime object. I explicitly added a contract_date_start on the hr.version creation and modified the assigning line as the create_version function returns the new version object but doesn't attribute it to the employee directly. Runbot error: 233590 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
9 changes
Resolved issues and error corrections
When an activity is created automatically, it will now always be assigned to a user instead of sometimes remaining unassigned. This avoids unclear ownership and helps ensure automated tasks are visible and actionable right away.
Original PR description
**Steps to reproduce:** - Install base_automation, sale_management, and stock. - Create an automation rule for the Transfer model (stock.picking) that creates an activity when the state is set to…
**Steps to reproduce:** - Install base_automation, sale_management, and stock. - Create an automation rule for the Transfer model (stock.picking) that creates an activity when the state is set to Ready. - User type → Dynamic user (based on record) - User field → Responsible - Confirm a Sale Order and open the related delivery. - Move delivery to the Ready state. - Notice that the created activity has no assigned user. **Issue:** - The activity is created without a user_id. **Cause:** - Since user_id is no longer a required field on mail.activity, when creating an activity through automation, if the related record (e.g., stock.picking) does not have a responsible user, and activity type dose not have `default_user_id the user_id` remains unset. https://github.com/odoo/odoo/blob/7ced429ff54c9670f2ff1b1866ecfb01f49ad50d/addons/mail/models/mail_activity_mixin.py#L408-L409 - Previously, the creation logic would fall back to using either a default user from the activity type or the current environment user (env.uid). This fallback no longer occurs in all cases. https://github.com/odoo/odoo/blob/279504268e1c4b57f26543db1c7da9a709fea350/addons/mail/models/mail_activity_mixin.py#L401-L402 **Solution:** - If no user_id is determined (either from the record or activity type), explicitly assign the current logged-in user (env.user) as the activity’s responsible user during creation. - This ensures that every activity created through automation has a valid assignee opw - 5213520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Bancontact payments that need an extra verification step will now stay in a waiting state instead of being marked as failed too early. This prevents customers from being blocked during the payment process and helps payments complete correctly when additional approval is required.
Original PR description
When paying with Bancontact, in case a 3DS validation is required (challenge flow), Wordline will send a webhook (see below) to indicate that an external (asynchronous) validation was requested.…
When paying with Bancontact, in case a 3DS validation is required (challenge flow), Wordline will send a webhook (see below) to indicate that an external (asynchronous) validation was requested.
Example of recevied webhook:
```
{
'apiFullVersion': 'v1.1',
'apiVersion': 'v1',
...
'payment': {
'status': 'AUTHORIZATION_REQUESTED',
'statusOutput': {
'isAuthorized': False,
'isCancellable': False,
'isRefundable': False,
'statusCategory': 'PENDING_CONNECT_OR_3RD_PARTY',
'statusCode': 51
}
},
'type': 'payment.authorization_requested'
}
```
Since efc2788dfccd, when receiving such webhook we set the transaction as error then force the user flow to `redirect`; this was done to handle payment w/ token (`online_token`) where a 3DS challenge is still required.
But for Bancontact - which is non-tokenizable - we will always be in the "redirect" mode, so we must keep the transaction as `pending`.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235847This change makes the Swiss payroll transmission tests independent from accounting setup details, so they no longer rely on a specific journal being present on the payroll structure. It helps keep automated tests stable and reduces the risk of unrelated configuration causing failures.
Original PR description
Forward-Port-Of: odoo/enterprise#99264 Forward-Port-Of: odoo/enterprise#98672
This update prevents quality checks from appearing for items that were not actually picked or fully prepared, especially in the barcode app. It ensures users only answer the checks relevant to the goods that will really be validated, reducing confusion and avoiding unnecessary steps during receipts and transfers.
Original PR description
*: {stock_barcode_,}quality_control #### There are two issues addressed in this PR: 1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.…
*: {stock_barcode_,}quality_control
#### There are two issues addressed in this PR:
1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.
2) Quality check related to product without set lots are triggered.
### Steps to reproduce:
- Create a storable products product A tracked by SN
- Create a control points of type pass/fail on receipts control by
quantity on product A
- Create and confirm a receipt with a move 2 x product A
- Open the receipt in the barcode app
- Scan product A > Scan SN001
- Click on Quality Check
#### > Both QC's are displayed to be processed
### Expected behavior:
Only the QC related to the scanned SN should be processed as it is the only unit that will be moved at validation.
### Cause of the issue:
Only picked move lines are considered to be processed in the barcode app. However, the `check_quality` triggered by clicking on the quality check button only check if the move related to the move line is picked:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L64-L72
### Fix:
Relying the `barcode_trigger` context key will ensure a uniform behavior between the QC's displayed to be processed directly from the QC button and from these displayed at validation since this context key is already used at validation:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/stock_barcode/static/src/models/barcode_model.js#L581-L590
Note we all changed the default return value of the `check_quality` from `False` to `True` here:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L71-L73
because this method is called in the `pre_action_done_hook` during the `button_validate` of the picking:
https://github.com/odoo/odoo/blob/a97d3c772001f4f0b9df66d28c1c8f19358898e0/addons/stock/models/stock_picking.py#L1415-L1421
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L91-L96
and since a result that is not `True` is expected to be an action that should be processed prior to validation, returning `False` would make it impossible to proceed with a validation in case the `check_quality` is called and there is no check to process.
Task: 4716252
opw-5010764
Forward-Port-Of: odoo/enterprise#99565Imported accounting entries with matching numbers are now handled more reliably during reconciliation. This prevents one account’s reconciliation from accidentally blocking automatic matching on other accounts, improving the accuracy of FEC imports.
Original PR description
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the…
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the entries are posted, the system will create odoo reconciliation records for those journal items. The issue lies in this part of the code removing the matching when performing reconciliations for the same matching number https://github.com/odoo/odoo/blob/9d34c7ee85d105a56c3393a3dbb3e5d62d4d634a/addons/account/models/account_partial_reconcile.py#L206 Most of the time it's not a problem for the auto reconcile mechanism of FEC. However since this mechanism reconciles grouped on matching + account, we can end up in a case where a first reconciliation on account A will remove all matching number similar but on account B leading to no automatic reconciliation for them. This commit aims to fix that by removing amls imported matching number (starting with "I") from the reconciled amls to consider. opw-5086823 Forward-Port-Of: odoo/odoo#234481
This change prevents the voice system from trying to reconnect when a user leaves the page normally. It avoids a conflict between two logout-related network requests, which could otherwise cause errors during sign-out or page unload.
Original PR description
On page unload, two conflicting things happen: - A REGISTER request with expires=0 is sent to invalidate the registration - The WebSocket disconnects, triggering the reconnection mechanism that attempts to reissue a registration These two concurrent and conflicting REGISTER requests result in the following error: > RequestPendingError: REGISTER request already in progress, waiting for final response This commit prevents the reconnection mechanism from occurring in the event of a "natural" disconnection, such as one triggered by a page unload. This way, the two conflicting REGISTER requests aren't sent on page unload. [Task-5261940](https://www.odoo.com/odoo/project/5778/tasks/5261940) Forward-Port-Of: odoo/enterprise#99560 Forward-Port-Of: odoo/enterprise#99376
This change fixes an intermittent failure in the manufacturing work order tour. It removes a search step that could cause timing issues and makes the target product appear first, so the test runs more reliably.
Original PR description
The search in the "Add Component" dialog caused a re-render race, making the tour ``test_add_component_from_shop_foor_in_multi_step_manufacturing`` fail intermittently. This fix removes the search steps and marks the “Courage” product as favorite so it appears first in the catalog. runbot-227694 Forward-Port-Of: odoo/enterprise#92403
This fix ensures imported FEC journal items keep their matching numbers correctly so automatic reconciliation can work across all affected accounts. It prevents a reconciliation on one account from accidentally blocking later automatic reconciliations on another account.
Original PR description
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the entries are posted, the system will create odoo reconciliation records for those journal items. The issue lies in this part of the code removing the matching when performing reconciliations for the same matching number https://github.com/odoo/odoo/blob/9d34c7ee85d105a56c3393a3dbb3e5d62d4d634a/addons/account/models/account_partial_reconcile.py#L206 Most of the time it's not a problem for the auto reconcile mechanism of FEC. However since this mechanism reconciles grouped on matching + account, we can end up in a case where a first reconciliation on account A will remove all matching number similar but on account B leading to no automatic reconciliation for them. This commit provides a test to reproduce this issue. opw-5086823 Forward-Port-Of: odoo/enterprise#98855
This update restores the ability to delete highlighted digits in the VoIP softphone when the selection starts at the beginning of the input. It keeps the safety checks that prevent unwanted cursor issues while making backspace work as expected again.
Original PR description
This commit fixes a regression introduced in commit [1] prevented deleting when a selection began at index 0; extend the guard so the numpad (keypad) backspace still removes the highlighted characters while keeping the cursor-safety logic. [1]: https://github.com/odoo/enterprise/commit/73b01fa5e1f56d4ab71d67760b15942fb2fa0e31 task-5217676 Forward-Port-Of: odoo/enterprise#99515 Forward-Port-Of: odoo/enterprise#99358
9 changes
Enhancements to existing features
This update brings back the ability to mark specific invoice lines as “No Follow-Up,” so they no longer trigger reminder workflows. It also improves follow-up reports and customer statements so excluded items are handled correctly in screens, exports, and reminder emails, reducing unnecessary or incorrect dunning messages.
Original PR description
During the rework of the follow-up report, we removed the "No Follow-Up" field from journal items, making it impossible to exclude individual journal items from triggering a follow-up. In this commit…
During the rework of the follow-up report, we removed the "No Follow-Up" field from journal items, making it impossible to exclude individual journal items from triggering a follow-up. In this commit we do the following: - Re-introduce a field for that, since it is a common requirement to be able to exclude individual items from the follow-up reports. The field is stored on the journal item, but can also be toggled from the journal entry. In case of multiple installments on the invoice, toggling the field on one installment will toggle it for all installments. - Adapt the Follow-Up Report and Customer Statement variants of the Partner Ledger to add a toggle for the "No Follow-Up" field on each report line, that toggles the field on the corresponding journal item(s). - Prevent the follow-up status on the partner to change when all of the overdue journal items are marked as "No Follow-Up". - Make sure users can toggle the "No Follow-Up" setting on the invoice level when opening the "Overdue Invoices" view from the partner's "Accounting" tab. - Make sure all receivable/payable lines without a due date (either from a manual miscellaneous entry or a PoS entry) are put under the "Due" section in the Follow-Up Report instead of the "Overdue" section. Since there is no due date, they can't be overdue. - Make sure the PDF and XLSX exports of the Follow-Up Report don't include the "No Follow-Up" lines, and the customer follow up email only includes the amount of the other lines. Backport of https://github.com/odoo/enterprise/commit/74b9d2ef17e4f9a217db8432d886de2eca4baef9 and https://github.com/odoo/odoo/commit/2789a0fbfa358c5c164e44380c2a4a10e5679615 Task: 5138378 Upgrade PR → https://github.com/odoo/upgrade/pull/8864 Forward-Port-Of: odoo/enterprise#96627
Resolved issues and error corrections
This update makes the Swiss payroll transmission tests independent from accounting-specific configuration, so they can run reliably even when accounting details are not fully set up. It also adjusts payroll validation so payslips can be confirmed without requiring a journal on the payroll structure, reducing test and setup failures.
Original PR description
Forward-Port-Of: odoo/enterprise#99264 Forward-Port-Of: odoo/enterprise#98672
This change fixes an issue where imported French accounting entries could lose their reconciliation marker too early, preventing some journal items from being automatically matched later. As a result, FEC imports should now reconcile more reliably across different accounts, reducing manual follow-up work.
Original PR description
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the entries are posted, the system will create odoo reconciliation records for those journal items. The issue lies in this part of the code removing the matching when performing reconciliations for the same matching number https://github.com/odoo/odoo/blob/9d34c7ee85d105a56c3393a3dbb3e5d62d4d634a/addons/account/models/account_partial_reconcile.py#L206 Most of the time it's not a problem for the auto reconcile mechanism of FEC. However since this mechanism reconciles grouped on matching + account, we can end up in a case where a first reconciliation on account A will remove all matching number similar but on account B leading to no automatic reconciliation for them. This commit provides a test to reproduce this issue. opw-5086823 Forward-Port-Of: odoo/enterprise#98855
This change prevents quality checks from appearing for items that were not actually picked or do not yet have the required lot/serial information. It ensures warehouse users only see the checks relevant to the products they are really processing, avoiding extra work and validation confusion.
Original PR description
*: {stock_barcode_,}quality_control #### There are two issues addressed in this PR: 1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.…
*: {stock_barcode_,}quality_control
#### There are two issues addressed in this PR:
1) In the barcode app, quality checks triggered at validation includes quality checks related to unpicked products.
2) Quality check related to product without set lots are triggered.
### Steps to reproduce:
- Create a storable products product A tracked by SN
- Create a control points of type pass/fail on receipts control by
quantity on product A
- Create and confirm a receipt with a move 2 x product A
- Open the receipt in the barcode app
- Scan product A > Scan SN001
- Click on Quality Check
#### > Both QC's are displayed to be processed
### Expected behavior:
Only the QC related to the scanned SN should be processed as it is the only unit that will be moved at validation.
### Cause of the issue:
Only picked move lines are considered to be processed in the barcode app. However, the `check_quality` triggered by clicking on the quality check button only check if the move related to the move line is picked:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L64-L72
### Fix:
Relying the `barcode_trigger` context key will ensure a uniform behavior between the QC's displayed to be processed directly from the QC button and from these displayed at validation since this context key is already used at validation:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/stock_barcode/static/src/models/barcode_model.js#L581-L590
Note we all changed the default return value of the `check_quality` from `False` to `True` here:
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L71-L73
because this method is called in the `pre_action_done_hook` during the `button_validate` of the picking:
https://github.com/odoo/odoo/blob/a97d3c772001f4f0b9df66d28c1c8f19358898e0/addons/stock/models/stock_picking.py#L1415-L1421
https://github.com/odoo/enterprise/blob/9fe45b673c02a98e6dd6b3997f19a2018a76df09/quality_control/models/stock_picking.py#L91-L96
and since a result that is not `True` is expected to be an action that should be processed prior to validation, returning `False` would make it impossible to proceed with a validation in case the `check_quality` is called and there is no check to process.
Task: 4716252
opw-5010764
Forward-Port-Of: odoo/enterprise#99565This change makes the manufacturing test flow more reliable by removing a search step that could refresh the screen at the wrong moment. It also ensures the intended product appears first in the catalog, reducing intermittent failures in the add-component process.
Original PR description
The search in the "Add Component" dialog caused a re-render race, making the tour ``test_add_component_from_shop_foor_in_multi_step_manufacturing`` fail intermittently. This fix removes the search steps and marks the “Courage” product as favorite so it appears first in the catalog. runbot-227694 Forward-Port-Of: odoo/enterprise#92403
This change prevents the phone system from trying to register twice when a user leaves a page. It avoids an error during page unload, making sign-out and navigation smoother and more reliable.
Original PR description
On page unload, two conflicting things happen: - A REGISTER request with expires=0 is sent to invalidate the registration - The WebSocket disconnects, triggering the reconnection mechanism that attempts to reissue a registration These two concurrent and conflicting REGISTER requests result in the following error: > RequestPendingError: REGISTER request already in progress, waiting for final response This commit prevents the reconnection mechanism from occurring in the event of a "natural" disconnection, such as one triggered by a page unload. This way, the two conflicting REGISTER requests aren't sent on page unload. [Task-5261940](https://www.odoo.com/odoo/project/5778/tasks/5261940) Forward-Port-Of: odoo/enterprise#99560 Forward-Port-Of: odoo/enterprise#99376
Fixes an issue where locking a document in the preview did not refresh the available actions in the menu. Users will now see the correct options right away after changing a document’s lock status, avoiding confusion and inconsistent behavior.
Original PR description
Steps to reproduce =================== - Preview any documents. - Click on the actions menu and lock the document. - Now go to the actions menu again. => The set of options is not updated. Technical =========== - The action menu, which we are using inside the file previewer, is passed explicitly inside the FileViewer component of the document. We were using the `record.load()`, which will not have any effect on the FileViewer component and that's why the action menu was not updating. After this commit ================== - Used the `this._notifyChange()` method, which closes the preview and loads the model to align with the same behaviour as other actions. Task-4988116
This update resolves an error that could interrupt WPS file generation for Saudi payroll. It makes the export process more reliable so payroll teams can complete their work without unexpected tracebacks.
Original PR description
this commit addresses traceback errors occured due to incorrect usage of `_` function. task-5310946
Vendor batch payments will now use the correct numbering sequence when they are validated. This prevents vendor batches from being given an incoming payment name, which could cause confusion in accounting records.
Original PR description
Currently when creating a vendor batch payment, the system may incorrectly use the inbound batch payment sequence to generate the batch name Steps to reproduce: - Create a Vendor payment. - Create a Vendor batch payment, add the payment, validate it. Issue: Name has been set using the incoming batch payment sequence This occurs because `batch_type` is set to readonly when a payment is added to the list. As result, the current batch type is never sent to the backend that will use the default 'inbound'. opw-5128426 Forward-Port-Of: odoo/enterprise#99570
34 changes
Enhancements to existing features
Users can now drag and drop an attachment directly onto a new expense form without being blocked by missing required fields. The duplicate attachment link in the expense list view was also removed, making the interface less confusing.
Original PR description
[IMP] hr_expense: enable attachment drop on expense form view Steps to reproduce the use case that is improved: - create a new expense (without writing anything) - drag and drop an attachment -> Some required field prevent this behavior Solution: Pre-fill values that are required when dropping an attachment. ---------------------------------------------------------------------------------------------- [FIX] hr_expense: remove duplicate attachment link remove an unnecessary link to the attachments of expenses in the list view. task-4684825 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The test cases for Philippine tax report generation were updated to match the latest description changes. This helps keep the reporting feature reliable and ensures future updates do not break expected report outputs.
Original PR description
Related PR: https://github.com/odoo/odoo/pull/235448 TaskID-5248240
This update improves the internal documentation of the website and HTML builder plugin system, including shared methods and reusable resources. It helps developers work faster and with fewer integration mistakes by making available features easier to discover in code editors.
Original PR description
Backport of https://github.com/odoo/odoo/pull/234203
This update adds missing tax entries for the Philippine localization and cleans up tax descriptions by removing unnecessary ATC codes. It helps ensure local tax data is more complete and easier to read in reports and forms.
Original PR description
Spec: Several taxes were missing in the Philippine localization. Existing tax descriptions were filled with unnecessary codes. IMP: Added additional taxes as per the provided specifications. Updated descriptions for existing taxes by excluding ATC code. Related PR: https://github.com/odoo/enterprise/pull/99354 TaskID-5248240
Resolved issues and error corrections
This update prevents accidental line breaks from being included in Swiss QR code fields. As a result, QR codes are less likely to be rejected by banks or payment systems due to incorrect formatting.
Original PR description
Swiss QR codes have required information for each line of the QR code. Newline characters present in a field's content shift the content to a different line than intended, causing the QR code to be rejected. This commit removes newline characters from the field elements and alters a unit test to check if this issue occurs again. opw-5095997 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233880
This fix ensures the restaurant floor plan only shows booking notifications for the correct appointment type set in the POS configuration. It also prevents misleading bookings from appearing and then disappearing after a refresh, making the booking experience more reliable for staff.
Original PR description
Task: [#5005216](https://www.odoo.com/odoo/my-tasks/5005216) Enterprise v17.0: [#93714](https://github.com/odoo/enterprise/pull/93714) --- **Before:** If no appointment type is specified in the POS config and a table is booked via the website, the floor plan is notified of a new booking because the resource used is one of the POS config resources. However, if the page is refreshed, the booking disappears since no appointment type is defined in the POS config **After:** The floor plan is notified of a new booking only if the appointment type of the booking matches the one specified in the POS config. If no appointment type is set in the POS config, no booking notifications are sent. Additionally, when the "Table Booking" field is unchecked in the POS config, the appointment type is automatically unset. Forward-Port-Of: odoo/enterprise#98887 Forward-Port-Of: odoo/enterprise#93636
Imported accounting entries that share the same matching number will now be handled more reliably during automatic reconciliation. This prevents one reconciliation from accidentally blocking others on different accounts, helping imported data get matched correctly without manual follow-up.
Original PR description
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the…
When a FEC file imports journal items, it will create them to draft with reconciliations stated by a matching number starting with "I" (also the case for other some types of imports). Once the entries are posted, the system will create odoo reconciliation records for those journal items. The issue lies in this part of the code removing the matching when performing reconciliations for the same matching number https://github.com/odoo/odoo/blob/9d34c7ee85d105a56c3393a3dbb3e5d62d4d634a/addons/account/models/account_partial_reconcile.py#L206 Most of the time it's not a problem for the auto reconcile mechanism of FEC. However since this mechanism reconciles grouped on matching + account, we can end up in a case where a first reconciliation on account A will remove all matching number similar but on account B leading to no automatic reconciliation for them. This commit aims to fix that by removing amls imported matching number (starting with "I") from the reconciled amls to consider. opw-5086823 Forward-Port-Of: odoo/odoo#234481
This change makes the manufacturing training/test flow more reliable by removing a step that could cause the screen to refresh at the wrong time. It also ensures the intended product appears first, preventing intermittent failures during the add-component process.
Original PR description
The search in the "Add Component" dialog caused a re-render race, making the tour ``test_add_component_from_shop_foor_in_multi_step_manufacturing`` fail intermittently. This fix removes the search steps and marks the “Courage” product as favorite so it appears first in the catalog. runbot-227694 Forward-Port-Of: odoo/enterprise#92403
Bancontact payments that require an extra verification step are now kept in a pending state instead of being marked as failed. This prevents customers from seeing an error during the normal redirect-based payment flow and helps payments complete correctly.
Original PR description
When paying with Bancontact, in case a 3DS validation is required (challenge flow), Wordline will send a webhook (see below) to indicate that an external (asynchronous) validation was requested.…
When paying with Bancontact, in case a 3DS validation is required (challenge flow), Wordline will send a webhook (see below) to indicate that an external (asynchronous) validation was requested.
Example of recevied webhook:
```
{
'apiFullVersion': 'v1.1',
'apiVersion': 'v1',
...
'payment': {
'status': 'AUTHORIZATION_REQUESTED',
'statusOutput': {
'isAuthorized': False,
'isCancellable': False,
'isRefundable': False,
'statusCategory': 'PENDING_CONNECT_OR_3RD_PARTY',
'statusCode': 51
}
},
'type': 'payment.authorization_requested'
}
```
Since efc2788dfccd, when receiving such webhook we set the transaction as error then force the user flow to `redirect`; this was done to handle payment w/ token (`online_token`) where a 3DS challenge is still required.
But for Bancontact - which is non-tokenizable - we will always be in the "redirect" mode, so we must keep the transaction as `pending`.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235847We removed a restriction that prevented users from reusing or copying tax groups when the linked payable or receivable accounts did not match a specific account type. This makes tax group setup and maintenance more flexible while still allowing account types to be adjusted afterward.
Original PR description
**Issue:** A constraint has been added to "account.tax.group" model some month ago, forcing a type for "Tax Payable Account" and "Tax Receivable Account" fields. However, some users had changed the type of these accounts or selected another one and they cannot do it anymore. They can't copy these tax groups neither. The constraint is too restrictive as we want to be more permissive. It's still possible to change the type of the account after selecting it for the tax group. Therefore, the constraint has some flaws. **Solution:** Remove the constraint. **Community PR:** https://github.com/odoo/odoo/pull/235548 opw-5231379 Forward-Port-Of: odoo/enterprise#99421
When a lead is moved to a different sales team, its stage is now refreshed to match that team’s available stages. This prevents leads from staying in an outdated stage that no longer fits the team they belong to, improving consistency for sales users.
Original PR description
**Steps to reproduce:** - Install CRM and set the Leads configuration setting - Go to CRM > Configuration > Sales Teams - Create two Sales Teams - Go to CRM > Configuration > Stages - Create multiple stages specific to each team - Make the current user belong to both teams - Go to CRM > Leads - Create a new lead (stage is assigned here) - Change its Sales Team - Lead stage is not updated according to the team **Issue:** The `stage_id` of `crm.lead` is never updated after it is set. This means that changing the related team will not modify the possible stages of the lead (even if it should not be available to the current team). **Fix:** Check if the team of the lead is the same as the one of its current stage during `_compute_stage_id`. opw-4901009 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232136
This change prevents the VOIP system from trying to reconnect when a user leaves the page normally. It avoids a conflict between two registration actions, which could otherwise trigger errors during page unload.
Original PR description
On page unload, two conflicting things happen: - A REGISTER request with expires=0 is sent to invalidate the registration - The WebSocket disconnects, triggering the reconnection mechanism that attempts to reissue a registration These two concurrent and conflicting REGISTER requests result in the following error: > RequestPendingError: REGISTER request already in progress, waiting for final response This commit prevents the reconnection mechanism from occurring in the event of a "natural" disconnection, such as one triggered by a page unload. This way, the two conflicting REGISTER requests aren't sent on page unload. [Task-5261940](https://www.odoo.com/odoo/project/5778/tasks/5261940) Forward-Port-Of: odoo/enterprise#99560 Forward-Port-Of: odoo/enterprise#99376
This update refreshes the websocket-client package used by the IoT box image to version 1.9.0. It helps prevent unwanted disconnections, improving the reliability of connected devices and reducing service interruptions.
Original PR description
This commit updates the PIP package websocket-client to 1.9.0 to fix disconnection issues. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235999 Forward-Port-Of: odoo/odoo#235748
This change removes an overly strict rule on tax group accounts, so users can again choose or copy tax groups even if the linked tax payable or receivable account has a different type. It restores flexibility without preventing users from updating the account type later if needed.
Original PR description
**Issue:** A constraint has been added to "account.tax.group" model some month ago, forcing a type for "Tax Payable Account" and "Tax Receivable Account" fields. However, some users had changed the type of these accounts or selected another one and they cannot do it anymore. They can't copy these tax groups neither. The constraint is too restrictive as we want to be more permissive. It's still possible to change the type of the account after selecting it for the tax group. Therefore, the constraint has some flaws. **Solution:** Remove the constraint. **Enterprise PR:** https://github.com/odoo/enterprise/pull/99421 opw-5231379 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235548
This change improves how fixed taxes are represented when invoices are exported, especially for UBL documents. It ensures different tax types are treated correctly, so exported invoices are more accurate and consistent for customers and tax authorities.
Original PR description
This commit contains 2 things: - an helper to extract any tax_data and move it to another base_line - the usage of this helper in UBL to turn emptying taxes into additional base_lines == Add helpers…
This commit contains 2 things: - an helper to extract any tax_data and move it to another base_line - the usage of this helper in UBL to turn emptying taxes into additional base_lines == Add helpers to turn tax_data into new base_lines easily == With this helper, you can now exclude any tax from any base line and turn them into new base lines. Also, I changed a bit the smooth distribution of rounding because the math.ceil is sometimes too greedy and make the whole results to be less accurate. == Make a different behavior between recycling contribution taxes / emptying taxes == In UBL, all fixed taxes are treated as allowances/charges. In this commit, we make a clear distinction between recycling contribution taxes that are treated as allowances/charges and emptying taxes that are exempted of tax and are treated as addition invoice lines in the document. == Fix a small issue with aggregate_function passed to reduce_base_lines_with_grouping_function == The aggregator wasn't called when setting the 'target_base_line' at the very first time. task_id: 5182783 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235580 Forward-Port-Of: odoo/odoo#234489
This fix ensures that products shown in the add-to-cart pop-up only belong to the website the shopper is currently browsing. It prevents customers from seeing optional products that are not available on that site, reducing confusion and avoiding incorrect product offers.
Original PR description
Steps to reproduce: =================== 1- Create another website 2- Sales app > Products > Open any product's form 3- In the Optional Products field, select any other product in your database for this field 4- Open the product form of the optional product you selected 5- Set the Website field to only be one of your websites, rather than All 6- Navigate to the Website app > Select the non set website in the other Steps 7- Open your shop > Select your main product > Click the add to cart button -> See the optional product appear in the pop-up. Cause: ====== _should_show_product function doesn't validate if a product is available on the website from which the request originates when handling multiple websites. Solution: ========= Update the function to take multiple websites into consideration opw-5179894 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233170
This change prevents an error in payroll processing when a payslip date is missing or empty. The system now safely handles those cases instead of failing, reducing interruptions for users and improving reliability.
Original PR description
The assertion was added to prevent the use of the _is_overlapping_period function with null or False dates. Which fixes an exception caused when a payslip's date was false/null. Related to odoo/enterprise#97013 task-5159666 Forward-Port-Of: odoo/odoo#231247
This fix ensures that when the account on a vendor bill line is changed, any linked non-deductible product line is updated to use the same account. This prevents mismatches between related accounting entries and helps keep bills consistent and correctly posted.
Original PR description
When you have a vendor bill with an invoice line linked to a journal item with the display type "non_deductible_product", if you modify the account_id of the invoice line, then the account_id of the…
When you have a vendor bill with an invoice line linked to a journal item with the display type "non_deductible_product", if you modify the account_id of the invoice line, then the account_id of the linked line should change to have the same value.
How to reproduce?
1. Create an asset model (Accounting > Configuration > Accounting > Asset Models)
2. Set the asset_model_id on an account (on the tab "Automation", set "Automate Asset" as "Create in draft" then set the "Asset Model" field with the created asset model
3. Duplicate the account having the created asset model
4. Create a vendor bill with an invoice line having:
- A strictly positive price unit
- A deductible_amount (Professional %) lower than 100 (this field is hidden by default)
5. Modify the account_id of the invoice line
6. Observe the journal items: the line with the non- deductible product should have the same account_id than the invoice line but it's not the case.
task-5156256
Forward-Port-Of: odoo/odoo#232121Draft payslips could raise an error when their period date was cleared. This fix lets users remove the date safely and includes an automated test to prevent the issue from coming back.
Original PR description
When removing the date in a draft payslip an exception was raised. This was fixed and a test was added to check the flow. Related to odoo/odoo#231247 task-5159666 Forward-Port-Of: odoo/enterprise#97013
The invoice form now avoids showing an empty section that could shift labels and fields out of alignment. This keeps the layout consistent for users in the affected accounting setup, especially when currency options are not available.
Original PR description
### Issue: In a certain case, the div `journal_div` has nothing inside and is displayed. This causes the form view to be offsetted. ### Steps to reproduce: - Install "l10n_ar" and switch to an…
### Issue:
In a certain case, the div `journal_div` has nothing inside and is displayed. This causes the form view to be offsetted.
### Steps to reproduce:
- Install "l10n_ar" and switch to an Argentinian company
- The user must not have the group `base.group_multi_currency`
- Settings > Currencies and deactivate the USD
- Make sure you only have one Sales journal
- Create an invoice
- The field 'Result' is offsetted
### Cause:
The div `journal_div` is constructed like this:
```xml
<div name="journal_div" class="d-flex">
<field name="journal_id"
invisible="not show_journal"/>
<div name="currency_div"
groups="base.group_multi_currency">
...
</div>
</div>
```
In the case `show_journal = False` and the user doesn't have the group `base.group_multi_currency`, then `journal_div` is empty, but it's still displayed.
It will take the place of a label, this means that the next field label will be in the "input" column and its input in the "label" column.
### Solution:
We need to not display the `div` when `show_journal = False` AND the user doesn't have the group `base.group_multi_currency`. This is not possible.
A possible fix would be to add a non-stored computed field just like `show_journal` to show or not the div.
This commit chose to fix this with CSS: do not display `journal_div` if it's empty. This is also more secure in the case where a customization added things in the div.
Before this commit:
<img width="1048" height="273" alt="image" src="https://github.com/user-attachments/assets/04062527-ee8d-463c-9768-72f0680c922d" />
After this commit:
<img width="1052" height="221" alt="image" src="https://github.com/user-attachments/assets/30b4f169-f4c0-485f-b895-b8d33bfd1fa6" />
opw-5221931This fix resolves an issue where the status bar could show empty dropdowns after selecting a stage when not all items fit on screen. It ensures the hidden stages are properly included in the dropdown, so users can reliably change statuses without missing options.
Original PR description
Since PR [1], there was an issue with the statusbar field and the way it put overflowing items into dropdowns (cf. adjust function). Have a form view with a statusbar field and enough items s.t. they…
Since PR [1], there was an issue with the statusbar field and the way it put overflowing items into dropdowns (cf. adjust function). Have a form view with a statusbar field and enough items s.t. they don't all fit in the screen. The widget implements a logic to put the first and/or last overflowing items into dropdowns (one before the displayed items, one after). Before this commit, if the user clicked on an item to select it as new value, the state of the widget was incorrect, leading to dropdowns being displayed, but empty (and items being unavailable, as they are hidden, but not displayed in the dropdown). This was due to a `useEffect` with an incorrect dependency: if two consecutive renderings were done with the `shouldAdjust` status (which is possible since [1] and the introduction of the `forceRecomputeItems` flag), the dependency didn't change and the callback of `useEffect` was not called, leading to items not being processed. [1] https://github.com/odoo/odoo/pull/230548 opw~5232448 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
The .dat export for Philippine reports now uses the same date range as the report filter, so the file period and the report data stay consistent. A non-blocking warning also helps users notice when the selected export period does not match the report period, reducing the chance of confusion or incorrect filings.
Original PR description
Before this commit: - The `.dat` export adjusted its date based on the selected export type’s periodicity (quarterly or annually) using the report filter's date_to. - This caused mismatches where the…
Before this commit: - The `.dat` export adjusted its date based on the selected export type’s periodicity (quarterly or annually) using the report filter's date_to. - This caused mismatches where the `.dat` file showed a different period than the report data. - The adjustment only changed the date in header of `.dat` file but did not restrict data accordingly, leading to inconsistencies when exporting reports with different filter and periodicity types. - Example: If the report filter is set to 'October 2025' month and the export type's periodicity is 'Annual', the `.dat` file would show 12/31/2025 even though the data in `.dat` file only covers 'October 2025'. Similar mismatch occurs for 'month & quarter' and 'annual & quarter' combinations. After this commit: - The `.dat` export date now fully depends on the report’s date filter, keeping report data and export date consistent. - A non blocking warning is added in the `.dat` export wizard when the report period type is different from the export type's periodicity, helping users select the correct period type while still allowing export if intended. task-5172259
This update fixes an issue where some accounting and localization workflows could proceed without a bill date being properly required. It helps ensure invoices and related reports behave consistently, reducing the risk of incomplete or incorrect billing information.
Original PR description
task-5214234
The Due button on a partner record will now stay visible whenever the partner has at least one invoice, even if their balance is currently zero. This makes it easier for users to quickly access customer financial information and statements without the shortcut disappearing unexpectedly.
Original PR description
The `Due Button` on `res.partner` is a convenient shortcut to access the partner’s current financial situation, especially the Customer Statement report. Even if the partner has no outstanding balance, the shortcut remains useful. So in this commit, we update the visibility logic of the `Due Button` so it appears as long as the partner has at least one `invoice (in/out)` linked to them. This means the button will remain visible even when the total `due amount is `zero`, ensuring the shortcut is always accessible. Task-5264512
This fix corrects the unit of measure shown for finished products in manufacturing orders when the bill of materials uses a pack-based unit. It helps ensure the produced quantity is recorded and displayed accurately, avoiding confusion during production validation.
Original PR description
**Steps to reproduce:** - Create a bill of material for a product tracked by lot - Modify the uom on the bill of material for that final product to 'pack of 6' - add any component that you like - Create a manufacturing order for the final product - Generate a lot number and validate the production order **Issue:** The unit for the final product is incorrect. Task: 5232897 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update corrects access permissions so regular users and applicants can no longer access car-related information they should not see. It helps protect sensitive employee data and ensures the salary contract flow respects user permissions.
Original PR description
Normal users and applicant don't have access to car.
The Pay Category field is no longer mandatory for employees and contract templates, which helps cases like freelancers or people without an occupation avoid unnecessary setup. Employees without a Pay Category will be excluded from pay runs, and the form text has been updated to make this clearer.
Original PR description
The field is always required in the employee and contract template form views, but a Freelancer, or people without occupation should not bother with it. There was a check on the pay category during the payslip creation which is now removed since the payslip is computed based on the pay structure on the payslip form not the one on the employee profile. Employees without a pay category will be excluded from pay runs, therefore the "Pay Category" placeholder in form views has been updated to indicate so. Task-5237800
Vendor bills will no longer automatically use today’s date when the date is left blank. This helps avoid accounting mistakes that can affect VAT periods and tax deductibility, since the bill date often differs from the posting date.
Original PR description
Defaulting the bill date to today (behavior since 19.0) is error-prone for accounting (e.g., VAT periods, deductibility) as the bill date rarely matches the posting date. This commit restores the validation error if the date is empty on vendor bills, forcing a user to enter the correct date. task-5214234 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The employee and contract form now makes it clear that leaving the pay category field empty means the employee will not be included in pay runs. This helps avoid confusion and reduces the risk of employees being unintentionally left out of payroll processing.
Original PR description
The pay run field is now optional on employee profiles and contract templates, and therefore such employees are not included in pay runs. This commit makes the placeholder for the field indicate that the employee will be excluded from pay runs. Task-5237800
This change prevents an error that could occur when a user deletes the value in a pricelist rule’s base price field and then saves. It improves the reliability of pricelist editing in the website sales flow and avoids an interruption for users configuring pricing rules.
Original PR description
Currently, an error occurs when user removes value from `Based On` field and saving. Steps to replicate: - Install `website_sale` with demo and enable pricelists from settings. - Open pricelists and…
Currently, an error occurs when user removes value from `Based On` field and saving. Steps to replicate: - Install `website_sale` with demo and enable pricelists from settings. - Open pricelists and Open any Pricelist. - Under the pricelist rules, make sure `Price Type` is selected as Formula. - Remove value from `Based Price` and click elsewhere. Error: `KeyError: False` Cause: - As the `base` field was changed the compute was called and `item.base` was passed on as 'False' at line [1] and caused the Keyerror. Solution: - The code skips execution when `item.base` is False, as there is no point in making the `item.rule_tip` [2] if we dont have all the values. [1]: https://github.com/odoo/odoo/blob/257537584bedc1ab7db1bdc700f89145a3bb6095/addons/product/models/product_pricelist_item.py#L287 [2]: https://github.com/odoo/odoo/blob/257537584bedc1ab7db1bdc700f89145a3bb6095/addons/product/models/product_pricelist_item.py#L284-L296 sentry-6948941509 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When merchants replace a product image in the website editor, the uploaded image will now keep a high-resolution quality instead of being reduced to a blurry, compressed version. This improves the appearance of zoomed product images and avoids visible compression artifacts for customers.
Original PR description
Versions -------- - 19.0+ Steps ----- 1. Have a browser open with a side-bar or that isn't full-screen; 2. open website editor on a product page; 3. enable zoom-on-click; 4. replace the main image;…
Versions -------- - 19.0+ Steps ----- 1. Have a browser open with a side-bar or that isn't full-screen; 2. open website editor on a product page; 3. enable zoom-on-click; 4. replace the main image; 5. save changes; 6. click on the new image to zoom in; 7. download the image. Issue ----- The image is too small & low quality. Cause ----- The `this.dependencies.media_website.replaceMedia(image)` call is meant to be used along with an html editor widget to select size & quality. As we have a custom widget to handle product images, the image that ends up getting uploaded is one that's been optimized for the current viewport size. Solution -------- Replace the `replaceMedia` call with custom logic similar to that used for extra media, drawing the image to a `canvas` element, and then saving it as the product's `image_1920` field. Additionally, enable extra media to get saved as in 1920 size, and remove the hardcoded `0.75` image quality value, as a value this low easily leads to visible compression artifacts. opw-5088032
This change prevents a report page from briefly reloading with outdated settings when switching between report variants. It fixes an error that could appear in composite reports, making report navigation more reliable for users.
Original PR description
This fix a traceback: - Create a report "A" with Period Comparison set to True - Create a report "B" with Period Comparison set to False - Create a composite report with report "B" inside. - Use the…
This fix a traceback: - Create a report "A" with Period Comparison set to True - Create a report "B" with Period Comparison set to False - Create a composite report with report "B" inside. - Use the variant filter to switch from report "A" to the composite report This happens because of a UI refresh in `loadReportOptions` trigged by: - delete this.reportOptionsMap[cacheKey]; - delete this.loadingCallNumberByCacheKey[cacheKey]; When refreshing the UI, it will start with the cachedOption set to the value of the displayed report (report "A"), and is able to pass the condition inside `filters.xml`: `<t t-if="controller.filters.show_period_comparison">`. While this is happening, the loading of the new report "composite" reaches `this.cachedFilterOptions = options;`. However, the UI refresh is still ongoing, and when it reaches `<t t-if="controller.cachedFilterOptions.comparison.string">` in `filter_comparaison.xml`. If the new report doesn't have the comparaison filter enabled, cachedFilterOptions.comparison will be undefined triggering the traceback. This is fixed by marking the objects, that would trigger this useless refresh, as raw preventing them from triggering a refresh. This only happened on composite reports since the cacheKey used to load them is different from the one received by the call to get_options due to the sections. task-5085985
This change makes server-side call disconnections behave the same way regardless of how they happen. Users will now get a log entry and a notification every time, which makes the experience more predictable and easier to understand.
Original PR description
Before this commit, when a rtc session was removed by the server, the behavior was different depending on the notification flow, this commit makes it so that server disconnections are treated the same way, with a log entry and a notification.
Miscellaneous changes
This pull request appears to contain a very small change with no clear user-facing impact based on the provided information. It likely serves as a maintenance or test update, so business users should not expect any functional difference.
Original PR description
Very clean, 0 mistakes
19 changes
New functionality added to Odoo
This update adds a new Spanish tax rule to distinguish income and withholdings related to temporary incapacity from regular payroll amounts. It helps businesses generate AEAT Form 190 more accurately and reduces the risk of reporting errors in annual tax filings.
Original PR description
### Description of the feature this PR addresses: **Specific tax on withholdings for incapacity to work created to correctly reflect the amounts derived in Form 190 of the AEAT.** A new tax called…
### Description of the feature this PR addresses: **Specific tax on withholdings for incapacity to work created to correctly reflect the amounts derived in Form 190 of the AEAT.** A new tax called "**100% WHI monies**" has been created with the aim of correctly reflecting the income derived from incapacity for work in the AEAT's Model 190. ### Current behavior before PR: Currently, Odoo does not allow automatic differentiation between monetary payments derived from work incapacity and those not derived from it. This creates a problem when generating Model 190, as the Spanish Tax Agency (AEAT) requires both types of payments to be reported separately (according to the codes and subcodes established in the model). **In practice, this separation is necessary because:** - Income derived from incapacity for work (e.g., sick leave) is considered employment income with differentiated tax treatment. - Withholdings made on these amounts must be declared in specific sections of Form 190. - If they are not separated correctly, the totals on the form may be incorrect or incomplete, affecting the accuracy of the tax information submitted. ### Desired behavior after PR is merged: A new tax has been added to represent “100% Withholding income tax (workers)”, allowing Odoo to: - Correctly identify and calculate the related amounts. - Report them separately in the AEAT Model 190. - A new tax group has also been created to distinguish these withholdings from regular ones. ### Benefits: - It allows you to correctly generate Form 190, separating income derived from and not derived from work disability. - It facilitates the accounting and tax traceability of this type of income. - It ensures consistency with the information structure required by the Spanish Tax Agency (AEAT), avoiding errors in the annual filing. - It improves the flexibility of the Odoo tax system, adapting it to actual tax needs. ### Technical summary: - A **new specific tax** has been created for withholdings associated with incapacity for work benefits. - This tax **allows the amounts corresponding to these benefits to be identified, accounted for, and reported independently.** - In addition, a **new tax group "Whitholdings IRPF Workers" has been added that groups these withholdings together**, allowing them to be clearly distinguished from other withholdings on earned income. The related issue: https://github.com/OCA/l10n-spain/issues/4416 ### Follow-up suggestion: adjust Odoo’s base tax “15% WHI monies” **Proposal:** Change the base tax “15% WHI monies” to 100% and move it to the new “Whitholdings IRPF Workers” tax group. **Why:** The current 15% rate is not aligned with how AEAT Model 190 requires amounts to be computed: the base should reflect 100% of the earnings derived from temporary incapacity, with the withholding rate applied on top of that base. Keeping 15% leads to misclassification and wrong totals in the "_percepciones_" and "_retenciones_" sections. These are variable withholdings, not fixed taxes — each worker’s rate can change monthly depending on their income and number of days worked. Therefore, having a fixed 15% rate is conceptually incorrect and causes misclassified amounts and inaccurate totals, forcing users to adjust values manually after payroll. Ideally, this tax should not have any fixed percentage defined. Since Odoo currently requires a rate, setting the base to 100% is a pragmatic workaround that ensures more accurate and flexible withholding calculations. **Outcome:** - Correct calculation and reporting of **_percepciones derivadas de incapacidad laboral_**. - Clean separation from other withholdings via the new tax group. - Consistency between accounting, payroll, and the 190 export. Would you accept this change? @moduon @rafaelbn @EmilioPascual @chklop @jco-odoo MT-11667 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds support for carrying key website checkout details into Taiwan electronic invoices for Ecpay. It helps ensure the invoice is created with the right customer and order information after an online purchase.
Original PR description
This module adds extra functions on the website sale for l10n_tw_edi_ecpay, passing values from e-commerce to invoice for creating Taiwan E-invoice task-5122489 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Enhancements to existing features
The mail plugin can now identify the Odoo version it is connecting to. This lets the add-in show a clear message when it is used with an unsupported Odoo version, reducing confusion for users.
Original PR description
Purpose ======= The new addin has been refactored and doesn't work with older Odoo version, and so we add an endpoint to be able to show a message if we don't support that Odoo version. Task-4727609
The Point of Sale sales report now includes a clearer breakdown of payments by payment method. This makes it easier for businesses to review how customers paid and compare payment types in the report.
Original PR description
In this commit: ----------- - Enhances the PoS sales report by adding detailed breakdowns of payments grouped by payment method. task-5184319
Odoo Point of Sale and Self-Ordering now support Chrome’s Local Network Access feature, which allows the browser to reach local devices over HTTP without triggering mixed-content errors. In practice, this makes it easier to connect to Epson printers and the black box, removing the need for certificates in these setups.
Original PR description
*: pos_self_order, pos_epson_printer Feature: https://chromestatus.com/feature/5152728072060928 Since Chrome 142, a new feature called “Local Network Access” has been added, allowing local IPs to be contacted via HTTP without mixed content errors. This means that certificates are no longer required to contact Epson printers or the black box.
Resolved issues and error corrections
The activity list now keeps pagination usable even when some activities are filtered out by access rules. This prevents users from getting stuck on a page that appears complete while additional accessible activities still exist on later pages.
Original PR description
**Steps to reproduce:** - Create some activities which should not be accessible to a specific user (according to the `_search` filtering of `mail.activity`) - Go to Activity Menu > View all…
**Steps to reproduce:** - Create some activities which should not be accessible to a specific user (according to the `_search` filtering of `mail.activity`) - Go to Activity Menu > View all activities as the given user - Ensure that the limit (default: 80) is lower than the total number of activities which should be returned and that the new activities are in the returned elements - On `web_search_read` some records are removed by the `_search` override - The pagination navigation buttons are disabled as the returned number of records is lower than the limit - This means that some activities are not accessible to the user (everything above the given limit) **Issue:** The issue comes from the `_search` override which checks the records available to the user. As it's done after fetching with the limit, the resulting number of records can be lower than expected and this breaks the `_format_web_search_read_results` which considers that we have all the possible records and doesn't try to fetch the total count of records. **Fix:** The main issue can't be directly fixed without modifying the way the access are checked in the `_search` override. This could be mitigated by changing the search limit, making the search as superuser, or adding specific filtering but each has its own limitations. Adding `force_search_count` should allow the user to navigate between pages anyway and see all the available activities. But the number displayed in the pagination will often be incorrect for the current and total count. (e.g. we can have 75 records but 1-80/150 is displayed out of 140 actually readable records) opw-5046389 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures replenishment filters show the right records when users search for items with a to-order value of zero. It removes a mismatch that could incorrectly include products that actually need to be ordered, making inventory filtering more reliable.
Original PR description
**Issue** In replenishment, filtering with `to_order = 0` does not correctly exclude records where `to_order != 0`. **Steps to reproduce** 1. Go to Inventory > Operations > Procurement >…
**Issue** In replenishment, filtering with `to_order = 0` does not correctly exclude records where `to_order != 0`. **Steps to reproduce** 1. Go to Inventory > Operations > Procurement > Replenishment 2. Create a replenishment with a forecast quantity smaller than the min and max quantity (without editing the To Order) 3. Apply a custom filter `to_order = 0` → Records with non-zero `to_order` are incorrectly included **Cause** `qty_to_order` was split into `qty_to_order_computed` and `qty_to_order_manual` in [this commit](https://github.com/odoo/odoo/commit/156bed3f430d706e13822bbd95d91c8dfd3ea42d#diff-0eb18a8d7773b5f99b402392188594178c3ba2004e4bcab26dbc84b1c8d7256a). In the [`_search_qty_to_order` method](https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_orderpoint.py#L338), all records with `qty_to_order_manual = 0` are included. Since `qty_to_order_manual` defaults to 0 when untouched by the user, this causes incorrect results. Additionally, [`to_order`](https://github.com/odoo/odoo/blob/322c6d0468bf79e9d29e1375c49aa13d4a7b7a67/addons/stock/models/stock_orderpoint.py#L323) displays `qty_to_order_computed` if `qty_to_order_manual = 0`, creating inconsistency. **Solution** Fix the inconsistency by ignoring `qty_to_order_manual` when searching for zero `to_order` values. opw-5150643
This fix makes the event dot easier to see when an event is displayed with a hatched style. It also ensures the correct styling is applied consistently in views like Planning, even when the Calendar app is not installed.
Original PR description
When pills are hatched (unpublished event) in the calendar view (eg. planning) the `o_event_dot` is barely visible. Additionally the styling to display the dot as outlined on hatched event is wrongly scoped in `/calendar` with the calendar status styling. It should be in the view instead. Otherwise, for the planning module which doesn't depend on calendar, the styling is not applied if calendar is not installed, rendering the filled dot. task-3916768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235286
The import screen now shows the same formatting options for CSV files whether the file extension is written as .csv or .CSV. This removes an inconsistency that could confuse users during file imports, while keeping the import itself working as before.
Original PR description
Before this fix, the import side panel displayed the formatting options only when the uploaded file had a lowercase .csv extension. Files with an uppercase .CSV extension could still be imported but did not show the format selection section, leading to inconsistent behavior. This commit updates the condition to perform a case-insensitive comparison on the file extension. Task-5145031 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235061
This fix ensures users see the full list of unbalanced accounting entries when a balance check fails. It improves the error message so teams can identify and correct all affected records more quickly.
Original PR description
The commit 3467b5971423f70581c6be2caf7f8a8d86ee70f1 intended to improve the error message in `_check_balanced()` by tailoring it based on the number of affected entries. However, in the case of multiple affected entries, the error was raised after the first iteration, preventing the full list of unbalanced entries from being collected and displayed to the user. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a cashier tries to request an invoice and the order does not meet the required conditions, the system will now display the error instead of hiding it. This helps users understand why the action failed and correct the order information before trying again.
Original PR description
Initially, all errors emerging from the `action_pos_order_invoice` call were ignored through a `silentCall`.…
Initially, all errors emerging from the `action_pos_order_invoice` call were ignored through a `silentCall`.
https://github.com/odoo/odoo/blob/eac2a1132fd7a9a6ba51b87195c5f0b5a706b191/addons/point_of_sale/static/src/app/models/data_service.js#L638-L645
This prevents the user from being shown an error when they attempt to perform a forbidden action. An example of an error silenced by this issue is shown in https://github.com/odoo/enterprise/pull/98802, which was also the initial reason for this fix.
Replacing the `silentCall` by a `call` allows us to work with the RPCErrors raised from the `action_pos_order_invoice` call and show the users why their operations might be invalid. Other errors are only displayed as a warning, just like they would have been using a `silentCall`.
Steps to reproduce an error which required this fix:
- Install the POS app and the "_Mexican localization for the Point of Sale_" module (`l10n_mx_edi_pos`)
- Set the company to a Mexican one (e.g. _ESCUELA KEMPER URGATE_)
- Open the POS app
- **Sell a product**
- Open a register
- Select a product and click "Add"
- Click "Payment"
- Set the Customer to a new customer with only a name
- Click "Cash" to set the Remaining to 0
- Click "Validate"
- **Request an invoice**
- Once the payment is done, get to the Orders tab (in the POS)
- Set filter to "Paid"
- Select the transaction at the top of the list
- Click "Invoice"
- Set "Invoice to public" to "Yes"
- Click "Ok"
- An error should be displayed, because the selected customer does not have a country or zip code set. This error is prevented by the `silentCall` mentionned above.
opw-5171035This update ensures Flutterwave payment references are always unique by adding a timestamp to each one. It prevents payment requests from reusing the same identifier, which helps avoid provider-side errors when tests or database resets create repeated reference sequences.
Original PR description
The `/payments` endpoint of the Flutterwave v3.0.0 API expects unique `tx_ref` parameters (matching Odoo's payment transaction `reference` field) to be passed. This is guaranteed by a UNIQUE() SQL constraint in Odoo, but testing sometimes involves dropping the database, leading to transaction references being repeated at the provider level for a given merchant account. This commit singularizes all transaction references by suffixing them with the current timestamp, ensuring that the `tx_ref` API parameter remains unique across transaction reference sequences. Forward-Port-Of: odoo/odoo#235799
The Belgian Partner VAT Listing now correctly leaves out exempt transactions, instead of showing some 0% taxes when a partner’s total base exceeds the reporting threshold. This makes the report align with the tax rules for exempt operations and reduces the risk of misleading VAT declarations.
Original PR description
Currently, the behavior is wrong and 0% taxes appear in the report (if the cumulative base for a partner is > 250) A distinction needs to be done here. The operations are taxable (even at a zero rate) or exempt. We shall rely on the Tax Category Code (E = Exempt) When a tax belongs to E, it cannot appear in the Partner VAT Listing. It is exempt from taxation. It does not open the right to deduction of vat on purchases. task-5269970
This fix restores the correct sizing for calendar views when they are added to My Dashboard. As a result, the calendar is visible and usable again instead of appearing collapsed or blank.
Original PR description
Problem: When a calendar view is added to the My Dashboard menu, it is rendered with style height: 100%. This results in a height of 0px, making the calendar unviewable. Purpose: Reintroduce code that sizes the calendar renderer based on page size. Steps to Reproduce on Runbot: 1. Navigate to any Calendar view, then select Actions>Dashboard>Add 2. Refresh the page, then navigate to Dashboards>My Dashboard opw-5227497
This update fixes several layout issues in the Documents app on mobile devices. It removes unnecessary spacing, makes folders and documents use the available screen width more effectively, and restores scrolling so users can view all recent documents.
Original PR description
This commit fix several issue in kanban mobile view: - When a folder has folders AND documents, there is a huge gap between the two because of the kanban ghost records. - In the 'Recent' folder, folders and documents doesn't take all width. - In the 'Recent' folder, we can't scroll to see all the documents. Task-4963198
Reprinting a previously sold receipt in the Italian point of sale now prints the selected order instead of always printing the most recent one. This fixes a frustrating issue for staff and ensures customers receive the correct ticket when past orders need to be reissued.
Original PR description
before this commit, when trying to reprint a past order it would not work. Instead it would print the last order no matter what order is selected. Steps to reproduce: 1. setup an DB with an italian…
before this commit, when trying to reprint a past order it would not work. Instead it would print the last order no matter what order is selected. Steps to reproduce: 1. setup an DB with an italian POS 2. make 2 sales with a different product (easier tracking) 3. open the "orders" view 4. try to reprint the ticket of the firt order result: the receipt of the second order is printed the reason for this is that we were using the printer's built in command "printDuplicateReceipt" which is inteded for printing the very last receipt. With this commit, we changed the behavior and invoke another printer command. That command is meant to reprint any receipt, based on the provided reference. After this commit, trying to print any past receipt will print that exact receipt. IMPORTANT NOTE: In theory, the printer command can reprint any number of receipts. We decide that we will only use it to reprint the one receipt selected by the user. This moves the complexity of parsing date strings and ranges to the command component and therefore will keep the rest of the code cleaner. opw-5008702 opw-4882480
This fix restores clickable tab navigation in module information pages when the page contains multiple tabs. It brings the behavior in line with the app store description view, making it easier for users to browse module details.
Original PR description
* Before: if we have a block contain multiple tab in index.html file we can not click on it to switch between tab, unlike the behiviour in odoo apps store description https://github.com/user-attachments/assets/ab7f8213-2112-46e2-bb72-5e01cc1f7883 * After: Make the nav tabs work as it should be https://github.com/user-attachments/assets/12c05abc-84f6-495e-ae5b-b6eca4d81a92 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#186568
This fix restores drop-off point selection for Sendcloud delivery methods that use locker-based last-mile options. Customers will now see the map to choose a drop-off location when the delivery service supports lockers or a locker/service point combination, preventing these shipping methods from being incorrectly hidden.
Original PR description
Steps to reproduce ----- - Create a Sendcloud delivery method - Select a delivery service with "Locker or service point" as "Last mile" (eg "bpost @ bpack") > "Use Sendcloud locations" is set to…
Steps to reproduce ----- - Create a Sendcloud delivery method - Select a delivery service with "Locker or service point" as "Last mile" (eg "bpost @ bpack") > "Use Sendcloud locations" is set to false Cause ----- There is a problem with the values retrieved from the Sendcloud API call, more specifically the `available_functionalities` > `last_mile` value. The Sendcloud API (of both previous and current beta version) specifies the possible values to only be the following - `home_delivery` - `mailbox` - `pobox` - `service_point` - null https://api.sendcloud.dev/docs/sendcloud-public-api/shipping-options/operations/create-a-shipping-option https://api.sendcloud.dev/docs/sendcloud-public-api/branches/v2/shipping-products/operations/list-shipping-products However, it seems like they have added some new undocumented values `locker` and `locker_or_service_point`. To detect whether to use drop-off locations, we do https://github.com/odoo/enterprise/blob/5b64c63301bc814c7c9d99146af6a86d37563762/website_delivery_sendcloud/models/delivery_sendcloud.py#L51-L53 Where we compare the retrieved value with the string 'Service point' https://github.com/odoo/enterprise/blob/5b64c63301bc814c7c9d99146af6a86d37563762/website_delivery_sendcloud/models/delivery_sendcloud.py#L13 In our "Locker or service point" case, this does not work because the `in` operator makes a case sensitive comparison. Solution ----- Functionally, both lockers and service points work the same. The user should be prompted a map on which they choose where the delivery should be dropped off. So we can add `Locker` and `Locker or service point` as accepted values and enable the use of sendcloud locations for both. ----- Ticket: opw-5217796
This change prevents automatic quality checks from being created for component lines during manufacturing. It ensures quality controls are only triggered where they are intended, avoiding unnecessary checks on consumed materials and reducing confusion for users.
Original PR description
### State of the art: Control point for the manufacturing operation type are not expected to create QC when they refer to components. ### Steps to reproduce: - Create a BOM for a final product FP: -…
### State of the art:
Control point for the manufacturing operation type are not expected to create QC when they refer to components.
### Steps to reproduce:
- Create a BOM for a final product FP:
- 1 X COMP (consumable)
- Create a Quality Control Point:
- Control: Quanity
- Operations: Manufacturing
- Product: COMP
- Create and confirm an MO for 1 unit of FP
#### > A QC is created for the component
### Cause of the issue:
Quantity quality checks related to MOs are expected to be created by `_create_quality_checks_for_mo`, which ensures that only moves referring to the production are considered:
https://github.com/odoo/enterprise/blob/931779b845291e1dc7efdea91d91bdfa5ab703d6/quality_mrp/models/stock_move.py#L23-L29
However, each time a `stock.move.line` is created, it triggers the related "quantity" control points if it is not filtered out of the applicable lines:
https://github.com/odoo/enterprise/blob/931779b845291e1dc7efdea91d91bdfa5ab703d6/quality_control/models/stock_move_line.py#L28-L35
The issue is that move lines related to `move_raw_ids` are always considered applicable:
https://github.com/odoo/enterprise/blob/931779b845291e1dc7efdea91d91bdfa5ab703d6/quality_mrp/models/stock_move_line.py#L31-L34
and that the `_create_check` triggers "quantity" control points that directly refer to the `product_id` of the move line:
https://github.com/odoo/enterprise/blob/931779b845291e1dc7efdea91d91bdfa5ab703d6/quality_control/models/stock_move_line.py#L79-L88
Note, however, that `_create_check` ignores control points of move lines related to a raw move if they do not refer to any product_ids, due to `_get_quality_points_all_products` (which is only called to find control points without a set `product_ids`):
https://github.com/odoo/enterprise/blob/931779b845291e1dc7efdea91d91bdfa5ab703d6/quality_mrp/models/stock_move_line.py#L20-L24
This explains why the test `test_04_quality_check_on_quantity` did not trigger the creation of quality checks for components.
### opw-51375949 changes
Resolved issues and error corrections
This update fixes an issue in Studio where adding a new selection option without entering a value could crash the interface. Users can now click Add Selection safely, even if the input is left empty, which makes field setup more reliable.
Original PR description
**Before this commit:** When a user added a new Selection field and clicked the “Add Selection” :white_check_mark: button without entering any value, a `Client Error: (Cannot read properties of undefined (reading 'trim'))` was raised, resulting in a crash of the Studio interface. **After this commit:** Clicking the “Add Selection” :white_check_mark: button with an empty input no longer triggers an error. task-5159376
This update prevents accounting reports from crashing when a saved report points to a handler model that is no longer available. Instead of failing, the system now safely ignores the missing handler and continues to open the report normally, which helps during upgrades or when related modules have been removed or renamed.
Original PR description
In some customer databases, the `custom_handler_model_name` or its fallback `root_report_id.custom_handler_model_name` may point to a model that no longer exists (e.g. `l10n_il.tax.report.handler`).…
In some customer databases, the `custom_handler_model_name` or its fallback `root_report_id.custom_handler_model_name` may point to a model that no longer exists (e.g. `l10n_il.tax.report.handler`). https://github.com/odoo/enterprise/blob/7410249cfdfaca19769e1c9aed813666af8eb19d/account_reports/models/account_report.py#L2578
The previous implementation returned this model name directly without checking if it was registered, which caused a KeyError during report access.
This fix validates the model presence in `self.env` before returning it, and falls back to None if missing. This ensures stable behavior when localization or custom modules are removed or renamed during upgrades.
```python3
Traceback (most recent call last):
File "/home/odoo/src/odoo/17.0/odoo/service/server.py", line 1374, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-16>", line 2, in new
File "/home/odoo/src/odoo/17.0/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/17.0/odoo/modules/registry.py", line 110, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/home/odoo/src/odoo/17.0/odoo/modules/loading.py", line 519, in load_modules
migrations.migrate_module(package, 'end')
File "/home/odoo/src/odoo/17.0/odoo/modules/migration.py", line 221, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/src/odoo/17.0/odoo/modules/migration.py", line 239, in exec_script
migrate(cr, installed_version)
File "/home/odoo/src/odoo/17.0/addons/l10n_il/migrations/1.1/end-migrate_update_taxes.py", line 8, in migrate
env['account.chart.template'].try_loading('il', company)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 155, in try_loading
return self._load(template_code, company, install_demo)
File "/home/odoo/src/odoo/17.0/addons/account/models/chart_template.py", line 214, in _load
self._post_load_data(template_code, company, template_data)
File "/home/odoo/src/enterprise/17.0/account_reports/models/chart_template.py", line 31, in _post_load_data
company._get_and_update_tax_closing_moves(fields.Date.today(), include_domestic=True)
File "/home/odoo/src/enterprise/17.0/account_reports/models/res_company.py", line 163, in _get_and_update_tax_closing_moves
report, tax_closing_options = tax_closing_move._get_report_options_from_tax_closing_entry()
File "/home/odoo/src/enterprise/17.0/account_reports/models/account_move.py", line 272, in _get_report_options_from_tax_closing_entry
report_options = tax_report.with_context(allowed_company_ids=company_ids).get_options(previous_options=options)
File "/home/odoo/src/enterprise/17.0/account_reports/models/account_report.py", line 1670, in get_options
initializer(options, previous_options=previous_options)
File "/home/odoo/src/enterprise/17.0/account_reports/models/account_report.py", line 1619, in _init_options_custom
self.env[custom_handler_model]._custom_options_initializer(self, options, previous_options)
File "/home/odoo/src/odoo/17.0/odoo/api.py", line 550, in __getitem__
return self.registry[model_name](self, (), ())
File "/home/odoo/src/odoo/17.0/odoo/modules/registry.py", line 209, in __getitem__
return self.models[model_name]
KeyError: 'l10n_il.tax.report.handler'
select a.id,a.name,a.custom_handler_model_id,d.name,d.module,d.create_date,d.write_date from account_report a JOIN ir_model_data d on a.id = d.res_id where d.name = 'vat_report' and d.mod
el = 'account.report';
+----+----------------------------------+-------------------------+------------+---------+----------------------------+----------------------------+
| id | name | custom_handler_model_id | name | module | create_date | write_date |
|----+----------------------------------+-------------------------+------------+---------+----------------------------+----------------------------|
| 4 | {"en_US": "VAT Report (PCN874)"} | 770 | vat_report | l10n_il | 2023-02-05 09:42:05.581858 | 2025-06-25 09:19:46.431141 |
+----+----------------------------------+-------------------------+------------+---------+----------------------------+----------------------------+
SELECT 1
Time: 0.106s
select m.id,m.model,m.name,d.name,d.module from ir_model m JOIN ir_model_data d on m.id = d.res_id where d.res_id = 770 and d.model = 'ir.model';
+-----+----------------------------+------------------------------------------------+----------------------------------+-----------------+
| id | model | name | name | module |
|-----+----------------------------+------------------------------------------------+----------------------------------+-----------------|
| 770 | l10n_il.tax.report.handler | {"en_US": "Israely Tax Report Custom Handler"} | model_l10n_il_tax_report_handler | l10n_il_reports |
+-----+----------------------------+------------------------------------------------+----------------------------------+-----------------+
SELECT 1
Time: 0.009s
select id,name,author,latest_version,state,demo from ir_module_module where name='l10n_il_reports';
+-----+-----------------+-----------+----------------+-----------+-------+
| id | name | author | latest_version | state | demo |
|-----+-----------------+-----------+----------------+-----------+-------|
| 997 | l10n_il_reports | Odoo S.A. | 16.0.1.7.2 | installed | False |
+-----+-----------------+-----------+----------------+-----------+-------+
SELECT 1
Time: 0.009s
```
**### There are some upgrade-specific PR**
<img width="1230" height="64" alt="2025-11-12_17-47" src="https://github.com/user-attachments/assets/0f75d3e0-1c95-48bf-adb6-41473f3f1da2" />
opw-5229611
upg-3258991This change removes a unit test that depended on module-specific and Enterprise-only data, which was causing build failures. The test can be reintroduced later in the proper module if needed, but removing it now helps keep the test suite stable.
Original PR description
The unit test `test_can_reset_deferred_invoice()` has several issues. 1. It should be in the `account_audit_trail` module, as the test requires this module. [Unit test documentation: modules](https://www.odoo.com/documentation/19.0/developer/tutorials/unit_tests.html#modules). 2. The test references fields from the Enterprise module `account_accountant`, `account.move.line.deferred_start_date` and `account.move.line.deferred_end_date`. This causes build tests to fail. As such, the test should be removed now and replaced later if necessary. Fixes [PR 235223](https://github.com/odoo/odoo/pull/235223) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change reduces the amount of data loaded when validating tax-related information for multiple invoices at once. It helps avoid memory errors when registering batch payments, making the payment process more reliable for larger invoice sets.
Original PR description
### Description: When trying to register a payment for multiple invoices, it is possible to trigger an Out Of Memory error. This is caused by the constraint `_validate_taxes_country`, calling the compute `_compute_tax_country_id` on all of the moves. To avoid that, we just retrieve the field we need rather than fetching everything. ### Reference: opw-5152687
Odoo now sets the login session cookie to expire using the database’s session inactivity limit when that setting is available. This keeps browser sessions and server-side session cleanup aligned, reducing cases where users appear logged in longer than the stored session remains valid.
Original PR description
When adding the session_id cookie, we usually set it to expires after odoo.http.SESSION_LIFETIME seconds (at the moment: 7 days). At the same time the "sessions.max_inactivity_seconds" ir.config_paramater is used to remove old sessions from the session store. We suggest to better align the two options, to also use the "sessions.max_inactivity_seconds" ICP when we are in the context of a database and when the option is set to a valid value, and to only fallback on odoo.http.SESSION_LIFETIME otherwise. opw-3716924 opw-5237642 task-5263937 Backport-of: 99f96049a895e7336ab19356649a46db51c012ce
This fix prevents an error when refreshing OSS mapping while multiple companies are active. It ensures the action runs only on the intended company, avoiding a traceback and keeping the setup process smooth for users.
Original PR description
To reproduce: - Activate multiple companies in the selector - Enable OSS on the active company - Click the refresh mapping button ===> Traceback, because a function expects to be called on a single company and is instead called on all the active companies.
This fix stops users from creating or updating a Request for Quotation more than once from the same approval, which could happen when the record is open in multiple tabs or by multiple users. It helps avoid duplicate purchase quantities and keeps purchasing data accurate.
Original PR description
**Problem:** It's possible to click the "Create RFQ's" button more than once, as the user may have multiple tabs open or multiple users are viewing the same record. When this happens, the approval will create or add to an RFQ even if it already did, and this causes double the intended product quantities. **Solution:** The "Create RFQ's" button becomes hidden when purchase_order_count > 0 (i.e. there are linked POs) so we can perform this check within the button's method `action_create_purchase_orders` to prevent RFQ generation (or modification). opw-5227493
This fix removes empty space that appeared in Delivery and Batch Transfer lists and details. It makes the screens look cleaner and prevents unused columns from taking up room when their related information is hidden.
Original PR description
Issue: Blank, unused columns showed in Deliveries and Batch Transfers. Repro Steps: Open Deliveries and see a right-side gap . Open Batch Transfers list and see a right-side gap. Open a Batch Transfer details shows left-side gap. Cause: Rows were hidden, but their table columns stayed visible, so space was still reserved. Fix: Deliveries: hide the rescheduling popover column and the activity indicator column at the column level. Batch Transfers list: hide the activity indicator column at the column level. Batch Transfer Detailed: hide the three quality-check button columns at the column level when the batch has no checks to do (keep row-level visibility when shown). opw-5031933
This update prevents a spurious line from appearing in the Bank Reconciliation report when exchange difference entries cancel out fully. It helps keep reconciliation totals accurate and avoids confusing users with an amount that should not be shown.
Original PR description
*(Tested with the `l10n_be` localization)* 1. Enable multicurrency. Set the main currency to EUR and create the following USD exchange rates: - **01/01/2025**: 1.1 USD per EUR - **06/30/2025**: 1.2…
*(Tested with the `l10n_be` localization)* 1. Enable multicurrency. Set the main currency to EUR and create the following USD exchange rates: - **01/01/2025**: 1.1 USD per EUR - **06/30/2025**: 1.2 USD per EUR - **07/01/2025**: 1.3 USD per EUR 2. Create a new account in the Chart of Accounts: - **Code**: 550012 - **Name**: Bank USD - **Type**: Bank and Cash - **Account Currency**: USD 3. Create a journal: - **Name**: Bank USD - **Bank Account**: 550012 Bank USD - **Currency**: USD 4. From the Accounting dashboard, create a bank transaction in Bank USD: - **Date**: 04/09/2025 - **Amount**: 5000.0 5. Generate the adjustment entry in the *Unrealized Currency Gains/Losses* report: - **Journal**: Exchange Difference - **Expense Account**: 654000 Exchange Results - **Income Account**: 754000 Income Account --- In the *Bank Reconciliation* report for Bank USD, a line appears under *Misc. operations* for an amount of **37.87**. This line should not be there: clicking on it shows that it corresponds to exchange rate lines that fully cancel each other out and have a zero `amount_currency`. --- In `_report_custom_engine_misc_operations`, the amount of misc. operation lines is computed by summing their balances converted to the company currency. However, even when `amount_currency` is 0, a conversion still occurs. opw-4938249