Thursday, September 10, 2026
8 changes · master
Enhancements to existing features
Businesses can now manage one asset under multiple depreciation rules at the same time, such as statutory and internal book accounting. This improves reporting accuracy and reduces duplicate asset records when different ledgers require different depreciation treatment.
Original PR description
* = account_reports,l10n_{in_asset,ph_reports_asset,ro_saft} This commit enables a single asset to carry multiple depreciation configurations (variants), each targeting a different ledger. This…
* = account_reports,l10n_{in_asset,ph_reports_asset,ro_saft}
This commit enables a single asset to carry multiple depreciation
configurations (variants), each targeting a different ledger. This allows
the same asset to be depreciated under multiple accounting regimes (e.g.,
statutory vs. book) simultaneously.
Changes:
- Introduces `account.asset.variant` model: moves most depreciation
lifecycle logic (board computation, disposal, sale, modification)
from `account.asset` onto variants. A single asset owns multiple
variants, each with its own model, journal, accounts, and state.
- Renames `account.move.asset_id` to `asset_variant_id`: all depreciation
moves now link to a variant instead of an asset directly. Downstream
integrations (fleet, l10n_*, reports) are updated accordingly.
- Adds ledger account fields to `account.depreciation.model`
(`ledger_depreciation_account_id`, `ledger_expense_account_id`,
`ledger_recovery_account_id`) so a depreciation model used for a
ledger variant carries its own account mapping.
- Adds `ledger_depreciation_model_ids` on `account.account` so default
ledger depreciation models can be configured per account, enabling
automatic multi-variant asset creation from bills.
- Adds UI: asset variant list view, depreciation ledger list/form
views, ledger-specific sections on the depreciation model form,
conditional button visibility based on variant state, and a wizard
(`depreciation.ledger.wizard`) to attach a ledger-based depreciation
model to an existing asset.
- Adapts the account asset report SQL to operate at variant level:
restructures CTEs to group values by variant, avoids double-counting
asset cost values across variants, and adjusts disposal/recovery
logic for the multi-variant scenario.
- Updates `l10n_ro_saft` SA-FT asset queries and `l10n_in_asset`
computation overrides to work with `account.asset.variant`.
- Adapts existing tests and adds test file (`test_asset_ledger.py`)
covering ledger variant creation, board generation, disposal, and
report output.
task-5961309Belgian payroll now handles mobility budget settlements, Pillar 2 and Pillar 3 payments, year-end balances, and termination calculations more accurately. The update also adds warnings to help payroll teams spot inconsistent payments, invalid budget limits, or company car conflicts before declarations and payslips are finalized.
Original PR description
Rework the mobility budget logic according to Partena requirements. * Settle the remaining mobility budget in December or on the employee's final monthly payslip instead of in the anniversary month.…
Rework the mobility budget logic according to Partena requirements. * Settle the remaining mobility budget in December or on the employee's final monthly payslip instead of in the anniversary month. * Support Pillar 2 payments through payslip inputs even when the Expenses module is not installed. * Add dedicated salary rules for mobility budget amounts already paid, remaining balances, and Pillar 3 payments, including payments related to the previous year. * Include the mobility budget amount in termination fee computations. * Compute the yearly mobility budget as a prorated amount based on all employee versions within the calendar year, where required for payroll calculations and the 281.10 declaration. * Adapt the DMFA mobility budget declaration to report the applicable yearly mobility budget for Pillar 3 payments, including payments related to the previous year. * Add warnings when Pillar 2 or Pillar 3 payments are inconsistent with the remaining mobility budget. * Add warnings when the mobility budget falls outside the configured boundaries or exceeds 20% of the yearly wage. * Add a dashboard warning for employees with a mobility budget and a company car emitting CO₂. * Move the computation of the default mobility budget amount from l10n_be_hr_contract_salary to l10n_be_hr_payroll, so that the mobility budget amount is available without requiring the salary configurator module to be installed. Related upgrade PR:https://github.com/odoo/upgrade/pull/11241 Task: 6263962
Belgian payroll now calculates certain withholding tax exemptions directly on payslips, including exemptions for eligible R&D employees. This improves accuracy when exemptions depend on totals across multiple payslips and supports required Belgian reporting.
Original PR description
Some withholding tax exemptions depend on the result of other payslips tax exemptions. Tax exemptions need to be implemented as payslip rules. In order to have the result of other payslip's rules, we need to setup up "rounds of computation". For example: payslip1, payslip2 and payslip3 need to be computed with rules 1, 2 and 3 for each payslip. Rule 3 needs the result of rule 1 and 2 for all payslips. - rule 1: round_of_computation = not_defined -> default = 0 - rule 2: round_of_computation = 0 - rule 3: round_of_computation = 1 Computation will happen in the following order 1) payslip1: rule 1 and rule 2 2) payslip2: rule 1 and rule 2 3) payslip3: rule 1 and rule 2 4) payslip1: rule 3 5) payslip2: rule 3 6) payslip3: rule 3 The final goal of this task is to introduce the computation of withholding tax for R&D employees (bachelor, master and doctor/civil_engineers). task-6201363
Manufacturing administrators can now reset canceled manufacturing orders to draft or move completed ones back into progress, making it easier to correct or continue production records. Canceled orders now consistently cancel all related work orders, and serial or lot numbers are reused when an order is restarted to avoid cluttering inventory records.
Original PR description
This PR allows Manufacturing Admin user to `Reset to Draft` an MO if it's canceled or `Set to In Progress` if validated. This PR also changes the behavior of canceling an MO to cancel all workorders regardless of their state. In case of producing a product tracked by serial number or lot: if the MO already generated/assigned lot_ids, then Mo is validated/canceled, then reset, then confirmed/produced again, it uses the same old lot_ids which keeps the inventory from being crowded with unused serial numbers. Related PR: https://github.com/odoo/enterprise/pull/124863 Task-6348605
This update improves how Odoo records inventory costs, cost of goods sold, and accruals for purchases and sales. It gives finance teams more accurate stock valuation and a clearer view of goods invoiced but not yet delivered or received.
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
Cash on Delivery and Pay on Site orders now remain marked as unpaid until money is actually collected, while still confirming the order and showing customers a successful checkout. Delivery staff are prompted to collect the due amount during delivery, and Point of Sale can later settle these orders correctly even after goods have been delivered.
Original PR description
The export data dialog is easier to use, with a cleaner layout, better field selection behavior, and editable export templates. Users can now export translated field values by language, making multilingual data exports easier to reuse and re-import.
Original PR description
This PR applies several changes to revamp the export data dialog. First commit modernizes the layout and behavior of the export dialog: Layout: - Replace the "I want to update data (import-compatible…
This PR applies several changes to revamp the export data dialog. First commit modernizes the layout and behavior of the export dialog: Layout: - Replace the "I want to update data (import-compatible export)" checkbox with a more compact "Updatable fields only" switch, placed next to the "Available fields" title it actually filters. - Replace the export format radio buttons with a select displayed below the available fields, freeing vertical space in the right panel, and name the formats "Excel Workbook (.xlsx)" and "Plain Text (.csv)" instead of bare extensions. - Add a search icon inside the search input, hidden as soon as the user starts typing. - Use caret icons and the standard emphasis hover color in the fields tree instead of the brand color overlay, and drop the special styling of expanded items. Behavior: - Toggling "Updatable fields only" now only refreshes the available fields and keeps the export list untouched, instead of resetting it to the default/template list. - Hide the "add" icon of fields already selected instead of rendering it in a disabled state. - Ignore the trash icon in the draggable hook so removing a field cannot accidentally start a drag sequence, and give it a pointer cursor. Second commit adds translation support to export: since https://github.com/odoo/odoo/pull/224997, the import supports translated fields through the `field@lang` header convention (e.g. `name@fr_FR`). The commit adds the counterpart on the export side. Server: - `_export_rows()` now accepts field paths suffixed with `@` and a language code and exports the translation of the field in that language, mirroring the import convention (including nested paths such as `line_ids/name@fr_FR`). - `/web/export/get_fields` and `ir.exports._get_fields_info()` expose a `translate` flag so the client knows which fields are translatable. Export dialog: - Add a "Languages" input at the bottom of the "Fields to export" column, only shown when more than one language is installed. The selected languages are displayed as removable tags next to an inline autocomplete listing the remaining installed languages. - On export, each translatable field of the export list is replaced by one column per selected language, using the `field@code` syntax. An import-compatible export can thus be re-imported with its translations directly. - Languages export preferences can also be saved and loaded into/from export templates. Layout: - Rework the two-pane layout into a 2-column CSS grid so each horizontal pair (titles, search/template, field lists, format/languages) shares a row and stays vertically aligned with equal heights - in particular the Format select and the Languages input. Third commit improves export template creation/edition UX. Templates can now be renamed and have their fields/order/languages changed in-place, instead of only supporting a separate "New template" option. Changing the export list, field order or languages while a template is selected but not being edited detaches from it, keeping the current selection as an unsaved working set instead of forcing edition mode, so a new template can be built on top of an existing one without altering it. ir.exports.line gains a sequence field so the field order of a template is preserved across saves. task-6090205
Point of Sale employee access levels have been renamed to clearer business roles: Restrictive, Cashier, Manager, with a new Supervised role added. POS actions are now limited according to each employee's assigned role, helping businesses better control what staff can do at checkout.
Original PR description
**= point_of_sale, pos_discount, pos_loyalty, pos_sale, pos_self_order Following this commit: ==== - Minimal Employee has been renamed to Restrictive. - Basic Employee has been renamed to Cashier. - Advanced Employee has been renamed to Manager. - Introduced the Supervised Employee role. - Restricted POS features based on the employee's assigned role. task-6317141 Ent PR : https://github.com/odoo/enterprise/pull/122275 Upgrade PR : https://github.com/odoo/upgrade/pull/10629
*: account_payment_custom, payment(_custom), pos_sale(_delivery,_stock), pos_stock, sale, website_sale_collect Since 9d01784fa998, "Cash on Delivery" and "Pay on Site" transactions were marked as…
*: account_payment_custom, payment(_custom), pos_sale(_delivery,_stock), pos_stock, sale, website_sale_collect Since 9d01784fa998, "Cash on Delivery" and "Pay on Site" transactions were marked as done as soon as the order was placed, so the order appeared fully paid: it could no longer be settled in the Point of Sale, and 1c9c1a1213ef had to patch the remaining balance to ignore those transactions. This keeps such transactions pending instead, the money genuinely hasn't been received yet, and drops that workaround. The order is still confirmed and the customer still sees a success message at checkout, but the payment stays outstanding until it is really collected: - The invoice is no longer issued at checkout, so the customer isn't invoiced for money they haven't paid; it is created when the payment comes in. - Validating a delivery for such an order pops a dialog stating the amount the delivery person has to collect, and for which orders, before the transfer goes through. - The order keeps a remaining balance, so it can be loaded and settled in the Point of Sale, including after the goods have already been delivered, which previously loaded an empty order. - Settling it in the Point of Sale takes the payment there and closes the promise of a payment on delivery. - "Pay on Delivery" is only offered for the full remaining balance: it can't be used to promise a partial payment. task-5166559