Tuesday, September 8, 2026
56 changes · master
Enhancements to existing features
The stock traceability report now shows both where products came from and where they went, including finished products and customers, within the same report. Expanding report lines is faster and clearer, with better visual hierarchy and highlights for locations that still hold stock.
Original PR description
Expand towards end products and customers: Instead of moving downstream moving from one report to the next, we're adding a way to find all the 'children' lines of the select stock move line(s). This way we can stay in the same report and have a global view upstream and downstream from any point in the chain. Moreover, we're modifying the Unfold/Fold button to fetch all records in python before sending the final result at once to the JS. This limits the number of calls between JS and python to one. If we enter the report from the middle of a chain, there will be at least two lines show, one going upstream (parent line, existing behavior) and one going downstream (child line, new behavior). The most recent lines are shown at the top of the report. task 5265405 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Readonly image fields now hide the buttons for editing or clearing images. This prevents users from seeing actions they cannot use, making forms clearer and reducing confusion in kanban-based workflows.
Original PR description
Purpose ======= When the field is readonly, hide the "clear" and "edit" button for the `x2many_image_field` widget. Task-6323897
Accrual entries now include clearer labels so users can better understand and track what was generated. The process also detects possible duplicate accruals for the same period, reducing the risk of repeated accounting entries and cleanup work.
Original PR description
This commit improves the creation of accrual entries by: 1. adding context dependant strings allowing the user to easily track what kind of accrual entry has been created. 2. adding a mechanism to detect and handle duplicate accrual entries for the same period. task-6484921
The barcode tools now use a reusable view that combines camera scanning and manual barcode entry. This makes the scanning experience easier to expand and lets teams control whether the manual input field automatically receives focus.
Original PR description
Input focus is made conditional for the BarcodeInput component, to allow users to disable it if desired. It is enabled by default task-4170451 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
On-hand quantity links in stock reports now open the detailed stock quantities view directly. Lot quantities also reuse the existing filtered view, making it easier for users to inspect stock details consistently.
Original PR description
This commit's changes: - Redirect the stock report's on-hand quantity to the quant action. - Make the lot quantity call the existing lot-filtered quant action. task-6445662 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
Website editors now have more control over product snippets, including grid or carousel layouts, column settings, and an option to show all products by website order. The settings have also been renamed and reorganized to make product presentation easier to configure.
Original PR description
**Post this commit:** - Added Orientation option for choosing Grid/Carousel layout. - Added an 'All' Filter to fetch products based on website sequence, rather than a specific rule. - Added Columns and Mobile columns to get more precision in terms of layout. - Renamed 'Show Variants' and 'Product Names'. - Reordered some of the settings. - Removed scrolling mode and making it single by default just for the product snippet. **Affected Version**-master Task-5167730 Docs PR: https://github.com/odoo/documentation/pull/16668
The command-line module tools now show which apps would be installed, upgraded, or removed before changes are applied. Users can also list installed apps and see pending updates, making database maintenance safer and easier to plan.
Original PR description
Show the modules that would be installed, upgraded or removed by running the command. Also allow listing installed modules. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Private calendar events are now counted when showing availability for appointments, while still hiding their details from people who should not see them. This helps prevent double-booking by showing users as busy even when the underlying event is private.
Original PR description
https://github.com/odoo/enterprise/pull/122675 When a user creates a private event, it shows up as 'Busy' with no additional details in the calendar module. This behavior was not mirrored in the…
https://github.com/odoo/enterprise/pull/122675 When a user creates a private event, it shows up as 'Busy' with no additional details in the calendar module. This behavior was not mirrored in the gantt view, meaning that we couldn't see the actual availability of the user. Additionally, if the user has their default calendar privacy set to private, any event created through the appointment view will automatically be private and hidden from all other (non-attending) users. Why? When we fetch events in calendar, we do a search and go through `_fetch_query` which censors non-public fields if the user doesn't have access to a private event. In the gantt view, however, we first do a `_read_group`. Since _read_group only returns ids and does not fetch fields directly, it filtered out the private events entirely. This is not entirely necessary, as whenever we want to read the events based on the retrieved ids, we still go through `_fetch_query` which censors them. Hiding the ids themselves is not needed, as they can be read using a search anyway. This commit therefore removed the `_read_group` event override. To make sure that the events are accounted for in the availability computation, we need to fetch them with sudo in `_get_busy_calendar_events` to bypass the censorship, as we need the partner_ids to create the interval mapping. The enterprise counterpart handles displaying the busy events in the gantt view. Task-6237805
Adds a new accounting setup for Indian companies that need to prepare financial statements under Schedule III. The existing Indian template is renamed for non-corporate entities, while corporate entities get the required account classifications and tags for compliant balance sheet and profit and loss reporting.
Original PR description
Schedule III provides the format and classification for the financial statements of companies required to prepare their financial statements accordingly. In this commit, rename the existing chart template to `Non-Corporate Entities` and add a new `Corporate Entities` chart template with the Chart of Accounts and account tags required for Schedule III. The account codes from the existing Chart of Accounts are also removed, as they are not prescribed by the Indian government and are not mandatory for any specific purpose. These will provide the required account classification and will be used by the Schedule III Balance Sheet and Profit and Loss reports. task-2381149
CRM lead cards now show the sales team when viewing leads across all sales teams, making it easier to understand ownership at a glance. Helper text was also adjusted so the wording stays clear whether the team switcher is active or not.
Original PR description
- Display the crm team on the lead kanban card when the switcher is activated and the "All Sales Teams" is selected. This improves the team visibility when leads from different teams are displayed. - Reword the helpers to make sure the wording works whether or not the team switcher is activated. Task-6537623 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Belgian payroll now includes the monthly employer ONSS reduction directly on payslips, instead of only calculating it in the quarterly DMFA report. This gives companies earlier visibility into expected social security costs while keeping quarterly totals aligned with official reporting.
Original PR description
Currently the ONSS deductions for the employer are only calculated in the DMFA report every quarter, but are not reported on the payslips, so companies do not have a clear idea of the ONSS contribution they will have to pay. This commit adds a salary rule to calculate the monthly reduction amount using the computation in the DMFA report. Since the DMFA contribution and deduction are quaterly calculations, the payslips for the whole quarter are required for accurate calculations. Since the DMFA report requires validated payslips to access line IDs, the remuneration processing was adapted to use the localdict for the current payslip. The ONSS reduction rule is processed towards the end of the computation so the required lines should be available. task-6108623
Social media managers can now set different scheduled times for each social channel within one post, making multi-channel campaigns easier to coordinate. The update also refreshes social calendar and card views, separates likes, comments, and shares for clearer reporting, and adds controls to cancel posts that are still being published.
Original PR description
Purpose ======= Allow specifying a schedule date per media, like we did for the message, images, first comment, etc. In the calendar view, we show the post from the smallest date to the latest date. When moving card in the calendar view, we try to keep the same hour of the day of all scheduled date share the same day (most of the time, we will schedule different hour of the day for different media, and changing the day from the calendar view is convenient). Now the CRON is triggered when adding the post in the queue instead of for every scheduled dates update. We cannot schedule a post not in draft state. Improve the kanban cart of the social.media Improve the kanban view of the `social.live.post` to make it look like the `social.stream.post`. Like we have for `social.stream.post`, use the number of likes, the numbers of comments and the number of shares instead of aggregating everything into "engagement". Task-6323897
When an employee leaves, Belgian payroll now automatically prepares the required departure documents at the right point in the payroll process. HR teams also get easier access to these documents from the employee profile, reducing missed paperwork and manual follow-up.
Original PR description
Context: Terminating an employee doesn't generate any document anymore. Termination payslip and holiday attest used to be generated in the end of collaboration wizard, but this was removed. This commit generate the termination documents (termination payslip, holiday attests, 13th month payslip, employment certificate): - As soon as the last monthly payslip for an employee is created within a payrun - Or when the last orphan payslip is validated for that employee A flag on the departure prevents regenerating them a second time when that payslip is later validated. It also add a dropdown to the employee profile when a departure is registered, regrouping all the termination documents that can be generated for that employee. The employment certificate can also now be generated anytime under the cog menu, before it was only possible to do it if the employee was on end of collaboration. task-6482307
The barcode app now uses a more consistent scanning and manual entry experience across its screens, reducing confusion for warehouse users. Barcode Lookup product creation is also available from every scanner view, with added support for expiry-date handling when relevant.
Original PR description
Before the barcode app had inconsistent barcode scanning flows, sometimes a dialog was opened, sometimes you had to click on the 'gear' icon to input the code manually. Now it has been unified to follow the same flow. Moreover, capability to create a new product with Barcode Lookup is added to all barcode scanners to provide consistency. task-4170451
Belgian payroll now supports tax and social contribution reductions for first hires in DMFA reporting. This helps businesses apply the correct employment incentives more reliably and avoid reporting issues, including a safeguard against crashes when configuration values are missing.
Original PR description
Implement reductions for first hires in belgium DMFA. Task-5476927
Users now receive a clear warning when trying to delete a worksheet template that is already used by worksheets. This helps prevent accidental deletion of related worksheets and reduces the risk of unintended data loss.
Original PR description
Deleting a worksheet template deletes all worksheets using it, which was not explicitly mentioned prior to this commit. Hence, we display a warning when the user wants to delete a worksheet template, if it is used anywhere preventing them to delete unintentionally all their worksheets. task-6417105
The accounting review menu has been reorganized so users can find asset, loan, purchase, and sales review items in more appropriate places. The change also improves how accrued order review workflows connect with the updated wizard, supporting a smoother finance review process.
Original PR description
This commit cleans up the review menu by moving items to their appropriate space, it also sets up the logic to properly interact with the improved `account.accrued.orders.wizard`. task-6484921
VoIP users can now choose separate audio outputs for incoming call ringtones and active call audio, making headset and speaker setups easier to manage. The in-call menu also keeps key settings available during calls, including device selection, Do Not Disturb, and access to phone numbers.
Original PR description
task-6533808
Frontdesk visitor records now allow only one host, matching the kiosk experience where visitors can select a single person to meet. This keeps front desk, SMS, and WhatsApp workflows consistent and reduces confusion from assigning multiple hosts in the back office.
Original PR description
Given that from the kiosk front end a visitor could select only 1 host at a time, It doesnt make sense to allow relating multiple hosts from the back end. This commit changes the `host_ids` field on `frontdesk.visitor` from a many2many field to a many2one field `host_id`. task-6514675
Appointment scheduling checks are reinforced so private calendar events are counted when determining whether someone is unavailable for a booking. This helps prevent appointments from being offered when a team member already has a private commitment.
Original PR description
Make sure that private events are correctly taken into account when computing the unavailable partners for bookings. Task-6237805
The timesheet KPI header now uses less width when the leaderboard is hidden. This improves the visual fit of the page with the updated Frost design and helps avoid an overly wide header.
Original PR description
In this commit, we reduce the width of the kpi header if the leaderboard is not displayed. Due to the new frost design, the header was too wide and did not render well. task-6530653
Stacked list columns now align like regular numeric columns when their leading value is a number or amount. This makes list views easier to scan and keeps totals and grouped values visually consistent.
Original PR description
Columns declared with the `column` tag stack several fields in a single cell, but were always left-aligned, unlike plain numeric field columns. Such a column now takes the alignment of its first sub-field, since that is the one heading the cell: header label, data cells and group/footer aggregates are right-aligned when that field is a float, an integer or a monetary. opw-6533733
The view switcher now animates the selected highlight smoothly between buttons instead of jumping instantly. This makes switching between views feel more polished and visually clear for users.
Original PR description
Switching view moved the highlight of the switcher from one button to another in one jump. Paint it once, on the group, as a single layer travelling from the button being left to the one being activated. Switching view rebuilds the whole control panel, so the switcher that has to run the move is created only once the button it comes from is gone. That index is put on the document for the time of the switch, and '@starting-style' turns it into the first position the indicator renders at, which leaves the move itself to a plain CSS transition. The indicator is laid out as one button of the group, so at rest it covers exactly the background '.btn' used to paint - which it now leaves to the group. The group carries '--btn-active-bg' for that, the buttons still inherit it, and dark mode keeps overriding the one value. Code made by Claude Supervised by RFR
Odoo’s AI capabilities are now delivered through the Odoo AI in-app purchase service, with model selection managed centrally by Odoo. This makes AI features easier to maintain, allows model upgrades without user-side changes, and supports switching models during an AI session.
Original PR description
The AI features of Odoo are now provided through a new "Odoo AI" IAP service. - Provider/model selection is now handled on the IAP server side. The LLM model used will depend on the feature for which it is used. It can now be updated more easily when new models are released or older models are deprecated. - A generic format for messages has been introduced. Since we don't know in advance which LLM model will be used, it is necessary to store them in a provider agnostic format (see `ai/utils/types.py` for a description). Thanks to this, it is now possible to switch models during a session. task-[6334145](https://www.odoo.com/odoo/project/19060/tasks/6334145)
VoIP call forms and completed call activity messages now present key information more clearly, including summaries, status, date, duration, transcripts, and feedback. This helps users review calls faster while keeping sensitive cost information limited to administrators.
Original PR description
see commit messages Task-6512169
The Belgian payroll module now provides clearer explanations for employment bonus A and B directly in the payslip line tooltip. This helps payroll users better understand how these bonus lines are presented without changing payroll calculations.
Original PR description
1 - The explanation of the employement bonus A and B is improved
1.1 - (it is in payslip line's tooltip, next to the salary rule)
task-6448501This update makes it easier for businesses with multiple companies or branches to move, buy, sell, and value goods across company boundaries. It improves warehouse resupply routes, sales and purchase delivery options, stock valuation for intercompany transfers, and reporting visibility for intercompany deliveries.
Original PR description
[WIP] --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The invoice batch sending wizard now opens much faster, reducing wait times for large batches from minutes to seconds. Users can also review sent invoice details more easily, and the electronic invoicing banner now appears only when relevant.
Original PR description
[IMP] account: Enhance Send Batch Wizard - Previously, the Send Batch Wizard could take too long to appear due to doing too much unnecessary work. Benchmark results for 4,000 moves improved from 2 minutes to 7 seconds. - Added a dropdown menu to view the details of the sent invoices. - Fixed "Partner requested electronic invoices reception" banner was incorrectly displayed for non-default PEPPOL countries. task-6275573
The Bangladesh localization updates its taxes and chart of accounts to align with Finance Act 2026 requirements. Businesses get clearer statutory tax categories, better account rollups for reporting, and updated company accounting defaults while obsolete tax reporting setup is removed.
Original PR description
This commit replaces the percentage-based tax structure and the flat chart of accounts with the ones required by the Finance Act 2026, and removes the outdated tax report. Before: the 16 tax…
This commit replaces the percentage-based tax structure and the flat chart of accounts with the ones required by the Finance Act 2026, and removes the outdated tax report. Before: the 16 tax templates were grouped by rate alone (`VAT at 2%`, `VAT at 4.5%`, ...), which says nothing about the law a tax is levied under. The chart had no hierarchy beyond `active=False` range accounts (`100100-100199`), so nothing rolled up and a section-wise Trial Balance was impossible. `tr_form` no longer matched the NBR reporting format. Now: taxes sit on the three statutory pillars, Value Added Tax (VAT and Supplementary Duty Act, 2012), Tax Deducted at Source (Withholding Tax Rules, 2026) and VAT Deducted at Source (VAT and Supplementary Duty Rules, 2016), with VDS and TDS flagged as withholding so they are held back until payment rather than deducted on the invoice. The chart is a real `parent_id` hierarchy, `1 Assets` -> `11 Current Assets` -> `111 Cash & Cash Equivalents` -> `111400 Bank Suspense Account`, so accounts roll up by section. `bank_account_code_prefix` moves to `1111` and `_get_account_parent_xmlid` nests the auto-created journal accounts under `111` instead of leaving them outside the tree. The company defaults follow the new chart: VAT 15% on sales and purchases, fiscal year ending 30 June, and the inventory, exchange difference, bank and deferred accounts. The obsolete tax report is dropped along with its fiscal positions, which mapped nothing once the rate-based taxes were gone. task-6219535 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Improves performance when opening point-of-sale registers for newly created companies in databases with very large accounting histories. The system now checks smaller company data first, avoiding slow scans of millions of accounting lines and making the experience much faster for users.
Original PR description
When you create a new company in a database that has a lot of existing account move lines and you attempt to open a PoS register from the list view, `_compute_company_has_template` checks…
When you create a new company in a database that has a lot of existing
account move lines and you attempt to open a PoS register from the list
view, `_compute_company_has_template` checks `_existing_accounting` for
the new company and wil run a sequential scan on the entire account_move_line
table followed by a nested loop as the query planner assumes AMLs company_ids
will be roughly evenly distributed.
This is not the case in a new company that has no/very few AMLs.
This is because the query ran is:
`SELECT COUNT(*) FROM
(SELECT FROM "account_move_line"
WHERE (
"account_move_line"."company_id" IN
(SELECT "res_company"."id" FROM
"res_company" WHERE
("res_company"."parent_path" LIKE '3/%')
))
LIMIT 1)`
and the values of company_id being searched for aren't known until the
subquery runs.
Running a query more like
`SELECT COUNT(*) FROM
account_move_line
WHERE company_id IN (%s)`
is much faster
Since res_company will always be a smaller table, we can do the inexpensive
search first and then pass in the values so Postgres can do a cheaper
search and return faster.
Benchmark time of `_existing_accounting`:
| Company 1 AML count | Company 2 AML count | Pre-fix | Post-fix | Multiplier |
|---|---|---|---|---|
| 10,000,000 | 0 | 700 Milliseconds | 500 Microseconds | 1,400x |
| 20,000,000 | 0 | 1.35 Seconds | 1 Millisecond | 1,350x |
| 20,000,000 | 20,000,000 | 2 Milliseconds |1.3 Milliseconds | 1.5x |
| 50,000,000 | 0 | 3.25 Seconds | 1 Millisecond | 3,250x |
| 100,000,000 | 0 | 5.3 Seconds | 1.3 Milliseconds | 4,075x |
Query Plan Before:
```
"Aggregate (cost=0.08..0.09 rows=1 width=8) (actual time=5573.001..5573.002 rows=1.00 loops=1)"
" Buffers: shared read=571435"
" -> Limit (cost=0.00..0.08 rows=1 width=0) (actual time=5572.995..5572.997 rows=0.00 loops=1)"
" Buffers: shared read=571435"
" -> Nested Loop (cost=0.00..https://github.com/odoo/odoo/commit/1571439c0c70c1f1dc3229421e696b97ce1678f8.33 rows=20000086 width=0) (actual time=5572.988..5572.989 rows=0.00 loops=1)"
" Join Filter: (account_move_line.company_id = res_company.id)"
" Buffers: shared read=571435"
" -> Seq Scan on account_move_line (cost=0.00..971432.72 rows=40000172 width=4) (actual time=0.432..1913.934 rows=40000000.00 loops=1)"
" Buffers: shared read=571431"
" -> Materialize (cost=0.00..4.03 rows=1 width=4) (actual time=0.000..0.000 rows=0.00 loops=40000000)"
" Storage: Memory Maximum Storage: 17kB"
" Buffers: shared read=4"
" -> Seq Scan on res_company (cost=0.00..4.03 rows=1 width=4) (actual time=0.785..0.785 rows=0.00 loops=1)"
" Filter: ((parent_path)::text ~~ '3/%'::text)"
" Rows Removed by Filter: 2"
" Buffers: shared read=4"
"Planning:"
" Buffers: shared hit=574 read=77"
"Planning Time: 15.323 ms"
"Execution Time: 5573.060 ms"
```
Query Plan After:
```
"Aggregate (cost=4.46..4.47 rows=1 width=8) (actual time=1.972..1.973 rows=1.00 loops=1)"
" Buffers: shared read=3"
" -> Limit (cost=0.44..4.46 rows=1 width=0) (actual time=1.967..1.968 rows=0.00 loops=1)"
" Buffers: shared read=3"
" -> Index Only Scan using account_move_line__company_id_index on account_move_line (cost=0.44..4.46 rows=1 width=0) (actual time=1.965..1.966 rows=0.00 loops=1)"
" Index Cond: (company_id = 3)"
" Heap Fetches: 0"
" Index Searches: 1"
" Buffers: shared read=3"
"Planning:"
" Buffers: shared hit=3"
"Planning Time: 0.219 ms"
"Execution Time: 1.998 ms"
```
opw-6513885
Forward-Port-Of: odoo/odoo#285096Point of sale receipts now always show the base amount for each tax group, matching the earlier receipt layout. This makes tax lines easier for customers and staff to understand, especially when several taxes use the same base amount.
Original PR description
Revert the receipt tax summary design back to the 19.0 format, ensuring that the base amount is always displayed for each tax group. Before this commit, when all tax groups shared the same tax base, the base amount was hidden, leading to a flat tax listing. Now, the template always renders the tax groups in the format: "Tax [Name] on [Base Amount] [Tax Amount]" task-id: 6296906 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283120 Forward-Port-Of: odoo/odoo#270749
Belgian payroll now treats employee versions as concurrent when their worker code and DIMONA category match, so payslips automatically include the right related versions. Payruns now select employees and create payslips for each relevant employee-version combination, reducing manual selection issues and duplicate warnings.
Original PR description
For Belgian payroll, employee versions are now considered concurrent if their DIMONA category and worker code match, instead of only contract dates. So that change the logic in the payslip for where…
For Belgian payroll, employee versions are now considered concurrent if their DIMONA category and worker code match, instead of only contract dates. So that change the logic in the payslip for where if you select specefic version, the payslip will also include the concurrent versions with the same worker code and DIMONA category. And if all the versions are concurrent in the payslip period, you will not have an option to select specific version and the payslip will automatically include all the concurrent versions. For Payrun: now selects employees instead of versions A payslip is generated for every employee-version combination within the payrun period If an employee has multiple versions in the payrun period, a payslip is created for each version The previous tests did not account for the newly added concurrency. In some tests, so that calculate all the concurrent versions in the same payslip and merging two versions into a single payslip hit the contract's wage limit. Since the total payment was capped regardless of the combined payslip amounts, those tests nothing now . To resolve this, I changed the version dates to ensure each version is tested separately. Additionally, I removed test_bik_first_payslip_unpaid. That specific scenario no longer exists now that the versions run concurrently. Task Id: 6126845
Appointment teams can now choose a specific email template to request customer feedback after a visit. This helps businesses collect service ratings in a controlled way, while leaving the setting empty by default to avoid unexpected emails for existing appointments.
Original PR description
Businesses often need to collect customer feedback after an appointment takes place to evaluate service quality and drive continuous improvement. Currently, Odoo only supports default templates for bookings and cancellations. This change links a specific mail template for post-visit feedback directly within the appointment type configuration. It is left empty by default to prevent breaking existing flows or sending unwanted emails during data migration. task-6268987
Belgian payroll now flags four additional issues before DMFA reporting, including mismatched location unit dates, incompatible remuneration codes, and payslips created before the company's first scheduled pay. These warnings help payroll teams catch compliance problems earlier and reduce the risk of incorrect social security declarations.
Original PR description
Adding 4 warnings on payroll dashboard and payslip model - Check if DMFA location unit cover the payslip date range - Check employers with code 317 don't have remuneration code 2 - Check that employers with 100% credit time don't have remuneration code 1 - Check that there is no payslips starting before company first scheduled pay Task: 6297320
The WhatsApp embedded signup onboarding is now included directly in the main WhatsApp module instead of a separate add-on. This simplifies maintenance and setup without changing the experience for existing users, since both parts were already installed together.
Original PR description
whatsapp_oauth is a separate module because the Embedded Signup onboarding had to ship in stable, where whatsapp itself cannot be touched. In master that constraint is gone, so it is folded back in. The module was auto installed and depended on whatsapp, so every database already had both. The code only moves, nothing changes for them. `WhatsAppOAuthApi` is folded into `WhatsAppApi` as well, which drops the `_api_requests` passthrough that only existed so a subclass could reach the name mangled request helper. The proxy endpoint parameter is renamed from `whatsapp_oauth.endpoint` to `whatsapp.proxy_endpoint`, it no longer names a module that exists. Task-6529850
Dutch SBR and ICP report submissions now go through Odoo's proxy service instead of connecting directly to Digipoort. This simplifies the submission process and lets businesses use either their own certificate or Odoo's shared group certificate.
Original PR description
*: l10n_nl_reports_sbr{,_icp,_status_info}
---
Description of the issue this commit addresses:
Dutch SBR and ICP reports still send directly to Digipoort with duplicated SOAP/signature code and no shared group-certificate flow.
---
Desired behavior after this commit is merged:
This commit routes both reports through IAP proxy signing/sending, and lets users submit with either a personal certificate or Odoo's group one.
---
IAP PR: https://github.com/odoo/iap-apps/pull/1593
Upgrade PR: https://github.com/odoo/upgrade/pull/11237
task-3439634
Forward-Port-Of: odoo/enterprise#117617Asset records now show the related bill lines more accurately when non-deductible taxes are involved. This prevents tax amounts from being hidden or incorrectly combined when several assets are created from the same vendor bill.
Original PR description
Previously, tax lines lacked a direct link to their parent base line, causing non-deductible taxes to be omitted from the asset's "Bills" tab and merged across multiple assets on the same bill. In this commit - `asset_base_line_id` is added to track the parent base line for asset generating accounts - overrides for `_prepare_base_line_tax_repartition_grouping_key` and `_prepare_tax_line_repartition_grouping_key` are added to force the tax engine to generate distinct tax lines per asset base line - `display_move_line_ids` is introduced to safely display both the base and tax lines in the "Bills" UI Task-6283724
Delivery operations can now include the Consignment Note (CMR) in their automatic print options when a delivery is validated. This also applies to point-of-sale deliveries, helping teams produce required transport paperwork with less manual effort.
Original PR description
Add the `Consignment Note (CMR)` report to the `Print on Validation` options for delivery-type operations, allowing users to automatically print the CMR report when validating a delivery. Apply the same behavior to POS deliveries. Enterprise PR: odoo/enterprise#128943 TaskId-6413050
The user interface icon library has been updated with additional icons for VoIP log types. This helps make VoIP activity logs clearer and easier to recognize in the application.
Original PR description
This commit adds new icons to the Material Symbols library to be used for log types in the voip module. task-5864994 Requires: - https://github.com/odoo/enterprise/pull/128919 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The point-of-sale hamburger menu now opens as a dialog instead of a dropdown, making buttons larger and easier to tap. This improves day-to-day usability on touchscreen devices across standard POS, employee POS, restaurant, and self-order flows.
Original PR description
*pos_hr, pos_restaurant, pos_self_order In this PR we've changed the layout of the hamburger menu buttons so they're more easily clickable on devices. We've switched the dropdown menu with a dialog. task-6253998 Enterprise https://github.com/odoo/enterprise/pull/118961 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Bank statements can now be created in draft and explicitly posted when ready, giving accounting teams more control before finalization. The update also protects journals that require secure sequencing by preventing incompatible draft statements or journal type changes once hashed statements exist.
Original PR description
- Add `is_statement_posted` field: Introduced to support a "draft" state when creating a statement directly from the form view. - Add Post/Draft Actions: Added `action_post` and `action_draft` for statements. Resetting to draft (`action_draft`) will also trigger move hashing if required. task-5170039 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Italian electronic invoicing form now narrows the document type list based on the kind of accounting document being created. This makes it easier for users to choose the correct option quickly and reduces confusion during invoice entry.
Original PR description
In IT account move form view, add a filter on the document type field to display only possible document type for the move type. This should help users to find the right type faster and reduce confusion Task [link](https://www.odoo.com/odoo/project.task/6152691) task-6152691
Belgian payroll declarations are now tied directly to the payslips they report, making it easier to identify which payroll records need review when corrections are required. The reporting process also avoids reprocessing already reported payslips and uses a more reliable way to detect when corrections are needed.
Original PR description
- change the dmfa linking to be with its related payslips instead of employees which makes it easier in case of correction to track which payslips need checking - generalize dmfa correction to include web reports as well - only payslips that haven't been reported will be fetched instead of regenerating the report with all the month's payslips - the mechanism to detect the need of a correction is now more robust using a boolean that gets updated when a payslip is moved to done instead of the dates comparison previously used task-6326405
The point-of-sale hamburger menu buttons have been updated to match the newer modal layout. This creates a more consistent cashier experience across enterprise POS, IoT, and country-specific POS flows.
Original PR description
Following a change of layout for the hamburger menu buttons we've adapted these buttons to fit with the rest of the buttons in the modal. task-6253998 Community https://github.com/odoo/odoo/pull/267462
Payroll settings for Belgian localization now follow the company selected by the user. When switching companies from the payroll settings screen, users are redirected to the selected company’s settings list, reducing confusion and the risk of editing the wrong company’s configuration.
Original PR description
Currently, on Payroll config settings list and form view when we switch the company, We're still on the initially selected compan settings version. This behavior could lead to confusion and users have chance editing field that not belong to the company they switched. This PR expected If the user changes company while on the payroll setting version form or list view, they should be redirected to the newly selected company's setting version list view. How to access the view - Settings -> Payroll -> Configure (Belgian Localization section) task-6478413
This update refines the VoIP softphone experience with clearer icons, better button feedback, improved dropdown behavior, and more consistent spacing and alerts. These changes help users better understand call actions, settings, and activity context while reducing small visual issues that could cause confusion.
Original PR description
*: voip_hr_recruitment, voip_sale_subscription ### Update UI icons This PR updates several UI icons to improve consistency across actions and activity, while making them more relevant and easier to…
*: voip_hr_recruitment, voip_sale_subscription ### Update UI icons This PR updates several UI icons to improve consistency across actions and activity, while making them more relevant and easier to understand. ### Add active state to action buttons Prior to this PR, action buttons that opened dropdowns had no active state, which could lead to confusion as users might not know which button had opened the dropdown. This PR fixes the issue by adding a proper active state whenever a dropdown is open. ### Adapt top info message layout in softphone This PR revises the layout of the info message displayed at the top of the softphone to make it more consistent with other info alerts. ### Show correctly softphone navbar border Prior to this PR, the top border of the softphone navbar could disappear when scrolling. This PR ensures that the navbar border remains visible at all times. ### Review user settings dropdown items Prior to this PR, the "Do not disturb" dropdown items used custom utility classes that broke the hover state. This PR ensures that the dropdown correctly uses the standard dropdown item component. ### Add tooltip to many2one_reference_icon_field This PR adds a tooltip displaying the activity's "display_name" when hovering the `many2one_reference_icon_field` icon, helping users understand what the icon represents. ### Update o-voip-InCallView-pad spacing The current spacing in `o-voip-InCallView-pad` was initially designed to accommodate two additional action buttons that have not yet been implemented. For now, this creates an inconsistent spacing that can give the impression of a bug. This PR updates the spacing to better align with the action buttons currently available. task-5864994 --- 💡 _Preview screenshots are available in the task pad._ --- Requires: - https://github.com/odoo/odoo/pull/285621
Belgian payroll now includes certain unpaid but legally assimilated absences when calculating holiday pay tax provisions. When an employee leaves, the accrued yearly provision is cleared on the final payslip, improving payroll accuracy and preventing unreleased balances.
Original PR description
Before this commit, the holiday pay tax provision kept accruing every month but was never released, and it ignored the time off that is assimilated for the double holiday pay when it was not paid on the payslip. After this commit, the monthly provision base also covers assimilated but unpaid days (legal leave, public holidays, sickness, strike) so it keeps growing on those absences. On the employee last payslip the whole provision accrued during the year is emptied in a single negative line. taskid-6416109
Shop Floor users can now edit existing work instructions without starting from a blank editor, making small updates faster and less error-prone. The document viewer also works correctly for attached instructions, and newly captured pictures are added consistently to the instruction text without replacing worksheet documents.
Original PR description
[IMP] mrp_workorder: pre-fill the instruction when updating a step In the Shop Floor, "Update Instructions" opened the editor empty. A user making a small adjustment had to retype the whole…
[IMP] mrp_workorder: pre-fill the instruction when updating a step
In the Shop Floor, "Update Instructions" opened the editor empty.
A user making a small adjustment had to retype the whole instruction
again from scratch, without seeing what they were replacing.
The wizard is now pre-filled with the step's current instruction.
task-6459280
---
[FIX] mrp_workorder: fix the document viewer on Shop Floor
Opening the instructions of a step holding a document raised
"this.props.value.startsWith is not a function" and left the dialog empty.
Since https://github.com/odoo/odoo/commit/23a7d8cc5b1d2f38eaee35a4f6729fe128c1b62b , reading a
binary field over rpc no longer returns a base64 string but a dictionary
holding its content, name and size.
Adapt to read the content out of that dictionary.
---
[IMP] mrp_workorder{,_plm}: append new picture to the instruction
"Set a New Picture" wrote the picture to worksheet_document, the step's
document attachment, and stripped the inline images out of the note.
But that field is presented as a PDF worksheet everywhere else.
mrp_workorder_plm did the opposite on the ECO's BoM step: it added the
picture to the note and cleared the attachment. The same action led to
inconsistent results.
The picture is now appended at the end of the instruction, on the work
order step and on the ECO, and the worksheet_document is left untouched.
task-6459280Payroll-related fields on time types are now updated automatically when payroll data changes. This keeps absence and work-entry configurations consistent across multiple local payroll packages, reducing manual upkeep and payroll setup errors.
Original PR description
…roll data update Task: 6410286
Bank statement handling is improved so users can choose relevant reconciliation models directly during the reconciliation and posting flow. This makes cash and bank journal processing more guided, while ensuring required hashing and reconciliation steps happen at the right time.
Original PR description
[IMP] account_accountant: improve statement flow and reconciliation models This commit improves the bank statement lifecycle, reconciliation model selection, and journal hashing behavior: -Allow…
[IMP] account_accountant: improve statement flow and reconciliation models This commit improves the bank statement lifecycle, reconciliation model selection, and journal hashing behavior: -Allow selecting from the top 5 reconciliation models (prioritizing journal-specific models, then falling back to global ones) directly in the bank reconciliation widget. Selecting a model triggers it on creation. - Hashing: If a statement is created in a hashed journal, force the reconciliation of the remaining unreconciled entries and hash the moves. - Statements accessed from the base view now start in "draft" state (including their lines). Users can select a reconciliation model to apply upon posting. Hashing is also deferred to the posting step. - Adjust the `from_bank_reco` context key to ensure it is passed correctly, resolving an issue introduced by the removal of `onWillRender` task-5170039 [IMP] l10n_be_reports: Adding reco models for cash journals When creating a cash journal, we will first create new reco models. If the reco models already exist then we will just add the new journal to the match_journal_ids. task-5170039
Belgian payroll now requires companies to provide insurance details when they have employees and holiday pay fund details when they have workers. This helps ensure payslips and individual accounts include legally required information and warns businesses when required payroll company data is missing.
Original PR description
Purpose: Comply with Belgian regulation regarding holiday pay fund and insurance information that must be present on payslips and individual accounts. Implementation: - Insurance information is mandatory as soon as there are employees. Hence, enforced on the frontend. - Holiday pay fund is mandatory only when there are workers (see is_worker()). Hence, enforced on the frontend. - Modify existing warning for payroll company data to also track holiday pay fund & insurance fields. task: 6512348
Belgian payroll declarations now calculate research and development time more accurately across additional payslip types, including double holiday pay, 13th month, and termination payments. This helps ensure payroll reporting reflects the correct eligible R&D percentage for each employee period.
Original PR description
now we support more payslip structures in 274.XX ex: (DHP, 13Months, termination) we need to compute rd_percentage correctly this commit adds a method to compute the correct value, based on related employee versions. Task#6394245
Belgian payroll now rounds train travel distances down to the nearest available reimbursement bracket. This helps ensure reimbursements remain favorable to employees when exact travel brackets are not present in the train table.
Original PR description
In order to keep the train reimbursement in favor of the employees, all the train travel brackets have been floored to the nearest threshold available in the train table. Task: 6485650
VoIP administrators can now submit a request when no suitable phone numbers are immediately available. The system tracks these advanced orders over time and automatically creates or assigns the number once the provider fulfills the request, reducing manual follow-up and improving number availability.
Original PR description
```mermaid
sequenceDiagram
actor Admin
participant E as Enterprise VoIP
participant I as IAP Phone Service
participant T as Telnyx
Admin->>E: Search available numbers
E->>I: Search request
I->>T: Search inventory
T-->>Admin: No numbers
Admin->>E: Ask us / Submit Request
E->>I: Create advanced order + request UUID
I->>T: POST /advanced_orders
I-->>E: Accepted, no charge
Note over I,T: May remain pending for days
T-->>I: advanced_order.status_update = ordered
I->>T: Read generated standard Number Orders
I->>T: Fetch current monthly price
I->>I: Adopt standard orders + reserve billing
I->>T: Resolve/configure actual phone resources
I-->>E: Signed normal phone-number status events
E->>E: Create/reuse DID and assign requester
```
[Task-6529404](https://www.odoo.com/odoo/project.task/6529404)
IAP: https://github.com/odoo/iap-apps/pull/1842Self-order table sessions now pass the right order identifier through the preparation display flow. This helps keep QR-code-based table orders linked to the correct session, supporting a smoother restaurant ordering experience.
Original PR description
Add order_uuid parameters into pos_self_order_preparation_display controllers task-4934385 see https://github.com/odoo/odoo/pull/222152
Restaurants can now create a one-time QR code when seating guests, print it on a ticket, and let customers use it to access the self-ordering menu for that visit. The code is invalidated after payment, reducing reuse risk and supporting more controlled table-based self-ordering workflows.
Original PR description
To support common self-ordering workflows, restaurants require dynamic, single-use QR codes generated per visit rather than static QR codes per table. Specification: - Allow staff to generate a dynamic QR code when seating a customer in the POS. - Extend POS receipt functionality to print the dynamic QR code on a physical ticket. - Enable customers to scan the ticket to access the self-ordering menu for their session. - Add validation to ensure the QR code is immediately invalidated and cannot be reused once the payment is validated. task-4934385