Daily updates from Odoo
Friday, September 12, 2025
20 changes · 18.0
Enhancements to existing features
The point of sale system now cleans up old record links more efficiently during bulk update operations. This helps prevent slowdowns when many related records are involved, improving reliability for busy sales environments.
Original PR description
When the “set” command is used, we will manually clean up the indexes to avoid performance issues when there are too many associated records.
Resolved issues and error corrections
Express checkout now excludes Click & Collect delivery options when they require the customer to choose from multiple pickup stores. This prevents customers from selecting a pickup method in a flow that cannot capture the pickup location, while still allowing single-store pickup options.
Original PR description
Before this commit, when entering the express checkout flow, Click & Collect (C&C) delivery methods (DM) were included in the list of possible delivery methods available for express checkout. However, the express checkout flow does not allow customers to select which store they want to pick up their order from. After this commit, C&C DMs are excluded from the list if they have more than one store configured. If only one store is configured, the customer implicitly knows where they will need to pick up their order.
This fix prevents subcontracted, lot-tracked purchase orders from showing incorrect duplicate inventory lines at the subcontractor location. It keeps subcontractor stock reporting accurate by ensuring quantities are cleared as expected after receipt.
Original PR description
…ed PO **Steps to reproduce:** - Create a new product and track by lots - Add a BOM for this product, setting type to Subcontracting - Create a PO for the product and confirm it (with the vendor as…
…ed PO **Steps to reproduce:** - Create a new product and track by lots - Add a BOM for this product, setting type to Subcontracting - Create a PO for the product and confirm it (with the vendor as the subcontractor specified on the BOM) - With debug enabled: go to Inventory/Operations/Procurement: run scheduler - Go to Inventory > Reporting > Locations and search for the product note the quant line at the subcontractor location with no lot number - Return to the PO and recieve, specifying lot number - Go to Inventory > Reporting > Locations - Search for the product again **Current behavior:** there are now 2 quant lines at the subcontractor location: one with lot and one without lot **Expected behavior:** There shouldn't be any visible quant line at the subcontractor location because the quantity and reserved quantity of the product at subcontractor location should both be 0 **Cause of the issue:** Step 1: When we confirm the PO, this creates a picking and a stock move (move A) from the sbc location to the stock location. When _action_assign is run on this move, self._should_bypass_reservation() will return true because the move is subcontract https://github.com/odoo/odoo/blob/95ed5c75582631c7cc417b000569ff6451cc5006/addons/mrp_subcontracting/models/stock_move.py#L302-L307 so we will not create a quant. (another move (move B) is also created from Production location to sbc location). However when we open Locations this triggers _clean_reserations() and because should_bypass_reservation() returns false for the sbc location, we will run update_reservation_quantity and create a new quant with a reserve quantity of 1 and no lot_id https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_quant.py#L1167-L1172 Step 2: Then, when we recieve the products and validate the picking, this will call _action_done() on move A. which will call synchronize_quant() https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_move_line.py#L690 which will call _update_available_quantity() for a quantity of -1, the location sbc and the lot that we just created in the steps. https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_move_line.py#L712 Inside _update_available_quantity(), the call to _gather() will return the quant that we created in step 1 (even though the existing quant has no lot and we give the lot we created as parameter). https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_quant.py#L1055 So we don't create a new quant but we update the existing one that has no lot. Step 3: _action_done() is then called on move B which calls _synchronize_quant() https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_move_line.py#L691 which calls _udpate_available_quantity() for a quantity of 1, the location sbc and the lot created in the steps. Inside _update_available_quantity(), the call to _gather() will return the quant that we created in step 1. BUT this time, because the quantity is positive, the quant will be filtered out https://github.com/odoo/odoo/blob/35ea3dcb2eeb379c8b1127f0c7b42191853c0bd2/addons/stock/models/stock_quant.py#L1056-L1057 so we will create a new quant with a lot_id this time and a quantity of 1. As a consequence instead of having the quantities zeroed out, we end up with two quants one with a lot and a quantity of 1 and one with no lot and a quantity of -1. opw-4935822
This fixes an approval workflow issue where selected approvers could be blocked from approving requests unless they also had broader Approvals user permissions. Businesses can now rely on assigned approvers being able to complete their approval tasks without unnecessary access changes.
Original PR description
Follow up on the previous PR odoo/enterprise#92309 , fixing access rights preventing approvers from approving in requests they are requested to approve in case they don't have the group approvals user. Task-4897775 Forward-Port-Of: odoo/enterprise#94316
Installing or re-enabling the Barcode feature could fail if the default barcode nomenclature had previously been deleted. The update prevents that crash by safely handling the missing default record, allowing users to enable the feature again without manual recovery.
Original PR description
The system will crash with error when user tries to install module `Barcode`. **Steps to produce: -** - Install `Inventory` module. - `Inventory > configuration > products > Barcode Nomenclatures`. -…
The system will crash with error when user tries to install module `Barcode`.
**Steps to produce: -**
- Install `Inventory` module.
- `Inventory > configuration > products > Barcode Nomenclatures`.
- Delete the `Default Nomenclature` record.
- Go to settings uncheck `Barcode Scanner` and save settings.
- Now, again `enable' that and save.
**Error: -**
```py
ValueError: External ID not found in the system: barcodes.default_barcode_nomenclature
ParseError: while parsing /home/odoo/src/enterprise/saas-18.4/stock_barcode/data/data.xml:40, somewhere inside <record id='scale_up_alias_1' model='barcode.rule'>
<field name='name'>Scale Up Receipt</field>
<field name='type'>alias</field>
<field name='pattern'>WH-RECEIPTS</field>
<field name='alias'>WHIN</field>
<field name='barcode_nomenclature_id' ref='barcodes.default_barcode_nomenclature'/>
<field name='sequence'>0</field>
</record>
```
**Root cause: -**
- At [1], the records use the ref of `default_barcode_nomenclature` which is defined in `barcode` module. So, when the ref is deleted and we are trying to use it then it gives error.
**Solution: -**
- This commit resolves the error by providing a False value for the field, if the reference is missing.
[1] https://github.com/odoo/enterprise/blob/400171c9cebc46ecdd907ada210c65f3bbd2dd66/stock_barcode/data/data.xml#L40-L71
**sentry-6823596992**This fixes a rounding mismatch that could block Mexican electronic payment documents when an invoice was issued in USD and paid in MXN. The payment values are now calculated consistently with the official reporting precision, reducing validation failures for affected foreign-currency payments.
Original PR description
Steps to reproduce: - With an MX Company setup - Set USD rate to: - 0.049216958195 for day 1 - 0.053418803419 for day 2 - Create an invoice in USD as follows: - line 1: price_unit 91, quantity 64,…
Steps to reproduce:
- With an MX Company setup
- Set USD rate to:
- 0.049216958195 for day 1
- 0.053418803419 for day 2
- Create an invoice in USD as follows:
- line 1: price_unit 91, quantity 64, tax 16%
- Confirm and send CFDI
- Register full payment in MXN
- Send Payment CFDI
Issue: Payment validation will fail with error
Code : CRP20268
Message : El campo BaseP que corresponde a Traslado, no es igual a la suma de
los importes de las bases registrados en los documentos relacionados donde el
impuesto del documento relacionado sea igual al campo ImpuestoP de este elemento
y la TasaOCuotaDR del documento relacionado sea igual al campo TasaOCuotaP de
este elemento.
Message : Valor esperado: 109025.275956 valor reportado: 109025.275862
This occurs because the precision set in https://github.com/odoo/enterprise/commit/e642e4d6d35c79d02c799d12451f3e2d92ab96e9 is high and can lead to failed
verification due to rounding on our side, because we compute BaseP using
the full digits of EquivalenciaDR, but, according to the specs, we
send it rounded to 10 digits.
opw-4750981
Forward-Port-Of: odoo/enterprise#92768POS GSTR reports now report service products with a quantity of zero, matching GST portal requirements. This prevents validation errors when submitting returns while keeping normal quantities for goods unchanged.
Original PR description
Before this PR: - Service products in POS GSTR lines were reported with their actual quantity. - This caused GST portal validation error: `RET191355: The Quantity entered is not valid`. After this PR: - For service-type products, `qty` is always set to `0`. - For goods, `qty` continues to reflect the actual ordered quantity. OPW: 5070636 Forward-Port-Of: odoo/enterprise#94272
This fixes an issue where tapping Send in Odoo’s iOS web app could sometimes fail while writing messages in Discuss or chatter. The message composer no longer shifts at the moment of tapping, making message sending more dependable for mobile users.
Original PR description
Before this commit, when using IOS PWA, pressing 'Send' button of in composer in discuss or chatter would sometimes not register the send. This happens because in IOS PWA, the composer has a bottom margin as this is close to iOS persistent swipe bar. However, the margin should not be present when there's the soft-keyboard. Because of this dynamic margin based on input focus, when composing textual message and pressing "Send" button, the textarea looses focus and a fraction of second the margin-bottom is increased and moves the "Send" button. This leads to mis-clicking the "Send" button. This commit removes the margin-bottom rule on non-focusin of textarea with iOS PWA. The composer is close to swipe bar so that's not as elegant as before, but at least this doesn't add the problem of non- working "Send" button. opw-5028809
This fixes an error that could block Indian e-Way Bill generation through IRN. Users should now receive the expected response instead of a crash when generating an e-Way Bill.
Original PR description
backport of https://github.com/odoo/odoo/commit/b7b987c4077c064fdfdb6b956379455cbdd93de3 on generating ewaybill through irn following traceback is produced ```py File…
backport of https://github.com/odoo/odoo/commit/b7b987c4077c064fdfdb6b956379455cbdd93de3 on generating ewaybill through irn following traceback is produced
```py
File "/home/odoo/src/odoo/addons/l10n_in_ewaybill_stock/tools/ewaybill_api.py", line 165, in _ewaybill_generate
return self._ewaybill_make_transaction("generate", json_payload)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/l10n_in_ewaybill_stock/tools/ewaybill_api.py", line 157, in _ewaybill_make_transaction
response = self._ewaybill_get_by_consigner(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/odoo/src/odoo/addons/l10n_in_ewaybill_stock/tools/ewaybill_api.py", line 181, in _ewaybill_get_by_consigner
'message': self.DEFAULT_HELP_MESSAGE % 'generated',
~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
TypeError: unsupported operand type(s) for %: 'LazyGettext' and 'str'
```
In this commit we resolve this issue
opw-5079789
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prMollie payments that are created but still waiting, such as SEPA bank transfers, are now treated as pending instead of invalid. This prevents customers from seeing an error after checkout when their payment is expected to remain open until completed.
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Enable Mollie as a payment provider; 2. set up an eCommerce order in EUR; 3. go to checkout; 4. pay via Mollie; 5. pick SEPA bank transfer as payment method; 6. leave the transaction open. Issue ----- When returning from the redirect, we get the following error message: > Mollie: Received data with invalid payment status: open Cause ----- An 'open' payment indicates the payment has been created, but nothing else has happened yet[^1]. This is the expected status for bank transfers, but is currently not getting handled in `_process_notification_data`, leading to the error. [^1]: https://docs.mollie.com/docs/status-change Solution -------- Handle 'open' payments the same as 'pending' ones. opw-4894556 Forward-Port-Of: odoo/odoo#226642 Forward-Port-Of: odoo/odoo#225875
Users can now open assigned activities from the “View all activities” menu even when they do not have permission to view the related record. The activity opens in a safe form view so they can still complete the task, reducing access errors and workflow interruptions.
Original PR description
**Steps to reproduce** 1. Create an activity on a record and assign it to a user who doesn't have access to this record. (e.g. create an activity on a `hr.employee` record and assign to a user without HR rights). 2. With this user lacking access rights, click on "View all activities" in the systray. 3. Click on the activity: error **Cause** The user may not have access rights to the record related to an activity. **Change** Open the activity's form view, we use `mail_activity_view_form_without_record_access` to display the "Mark as done" button. opw-4925744
Fixes an issue where moving documents into a folder previously visited by the same members could accidentally remove those members' access. This helps ensure shared documents remain available to the intended people after being reorganized.
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
Tax return closing entry reports now keep the selected tax period when generating PDF or XML files. This prevents reports for a prior month, such as August, from incorrectly showing the posting month, such as September.
Original PR description
**Issue** When posting a closing entry in September on a tax return report for the month of August, the generated report (PDF/XML) incorrectly shows September instead of August. **Steps to Reproduce** 1. Install Belgian localization. 2. Go to Accounting > Reporting > Tax Return. 3. Select August as the reporting period. 4. Post the Closing Entry. 5. The report shows September as the month instead of August. **Root Cause** The logic in `_init_options_date` was changed in PR #89290 mutating the `options['date']['filter']` by replacing `"tax_period"` with a resolved period type (e.g., `"month"`). As a result, the `"month"` branch was triggered later in the code, recomputing `date_from` and `date_to` based on the current date instead of the selected tax period boundaries. **Fix** Keep the `options['date']['filter']` unchanged (e.g., `"custom_tax_period"`). Use `period_type` field to indicate whether the tax period represents a month, quarter, or year. Opw-5073081
Tax report values are now protected from edits once the relevant tax period has been locked, helping preserve submitted tax data. The tax closing process was adjusted so required default values are created before the lock date is applied, with a temporary exception for a French VAT filing edge case.
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
This fixes a time off workflow issue where approving a leave that deducts extra hours could proceed without creating the required negative overtime record. Businesses get more reliable extra-hours balances when leave requests are refused, reset, and approved again.
Original PR description
**Issue** - Create a leave for a time off type deducting extra hours. - Check: a negative overtime (`hr.attendance.overtime`) has been created. - Approve, refuse and reset the leave. - Inconsistency: state is in "confirm" state, but no overtime exists. - Approve the leave. - Issue: no overtime exists. **Cause** The forward port 8dd74bc723fe8ddffaac718f537f6284f341bfe6 didn't correctly consider the removal of the "Draft" leave state. **Change** Ensure leaves in "Confirm" and next steps have an associated negative overtime. opw-4815190
Neutralized databases now prevent existing Peppol connections from contacting live or test networks by moving them into a local demo mode. New Peppol connections from those databases are directed to the test network, reducing failed registrations and accidental production use.
Original PR description
Previously existing Peppol connections were only switched to `test`. This is not enough and incorrect: - someone connected in production does not necessarily have a registration on the test network,…
Previously existing Peppol connections were only switched to `test`. This is not enough and incorrect: - someone connected in production does not necessarily have a registration on the test network, therefore the database is in an inconsistent state, and calls to the test network are very likely to fail - if you create a new connection to Peppol on a neutralized database, since the system parameter was not changed, the new connection was on production After this commit: - existing connections are switched in `demo` where everything is mocked locally, no call to the network (whether it's `test` or `prod` can happen) - the system parameter is switched to `test`, therefore new connections will register to the Peppol test network - Also added some fields on the Edi Proxy User to display the mode of the user, as well as the proxy_type in list view. (Those records are only accessible in debug already.) <img width="579" height="333" alt="image" src="https://github.com/user-attachments/assets/87847726-d954-4f68-8336-07771747365f" /> task-none (report from PMAX + WTA) Forward-Port-Of: odoo/odoo#226435
Customers can no longer apply a coupon reward meant for a future purchase to the same order that generated it. This keeps loyalty promotions working as intended and prevents unintended discounts on current sales orders.
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Have a next-order coupon program; 2. create an order that would generate a coupon; 3. confirm order; 4. click on the "Reward" button. Issue ----- It's possible to claim the reward on the current order. Cause ----- When retrieving claimable rewards, it checks the coupons generated by the current order using `coupon_point_ids`, but does not verify whether the program should be applicable to the current order. Solution -------- If the program only applies on future orders, and the coupon's `order_id` is the current order, skip the coupon when retrieving claimable rewards. opw-4910922 opw-4948757 Forward-Port-Of: odoo/odoo#221536
Pasted tables whose first row comes in as a header are now normalized so the editor handles all rows correctly. This prevents errors when deleting rows and makes row selection work reliably in the HTML and website editors.
Original PR description
**Current behavior before PR:** Steps to reproduce: - Copy a table from chatGPT's response containing first row wrapped in `<thead>`. - Paste it in editor. - Select last row. - Pressing backspace leads to traceback. This issue happens because the copied table is pasted with first row wrapped in a thead element. Due to this, rows are wrongly calculated leading to traceback in removeRow method. **Desired behavior after PR is merged:** - This commit ensures that if a table has first row wrapped inside a `thead`, the row is moved from `thead` to the start of `tbody` ensuring that rows are calculated correctly. - This commit also replaces all the `<th>` elements with `<td>`. task-5048339 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can no longer place signature fields before a PDF page is ready, preventing errors during document preparation. The cleanup of temporary page elements has also been corrected, making the signing setup experience more stable.
Original PR description
Fixed an issue where users could drag and drop sign items before the target PDF page was fully loaded, which caused runtime errors. The system now blocks adding new sign items until the target page has finished loading. Also fixed a problem with cleaning up dummy elements: these were sometimes removed incorrectly when the iframe re-rendered the pages, as the cleanup was already handled automatically. task-5065598
Fixes an issue where Indonesian e-Faktur documents could fail to download when an invoice line included more than one non-luxury tax. This helps users complete invoice processing without crashes in affected Indonesian accounting workflows.
Original PR description
The system crashes with an error when a user tries to `download the e-Faktur` document. **Steps to produce:-** - Install `Accounting` and switch to `ID Company`(with demo data). - Create a `new…
The system crashes with an error when a user tries to `download the e-Faktur` document.
**Steps to produce:-**
- Install `Accounting` and switch to `ID Company`(with demo data).
- Create a `new invoice` and select customer as `ID Company`.
- Add the product and in `taxes add 11% and 0% (2 non-luxury taxes)` and confirm the invoice.
- Click on gear icon and click on `Download e-Faktur` button.
**Error:-**
`ValueError: ValueError('Expected singleton: account.tax(5, 15)') while
evaluating 'action = records.download_efaktur()'`
**Root cause:-**
- When more than one non-luxury tax is applied and the e-Faktur document is downloading, the code at [1] expects a single tax record, but multiple non-luxury taxes are found.
**Solution:-**
- Since luxury tax is already excluded from the regular tax computation at [2], I think we can directly sum all non-luxury taxes.
[1]: https://github.com/odoo/odoo/blob/52aa6231130ea165fdb44e6370ec3e396b7603cc/addons/l10n_id_efaktur_coretax/models/account_move_line.py#L52
[2]: https://github.com/odoo/odoo/blob/52aa6231130ea165fdb44e6370ec3e396b7603cc/addons/l10n_id_efaktur_coretax/models/account_move_line.py#L24-L25
**sentry-6837559933**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr