Friday, August 28, 2026
35 changes · master
Enhancements to existing features
Odoo now handles very large groups of records more efficiently by deciding when to reduce automatic preloading based on the original list size. This should lower unnecessary database work and improve performance in areas that process many records, such as accounting, mail, point of sale, exports, website, and attachments.
Original PR description
The previous approach was splicing the recordset in the __iter__ into batches of record with prefetch_ids equal in size to PREFETCH_MAX. This resulted in the iterator not being able to differentiate…
The previous approach was splicing the recordset in the __iter__ into batches of record with prefetch_ids equal in size to PREFETCH_MAX. This resulted in the iterator not being able to differentiate whether it comes from a large recordset or not. Which made the caching method to be used for this recordset not known as we dont have enough information on the recordset when it reaches the fetch. This made way for a lot of ad hoc fixes to detect earlier when the recordset is big enough to disable the prefetching. Currently, the slicing is removed so checking on the size of the original recordset can be done directly with getting the size of the prefetch_ids. This means that we can disable the prefetching for large recordsets on the fly without needing to change the context on a specific recordset. This also allows us to have a smaller callstack and lower number of queries per recordset. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The employee Overtime button now opens a pivot table instead of a collapsed list, making overtime information visible immediately. This helps payroll and HR users review overtime by type and month without manually expanding grouped records.
Original PR description
The employee's "Overtime" smart button opened an hr.leave list view grouped (collapsed) by year then type, so nothing was visible until every group was manually expanded. This commit replaces it with a Pivot view (work entry type rows, month columns, duration in hours as measure) and swaps the old group-by search defaults for the search view's existing "this year" filter default, so the button actually shows data on open. Task 6498778
This update improves how large sets of records are handled during German DATEV CSV exports. It helps reduce unnecessary system load, making large exports more efficient and reliable for businesses processing significant accounting data.
Spreadsheet pivots now prevent users from inserting configurations that rely on unsupported relation fields with non-numeric IDs. This avoids broken pivot tables and guides users with clearer disabled controls and tooltips.
Original PR description
Prevent inserting a pivot into a spreadsheet when it contains groupbys on relations whose IDs are not numeric (e.g. account.root uses string IDs), as the pivot table engine does not support them. The insert button is now disabled with an appropriate tooltip, and the layout configurator filters out blacklisted relations from the dimension field selector. Task: 6023622
Priority fields in list views now show only the selected stars by default, reducing visual clutter for records with low or no priority. Users can still see the full priority scale by hovering over the field, keeping the interface cleaner without removing context.
Original PR description
Before this change, priorities in list views always displayed all stars, including empty ones. Records with low or no priority showed multiple empty stars, creating unnecessary visual clutter. After this change, only filled stars are displayed by default. Records with no priority show a single empty star, and hovering over the priority field reveals the complete set of stars. task-6365816 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves how company configuration is shared across branch structures in Odoo. It helps businesses keep related branches aligned with common settings, reducing duplicate setup and making administration more consistent.
Original PR description
task-6341281 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
Accounting dashboard KPI cards now display at consistent sizes on tablet and desktop screens. This makes the dashboard easier to read and prevents cards from stretching awkwardly when the layout wraps.
Original PR description
Currently, the KPIs wrap around for tablets and don't render correctly This commit makes them render with the same size. It also stops cards from growing when they wrap on desktop screens. No task ID
The mail test helper now re-checks pending conditions every 500 milliseconds instead of waiting until a long timeout when certain screen changes are not detected. This reduces avoidable waiting in the mail test suite and helps developers get faster validation without changing customer-facing behavior.
Original PR description
Before this commit, a contains that does not match right away runs again only when its MutationObserver fires, and once more at the 10 seconds timeout. The problem is that the observer reports neither a text node updated in place nor an input value or checked property, so a check waiting for one of those sleeps 10 seconds and then passes: "Delete starred message decrements starred counter once" spends 10.2s of the 183s @mail suite waiting for a counter to go from "Starred3" to "Starred2". This commit turns that single timeout into a 500ms tick up to the same deadline, so that such a check costs 500ms. The tick uses the unmocked timer to stay out of the timer graph a test drives with runAllTimers, and only 32 of the suite's 4239 contains calls stay pending long enough to tick once. Forward-Port-Of: odoo/odoo#285129 Forward-Port-Of: odoo/odoo#284944
Belgian payroll settings can now be shared more consistently across company branches. This reduces duplicate setup work and helps keep payroll configuration aligned for businesses operating with multiple branches.
Original PR description
task-6341281
Employees who join after the BPJS Kesehatan billing cut-off will no longer have that contribution taken from their first payslip. The missed amount is tracked as arrears so it can be included in a later payslip, improving payroll fairness and accuracy.
Original PR description
Employees who join after the BPJS Kesehatan billing cut-off should not be charged on their first payslip. Any missed contribution is carried forward as arrears and can be included on the following payslip. task-6002251
The payroll dashboard now shows warning cards much faster by reusing the last known browser-saved state while updated checks run in the background. It also fixes a crash that could happen after dismissing all warnings when upcoming pay run dates were displayed.
Original PR description
Payroll warnings on the dashboard were loaded one by one, blocking the page until every warning finished computing and giving a poor first-load experience. Warnings now render instantly from the…
Payroll warnings on the dashboard were loaded one by one, blocking the page until every warning finished computing and giving a poor first-load experience. Warnings now render instantly from the browser's local store of the last known state, while the real computation still runs per warning in the background: - On a fresh browser, warnings load progressively as before, and get stored locally once computed. - On a later visit, stored warnings appear instantly with a spinner while they recompute in the background. - Once recomputed, a card updates in place, fades out if no longer valid, or fades in at the correct date if newly valid. Bug fix:- Steps to reproduce:- 1. Set schedule on payroll dashboard. 2. Dismiss every warning. 3. On dismissing last warning throws a traceback. Root cause:- `DashboardEmptyScreen` passed the raw closing_date value straight from the RPC response into formatDateLabel, which calls date.diff(...) assuming a Luxon DateTime. The RPC layer serializes it as a plain ISO string, so formatDateLabel crashed with "date.diff is not a function" any time the empty-dashboard screen rendered with upcoming pay runs. Fix:- added new method `formatClosingDate` to format `closingDate` seperately. task-[6240120](https://www.odoo.com/odoo/project/1251/tasks/6240120)
Assistant Rules screens for timesheets have been redesigned to make them easier to read, search, and manage. The update improves consistency across list, kanban, form, and search views, with supporting cleanup that should make the feature more reliable and maintainable.
Original PR description
This PR overhauls the list, kanban, form and search views of the Assistant Rules for clarity and consistency, along with a few related fixes and cleanups on the `aw.rule` model. Task-6116508
New project document folders now automatically inherit the available actions configured on their parent folder, making setup easier across projects. Folder access is also aligned with project visibility, and internal project followers are synchronized as folder members when visibility changes.
Original PR description
- This commit makes the newly created project's document folder have the parent folder's available embedded actions enabled by default. It is done to easily enable actions for all the project folders. - The visibility of the project impacts the internal access of the related folder. Here is the mapping of the project's visibility with the document's rights: | Visibility | Internal Access | |--------|--------| | Invited Internal Users | None | | Invited Internal and Portal Users | None | | All Internal Users | Editor | | All Internal Users and Invited portal users | Editor | Also, when the project's visibility changes, the members of the related document folder are also synchronized with the project's internal followers users. Task-6025723
Turkish payroll has been updated to apply the 2026 SGK social security contribution rules, including new minimum and ceiling checks for the SSI contribution base. The change also simplifies how employee and employer contributions are calculated and lets companies apply the relevant employer incentive reduction.
Original PR description
Update Turkish payroll localization to reflect 2026 SGK regulatory parameters and restructure SSI contribution rules: - Consolidate employee SSI contribution (Disability 9%, Health 5%, Short-Term 0%, Unemployment 1%) under a single salary rule (SSIEDED). - Consolidate employer SSI contribution (Disability 12%, Health 7.5%, Short-Term 2.25%, Unemployment 2%) under a single salary rule (SSICDED). - Remove obsolete standalone unemployment salary rules (SSIDED and SSIUCDED) and their related rule parameter. - Add SSI base amount minimum and update the SSI base ceiling rule parameters, and clamp the SSI contribution base between them. - Add l10n_tr_incentive_tier field on res.company and res.config.settings (0, 2, or 5 points) to deduct incentive points from the employer SSI contribution rate. **task-6397284**
Belgian payroll now better supports economic unemployment compensation, including specific handling for CP302 and clearer separation for CP200 employees. This helps payroll teams apply the right compensation rules and receive a reminder when required inputs are missing.
Original PR description
This commit adds the rules to support economic unemployment for CP302 and updates the existing setup. Key changes: * Add the 'ECONOMIC_UNEMPLOYMENT_BASE' category to better group economic and temporary unemployment rules. * Split the EUC rule into two separate rules: - 'EUC_CP200': For CP200 employees (uses a property input). - 'EUC': For all other joint committees. * Add a warning for 'EUC_CP200' to remind the user to set the input, which defaults to 0.0. * Rename the 'EUB' and 'EUT' rules to fit the new changes, and include the necessary upgrade script. * Add tests for the new rules and calculations. Task #6365138
Two Belgian payroll rules now use the correct employer detail category for social security reporting. This helps keep payroll declarations aligned with expected reporting structure without changing payroll calculation logic.
Original PR description
The following rules (code): - ONSSELDERLY - ONSSEMPLOYER_ARTIST_REDUCTION must have ONSSEMPLOYERDETAIL as a category. Updated the category_ids field of those rules to implement it. task: 6510619
Deleting accounts in the German reports module should now complete more quickly in cases with large amounts of related accounting data. The change adds supporting database indexes so the system can verify account usage more efficiently before deletion.
Original PR description
Without these indexes, the foreign key check when deleting an account can take a long time. Forward-Port-Of: odoo/enterprise#129403
Deleting an account now benefits from added database indexes in Accounting and Point of Sale. This reduces delays caused by background dependency checks, improving responsiveness for users managing account records.
Original PR description
Without these indexes, the foreign key check when deleting an account can take a long time. Forward-Port-Of: odoo/odoo#284780
Duration values are now formatted consistently across planning, Gantt, and grid views. This improves readability for users reviewing scheduled time and reduces inconsistencies in how time spans appear.
Original PR description
Replace formatFloatTime by formatDuration.
HR users can now see which employees and material resources are linked to a working schedule directly from smart buttons. When a schedule is shared across employees, the system warns users and offers to duplicate it for the current employee, reducing accidental changes that affect multiple people.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: . Add a smart button that list the employees linked to the working schedule . Add a smart button that list the material resources linked to the working schedule . Show a “Shared Across Employees” warning when navigating from the Employee model, with an option to duplicate and edit the record for the current employee, automatically linking the newly created record to that employee. task-6106525 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Turkish Nilvera e-invoice users no longer need a separate step to retrieve the official PDF once an invoice is accepted. The status sync now also fetches the PDF for successful invoices, handles additional successful commercial invoice statuses, and allows retrying sync when the status is unknown.
Original PR description
Getting the official Nilvera PDF on an invoice took three steps: wait for the status cron to run, wait for the invoice to be accepted by GİB, then click "Fetch Nilvera e-invoice PDF". The sync button…
Getting the official Nilvera PDF on an invoice took three steps: wait for the status cron to run, wait for the invoice to be accepted by GİB, then click "Fetch Nilvera e-invoice PDF". The sync button next to the Nilvera status only refreshed the status and stopped there, so the user had to come back to the invoice later for the document itself. Fetch the PDF right after the status refresh for the invoices that came back successful, and drop the now redundant button from the form view. Pending invoices are filtered out beforehand so they are not polled a second time by the PDF routine. A commercial invoice does not stay on 'succeed'. Once GİB accepts it and the recipient answers, the status is overwritten with 'commercial_approved' or 'commercial_answered_automatically', and both are terminal successes. Group the three in a constant and use it at every PDF gate. In the PDF routine those invoices previously matched none of the status branches, so they were dropped without being fetched, reported pending or reported failed. 'commercial_rejected' stays out: a rejection is not a success, and its PDF is already fetched by the rejection handler. Also show the sync button when the status is "Unknown": e-archive invoices stay unknown until GİB generates its report at 20:00 GMT+3, which is precisely when the user wants to poll again. The status cron already covers that status, the view was the odd one out. task-6434404 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Spreadsheet users can now create a new global filter directly from the related filters area in the side panel. When a field is selected, the filter editor opens with relevant fields already filled in, reducing manual setup and making spreadsheet filtering faster.
Original PR description
Task: 6079698
Website editors can now preview the AI live chat fallback button by hovering over the option before enabling it. This makes it easier to understand how the button will appear on the website and choose the right configuration with confidence.
Original PR description
Before this commit, there was no preview available of the ai livechat's fallback button. After this commit, a user will be able to hover over "Fallback Button" and see a preview of what the button would look like before enabling it. task-5248712
Belgian accounting tax data now marks additional 0% taxes with the non-deductible fiscal position where it was missing. This helps companies using Belgian localization apply tax treatment more consistently and reduces manual correction in accounting setup.
Original PR description
Adding non-deductible fiscal position to taxes that were missing it in the data. task-6389423 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284869 Forward-Port-Of: odoo/odoo#278020
Turkish e-Archive invoices can now identify e-commerce sales and include the required payment, website, shipment, and delivery details. This helps businesses comply with GiB requirements and prevents invoice export when mandatory e-commerce information is missing.
Original PR description
Purpose: Turkiye e-Archive regulations require invoices generated from e-commerce sales to include specific tracking and fulfillment information. Previously, the system did not distinguish between…
Purpose:
Turkiye e-Archive regulations require invoices generated from e-commerce sales
to include specific tracking and fulfillment information. Previously, the system
did not distinguish between standard sales and e-commerce sales, which is
required by GiB.
Modifications:
-Introduced stored computed field `l10n_tr_sales_type`('normal', 'website') on
'account.move', allowing users to control whether e-commerce nodes are included.
-Made `l10n_tr_sales_type` and `l10n_tr_gib_invoice_type` required when
`l10n_tr_nilvera_customer_status = 'earchive'`.
-Updated e-Archive XML generation to automatically inject required e-commerce
nodes when `l10n_tr_sales_type` is set to 'website'.
-Added validation checks to block export if required e-commerce details are missing.
Key additions for e-commerce sales include:
-Identifies the order as e-commerce sale and includes specific website domain.
-Adds payment details such as agent name, method used (e.g., Credit Card, Wire
Transfer, Payment Provider), and payment date.
-Includes logistics data like carrier/driver name, Tax ID (VKN/TCKN), and
shipment/delivery date.
Related Upgrade PR: https://github.com/odoo/upgrade/pull/10981
task-6236315The HR module now makes its clean number display component available for reuse in other Odoo editions. This helps Enterprise extend HR screens to show decimal values with custom unit labels, such as days, while keeping formatting consistent.
Original PR description
Export `FloatWithoutTrailingZeros` and `floatWithoutTrailingZeros` from the `hr` module so they can be imported and extended in Enterprise to support float fields with custom unit suffixes (e.g., "Days"). Task: 6222665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds checks to ensure payroll rule data files are kept up to date for several country localizations. It helps reduce payroll configuration inconsistencies and supports more reliable payslip processing in Bangladesh, Kuwait, Indonesia, Iraq, Oman, Romania, and Pakistan.
Original PR description
. Add check that the rules data files are updated on localizations . Add _get_data_files_to_update() method for bd, kw, id, iq, om, ro, pk localizations task-6456276
This update improves the website shop pickup experience by refining how warehouse pickup locations and exceptional closing information are shown. Customers should get clearer information when choosing where to collect an order, reducing confusion and support questions.
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
Holiday pay payslips now hide day-tracking details that are not useful in the salary computation view, making the screen easier for payroll users to read. Related time-off values are also clearly labeled in days, reducing confusion when reviewing Belgian payroll calculations.
Original PR description
This commit improves the user experience with the following changes: - Hide "Right to time off", "Time off already taken", and "Additional Vacation Taken" inputs from the "Salary Computation" tab on Holiday Pay N and N-1 payslips. - Set the display visibility rule for these fields to "Never". - Add a "Days" unit to the "Time off", "Right to time off", and "Additional Vacation Taken" rules. Task: 6222665
Notifications have been refreshed to be smaller, clearer, and easier to follow. A new progress bar shows when a notification will disappear, improving the user experience across several Odoo apps.
Original PR description
A big part of the notification behaviour that was in the notification service has been move to the component "Notification". With this comes also a visual cleaning of the notification. Smaller, more compact and with a progress bar that show when the notification will disappear. TASK-ID: 4334047
The Manufacturing Order Overview now includes subcontracted production details, making it easier for users to understand outsourced manufacturing steps alongside regular production information. This improves visibility for teams managing subcontracting through purchase and manufacturing workflows.
Original PR description
Handle subcontracted productions in MO Overview. task: 5225952 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update simplifies the data used by the Manufacturing Order Overview by removing an unnecessary currency field. It helps keep the report data cleaner and reduces the chance of redundant information being handled behind the scenes.
Original PR description
Remove 'currency_id' from dict task: 5225952
Manufacturing planning now supports scheduling work orders backwards from a required finish time, helping teams plan production around delivery or completion deadlines. If the calculated start time would be in the past, the system automatically switches to forward scheduling from the current time to keep plans realistic.
Original PR description
Implement backward scheduling Allow to schedule workorders 'backward': the last workorders in chain must finish at a specific datetime. However if any of the first workorders should have been started in the past scheduling is done 'forward' from now on task: 4504976 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
UPS shipping has been updated to use UPS's newer API by default because the older UPS connection is being retired. This helps keep shipping rates, labels, and related UPS services working after the legacy cutoff date, with module naming and data updated accordingly.
Original PR description
The UPS 'legacy' API will no longer be usable after 5/31/2024 So make UPS 'rest' API the default
Manufacturing order overviews now include a planning simulation that considers work center availability, similar to the existing bill of materials overview. This helps business users assess scheduling feasibility earlier without changing component availability assumptions.
Original PR description
Simulate planning in MO Overview task: 4455170 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr