Daily updates from Odoo
Thursday, November 20, 2025
26 changes
1 change
Enhancements to existing features
This update adds triangular taxes to Finnish tax reporting so they can be used in the EC Sales List report. It helps ensure cross-border sales are reported more accurately for businesses operating in Finland.
Original PR description
The aim of this commit is adding the triangular taxes into the tax report to use it in EC Sales List report. task-5126664 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236427 Forward-Port-Of: odoo/odoo#229269
2 changes
Enhancements to existing features
This update makes automatic database field conversion simpler and more predictable. It avoids unnecessary recalculation during upgrades, which should reduce upgrade time and prevent avoidable slowdowns.
Original PR description
The auto column conversion should be limited to simple and intuitive use cases. It shouldn't trigger the slow ORM recomputation if the field is computed. We always expect an upgrade script to handle…
The auto column conversion should be limited to simple and intuitive use cases. It shouldn't trigger the slow ORM recomputation if the field is computed. We always expect an upgrade script to handle more complex use cases.
This commit introduces two changes:
### 1. Removal of `drop_not_null` during auto column conversion
Before https://github.com/odoo/odoo/commit/50767ef90eadeca2ed05b9400238af8bdbe77fb3 We dropped the not_null constraint because the original column would be renamed. After that commit, we actually don't need to drop the not_null constraint since the `convert_column` will neither convert a not-null value to `null` nor convert 'null' to a not-null value. Keeping the not_null constraint shouldn't block the column convert.
### 2. Removal of `column.clear()`
When a computed/related Float field is changed from `digits=None` to `digits='xxx'`, the `column.clear()` will trigger ORM recomputation during upgrade which is useless since `double precision` to `numeric` is lossless. The recomputation in ORM is slow and should be avoided. If the rerounding is really needed, a sql script is required for upgrade or installation.
The `column.clear()` was originally introduced to avoid `Missing not-null constraint` warnings in specific scenarios:
Case 1 (Upgrade Warning): from saas-18.4 to 19.0
old database: Selection field `l10n_be.export.sdworx.leaves.wizard.reference_year` upgrade: pre-migrate `util.rename_model(cr, "l10n_be.export.sdworx.leaves.wizard", "l10n.be.hr.payroll.export.sdworx")` new database: Integer field `l10n.be.hr.payroll.export.sdworx.reference_year` The column value which was a required stringified integer is auto-converted to an integer.
Case 2 (Installation Warning):
In pos_urban_piper, the required field `pos.config.name` is overridden from `translate=False` to `translate=True`. The column value which was a required text is auto-converted to `'{"en_US": "text"}'::jsonb`
The not_null constraint was previously lost by the `sql.drop_not_null` in `update_db_column` and is not restored by `update_db_notnull` because of the inconsistency between the variable `column['is_nullable']` and the actual not_null constraint in the database.
Thanks to change 1, we will no longer lose the not_null constraint in `update_db_column`. The constraint can be kept even without `column.clear()`.
By removing the `column.clear()`, we also revert the meaning of the `column` variable, which is the column's configuration (dict) before `update_db` if it exists, or `None`
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-prUsers can again mark individual invoices or journal items as “No Follow-Up,” so they won’t trigger reminders or appear in follow-up outputs. This also keeps partner follow-up status accurate, improves handling of items without due dates, and ensures exports and follow-up emails only reflect the billable items that still matter.
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
9 changes
Enhancements to existing features
The IoT module files were reformatted using a standard formatting tool to make the codebase more consistent and easier to maintain. This is an internal cleanup with no expected change to user-facing behavior, and future checks will help keep the formatting consistent.
Original PR description
This commit formats all the files in the `iot` module using `prettier`. This formatting will be enforced by the ESLint test (see associated Community PR https://github.com/odoo/odoo/pull/236516).
Users can now mark or unmark documents as favorites directly from the list view, matching the behavior already available in Kanban view. The shortcut only appears when documents are selected, reducing clutter and making the action more relevant.
Original PR description
- Previously, toggling favorites was only supported in the Kanban view and not available in the list view. - Favorites can now be toggled in the list view, and provide consistency across all views. - Additionally, the shortcut command is now only available when at least one record is selected, as it doesn't make sense to show the command when no documents are selected. Task-4822074
Payroll users can now remove work entry export records for several Belgian payroll providers. This helps teams correct or clean up exported payroll data when records are no longer needed.
Original PR description
*={acerta,group_s,partena,prisma,sd_worx,ucm}
Payroll users should be able to delete the work entry export records.
task-5050476The default Administrator employee is no longer included in standard company data and is only available with demo data. This keeps new databases cleaner and avoids an incomplete placeholder employee getting in the way, while users can still create an Administrator employee when needed.
Original PR description
## Purpose The default administrator employee (in master data) sometimes can get annoying, making it difficult to code easy features. Moreover, almost all the fields of this employee are empty, and the user can easily create its own Administrator employee by clicking the "Create Employee" button from the Admin User View. ## Solution Moving the admin employee to the demo data. [community#232627](https://github.com/odoo/odoo/pull/232627) [upgrade#8806](https://github.com/odoo/upgrade/pull/8806) [task-5138634](https://www.odoo.com/odoo/all-tasks/5138634)
This update adds support for UK EC Sales and Intrastat return reporting. It helps businesses prepare required cross-border trade declarations more consistently within Odoo.
This update aligns several business workflows with a platform change where asking for zero records now correctly returns none. It helps avoid unintended records appearing in manufacturing planning, subscriptions, and barcode/package operations when a zero-result limit is expected.
Original PR description
https://github.com/odoo/odoo/pull/234231
The manufacturing work order display no longer keeps an unused reference in its setup logic. This removes outdated code tied to a previous storage naming approach, reducing confusion and making future maintenance safer.
Original PR description
Picking type Was only used in the previous local storage key name and was undefined. see odoo/enterprise#88073 (original PR) see odoo/enterprise#93841 (Fix PR were we remove the `picking_type_id` key from local storage name)
Installing an accounting chart template for countries in the SEPA zone now also installs ISO 20022 payment support. This helps businesses in those countries get the right bank payment capabilities automatically, reducing manual setup.
Original PR description
This commit will allow to install account_iso20022 when installing a chart template from the SEPA zone. task-5163045 Forward-Port-Of: odoo/enterprise#97209
The U.S. direct deposit settings are now connected to the community accounting setup, making them easier for users to discover in the right place. This improves configuration clarity without changing the direct deposit feature itself.
Original PR description
Change the new settings panel from being defined in enterprise to being defined in l10n_us_account and overriden here for proper discoverability. task-5080414
8 changes
Enhancements to existing features
This change lets users specify the place where a service was delivered using the delivery address on a sales order or invoice. That address is now sent to the Brazilian tax and e-invoicing flow, so the issued service invoice can show the correct city where the service was provided.
Original PR description
Purpose: In Brazil, it is common for companies to sell services in one city and provide the services in another city, thus, it is necessary to inform the place of service provision in NFS-e. Users can specify where the service was provided through the delivery addresss on either sale order or invoice. The delivery address will be sent in the request to the tax calculation and edi. Outline of additional attributes being sent: - header.locations.rendered.address.street --> partner_shipping_id.street - header.locations.rendered.address.neighborhood --> partner_shipping_id.street2 - header.locations.rendered.address.zipcode --> partner_shipping_id.zip - header.locations.rendered.address.cityName --> partner_shipping_id.city - header.locations.rendered.address.state --> partner_shipping_id.state_id.code - header.locations.rendered.address.countryCode --> partner_shipping_id.country_id.l10n_br_edi_code task-5124608
The Philippine location database now includes all official provinces as states. This improves address accuracy and makes it possible to configure payroll and other processes at the province level.
Original PR description
Before: -The Philippine localization lacked province data in res.country.state. -Address and payroll setups couldn’t use province-level information. After: -Added all official Philippine provinces as states under the Philippines. Impact: -Improves address accuracy and enables province-based payroll configuration. task-5257793
The IoT service now loads IoT Box information in advance, which helps requests keep working even when connectivity is limited. It also reduces the number of database calls, improving responsiveness and lowering system load for related POS and self-order flows.
Original PR description
In order to allow iot requests to work offline, and also reduce the amount of orm requests sent to the db, we now preload IoT Box records in the `iot_http` service. Task: 5258886 Forward-Port-Of: odoo/enterprise#99910
This update clears existing UrbanPiper menu links and rebuilds them from scratch during synchronization. It helps keep the restaurant menu shown in UrbanPiper accurate and reduces the risk of outdated or duplicated menu connections.
Original PR description
Following this commit: - Flush out all existing UrbanPiper product menu linkages and performs a fresh menu sync. task-5231247 Forward-Port-Of: odoo/enterprise#98994
When half-day or hourly time off was moved to the next month, it could be treated as a full-day absence by mistake. This update keeps the deferred work entry aligned with the actual leave duration, improving payroll accuracy.
Original PR description
When deferring half-day or hourly leaves to the next month, the work entry was incorrectly replaced with a full day duration instead of the actual leave duration. Now splits the work entry to match the exact leave hours when necessary. task-5258753
The transcript download button is now available from the live chat info panel during an active conversation. This makes it easier for internal users to access and save chat records without waiting until the session ends.
Original PR description
Previously, the 'Download Transcript' button was only visible to visitors at the end of a live chat session. This limitation caused confusion since internal users could not download the conversation transcript from the interface. This PR adds the 'download transcript' button to the info panel, ensuring it is accessible from within the chat session as well. Task-5262296 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The stock return wizard now shows one main action button, with the other options styled as secondary actions. The cancel action is also relabeled to "Discard," and users get clearer feedback when trying to return items with zero quantity, making the flow easier to understand and use.
Original PR description
Previously, the return wizard displayed multiple primary buttons, which could confuse users and affect the clarity of actions. This commit updates the wizard to have a single primary button, with all other action buttons changed to secondary for better user experience. Additionally, some button labels have been updated for clarity: - `Cancel` → `Discard` These changes make the return wizard more consistent, intuitive, and easier to use for all types of stock operations. This commit also enables improved user error when attempting to return products with zero quantities. Task - 5144914
This change makes large financial reports compute much faster by reusing already calculated account balances instead of recalculating the same data many times. It reduces waiting time for users running reports, especially on big databases, while keeping the result unchanged.
Original PR description
### Issue Large financial reports are slow to compute due to repeated re-aggregation of account_move_line balances for each formula, even when most formulas share the same base domain (usually…
### Issue
Large financial reports are slow to compute due to repeated re-aggregation of account_move_line balances for each formula, even when most formulas share the same base domain (usually filtered by account_id fields).
### Analysis
Each report line formula independently aggregates balances from account_move_line, even when their domains only differ on account_id-related fields such as account_id.account_type or account_id.non_trade.
This leads to redundant scanning and aggregation of the same dataset multiple times within a single report execution.
### Solution
Introduce a lightweight in-memory caching layer for aggregated balances by account_id, stored in self.env.cr.cache.
For each (options, date_scope) pair:
The report engine now computes once the mapping
{account_id: {'amt': total_balance, 'count_aml_lines': count}}.
This mapping is stored in the cursor cache and reused across all formulas whose domains filter exclusively on account_id fields.
A small domain transformation step allows AML domains based on account_id.* fields to be evaluated directly against the cached account aggregates.
This approach avoids redundant SQL aggregation, remains fully read-only (no database writes), and is safe for execution on read replicas.
### Benchmarks
Profiling get_report_information_readonly on different reports. Database has ~11.6 million account_move_lines, 305 account_accounts, and 16 account_types
| Report Name | Before | After | % Speed Up |
| --- |---|---|---|
| Balance Sheet | 35s | 6.2s | ~550% |
| Profit and Loss | 7.2 | 2.1 | ~300% |
| Cash Flow Statement | 1.5s | 0.4s | ~300% |
| Executive Summary | 24s | 6.3 | ~400% |
### References
opw-51307254 changes
Enhancements to existing features
This change makes the system find delivery information for product lots much faster by reworking how the lookup is done behind the scenes. It reduces the number of database reads and removes repeated processing, which can significantly speed up stock operations for larger batches.
Original PR description
### Description: This refactoring replaces the recursive calculation in `_find_delivery_ids_by_lot` with an iterative process. This change significantly reduces the amount of database queries by prefetching and batching all required lines in a single pass, and it also eliminates the overhead caused by repeated recursive function calls. ### Benchmark: | Total Lots | Before | After | |------------|--------|--------| | 69 | 1 sec | 106 ms | | 1152 | 1 min | 5 sec | ### Reference: opw-5096599 Forward-Port-Of: odoo/odoo#233478
The customer portal now reads subscription billing periods from the system configuration instead of relying on a fixed list. This prevents errors when businesses use custom periods such as daily subscriptions, and makes the portal more adaptable to future changes.
Original PR description
Problem -------- In v18.0, the day billing period was removed from the sale.subscription.plan model. For our use case, we require daily subscriptions, so we added this value back to the…
Problem -------- In v18.0, the day billing period was removed from the sale.subscription.plan model. For our use case, we require daily subscriptions, so we added this value back to the billing_period_unit selection field via inheritance. However, this customization causes an error (a KeyError) when accessing the customer portal at /my/subscriptions/<int:order_id>. This is because the controller logic relies on a hardcoded list of periods and does not account for the new custom "day" value. - Screenshot Order with plan Daily: <img width="1246" height="483" alt="image" src="https://github.com/user-attachments/assets/5dc5ca0d-a2f2-434d-8183-15a0424d9f34" /> - Screenshot when trying to get in order on the website: <img width="1250" height="776" alt="image" src="https://github.com/user-attachments/assets/5b10504e-71e2-4c13-8611-39e8a41e05d1" /> Proposed Solution -------- This PR improves the subscription portal by dynamically retrieving billing periods instead of using a hardcoded list. The portal now reads the available options directly from the billing_period_unit field's selection (i.e., self.env['sale.subscription.plan']._fields['billing_period_unit'].selection). This improves maintainability, as future changes to the field's selection will be automatically reflected without requiring code modifications. This makes the portal robust and automatically compatible with any custom periods added via inheritance. - <img width="1331" height="752" alt="image" src="https://github.com/user-attachments/assets/4f7be6c3-d96b-4525-8e23-6e1323adabde" />
The tax closing process now warns users if they try to close a later period while an earlier one is still open. This helps prevent gaps that could break carryover calculations, especially for reports that depend on a continuous closing order.
Original PR description
For instance with a monthly periodicity and the last closed period is January: When we try to close March, it will show a warning telling us a period in between is not yet closed. This only applies to report with carryover as it can break the carryover chain if we don't do it in the order task-4252735
This update makes the fields used in Sign templates easier to customize and extend. It helps developers adapt template behavior more cleanly in future patches without changing core logic directly.
Original PR description
Introduced a dedicated _getTemplateFields() method to make easier to override or extend the fields in patches.
2 changes
Enhancements to existing features
This update makes the Indonesian E-Faktur Coretax export compute VAT-related values using the correct tax groups, which helps avoid incorrect invoice data in the XML file. It also adds a new tax group, updates related tax definitions, and restricts when the Coretax XML can be downloaded to reduce the risk of generating an invalid export.
Original PR description
Update Coretax XML file to compute the values for nodes in the correct way. Currently the computation is based on the invoice type for some of the nodes + STLG is based on wrong tax group. This leads to wrong computation of values + inflexibility. - Update the VAT calculation inside the E-faktur XML based on tax group - Add new tax group and modify existing tax - Add restriction when downloading E-faktur Coretax XML Task [#4948267](https://www.odoo.com/odoo/project.task/4948267)
This update improves how GSTR-2B issues are handled by recognizing an additional error code and treating it as a warning. It also prevents background jobs from reprocessing records that are already in an error state, which reduces unnecessary processing and helps keep return period handling more reliable.
Original PR description
Before this commit: - `RET2B1017` error code was not handled. - Cron methods `_cron_get_gstr2b_data` and `_cron_gstr2b_match_data` processed all records with status: - `"waiting_reception"` - `"being_processed"` - Records with blocking level `"error"` were still being processed by cron. After this commit: - Added handling for `RET2B1017` and mapped it to `"warning"` level. - Updated cron domain filters to exclude records where `gstr2b_blocking_level = "error"`. - Cron jobs now skip invalid/error-state return periods, preventing unnecessary processing.