Monday, September 22, 2025
16 changes · 18.0
Enhancements to existing features
Australian payroll withholding calculations for study and training support loans have been updated to align with the latest ATO Schedule 8 tax tables. This helps businesses calculate employee payroll deductions correctly under the new guidance effective from September 2025.
Original PR description
This commit updates the Schedule 8 witholding flow and rate for mid year update as per ATO guidelines effective from 24-09-2024. https://softwaredevelopers.ato.gov.au/2025-pay-you-go-payg-withholding-tax-tables Task: 5088270
Resolved issues and error corrections
This fix prevents the Inventory replenishment screen from crashing when all warehouses have been removed. It helps users continue working safely in unusual stock configurations instead of seeing an error message.
Original PR description
When there is no warehouse and user clicks on the replenishment, A traceback will appear. Steps to reproduce the error: - Install ``stock`` module - Go to Inventory > Configuration > Settings >…
When there is no warehouse and user clicks on the replenishment, A traceback will appear. Steps to reproduce the error: - Install ``stock`` module - Go to Inventory > Configuration > Settings > Enable Multi-Step Routes - Create new product > Click on ``On Hand`` smart button > Add Negative On Hand Quantity (e.g. -10) - Go to Inventory > Configuration > Rules > Delete all Rules - Go to Inventory > Configuration > Warehouses > Delete Warehouse - Go to Inventory > Operations > Replenishment Traceback: ``` NotNullViolation: null value in column 'warehouse_id' of relation 'stock_warehouse_orderpoint' violates not-null constraint ``` https://github.com/odoo/odoo/blob/54204e664ed1924f512ba4626be010e39c2d17a3/addons/stock/models/stock_orderpoint.py#L538-L545 When there is no warehouse available, the ``warehouse_id`` is set to False. when the method tries to create orderpoints using this ``False`` value for ``warehouse_id``. So, It will raise the above traceback. sentry-6682818532 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that could stop users from planning a manufacturing order after recording actual time on one of its work orders. The plan action now handles work orders without scheduling data correctly, helping production teams continue planning without interruption.
Original PR description
When user clicks the plan button in the mo, A traceback will appear. Steps to reproduce the error: - Create a new MO > Select any product > Add 2 workorders - Confirm - Set Real duration in any…
When user clicks the plan button in the mo,
A traceback will appear.
Steps to reproduce the error:
- Create a new MO > Select any product > Add 2 workorders
- Confirm
- Set Real duration in any workorder
- Click on Plan button
Traceback:
```
File "/home/odoo/src/odoo/addons/mrp/models/mrp_production.py", line 1583, in _plan_workorders
'date_start': min([workorder.leave_id.date_from for workorder in workorders]),
TypeError: '<' not supported between instances of 'datetime.datetime' and 'bool'
```
The error occurs due to changes introduced in the following commit: https://github.com/odoo/odoo/commit/e587fecca81081a1861b353b85f1d8ed68503973
After this commit, modifying the real duration of a work order sets its status to ``In Progress``.
As a result, the resource calendar leave is no longer created for that workorder. https://github.com/odoo/odoo/blob/3fb37cbc59adc2caace8efcdae418d2466a9b750/addons/mrp/models/mrp_workorder.py#L529-L530
So, here ``leave_id.date_from`` becomes False.
https://github.com/odoo/odoo/blob/3fb37cbc59adc2caace8efcdae418d2466a9b750/addons/mrp/models/mrp_production.py#L1575-L1576
So, It will lead to the above traceback.
sentry-6595147036
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fix prevents Colombian electronic invoices from failing unexpectedly when no signing certificate is configured. Users will avoid a system error during invoice sending in this setup, making the missing configuration easier to handle.
Original PR description
The variable `cert_sudo` was being used outside of the for loop If no certificate is present, the loop is skipped, and `cert_sudo` remains undefined, resulting in the UnboundLocalError. **Steps to…
The variable `cert_sudo` was being used outside of the for loop If no certificate is present, the loop is skipped, and `cert_sudo` remains undefined, resulting in the UnboundLocalError. **Steps to replicate** Install the Sales,Accounting apps and l10n_co_dian module. * Go to Settings Open `Users and Companies` > `Companies` and create a New Company. * Enter the name: YourCompany (Colombia) and in the `Country field`, select `Colombia`. * Enter arbitrary values for the `Company ID` fields and save. * Switch to `YourCompany (Colombia)` from dashboard. * Go to Settings>Accounting section>Colombian Electronic Invoicing section. * In Operation Modes, add a line. * Set Software Mode to `DIAN 2.1: Electronic Invoices` and set `Software PIN` and `Testing ID` randomly and save. * Go to Contacts app and search for `Deco Addict`. * Open the Sales and Purchase page. * In the `Obligaciones y Responsabilidades` field, select `0-47`. * Enter an arbitrary value for Company ID and save. * Go back to contacts and now search for `YourCompany (Colombia)`. * Enter arbitrary letters in the Identification field and select any option in the `City` field. * Go to the Sales and Purchase page and Fill in `Obligaciones y Responsabilidades` and save. * Open Accounting and Select Configuration > Journals>Customer Invoices. * Go to the Advanced Settings page. * Fill all fields under the `Resolución DIAN section` with arbitrary values and save. * Create a new Customer Invoice by pressing the New button under Customer Invoices from accounting dashboard. * Set the customer to `Deco Addict`. * Add a random product in the product lines then save and press confirm. * Press Send, then in the template preview, press Continue > Send. **Error:** `UnboundLocalError: local variable 'cert_sudo' referenced before assignment` **Solution:** Added a check to ensure that certificates_sudo is not empty before entering the block where cert_sudo is used. Sentry-6515616912
This fixes an error that could prevent the Partner Ledger report from opening when users selected a custom horizontal group containing multiple journals. Accounting teams can now use this reporting configuration without hitting a system error.
Original PR description
When creating a custom horizontal group in accounting module with multiple journals, query with wrong syntax will be fired from `_get_query_sums` method **Steps to reproduce:** Install accounting…
When creating a custom horizontal group in accounting module with multiple journals, query with wrong syntax will be fired from `_get_query_sums` method
**Steps to reproduce:**
Install accounting module
* `Configuration>Accounting>Horizontal Groups`
* Create new group and put arbitrary `group name`
* On `Reports` field add `Partner Ledger` then add a line and on `field` select `Journal` hit Save and close.
* Go to `Reporting>Partner Reports>Partner Ledger`
* Select `Horizontal Group > The name of the group you created`
**Error:**
`psycopg2.errors.SyntaxError: syntax error at or near 'WITH'
LINE 27: WITH partner_sums AS (`
**Solution:**
Modify the `WITH partner_sums AS( .....) `
with `SELECT * FROM ( WITH partner_sums AS(...) as sub` this prevents invalid syntax of
```sql
WITH partner_sums AS (...)
SELECT * FROM partner_sums
...
UNION ALL
WITH partner_sums AS (...)
SELECT * FROM partner_sums
...
```
and now instead it does which is a valid syntax
```sql
SELECT * FROM (
WITH partner_sums AS (...) SELECT * FROM partner_sums
) AS sub
UNION ALL
SELECT * FROM (
WITH partner_sums AS (...) SELECT * FROM partner_sums
) AS sub
...
```
Sentry-6529855325Bank synchronization now starts after the company's accounting lock date, preventing transactions from being imported into periods that should no longer change. Opening balances are also dated consistently with the first synced transaction, reducing the risk of incorrect or confusing bank statement entries.
Original PR description
If you have a company with a lock date set, and you connect a bank that has transactions dated to the day of the lock date, these transactions will be fetched, which do not make sense because nothing…
If you have a company with a lock date set, and you connect a bank that has transactions dated to the day of the lock date, these transactions will be fetched, which do not make sense because nothing should be created in a period covered by a lock date. As a result, these transactions would be created at a wrong date (if the current month is the first after the lock date or if the sequence has a monthly reset, then they would be appended to the current month, else if the sequence reset annually, then they would be created at the current date). Additionally, the potential opening balance would be created at a wrong date too, since it would try to create it one day prior to the oldest transaction. The date which the opening balance is created would not be the same as the transactions above, which adds a layer to the mess created. To prevent this, at initialization, we set the last sync date one day after the lock date, not the same day. As for the opening balance, we do not try to set it one day prior to the oldest transaction, but the same day. The `internal_index` computed will ensure it is displayed as the first transaction of that journal. Finally, the test related to statement creation were adapted to this new behavior. Some ordering based on `date` in other tests were changed to `internal_index` to unify the test file with these changes. opw-4890538 Forward-Port-Of: odoo/enterprise#93543
Fixes an issue where edited time entries in the Timesheet list view could appear to revert when users moved focus with Shift+Tab. This helps employees keep confidence that their entered time is retained accurately while creating or updating timesheets.
Original PR description
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation:…
Steps to reproduce: ----------------- 1. Go to Timesheet → My Timesheet → List View → New OR Edit already filled time. 2. Change time in the Time Spent field. 3. Press Shift + Tab. Observation: ----------------- The focus changes, but the Time Spent field reverts to its old value instead of keeping the newly entered one. Issue: ----------------- - For new records, the component retrieves the value only from the state, which is updated in the `onWillUpdateProps` lifecycle. This lifecycle triggers only on saving or editing, not when simply changing focus. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L123-L128 - The same behavior occurs when editing existing records, leading to incorrect value display. https://github.com/odoo/enterprise/blob/e14b991927df14f41535e92dd01ea2ecac44a404/timesheet_grid/static/src/components/timesheet_display_timer/timesheet_display_timer.js#L31-L33 Solution: ----------------- - For new records, since the default value is 0, the fix makes the component fall back to the updated record value if the state value is not yet available. - For existing records, if the timer is running, the timer’s value is displayed. otherwise, the component falls back to the updated record value. opw-4922847
Fixes an issue where orders could keep using the Click and Collect warehouse even after the customer switched to standard delivery. This helps ensure quotations and fulfilled orders use the correct warehouse, reducing fulfillment errors.
Original PR description
Steps: - Activate Click and Collect, then create a new warehouse. - For the product, add quantities in both locations. - Assign the second warehouse to Click and Collect. - Go to the website, add the product to the cart, choose Click and Collect as the delivery method, then switch it to Delivery and confirm payment. Issue: - When checking the quotation, it still uses the warehouse linked to Click and Collect. Cause: - Warehouse recomputation logic is called after _remove_delivery_line which resets the delivery_type of sale order. Since delivery_type is reset the sale order filter for warehouse recomputation does not work as intended. Fix: - Moved warehouse recomputation logic to _set_delivery_method which will filter the sale order before _remove_delivery_line. opw - 4965726, 5004170 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The timesheet and attendance timesheet filters for Today, This Week, and Last Week now use the user’s local date instead of a UTC-based date. This prevents entries from appearing under the wrong day or week for users in time zones where the previous logic caused off-by-one errors.
Original PR description
This commit fixes issues with the timesheet Date filters, in which the `date` field of account.analytic.line records, which is stored as the local timezone's date, is being compared to a UTC DateTime value. This leads to off-by-one errors. For example, if you are in Berlin and try to filter for all timesheet entries from "Today", you will only find entries from the previous day. Similarly, for the "This Week" and "Last Week" filters, which would be shifted by one day. The filter domains have been changed to compare the `date` to the local timezone's "today". opw-5003310
This fix ensures date filters in timesheet forecasting return the correct records regardless of a user’s time zone. It prevents off-by-one-day errors that could cause forecasts or timesheet data to appear missing or incorrectly included.
Original PR description
This commit fixes the timezone issues with the Date filters, in which we were comparing a UTC DateTime value to a local timezone's Date. In certain timezones, this leads to off-by-one errors in the records fetched from the DB, depending on how far ahead or behind UTC that timezone is. Specifically, we remove the UTC conversion within the filter domains. opw-5068870
This fix stops users from repeatedly validating an online POS payment while the order is still syncing. It prevents checkout errors on slow connections and makes online payments more reliable for cashiers and customers.
Original PR description
Currently, an error occurs when validating an online payment if the network is slow. **Steps to Reproduce:** 1) Install POS (with demo data) and the Demo Payment module. 2) Go to Payment Methods and…
Currently, an error occurs when validating an online payment if the network is slow.
**Steps to Reproduce:**
1) Install POS (with demo data) and the Demo Payment module.
2) Go to Payment Methods and create a new online payment method for any shop (e.g., a clothing shop). Set the Payment Provider to `Demo`.
3) Open a POS session for the clothing shop, select any product, and proceed to payment.
4) Open Inspect → Network tab, create a custom slow network profile(e.g., `set both download and upload speed to 1 KB/s`), and switch to that network.
5) Select the online payment method you just created and continuously click on Validate.
Error:
ValueError: Expected singleton: pos.order('p', 'o', 's', '.', 'o', 'r', 'd', 'e', 'r', '_', '4')
**Root Cause:**
When an online payment is validated, the `_isOrderValid` and `addNewPaymentLine` methods are called.
- With a slow network, the order ID is still temporary(e.g., e74a3369-7dcd-4234-b35e-04daa149ffe6) as the order is not synced completely, when the code at [1] is executed.
- Due to multiple clicks, `_isOrderValid` forces a call to `update_online_payments_data_with_server` at [2] before order is synced.
- This eventually passes the temporary ID to `get_and_set_online_payments_data` at [3], causing the issue.
**Fix:**
Prevent multiple clicks on Validate until the order is successfully synced.
[1]- https://github.com/odoo/odoo/blob/eb88370e2fc1887e8c88dfd8dbeadce23bb7abe5/addons/pos_online_payment/static/src/overrides/pos_overrides/components/payment_screen/payment_screen.js#L11-L17
[2]- https://github.com/odoo/odoo/blob/eb88370e2fc1887e8c88dfd8dbeadce23bb7abe5/addons/pos_online_payment/static/src/overrides/pos_overrides/components/payment_screen/payment_screen.js#L87
[3]- https://github.com/odoo/odoo/blob/eb88370e2fc1887e8c88dfd8dbeadce23bb7abe5/addons/pos_online_payment/static/src/overrides/pos_overrides/models/pos_store.js#L18-L26
**sentry-6849786792**This fixes Saudi e-invoicing so that a duplicate submission response is treated as a successful send instead of an error. It helps prevent invoices that were already received by the authority from being incorrectly shown as failed, reducing manual follow-up for accounting teams.
Original PR description
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
Duplicating multiple Point of Sale configurations at once no longer causes an error. The update also ensures each duplicated shop gets its own cash payment method, preventing payment setup conflicts.
Original PR description
This issue occurs due to changes introduced in commit [4ac2702](https://github.com/odoo/odoo/commit/4ac2702c31f0e95f33f9ad554e7350bef9dab8bd), which added the `copy_data` method. The technique…
This issue occurs due to changes introduced in commit [4ac2702](https://github.com/odoo/odoo/commit/4ac2702c31f0e95f33f9ad554e7350bef9dab8bd),
which added the `copy_data` method. The technique allowed
duplicating multiple POS configs at once.
When performing a `search_count` on `pos.config` to check for existing records
with matching `payment_method_ids`, the domain was incorrectly using
('id', '!=', self.id).
This works fine if self is a `singleton record`, but `fails` if self contains
`multiple records`.
**Steps to Produce:-**
- Install the `Point of sale`.
- `Point of sale > Configuration > Payment methods`.
- Select `Card` and `Customer Account`, and delete them.
- Now, go to `Dashboard` and then open the `list view` of `Point of Sale`.
- Select `Furniture Shop` and `Clothes Shop` and then try to duplicate them.
**Error:-**
`ValueError: Expected singleton: pos.config(6, 7)`
**Solution:-**
- This commit fixes the above issues by:-
- Replacing `('id', '!=', self.id)` with `('id', 'not in', self.ids)` to
safely handle multi-record sets.
- Also found another issue, like when we duplicate pos in batch, then it assign
the same `cash payment method` to `multiple pos`.
- This commit also fixes the above issue by overriding the `copy_data()`
method.
- Assign a unique name to each duplicate (e.g., "Shop (copy)").
- Assign an `unused cash payment method` to each config, or `create` one if
none are available.
**Sentry - 6673398556**Cancelling a sales order after multiple nested product returns no longer causes the system to crash. This improves reliability for sales and warehouse teams handling complex return flows.
Original PR description
The system crashes with a `RecursionError` during the `Sale Order` cancellation with nested `returns`. **Steps to produce:-** - Install the `Purchase Stock` and `Sales` modules. - Create a new `Sales Order` (SO) with `Product A`. - Confirm the `Sales Order` and click on the `Delivery` button. - Click on `Return > Return all`. - In the new window, also click on `Return > Return all`. - Return to the `Sales Order` and attempt to `Cancel` it. **Error:-** `RecursionError: maximum recursion depth exceeded` **Solution:-** - Added a check for the self not already visited in the method `_get_upstream_documents_and_responsibles` to prevent revisiting the same move multiple times and `avoid infinite recursion`. **Sentry - 6693197358** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Field Service sales orders now use the product's currency when calculating prices, instead of incorrectly reusing the sales order currency. This ensures prices are converted correctly when products and orders use different currencies, preventing incorrect invoice amounts.
Original PR description
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any…
### Steps to reproduce: - Open Field Service module. - Create a new task. In the Customer field, select “Bloem GmbH”. - Open the task’s project. - In the Invoicing tab, create a new line for any employee and any service. - Return to the task and in the Timesheets tab, add a new timesheet. - Click the Mark as done button. - Click the Sales order button. ### Cause: When creating the sale order out of the fsm task we use _get_tax_included_unit_price to get the price of the SO line but we are passing the order currency twice to this method so it doesn't convert the price as when it checks the currency and the product_currency it found they are the same so no need to convert https://github.com/odoo/odoo/blob/6653355b8bc063ceadf08af17fbf2c4a250553e6/addons/account/models/product.py#L239-L240 ### Fix: We pass the product currency instead of the order currency in order to be able to convert the price according to the currencies opw-5045071 Forward-Port-Of: odoo/enterprise#94947
This fix prevents users from deleting the default barcode nomenclature that the barcode scanner setup depends on. This avoids crashes when re-enabling barcode scanning in Inventory settings, keeping configuration changes reliable.
Original PR description
The system will crash with error when user tries to enable barcode scanner in settings. **Steps to produce: -** - Install `Inventory` module. - `Inventory > configuration > products > Barcode…
The system will crash with error when user tries to enable barcode scanner in settings.
**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 prevent the deletion of `default nomenclature`.
[1]: https://github.com/odoo/enterprise/blob/400171c9cebc46ecdd907ada210c65f3bbd2dd66/stock_barcode/data/data.xml#L40-L71
**sentry-6823596992**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr