Daily updates from Odoo
Wednesday, September 17, 2025
21 changes · master
Resolved issues and error corrections
FedEx Home Delivery shipments can now generate return labels without triggering an address error. The fix ensures return label requests correctly mark the recipient address as residential, which FedEx requires for this service.
Original PR description
**PROBLEM** When selecting FedEx Home Delivery service, and enabling the return label generation, we got the error `RECIPIENT.ADDRESS.ERROR`. **STEPS TO REPRODUCE** 1. Install delivery_fedex_rest (use the new fedex credentials). 2. On the FedEx US shipment method (demo data) select FedEx home delivery service, and check the `Generate Return Label` option. 3. Create a SO, add shipping with FedEx US, validate the SO. 4. Validate the delivery order, and notice the FedEx API return an error. **CAUSE** For Home Delivery Service, the recipient address need to have the `residential` flag set to true. In `_return_package()`, the request sent doesn't include this flag, leading to an error. **FIX** Fix `_return_package()` query to include the `residential` flag. opw-4939065 Forward-Port-Of: odoo/enterprise#94463
Audit returns now correctly flag accounts for review when posted journal entries already exist in the audit period. Posting or resetting entries also updates the related accounts, helping teams avoid missed audit follow-up.
Original PR description
Before when we created an audit return with no previous audits, and moves already posted, nothing would be done. Now, we set to todo the accounts that were involved inside a move during the audit period. We also did the same logic when changes happen to a move. When we post or reset a move, we set to review to the accounts that was involved inside the move. Forward-Port-Of: odoo/enterprise#94559
Bank reconciliation now better matches imported bank transactions with payments created in Odoo when payment provider memos differ slightly. This restores more flexible memo matching, reducing missed matches while keeping reconciliation easier for accounting teams.
Original PR description
Commit 4c23de148eb3689842a48df81a5ced772c214861 introduced another query to look for outstanding payments to match in the bank reco widget, aiming to reduce the number of wrong matches found by the algorithm. Doing so, limiting the match between account.payment initiated in odoo and their matching bank transaction imported (through stripe for example), on an exact match of the memo seemed like a good idea. But for obscure reasons, the memo we're sending is not guaranteed to be found back, depending on the payment provider and the import flow. Also, for backward compatibility, it now appears important to allow the match to be on a part of the memo, like we used to do. So we're back on a solution that splits the memo using ' - '. Forward-Port-Of: odoo/enterprise#93304 Forward-Port-Of: odoo/enterprise#93237
This fix stops Odoo from adding accounting lines for Brazilian Avalara taxes that are marked as non-accounting, preventing invoice totals from being overstated. The taxes are still logged for traceability, including in point-of-sale flows, so businesses keep an audit trail without affecting accounting amounts.
Original PR description
### Steps to reproduce: - Install l10n_br_edi, switch to Brazilian company - Set up Avalara - Create an invoice with the tax "ICMS Exemption Incl." which is included in price - Click "Generate taxes"…
### Steps to reproduce:
- Install l10n_br_edi, switch to Brazilian company
- Set up Avalara
- Create an invoice with the tax "ICMS Exemption Incl." which is included in price
- Click "Generate taxes" to compute the taxes with Avalara
- In "Journal Items" we can see a line for "ICMS Exemption Incl.", its value appears as excluded
### Cause:
The result from Avalara included a value for this tax:
```
'tax': 1.44,
'taxImpact': {
'accounting': 'none',
'impactOnFinalPrice': 'Included',
'impactOnNetAmount': 'Included',
},
```
But the untaxed amount is computed without this tax. Odoo keeps the untaxed amount from the response and add a line for the tax. As a result, the tax is added to the amounts like an excluded tax would.
### Solution:
In the response from Avalara, taxes with `['taxImpact']['accounting'] == 'none'` should be part of the accounting: no line should be created for this tax. So we filter them out in `_get_external_taxes`.
We also log these taxes in the chatter to keep a trace of them. As the parameter `'accounting': 'none'` is linked with the tax and not the line, if a tax on one line has `'accounting': 'none'` then the same tax will also have 'accounting': 'none' on all other lines. We use this to fetch all non accounting taxes, then we use the summary to construct the message like it was done before.
The logging in the bridge with pos needed to ba adapted because now the taxes may not be unarchived as they are ignored when they have `'accounting': 'none'`.
opw-4964315
Forward-Port-Of: odoo/enterprise#91916Stamp fields in the Sign app are now editable during the signing process instead of being locked. Stamp text also displays cleanly in preview mode, helping documents look correct before they are sent or signed.
Original PR description
Version: - 19.0 Steps to reproduce: - Install the Sign app - Upload a PDF - Drag and drop a stamp field - Try to sign → the stamp is read-only and cannot be changed Issue: - The stamp field is readonly, so users can’t edit it when signing. Fixes: - Removed the constant value and the class that made the stamp field read-only. - Now, users can edit the stamp field normally. task-5082755 Forward-Port-Of: odoo/enterprise#94474
The spreadsheet sharing controls have been simplified to prevent errors while editing dashboards and avoid duplicate share options on mobile. Users now see sharing actions only where they are appropriate, making the experience clearer and more reliable.
Original PR description
Current behavior before PR: - Share button caused errors when editing dashboards. - Duplicate 'Share' and 'Freeze and share' buttons shown in mobile view. Desired behavior after PR is merged: - Hide share button in dashboard edit. - Remove duplicate share buttons in mobile (already under File -> Share). Task: [5043228](https://www.odoo.com/odoo/2328/tasks/5043228) Forward-Port-Of: odoo/enterprise#93464
This update fixes an issue in Odoo Studio where selecting a measure for a cohort view could trigger an error. It ensures users only see valid measure options and removes an unnecessary request parameter that caused warning messages.
Original PR description
Currently, an error occurs when user tries to select any measure in cohort view. Steps to replicate: - Install `sale_management` and `web_studio`. - Open the Sales app and turn on studio mode. -…
Currently, an error occurs when user tries to select any measure in cohort view. Steps to replicate: - Install `sale_management` and `web_studio`. - Open the Sales app and turn on studio mode. - Under the Views tab, turn on cohort view. - Under the Measures field, select any value and observe the error appearing in the terminal. Error: `ValueError: Invalid aggregate method 'None' for 'create_date:None'` Cause: - The Measure field dropdown in the Cohort Editor was mistakenly assigned the choices of `dateFields` [1] instead of `measureFields`. - This allowed users to select incompatible field types (e.g., date/datetime), which lead to error in aggregation behavior in the cohort view. Solution: - Corrected the choices of Measure field to `measureFields`. - Also added a condition to allow only those fields that have an aggregator (for some fields like `sequence` that dont have an aggregator). - Also removed context field from arguments [2] in the rpc call as function doesnt need it [3] (This shows warning on runbot as well). [1]: https://github.com/odoo/enterprise/blob/d8539dff5f3dcecfeb99fd7fc22a6915aaa02c4b/web_studio/static/src/client_action/view_editor/editors/cohort/cohort_editor_sidebar.xml#L30 [2]: https://github.com/odoo/enterprise/blob/bf9510e152279418200cb0becb6b637c19b02d4e/web_studio/static/src/client_action/editor/new_view_dialogs/new_view_dialog.js#L87 [3]: https://github.com/odoo/enterprise/blob/bf9510e152279418200cb0becb6b637c19b02d4e/web_studio/controllers/main.py#L805 sentry-6781792463 Forward-Port-Of: odoo/enterprise#94615 Forward-Port-Of: odoo/enterprise#91599
This fixes an issue where a Blackbox device could lose its existing setup after being unplugged and reconnected to an IoT box. The system now recognizes the same Blackbox by name and updates its connection details instead of treating it as a brand-new device.
Original PR description
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing…
Before this commit, if a blackbox was unplugged and re-plugged, and it was assigned a different serial port by the Raspberry Pi, it would show up as a new device in the database meaning the existing configuration wouldn't work. After this commit, we handle the blackbox as a special case, and if the name of the device matches exactly with our existing blackbox, we update its identifier instead of creating a new device. This does require a new device specific check in the controller which is quite ugly. Another approach would have been to make the identifier of the blackbox equal its FDM ID instead of the serial port, but this was not done for the following reasons: - Changing the identifier format in stable would cause all existing clients' blackboxes to become unconfigured once their IoT box restarts. - Making the identifier different to the serial port would require a hack in the blackbox driver to change its own identifier and update the devices dictionary, since the serial interface assumes all devices use the port as their identifier. task-5055027 Forward-Port-Of: odoo/enterprise#93665 Forward-Port-Of: odoo/enterprise#93593
Quicksign now behaves consistently with regular signing by showing the completed signature in PDF previews and recording the signing activity in the related document history. This helps users trust that signed documents are properly displayed, tracked, and stored across Documents, Chatter, and Sign.
Original PR description
### Issues: - PDF preview mismatch: - Regular sign updates the preview in Documents with the actual signature. - Quicksign only shows placeholders in the preview. - Missing chatter logs: - Regular sign from chatter creates a 'Signature Request' log and stores the signed certificate in Documents. - Quicksign skips chatter logs and only displays in Sign app. ### Cause: - Request is fully signed but the sign request item state is not set as completed that's why the value was not shown. - The function to sign and create log is not called when reference doc is set. ### Fix: - Sign request item state is set to completed. - Called the function to throw log note when the reference doc is set. ### Impact: - Quicksign now provides consistent PDF previews. - Chatter history and document logging are aligned between regular signing and quicksign. --- task-5082925 Forward-Port-Of: odoo/enterprise#94544
This update fixes several issues in manufacturing work orders, quality checks, and barcode demo materials. It improves the reliability of barcode scanning and related production screen behavior, helping operators complete shop floor tasks with fewer interruptions.
Original PR description
Various fixes, mostly related to barcode scanning and some JS. task 5089956 Forward-Port-Of: odoo/enterprise#94838
External tax report values are now protected from changes once the relevant tax period has been locked. The tax closing process was adjusted so required default values are created before the lock date is applied, helping preserve submitted tax data while avoiding normal closing errors.
Original PR description
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the…
[FIX] account_reports: external value check lock date This commit add the check that protects external values from being edited out of the lock date. For example when the tax report is submitted, the user is not supposed to modify any external values anymore. To do this, we had to modify the tax closing flow a little bit: when closing the tax period, we now generate the default external values before setting the tax lock date. This is because the generation of the default external values was done for the period we were closing, but now that we forbid the creation of an external value after the lock date we had to change the order of the flow. Due to one specific corner case (l10n_fr), we had to keep a hack to bypass the Tax Return Lock Date check. This was done with a context key and will have to be removed in master. The case is the following : when the user generates the tax closing entry, the external values for the period are generated and the Tax Return Lock Date is set with the last day of the month. Then if the user tries to submit the EDI VAT report, it tries to create 2 external values for the carryover but as the lock date was set, it raises an error. task-5012442 Forward-Port-Of: odoo/enterprise#94853 Forward-Port-Of: odoo/enterprise#92949
Customers can now choose between a subscription plan and a one-time purchase even when a product has only one recurring plan. This prevents confusion on the webshop and helps ensure shoppers can select the purchase option that fits their needs.
Original PR description
Version: - 19.0 Steps to reproduce: 1. Create a product with only one recurring plan 2. Enable option 'one-time purchase' 3. On e-commerce it is not possible to select between the recurring plan and the one-time option Issue: - When a product has only one recurring plan and the 'one-time purchase' option is enabled, the recurring plan selection is hidden. Solution: - Updated the `subscription_pricing_select` logic to allow selection when 'one-time purchase' is enabled, even if there is only one recurring plan. Forward-Port-Of: odoo/enterprise#94760
Reloading shared customer pages now keeps users in the correct app menu instead of switching to another app such as Invoicing. This helps Sales, Accounting, and Purchase users stay oriented when different apps reuse the same customer-related screen.
Original PR description
* STEP TO REPRODUCE: install sale management module, go to sale app -> customer menu -> Then reloading the page using F5 -> the menu is change to invoice which is not correct * Also Multiple modules (Sale, Account, Purchase) share same actions (e.g. partner action) * SOLUTION: - Modified webclient.js action-to-menu mapping to handle multiple menus sharing same action Forward-Port-Of: odoo/enterprise#94822 Forward-Port-Of: odoo/enterprise#94485
The appointment booking page now shows the right number of people allowed based on the available or selected resource. This prevents customers from seeing an artificially low capacity when multiple resources have different limits, reducing booking confusion and missed capacity.
Original PR description
**How to reproduce:** - Create an appointment with availability assigned to a resource. - Enable 'Manage Capacity' - Set the capacity of the first resource lower than the second one. - Open the appointment's booking page. **Technical Reason:** If appointment is scheduled based on 'resource_time' then resource_default is updated as the first value of resource_possible. Related PR: https://github.com/odoo/enterprise/pull/47059 **After this PR:** 'Number of people' dropdown will display the maximum capacity from all available resources. Task-4664393 Forward-Port-Of: odoo/enterprise#94917 Forward-Port-Of: odoo/enterprise#84243
Moving documents to another folder no longer removes access for members who had previously visited that folder. This prevents accidental loss of document access and keeps collaboration permissions consistent.
Original PR description
When moving documents with members to a folder which has been visited by those same members (or some of them) they are removed from those documents access. This is caused by the document.access which has an entry for the members but with a null role. Task-5075196 Forward-Port-Of: odoo/enterprise#94718 Forward-Port-Of: odoo/enterprise#94149
This change removes a broken upgrade step that could block customers from upgrading databases using Salary Package Configurator from Odoo 18.3 to 18.4 or later. The affected data handling is moved to the correct HR upgrade process, preventing upgrade crashes caused by a renamed contract table.
Original PR description
The `hr_contract` table is renamed to `hr_version` as part of the https://github.com/odoo/upgrade/blob/3bea30d1fd0cd202006da4ad11e00e283cbc78d0/migrations/hr/saas~18.4.1.1/pre-migrate.py#L29, script,…
The `hr_contract` table is renamed to `hr_version` as part of the https://github.com/odoo/upgrade/blob/3bea30d1fd0cd202006da4ad11e00e283cbc78d0/migrations/hr/saas~18.4.1.1/pre-migrate.py#L29, script, which is executed before any `hr_contract_salary` script, including module ones. As a result, any database from 18.3 to 18.4+ with `hr_contract_salary` < 2.1 will run into:
```
Traceback (most recent call last):
File "/home/odoo/src/odoo/saas-18.4/odoo/service/server.py", line 1410, in preload_registries
registry = Registry.new(dbname, update_module=update_module, install_modules=config['init'], upgrade_modules=config['update'])
File "<decorator-gen-6>", line 2, in new
File "/home/odoo/src/odoo/saas-18.4/odoo/tools/func.py", line 89, in locked
return func(inst, *args, **kwargs)
File "/home/odoo/src/odoo/saas-18.4/odoo/orm/registry.py", line 175, in new
load_modules(
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/loading.py", line 455, in load_modules
load_module_graph(
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/loading.py", line 181, in load_module_graph
migrations.migrate_module(package, 'pre')
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/migration.py", line 220, in migrate_module
exec_script(self.cr, installed_version, pyfile, pkg.name, stage, stageformat[stage] % version)
File "/home/odoo/src/odoo/saas-18.4/odoo/modules/migration.py", line 257, in exec_script
mod.migrate(cr, installed_version)
File "/home/odoo/src/enterprise/saas-18.4/hr_contract_salary/upgrades/saas~18.3.2.1/pre-unarchive-partially-signed-offers.py", line 4, in migrate
cr.execute(
File "/home/odoo/src/odoo/saas-18.4/odoo/sql_db.py", line 426, in execute
self._obj.execute(query, params)
psycopg2.errors.UndefinedTable: relation "hr_contract" does not exist
LINE 4: FROM hr_contract c
^
```
As a fix, the query is moved into the `hr` script mentioned above.
see: https://github.com/odoo/upgrade/pull/8466
opw-5071923
upg-3121357
tbg-2136
Forward-Port-Of: odoo/enterprise#94931The salary configurator now shows the gross salary only when the active company is the Belgian company. This prevents Belgian payroll-specific calculations from affecting other companies and helps HR users see the correct salary information.
Original PR description
Gross Salary did not appear previously as the extending function _get_compute_results in 10n_be_hr_contract_salary was returning the l10n_be_wage_with_mobility_budget right away without checking which company we are in. This change made sure before proceeding that we are in the correct active company, Belgian one in our case. task-4987491
Salary offer previews now use the best available working-hours calendar instead of showing zero gross pay when a contract template has no working hours. This helps HR teams present accurate salary simulations when creating employee offers.
Original PR description
#### Steps to Reproduce In debug mode go to Payroll > Employees > Offers > Create a new offer with a contract template that has no working hours. The gross salary shown in the Salary Simulation Preview is 0. #### Issue If the version has no resource calendar, its working hours are 0. This sets the `work_time_rate` to 0, and when multiplied by the wage the gross becomes 0 as well. #### Fix Prioritize the version’s resource calendar when available, otherwise fallback to the offer’s calendar, and finally to the company’s. task-5051509
Subscription invoices that include combo products can now be created and confirmed without triggering an accounting validation error. This prevents failures during both manual invoicing and automatic payment post-processing, improving reliability for subscription billing.
Original PR description
Currently, an error is produced while creating an invoice for a subscription order with combo products, and it can be triggered in two different ways. 1. Directly create an invoice. - Create and…
Currently, an error is produced while creating an invoice for a subscription order
with combo products, and it can be triggered in two different ways.
1. Directly create an invoice.
- Create and confirm a subscription with a combo product.
- Create an invoice for this subscription and try to confirm it.
- Validation error shown in display and error generated in log
2. When cron "Payment: Post-process transactions" trigger:
- Enable the Automatic Invoice option in the Subscription settings.
- Activate a demo payment provider (e.g. Demo: Payment Provider).
- Create and confirm a subscription that includes a combo product.
- Click on "Pay" to process the subscription payment.
- An error occurs when the above-mentioned cron is triggered, and it
tries to create an invoice for a subscription order.
Error: `new row for relation "account_move_line" violates check constraint
"account_move_line_check_accountable_....`
This issue arises during the creation of an account move line for deferred entries for
the 'Combo Product' column of the original invoice (subscription):
- At [1], `deferred_start_date` and `deferred_end_date` were added to all invoice line values within `_prepare_invoice_line` used to create the original invoice
- Then, at [2], during confirmation of the `original invoice`, the code attempts to generate `deferred entries` for for move where any move lines that has a `deferred_start_date`
- At code line [3], during the generation of deferred entries, an account move line is created without an associated `account_id`
- During `display_type` computation at [Code](https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/account/models/account_move_line.py#L480-L484), `line.move_id.is_invoice()` evaluates to `False`. As a result, the line is assigned a `display_type` as a 'product'.
- Since `display_type` is 'product' and `account_id` is missing, it violates the following check constraint at [Code](https://github.com/odoo/odoo/blob/9ec4e0d3c5f1aaff0b36dc5def1e69b8285c3be1/addons/account/models/account_move_line.py#L451): `CHECK(display_type IN ('line_section', 'line_note') OR account_id IS NOT NULL)`
This commit fixes the issue by preventing the addition of the `deferred_start_date` and `deferred_end_date` keys for invoice lines whose corresponding sale order lines have products of type 'combo' at [1].
[1]:- https://github.com/odoo/enterprise/blob/9642f7d8026149a6524e036c523b65ccbdf17258/sale_subscription/models/sale_order_line.py#L448-L449
[2]:- https://github.com/odoo/enterprise/blob/9642f7d8026149a6524e036c523b65ccbdf17258/account_accountant/models/account_move.py#L113-L114
[3]:- https://github.com/odoo/enterprise/blob/9642f7d8026149a6524e036c523b65ccbdf17258/account_accountant/models/account_move.py#L309
sentry-6763423503
Forward-Port-Of: odoo/enterprise#90989Quality checks now stay linked to the correct receipt when items are moved into a new wave transfer. This prevents staff from missing required checks on the new transfer or completing checks from the wrong receipt.
Original PR description
*{quality_control,stock}_picking_batch ### Steps to reproduce: - Got to Quality > Quality control > Control Point - Create a quality control point: - Operation: receipt - Control per quantity or…
*{quality_control,stock}_picking_batch
### Steps to reproduce:
- Got to Quality > Quality control > Control Point
- Create a quality control point:
- Operation: receipt
- Control per quantity or product
- Create a and confirm a receipt transfer with 2 products
- Go to the receipt list view > select your receipt > Wheel action > Add to wave > Add to a new wave > Add only one of the move line to the wave
#### > A new picking is created and the move line reassigned to it but the related quality check picking_id is not updated.
> In particular, there is no "quality check" button on the new picking and the "quality check" button of the first picking allows you to process a QC related to the wave transfer.
### Cause of the issue:
While the move lines or move are can be moved to a new picking during the `_add_to_wave` call:
https://github.com/odoo/odoo/blob/605e47a85561614c17fe2e6f59618610f87c69bb/addons/stock_picking_batch/models/stock_move_line.py#L69-L90 Nothing is done with respect to the quality check which pciking_id field is not computed:
https://github.com/odoo/enterprise/blob/d73f7ef6fe61ccddbe1fe4e32c1670611ba3c5d2/quality/models/quality.py#L185
### Fix:
While the quality check measured on move_line are linked to a move line, the quality checks measured on products and operation are not. For the first kind, we rely on an override of the write method of stock move lines to reassign the check to the apporpiate picking. For the other kinds, we add a post batch hook to unlink the obsolete checks and recreate the appropiate one. Note that since operation and product types are created during the action confirm of moves and since certain moves will be created and auto confirm during the new picking creation here: https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock_picking_batch/models/stock_move_line.py#L90 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L857 https://github.com/odoo/odoo/blob/73fd3af560c967f41339bfc4c71a51dc5baba4a8/addons/stock/models/stock_picking.py#L1263-L1267 https://github.com/odoo/enterprise/blob/b99d7073a34b24d4d3b863278e68f292fdd3c0b0/quality_control/models/stock_move.py#L12-L15 we rely on the `extra_move_mode` to avoid quality check creation during this step (as they will be created in the hook).
Community: https://github.com/odoo/odoo/pull/223852
opw-5009635
Forward-Port-Of: odoo/enterprise#93995
Forward-Port-Of: odoo/enterprise#92951Follow-up PDF reports now correctly handle attachments stored as remote links or in cloud storage. This prevents report generation failures and helps users produce customer follow-up documents reliably regardless of where attachments are stored.
Original PR description
### Issue PDF reports fail when attachments are remote URLs or cloud storage resources. The to_pdf_stream() method expects local file data but receives boolean values from remote attachments, causing a TypeError. ### Solution Download remote resources before processing them in PDF reports. This ensures all attachments have accessible data regardless of storage type. ### Affected Reports (enterprise): - account_followup.report_followup_print_all [Community PR](https://github.com/odoo/odoo/pull/226094) OPW-5036638 Forward-Port-Of: odoo/enterprise#94975 Forward-Port-Of: odoo/enterprise#94477