Wednesday, September 16, 2026
66 changes · master
Enhancements to existing features
Spanish electronic invoicing now recognizes additional identity document types such as passports, residence certificates, and other official documents. This helps businesses report customer identities more accurately across Spanish EDI systems, with automatic selection of the most reliable available ID type.
Original PR description
Following the task that introduced configurable ID types, this commit adds the missing document types required for Spain: - 03 PASAPORTE - 04 DOCUMENTO OFICIAL DE IDENTIFICACIÓN EXPEDIDO POR EL PAIS O TERRITORIO DE RESIDENCIA - 05 CERTIFICADO DE RESIDENCIA - 06 OTRO DOCUMENTO PROBATORIO Validators are intentionally omitted for now. Documentation and a warning text tooltip have been prepared to guide users. For Spanish EDI systems the 'IDType' field will now compute based on a priority hierarchy. When multiple document types are available, the system will fallback and choose the most reliable option closest to zero (higher up in the priority mapping table). task-6171794 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 can now open a preview dialog that shows how selected theme colors affect common page elements. This makes it easier to judge visual impact while editing and reduces guesswork when adjusting a site's branding.
Original PR description
Steps to reproduce: - Open the website builder. - Go to Theme > Colors. - Change theme colors. - Try to evaluate the impact on UI elements. Before this commit, it was hard to understand how theme colors affected typical components while editing. After this commit, users can open a dedicated colors preview dialog (see image), and theme CSS updates are reloaded in both the page iframe and the preview iframe. task-5960098 <img width="1550" height="925" alt="image" src="https://github.com/user-attachments/assets/f80dca4f-5223-4f9f-acaf-cb9e03541cae" />
Field service shift updates now use clearer notification categories for assignments, reassignment, unassignment, rescheduling, and status changes. This helps employees receive notifications only when they are relevant to the shift status and company settings, reducing unnecessary alerts.
Original PR description
Improve shift notification tracking by using dedicated subtypes for status changes, assignment, re-assignment, unassignment, and rescheduling. Ensure notifications are only sent when relevant based on the shift state and company configuration. task-6377602
Turkish localization now lets users apply VAT withholding more easily by choosing a fiscal position for the relevant withholding ratio. This reduces manual tax changes on invoices and supports accurate withholding calculations for related e-invoicing flows.
Original PR description
Turkish VAT withholding (tevkifat) is applied at seven ratios, from 2/10 to 10/10. Before, the seven withholding taxes were not linked to the normal 20% VAT, so there was no simple way to switch an invoice to withholding. After, seven fiscal positions are added, one per ratio, plus a Domestic one. Each links the 20% VAT to its withholding group, so choosing a position and running "Update Taxes and Accounts" swaps the tax on the invoice lines. `account.tax` also gains a helper that returns the fraction a tax withholds (9/10 gives 0.9), used by the Nilvera modules. task-6368193 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now removes reliance on an outdated spreadsheet-writing library and uses the maintained reader for older Excel imports. This reduces maintenance risk while preserving the ability to import existing .xls files and newer .xlsx files through the appropriate tools.
Original PR description
(see commit message) task-2480034 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A small internal flag was added to the base module setup to prepare for possible future support for loading test data. This does not change day-to-day user workflows now, but it makes a later backport or rollout easier and safer.
Original PR description
Part of https://github.com/odoo/odoo/pull/284989 for 20.0 Introduce the new test data flag on ir.module.module in case we want to backport the feature in 20.0 later.
Project billing reports now use clearer, more specific categories for revenue and costs. This helps project managers distinguish services, subscriptions, materials, expenses, and purchase-order-related vendor bills more accurately when reviewing profitability.
Original PR description
The billing types of an analytic line name every revenue stream in the plural, although revenue is uncountable in English, and they lump together flows a project manager reads separately: expenses only ever appear as a cost, goods and subscriptions are both reported as "Other Revenues", and a vendor bill is reported the same way whether or not it comes from a purchase order. With this PR, the revenue types are renamed to the singular and the service ones are grouped under "Service Revenue (...)", expenses are split into a cost and a revenue type, "Other Revenues" is split into "Subscriptions", "Materials" and "Other Revenue", and vendor bills billed from a purchase order get a "Purchase Orders" type. The keys are renumbered so that grouping by billing type still lists the revenue types before the cost ones, the "Other" ones last. Task-6545004
Settings pages now include clearer spacing between the top control area and the settings form. This small visual adjustment improves readability and keeps the layout consistent across Odoo editions.
Original PR description
ENT: https://github.com/odoo/enterprise/pull/131451 task-6570898 | Before | After | |--------|--------| | <img width="1704" height="567" alt="Screenshot 2026-09-14 at 17 06 55" src="https://github.com/user-attachments/assets/8adfb0f8-97e3-4405-975f-2b3a198e35e5" /> | <img width="1706" height="547" alt="Screenshot 2026-09-15 at 15 51 45" src="https://github.com/user-attachments/assets/311569f0-d0f7-4e7b-ac21-754f4e3e9fff" /> |
Partner ledger reports now store opening balances at accounting lock dates instead of recalculating all historical entries each time. This should make partner ledger and related customer follow-up reports faster while still reflecting later reconciliation corrections accurately.
Original PR description
Snapshot the partner ledger's initial balance at lock dates to avoid recomputing historical move lines on every report rendering. The balance is split into an init_balance and a period_balance aggregated with a groupby, the summable part of the init_balance goes through a snapshotable subengine Reconciling a partner-less line with a line having a partner moves the amount onto it, even in a locked period, so that correction stays out of the snapshots and is recomputed live on top of them. task-6235268
Spreadsheet imports now rely on the maintained Excel handling already required by the system, instead of an older library that is no longer used for XLSX files. This keeps accounting import tests aligned with the current dependency setup and reduces outdated technical baggage without changing day-to-day user workflows.
Original PR description
xlrd is not used anymore for xlsx files. https://github.com/odoo/odoo/pull/286896
Turkish e-invoices now select one withholding reason at invoice level instead of requiring many tax-specific choices on each line. This reduces long tax dropdowns, prevents invalid mixed withholding ratios from being sent, and exports the reason in the correct Nilvera category.
Original PR description
A Turkish withholding invoice must carry a GİB reason code (601-627) that says why the tax is withheld. Before, this code was stored on the tax itself. The module therefore shipped one tax for every…
A Turkish withholding invoice must carry a GİB reason code (601-627) that says why the tax is withheld. Before, this code was stored on the tax itself. The module therefore shipped one tax for every (ratio, reason) pair: 138 withholding taxes in each line's dropdown. The code was also asked per line and read from the fiscal position, which only reaches the lines after "Update Taxes and Accounts", so the form asked for a reason before the matching tax was on the invoice. After, the invoice type and the list of reasons are taken from the taxes on the lines. The reason is a single field on the invoice, limited to the codes for the ratio the lines withhold, kept while it fits and cleared when the ratio changes. A missing code can be created from the field, and an invoice mixing ratios cannot be sent. On export the reason is written under the 9015 withholding category, not the 0015 exemption one. `l10n_tr_nilvera_edispatch` changes only because its tests reuse the invoice fixture from `l10n_tr_nilvera_einvoice`, which built a wrong tax; the two reference files are regenerated. task-6368193
The contact smart button for Signature Requests now opens a complete list of all related requests, including those still awaiting signature. This removes confusion where the displayed count did not match the documents shown and makes requests easier to review.
Original PR description
The Signature Requests smart button on a contact opened a kanban view filtered to signed documents, while the number displayed on the button also included requests awaiting a signature. Users could therefore see fewer documents than the number displayed on the button, with no indication that a filter was applied. Open the requests in a list view without any filter, so that all requests counted by the smart button are displayed and easier to scan. task-6575586
Users can now download a version of an in-progress signing request that includes signatures and entered information already completed by other signers. The original document remains available, while the signing page continues to show only the original, making it easier to track progress without disrupting the signing flow.
Original PR description
Downloading from a sign request in progress always returned the original template document, even when some signers had already signed it. The request now serves its working copies, which already carry the values of the completed signers as incremental updates, under a "Partially signed" section of the download menu. The original documents stay available next to it, and the signing view still offers the original only. task-6469337
Changing a worksheet on a field service shift now automatically saves the shift first. This prevents users from entering information into outdated worksheet fields and helps avoid accidental overwrites or incorrect configurations.
Original PR description
Previously, when we changed the worksheet, the worksheet fields were not being changed because it required a save to update. So there were times when a user entered some data, and it updated the previous one and completely ruined their configuration. Now, when the user changes the worksheet field, the shift is automatically saved, so the user will always get only the updated fields. Task-6559528
Planning now better supports cases where an employee asks to be replaced by allowing the replacement flow to switch to that user. Button text, confirmation messages, access rules, reporting, and tests were updated to make shift switching clearer and more reliable for staff and managers.
Original PR description
Allow the adapter to switch to the user who only wants to be replaced. Change the button wording and popups of the switching scenarios --- task-5979777
Project managers can now see revenue from subscription orders under a dedicated "Subscriptions" billing type instead of mixed into "Other Revenues". This makes recurring revenue clearer in project analytic lines and improves reporting visibility.
Original PR description
Revenue invoiced on a subscription is reported as "Other Revenues", together with every other revenue that has no type of its own, so a project manager cannot tell recurring revenue apart in the analytic lines of a project. With this PR, an analytic line invoiced on a subscription order gets its own "Subscriptions" billing type. Task-6545004
The activity view now has softer cell gradients and slightly more padding after the web client redesign. This makes activity information easier to scan and gives the interface a cleaner, more polished appearance.
Original PR description
| Header | Header | |--------|--------| | <img width="264" height="77" alt="image" src="https://github.com/user-attachments/assets/95dd9535-c66a-420e-8e34-cd2a3a44c195" /> | <img width="262" height="80" alt="image" src="https://github.com/user-attachments/assets/2e62ad1a-afc1-4999-b4b1-f2b534597504" /> | This PR finetunes the cells of the activity view after the webclient redesign. It slightly reduces the strength of the gradient applied on the cells and adds a bit of padding. task-6577089 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Point of Sale snooze choices now use larger rectangular buttons instead of small radio buttons. This makes the options faster to scan and easier to tap or click, improving the day-to-day user experience for staff.
Original PR description
Replacing standard radio buttons with rectangular buttons. This makes the options quicker to scan and easier to click, enhancing the overall user experience. task-6564075
This update removes an obsolete internal option from expense receipt extraction and Stripe expense processing. It helps keep the expense workflow code simpler and easier to maintain without changing how users handle expenses.
Original PR description
Remove the check parameter as it is not used anywwhere anymore Related: https://github.com/odoo/odoo/pull/288256
The website shop carousel filter has been renamed from “Newest Products” to “Newest Arrivals” and now uses the same sorting logic as the shop page. This makes product presentation more consistent for website editors and shoppers, reducing confusion around which items are shown as new.
Original PR description
Currently, the `Newest Products` dynamic filter shows products that were recently created and published. This is inconsistent with the `Newest Arrivals` filter already used on the /shop page, which…
Currently, the `Newest Products` dynamic filter shows products that were recently created and published. This is inconsistent with the `Newest Arrivals` filter already used on the /shop page, which sorts products according to publish date. Steps to produce: --- - Install the website_sale module with demo data. - Navigate to Website and open the homepage in edit mode. - Add a Dynamic Snippet Carousel to the homepage. - Click on the newly added carousel. - In the right-side Edit panel, select the Dynamic Carousel settings. - Observe that the Current Filter is set to Newest Products by default. This PR aligns the dynamic filter with the /shop page behavior by: - Renaming the filter from `Newest Products` to `Newest Arrivals` (including its XML ID) for consistency. - Updating the underlying sort logic to match the /shop page's `Newest Arrivals` filter. - Updating the related tests accordingly. upgrade PR: https://github.com/odoo/upgrade/pull/10668 opw-6331212 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now routes Gevent worker web requests through the same internal HTTP server used elsewhere, while still relying on Gevent for connection handling. This reduces duplicate server logic and should make future maintenance more consistent without changing business workflows.
Original PR description
The Gevent worker (started in a subprocess by the PreforkServer) was still using the WSGI server of gevent, although we have our own server since [h11]. We think it is a good idea to consolidate the codebase around a single server, then to use multiple different ones. The Threaded and Prefork servers are calling `socket.accept()` themselves, doing the same for geven is proving more difficult, so we decided to still rely on Gevent and its StreamServer class for the socket management, but leave the HTTP part to our h11-based WSGI server. Co-authored-by: Chong Wang <cwg@odoo.com>
Companies can now view and manage grouped tax identifier information directly on the company record, reducing the need to track many separate fields. The setup flow is also improved for country-specific identifiers, with related localization screens updated to match the new layout.
Original PR description
*:fr,ar,au,br,ca,cl,es_edi_verifactu,in,nz,ph,sa_edi,tr_nilvera_einvoice
[IMP] account,base,l10n_fr: add the identifier list on the company
A new feature to group all TIN identifiers was added on the partner, to
avoid having a huge load of fields that are hard to track.
We now display it also on the company. This PR also adds the possibility
to force the display of some additional identifiers, for an easier setup
process. (Used here to display specific French identifiers for French
companies).
[IMP] l10n_{*}: update views after base template update
*ar,au,br,ca,cl,es_edi_verifactu,in,nz,ph,sa_edi,tr_nilvera_einvoice
The vat field in the base template has changed a bit for a
new feature, this updates the view that were xpathing to it.
task-6285604Several localization modules were updated so their company settings continue to align with a recent change to the VAT field in the base system. This helps keep country-specific reporting, payroll, payments, and e-invoicing settings working consistently after the underlying template change.
Original PR description
*au_hr_payroll_api,be_reports,bg_reports,ca_payment_cpa005,cl_edi, de_intrastat,eu_oss_reports,ke_edi_oscu,lu_reports,nl_reports, ph_reports,uy_edi In the associated community PR, the vat field has changed a bit for a new feature, this updates the view that were xpathing to it. task-6285604
Invoice emails now include the relevant timesheet report by default while avoiding unnecessary or empty timesheet PDFs. This gives customers clearer supporting details for service invoices and prevents irrelevant attachments on invoices without timesheet-based work.
Original PR description
Before this PR --- - Invoice email templates did not attach the Timesheets report by default. - The invoice email templates contained a hardcoded portal link to view timesheets. - The Timesheets report was generated from the Send & Print wizard even for invoices without timesheet-based service lines. - The Timesheets print action generated an empty PDF when no timesheet entries were available. After this PR --- - The Timesheets report is attached by default to the standard and self-billing invoice email templates. - The hardcoded portal link is removed from the invoice email templates. - The Timesheets report is generated from the Send & Print wizard only when the invoice contains timesheet-based service lines. - The Timesheets print action displays a notification instead of generating an empty PDF when there are no timesheet entries. task - 5361456
The RPC key generation dialog is clearer and now shows a ready-to-use Python example, making it easier for users to connect external tools correctly. Users can also copy the generated key more conveniently, while the clipboard button component gains more flexible icon support across the interface.
Original PR description
This commit improves the RPC key generation dialog by refining the form layout and displaying a ready-to-use Python code snippet. The key can also be copied directly using the provided copy button. Additionally, it modifies the CopyClipboardButton widget to support custom button icons while keeping `fa-clipboard` as the default. task-6375961
The purchase dashboard KPI cards have been visually updated so the Days to Order card matches the other dashboard cards. This improves readability and consistency by using clearer backgrounds and rounded styling.
Original PR description
Before this PR, the not all the KPI's backgrounds were updated to be visible with the new background. Now they are raised to bg-200 and border-radius was added. | Before | After | |--------|--------| | <img width="1681" height="193" alt="Screenshot 2026-09-14 at 15 16 27" src="https://github.com/user-attachments/assets/7cb39825-cf19-4872-97a1-5203fe79b8ff" /> | <img width="1681" height="193" alt="Screenshot 2026-09-14 at 15 16 05" src="https://github.com/user-attachments/assets/19f5f8cc-6eab-47b3-9604-ea1500d3d653" /> | task-6570029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Dropdown menus across several Odoo areas have been standardized and visually refined to better match the new Frost design. This gives users a more consistent and polished experience when navigating options in web, email, project, and website tools.
Original PR description
*: html_builder, mail, project, website This commit standardizes dropdowns into a consistent layout and fine-tunes them to better align with the new Frost design. task-6542810 Requires: - https://github.com/odoo/enterprise/pull/130999 | Community | Enterprise | |--------|--------| | <img width="230" height="285" alt="Screenshot 2026-09-15 at 10 56 08" src="https://github.com/user-attachments/assets/b0aa7b5f-4706-4ee9-898d-0a6fc8c70dae" /> | <img width="231" height="271" alt="Screenshot 2026-09-15 at 10 54 05" src="https://github.com/user-attachments/assets/e86deed6-1552-4b19-9531-b8684d3a9b4c" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The invite people experience in Discuss has been visually refined to match the rest of the interface. Search fields, selected person chips, invitation links, result rows, and dialog spacing now feel more consistent and easier to scan.
Original PR description
The invite people panel did not match the rest of Discuss. Its search field was square, while every other search input in Discuss is pill-shaped, and its result rows were stacked flush against each other without any padding. Give the search field the same pill shape and height as the one of `mail.SearchInput`, used by the member list and the sidebar. Add padding and a gap between result rows, and let the selected person chips and the invitation link field follow the same pill language. The dialog wrapping these panels, opened by "+ Chat" and by the "Invite people" entries, had almost no padding of its own, letting its content touch the modal border. Use the standard modal body padding instead. <img width="1716" height="686" alt="invite-popover-comparison-zoom" src="https://github.com/user-attachments/assets/d6338e61-3c72-49cc-a0b6-f5bfb73eaed0" />
This update brings the embedded spreadsheet tool up to its latest version, improving dashboards, chart behavior, pivot table accuracy, and data analysis suggestions. Business users should see more reliable spreadsheet reporting and a more consistent dashboard appearance.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4784627a29 [REL] 19.5.0-alpha.20 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/4784627a29 [REL] 19.5.0-alpha.20 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/e7d6e6e095 [IMP] spreadsheet: Allow integrator to set the spreadsheet dashboard [Task: 6542221](https://www.odoo.com/odoo/2328/tasks/6542221) https://github.com/odoo/o-spreadsheet/commit/14f6529b65 [IMP] colors: update dark background color [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/c0f451af1e [IMP] demo: debounce xml template build [Task: 6574005](https://www.odoo.com/odoo/2328/tasks/6574005) https://github.com/odoo/o-spreadsheet/commit/aa96e07891 [FIX] demo: fix scorecard demo definition [Task: 6573109](https://www.odoo.com/odoo/2328/tasks/6573109) https://github.com/odoo/o-spreadsheet/commit/11eac2b445 [FIX] model: evaluation plugin dispatch should trigger update [Task: 6574488](https://www.odoo.com/odoo/2328/tasks/6574488) https://github.com/odoo/o-spreadsheet/commit/dc06c6a41f [FIX] chart annotation: text input style [Task: 6533642](https://www.odoo.com/odoo/2328/tasks/6533642) https://github.com/odoo/o-spreadsheet/commit/f8d1faf29b [FIX] Charts: Bubble chart background depends on color scheme [Task: 6448882](https://www.odoo.com/odoo/2328/tasks/6448882) https://github.com/odoo/o-spreadsheet/commit/8f8951738b [FIX] Charts: fix rounded borders in full-screen [Task: 6569794](https://www.odoo.com/odoo/2328/tasks/6569794) https://github.com/odoo/o-spreadsheet/commit/1efdd6cc50 [FIX] pivot: wrong running total with collapsed/hidden dimensions [Task: 6569607](https://www.odoo.com/odoo/2328/tasks/6569607) https://github.com/odoo/o-spreadsheet/commit/a709278102 [IMP] data_analysis: detection of headers [Task: 6516198](https://www.odoo.com/odoo/2328/tasks/6516198) https://github.com/odoo/o-spreadsheet/commit/736ce42775 [FIX] gaugeCharts: fix GaugeChartBuilder typing [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/845acc4dd7 [REF] chart_suggestion_engine_test : small rewrite [Task: 6537589](https://www.odoo.com/odoo/2328/tasks/6537589) https://github.com/odoo/o-spreadsheet/commit/5d7b912754 [IMP] chart_suggestion_engine: date column [Task: 6537589](https://www.odoo.com/odoo/2328/tasks/6537589) https://github.com/odoo/o-spreadsheet/commit/84cfa4ba58 [IMP] chart_suggestion_engine: boolean column [Task: 6537589](https://www.odoo.com/odoo/2328/tasks/6537589) https://github.com/odoo/o-spreadsheet/commit/5b7222b702 [FIX] pivot: fix scope of `pivot_html_renderer` css [Task: 6523521](https://www.odoo.com/odoo/2328/tasks/6523521) https://github.com/odoo/o-spreadsheet/commit/c411984235 [FIX] standalone viewport: use correct devicePixelRatio [Task: 6445656](https://www.odoo.com/odoo/2328/tasks/6445656) https://github.com/odoo/o-spreadsheet/commit/487d50683b [IMP] model: remove notifyUser from the model [Task: 6517821](https://www.odoo.com/odoo/2328/tasks/6517821) https://github.com/odoo/o-spreadsheet/commit/681c280799 [IMP] model: remove raiseBlockingErrorUI from model [Task: 6517821](https://www.odoo.com/odoo/2328/tasks/6517821) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
The ellipsis menu buttons in Odoo Discuss now use a consistent size and hover style across related screens. This creates a more polished and predictable experience for users interacting with chat, channels, and messaging menus.
Original PR description
Before this commit, ellipsis buttons in Discuss had an inconsistent style (different size, different hover effect). This commit harmonizes the style with a shared classname `.o-discuss-ellipsisButton`. <img width="1188" height="1130" alt="ellipsis-button-before-after" src="https://github.com/user-attachments/assets/54e7f6f8-1308-4075-adaf-7b95230e2a70" />
Stock screens now use clearer wording and visually de-emphasize empty values, making key information easier to scan. Manufacturing bill of materials printouts are cleaner, with unnecessary items removed and breadcrumbs fully shown for better context when printing.
Original PR description
stock ----- The name of the `Detailed Stock`-menu needed to change and the null fields were too prominent in the line so they are now muted for clarity. mrp --- The default browser print button option showed some unnecessary objects. These have been removed to improve clarity. Also the breadcrumb is now fully expanded when using the browser print option. Task-id: 6201687
Completed activity meeting links now keep users connected to the record they came from, making it easier to return after viewing a meeting. The change also improves these links in email notifications so navigation remains reliable outside the app.
Original PR description
If you clicked on the activity meeting link of a done activity, you'd have no robust way of going back to the record you were on. Using this instead of _get_html_link and adding base_url in order to work on email notifications too. Task-6577150
Payroll line updates are now grouped together instead of handled one by one, reducing processing overhead during large payroll runs. This can make payroll generation noticeably faster, with the reported benchmark improving a 300-payslip Belgian run from about 12 seconds to about 7 seconds.
Original PR description
This commit batches the assignment in `hr.payslip.line. _inverse_name` to reduce the frequency to `write` on the field and it's calling `modified`, which is quite expensive to call. On a Belgian CP200 payrun with 300 payslips and 199 salary rules, which generates roughly 12k `hr.payslip.line`, it shaves off 4.75s of the whole creation process (from ~12s -> ~7s). Before: <img width="1917" height="296" alt="image" src="https://github.com/user-attachments/assets/45640465-09ee-43c2-861d-bf01eac35505" /> After: <img width="1917" height="346" alt="image" src="https://github.com/user-attachments/assets/30412ed4-ca68-4214-9e37-7ddeaf62427a" />
The appointment module interface has been updated to better align with the newer Frost design style. This should make scheduling pages feel more polished and consistent, improving the experience for users booking or managing appointments.
Original PR description
This PR adds some improvements to the appointment module UI Task-6533622
The AI assistant connection setup now includes clearer hints about the information users need to provide. This makes it easier for users to configure the connection correctly and reduces confusion during setup.
Original PR description
This commit adds hint to the MCP configuration dialog describing the parameters required to connect an AI assistant, making the setup process clearer for users. task-6375961
VoIP users can now access the queues menu while they are already on a call. This lets them join or leave call queues before their current call ends, helping control whether they receive another queued call immediately afterward.
Original PR description
Follow-up of [1], we now show the queues menu while in a call (softphone top-left dropdown menu). This allows to join/leave a queue during a call allowing/preventing a queue call to be made as soon as you hang up your current call. In any case, while in a call, you are marked as being busy from the queue point of view of course. [1]: https://github.com/odoo/enterprise/commit/7250e8dda350019f739b91fa6cc7533395ec45da task-6575682
Helpdesk users will no longer receive an empty PDF when trying to print timesheets for a ticket with no logged time. Instead, the system shows a notification, keeping the action available while avoiding confusing blank reports.
Original PR description
Before this PR --- - The "Timesheets" print action was available from helpdesk tickets even when no timesheet entries were logged on the ticket - Clicking the action generated an empty timesheet PDF After this PR --- - The "Timesheets" print action remains available on helpdesk tickets - When no timesheet entries are available to print, a toast notification is displayed instead of generating an empty PDF task-5361456
Dropdown menus have been visually adjusted to better match Odoo's new Frost design direction. This improves interface consistency and polish for users across enterprise web screens without changing business workflows.
Original PR description
This commit adapts the dropdown layout to better align with the new Frost design. task-6542810 Requires: - https://github.com/odoo/odoo/pull/287459
Users can now archive, unarchive, or delete AI agents directly from agent menus. When an agent is deleted, empty chats are removed while chats with prior messages remain available as read-only history, preserving important context without allowing unavailable agent actions.
Original PR description
Adds 'Archive', 'Unarchive', and 'Delete' actions to the AI agent kanban card menu and panel menu. On agent deletion, its empty chats are deleted. Chats with existing messages are kept but become read-only where the composer and any agent-dependent actions are hidden. task-id-6570223
The spreadsheet dashboard grid now better matches the surrounding action interface color. This creates a more consistent visual experience for users working with spreadsheet dashboards.
Original PR description
Task-6542221
Payroll run lists now show the most recent entries first. This makes it easier for payroll teams to find and review current pay runs without scrolling through older records.
Original PR description
-Order of payruns has been adjusted to show the newest firstly.
Belgian payroll tax reports now use configurable mappings instead of fixed salary rule codes, making it easier to adapt report boxes without developer changes. The update also separates sickness and work accident replacement revenue reporting and corrects withholding tax calculation for hourly-paid employees.
Original PR description
The reports listed salary rule codes in the code, so no rule could be added to a box without a developer. - each box now has its own category - the reports add up the payslip lines of the rules in those categories - reported amounts unchanged Task 6413398
Odoo settings can now store text-based options directly through configuration parameters. This makes it easier for businesses and implementers to manage longer or multi-line setting values consistently without extra custom work.
Peppol-related errors are now shown as separate, easier-to-read items with plain-language explanations where possible. This helps users understand what went wrong with electronic invoicing and what action may be needed, instead of seeing one long technical message.
Original PR description
Before this commit, Peppol error messages (e.g. Schematron errors) were logged in the chatter as a single unformatted line and without any humanization. The errors were too technical and the user could not easily know what action to take. This PR splits the raw error payload into individual entries, maps known error codes to human-readable explanations, and renders them as an HTML list in the chatter. task-6144909 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283311 Forward-Port-Of: odoo/odoo#265253
The point of sale now remembers whether the cashier last used a percentage or fixed global discount and uses that choice as the default on the next order. This reduces repeated setup for businesses that commonly use fixed discounts, and the related label is clearer by referring to a discount value instead of only a percentage.
Original PR description
The default global discount type was always `percent`, ignoring the type the cashier last picked. Some clients prefer `fixed` and had to reselect it on every order. Save the last global discount type used in local storage and use it as the default type for the next global discount. Since the discount value is no longer necessarily a percentage, rename the "Discount Percentage" field and its label to "Discount Value". --- Task: https://www.odoo.com/odoo/project/1737/tasks/6507075 Forward-Port-Of: odoo/odoo#285353
ESG metric and action lists now open records more clearly, reducing accidental inline edits and making navigation easier. The metric form and ESG report templates were reorganized so users can find assessment details, company information, and action summaries more quickly.
Original PR description
Lists now only let you edit a record's fields once it's selected, otherwise clicking opens the form view directly. Reorganized the metric form (moved tags, grouped type/status under a new "Impact, Risk, Opportunity Assessment" section, moved company under a new "Other Info" tab). Moved the Actions appendix article to the top of the CSRD report and added a short note about what it shows, plus a few wording tweaks in the VSME report template. no-task
The Knowledge app interface has been refreshed to align with Odoo's new Frost design language. This improves visual consistency across comments, side panels, navigation, permissions, and article views, giving users a more modern and coherent experience.
Original PR description
This commit adapts Knowledge to match the new Frost design. task-6512406
AI-powered searches now return references to files instead of loading every file's content automatically. This keeps the AI context focused and allows file contents to be read only when needed, improving efficiency for searches involving attachments or binary fields.
Original PR description
Searching records sent the content of every binary field returned, filling the context with files rarely needed. The search tool now returns a reference for each of them, and a new tool reads the content of an attachment or a binary field for the records that need it. task-id-6562658
Accounting dashboards can now fully hide KPI indicators using a central system setting, extending the existing option to disable dashboard graphs per journal. For very large databases, this setting will be enabled by default to help reduce dashboard load and improve usability.
Original PR description
Currently, we give the option to disable dashboard graphs per journal via `disable_dashboard_graph`. This commit enhances this even more by adding a system parameter to hide the KPIs completely. An upgrade script will set it to True by default for any DB with over a 100k `account.move` records. task-6518856
Spreadsheet dashboards now use a background color aligned with the surrounding action view, creating a more consistent visual experience. The update also brings spreadsheet component refreshes and several quality fixes that improve printing, charts, exports, and interface behavior.
Original PR description
Task-6542221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Spreadsheet dashboards now use a grid color that matches the surrounding action interface. This creates a more consistent visual experience for users working with dashboards and spreadsheets.
Original PR description
Task-6542221
Self-order and kiosk orders now show a clearer reference using the customer or partner name together with the selected preset name. Each self-order configuration also gets its own unique tracking number, making it easier for staff and customers to identify and follow the right order.
Original PR description
After this commit: = - The floating order name for Self Order/Kiosk will be formatted as: `partner_name - preset_name` - Each self-order config have a unique tracking number. task-5470833 related pr: https://github.com/odoo/enterprise/pull/104163
The order status display now shows the floating order name instead of the tracking number when that name is available. Long order names are shortened on screen, making orders easier for customers and staff to recognize without disrupting the display layout.
Original PR description
After this commit: == - Floating order name will be displayed on the order status display instead of order tracking number if available - If floating order name is longer it will be truncated. task-5470833 related pr: https://github.com/odoo/odoo/pull/250288
The mail system now skips empty alias names when checking email routing. This avoids unnecessarily loading very large numbers of unnamed aliases, improving performance and reducing load for large databases.
Original PR description
`email_localparts_tocheck` might contains the empty string. It can end up fetching tons of aliases without name (2M+ in odooo.com) task-6570805 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#288230
The Guatemala and Peru localization settings have been moved higher in the Accounting settings page. This makes electronic invoicing configuration immediately visible when users arrive from dashboard links or warnings, reducing scrolling and setup friction.
Original PR description
Purpose: Moving the Guatemalan/Peruvian Localization section higher in the settings ensures that when a user is redirected from the Accounting Dashboard or from warnings, the relevant EDI configuration is immediately visible without scrolling. task-6572740
This update adds configurable rules that automatically classify extra or missing work time and can adjust compensatory leave balances. It also makes employee working schedules mandatory and improves how flexible schedules are interpreted, helping payroll, attendance, and leave records stay more accurate with less manual correction.
Original PR description
[IMP] hr_{work_entry,attendance,holidays,holidays_attendance}: sequential time rule pipeline engine Adds a configurable threshold-based engine that automatically reclassifies attendance and leave…
[IMP] hr_{work_entry,attendance,holidays,holidays_attendance}: sequential time rule pipeline engine
Adds a configurable threshold-based engine that automatically reclassifies
attendance and leave records when a worked-hours threshold is crossed, and
optionally creates or deducts compensatory-leave allocation credits.
MECHANISM
A rule (hr.time.rule) expresses a condition:
"When employee X works more (or less) than Y hours on day/week D,
reclassify the excess (or deficit) as work-entry type Z and grant
(or deduct) N% of those hours as compensatory-leave allocation."
Rules run sequentially in sequence order. Each rule sees the already-
reclassified output of all prior rules, so they compose cleanly:
Rule 1 - excess > 2 h -> Overtime
Rule 2 - excess > 4 h -> Double-time (evaluates the post-rule-1 pipeline)
KEY MODULES
hr_work_entry
hr.time.rule rule model, field definitions, pipeline entry point
_evaluate_rules builds initial intervals, runs rules in sequence,
extracts excess and deficit per (employee, source) pair
_evaluate_period period-level threshold: compares worked hours against
the employee's schedule or a fixed expected-hours value
_apply_output writes results: reclassifies sources in-place or creates
child output records; collects allocation credit tuples
HrTimeRuleSourceMixin abstract trigger layer inherited by hr.attendance and
hr.leave; fires the pipeline on validated create/write
and exposes daily/weekly cron entry points for undertime
hr_attendance
attendance_validation per-company policy: when an attendance counts as a
validated pipeline source (immediate, officer, tolerance)
_apply_attendance_output base implementation - no allocation tracking
hr_holidays
leave_compensation_rate / allocation_type_id output fields on the rule
_apply_leave_output excess -> hr.leave.allocation credit;
deficit -> allocation deduction
hr.time.rule.allocation.log per-source log of credits; allows precise reversal
when a source record is modified or deleted
hr_holidays_attendance
bridge module: attendance-based excess/deficit also creates/deducts
hr.leave.allocation records using the same log + reversal mechanism
TRIGGER TIMING:
On write/create (for daily excess rules)
Daily cron for yesterday's daily undertime
Weekly cron for weekly rules
Task-6158746Label printing is now more consistent across products, inventory, and manufacturing, with more format choices including QR labels and updated printer layouts. This helps businesses produce clearer labels with standardized product details, pricing, packaging, barcodes, and related information while reducing duplicated setup behind the scenes.
Original PR description
Label printing offered limited formats and inconsistent layouts across products, inventory, and manufacturing. Adding new label designs also required duplicating report classes, actions, and data…
Label printing offered limited formats and inconsistent layouts across products, inventory, and manufacturing. Adding new label designs also required duplicating report classes, actions, and data preparation. Add QR label variants for Dymo, 2x7, 4x7, and 4x12 PDF formats. Add redesigned normal, alternative, small, and jewelry ZPL formats with optional prices and packaging. This commit's changes: - Standardizes names, pricing, packaging, barcodes, and extra content. - Shares PDF, Dymo, and ZPL rendering and pagination infrastructure. - Moves model-specific data preparation into the corresponding wizards. - Applies the new formats to products, lots/SNs, locations, operation types, packages, and finished products. - Removes obsolete report classes, actions, and templates. task-6127471 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
Sales service products can now have a task template selected even when no project is assigned. This reduces setup friction while keeping choices relevant by limiting templates based on whether a project is selected.
Original PR description
The task template field on the product form was hidden if there were no project set on the service, forcing users to set a project before being able to pick a task template. With this commit, the task template can be selected even without project. Further, if no project is set, only task templates without project can be chosen. Finally, if a project is set then task templates either matching the project or without project can be selected. task-6514809
Project administrators can now open a project's settings directly from the task kanban or list view using a new cog menu action. This saves time by reducing navigation steps while keeping the option limited to users with project administration rights.
Original PR description
In this commit, we add a "Configure Project" action to the cog menu of the kanban and list views of tasks. This action redirects to the form view of the current project and is only visible for users with 'project > admin' access rights. task-6533807
Attendance and leave time rules now carry premium pay categories through to payroll, helping payslips reflect special working time more accurately. Employee attendance can also replace the planned schedule for that day, improving payroll calculations when actual hours differ from standard working hours.
Original PR description
WIP Task-6158746
Field Service auto-planning now factors in technician and customer locations, travel time, working hours, existing jobs, equipment conflicts, and required skills before assigning work. This helps create more realistic schedules, reduce unnecessary driving, and avoid assigning jobs when location data is missing.
Original PR description
Auto-plan used to assign open Field Service interventions to technicians purely based on their availability, with no notion of where the technician or the customer actually is. This could send a…
Auto-plan used to assign open Field Service interventions to technicians purely based on their availability, with no notion of where the technician or the customer actually is. This could send a technician to two customers an hour's drive apart back-to-back, or send them off without accounting for the trip back to their own home or office. This only affects interventions that have a customer set — shifts without one keep being planned exactly as before. And if a customer's or a technician's location can't be determined, the intervention is left unplanned rather than scheduled without regard for travel. Auto-plan now takes travel time into account when assigning interventions to technicians. For each open intervention, it looks for the technician and time slot that fit best while respecting: - The technician's working schedule (only assigns within their actual working hours/days). - The technician's other confirmed interventions that day (no double-booking, and no cutting it too close before/after them). - Any material assigned to the technician already booked at that time, so sharing it with another intervention doesn't create a conflict. - The driving time between two consecutive interventions, or between an intervention and the technician's home/office when it's the first or last of the day. - The technician's required role/skill for the intervention, as before. - A technician's maximum workload for the day, for technicians without a fixed schedule. Among every technician and time slot that satisfies all of the above, the one requiring the least total driving time is chosen. The auto-plan works in any scale if MapBox is not enabled. If, however, MapBox is enabled, the auto-plan only works day-by-day to account for the runtime of estimating travel times (see below). Open shifts which are in 'draft' are considered as plannable anytime of the day, respecting the resources' work schedules. Interventions are planned in priority order: priority and long ones first, since they are the hardest to fit in, then shorter ones to fill the remaining gaps, and finally interventions with no requested date at all, if any availability remains. Travel times are first estimated using two different approaches, depending whether a MapBox token is set. In the negative case, a simple Haversine (straight-line distance) is used with a fixed average speed. In the positive case, we employ MapBox's isochrones API [1] and interpolate travel times between the different contours. At the end, and if MapBox is enabled, the true travel times are computed and the interventions just planned are rescheduled (iff they are in draft). See odoo/upgrade#11332 task-6200253 [1] https://docs.mapbox.com/api/navigation/isochrone/
Manufacturing and barcode users now have clearer label printing choices for product and lot/serial number labels. The update adds more label formats and keeps printing available from Shop Floor and Barcode workflows, making label handling more flexible and easier to understand.
Original PR description
Split label printing into explicit product and lot/SN quality-check types. Reuse the shared Community label wizards and reports while preserving Shop Floor and Barcode application printing. This commit's changes: - Add separate Print Product Label and Print Lot/SN Label check types. - Expose the manufacturing product-label formats on quality points. - Add 4x12 and ZPL lot/SN formats with per-lot and per-unit quantities. - Route quality-check printing through the product and lot label wizards. - Adapt Shop Floor buttons and commands to the new MRP label actions. - Render location and operation-type sheets through the shared PDF report while preserving server-side PDF merging. - Update quality domains, views, tests, and client behavior for both check types. - Rename the Barcode application action from Print Barcodes to Print Labels. task-6127471
This update aligns HR, payroll, planning, appointments, attendance, leave, and timesheet features with the new rule that every employee version must have a working schedule. It also changes how flexible employees are identified, using a flexible schedule type rather than the absence of a schedule, which improves consistency in payroll and workforce planning.
Original PR description
adapting after making hr.version.resource_calendar_id required and redefining a "flexible" employee as one assigned a flexible-type calendar instead of having no calendar at all. l10n_be_hr_payroll: move l10n_be_part_time_status from the employee/contract to the Working Schedule (resource.calendar), as part-time status is now a property of the schedule. Related: https://github.com/odoo/odoo/pull/275244 Task-6296065
Employees must now have a working schedule assigned, including flexible employees who will use a dedicated flexible schedule instead of leaving the field empty. This makes work time, leave, attendance, and planning calculations more consistent and easier to manage across HR processes.
Original PR description
[IMP] hr: make the Working Schedule required on employees Employees could previously be left without any resource_calendar_id, using standalone "Hours per Week"/"Hours per Day" fields on the…
[IMP] hr: make the Working Schedule required on employees Employees could previously be left without any resource_calendar_id, using standalone "Hours per Week"/"Hours per Day" fields on the employee/contract as an implicit "flexible schedule" signal instead. Since resource.calendar now supports a "variable" calendar_type that can hold zero predefined attendance slots:: a flexible employee can simply be assigned a variable-type calendar with no slots. This commit: - Makes hr.version.resource_calendar_id required, and removes the "Flexible" placeholder and standalone hours fields from the employee form. - Turns hours_per_week/hours_per_day into read-only fields related to the calendar instead of independently editable values. - Redefines is_flexible/is_fully_flexible: instead of keying off the calendar being absent, they now key off the calendar being a variable-type calendar with no predefined slots (fully flexible additionally requires no hours_per_week/hours_per_day target). Task-6296065
The VoIP project app now includes required access group information when the user session starts. This avoids an extra background request during startup, helping the web client load more efficiently.
Original PR description
The voip app needs this group at startup: https://github.com/odoo/enterprise/blob/c50de485ab5c0fa7927652d4129629b5b674ca37/voip_project/static/src/softphone/softphone_model_patch.js#L14 This commit adds the group inside the session info to avoid extra RPCs at webclient startup. The exact same thing is done for `voip_crm` task-6565730 Forward-Port-Of: odoo/enterprise#131207
The VoIP recruitment integration now includes a needed permission check during the initial session load. This reduces extra background requests when the web client starts, helping the app open more efficiently without changing user workflows.
Original PR description
The voip app needs this group at startup: https://github.com/odoo/enterprise/blob/203c85cade63a6564f5051d318916aaf0ea87df5/voip_hr_recruitment/static/src/softphone/softphone_model_patch.js#L14 This commit adds the group inside the session info to avoid extra RPCs at webclient startup. The exact same thing is done for other voip_* bridge modules task-6565730 Forward-Port-Of: odoo/enterprise#131210