Friday, September 4, 2026
45 changes · master
Enhancements to existing features
French accounting localization now treats Monaco as part of the EU VAT group while preserving a separate EU group that excludes Monaco. New localization packages were also added for French overseas territories, helping businesses apply the right local accounting and tax setup in those regions.
Original PR description
[[IMP] l10n_fr,l10n_fr_account: European union vat](https://github.com/odoo/odoo/commit/9870a204bb64bdf8a11e433eef3a9e9f8f3fad86)
This commit will add Monaco to the European union vat country group and
create a new country group that is the same than the european union but
without monaco
task-6321652
[[ADD] l10n_{gf,gp,mq,re,yt}: new localization](https://github.com/odoo/odoo/commit/58518e1d7df773a70c595bd3842a33ac6be611bb)
Like Monaco, we need to add new localization package for
the drom countries
task-6321652
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#284404Sales cash rounding is easier to manage, with editable and archivable rounding methods, clearer handling when rounding has no effect, and better default profit and loss account setup. These changes reduce configuration mistakes and make invoice rounding behavior more transparent for users.
Original PR description
This commit is a followup of the work done in this PR https://github.com/odoo/odoo/pull/283020 It adds the following improvements: 1) Show the icon to remove the cash rounding in case of biggest_tax strategy before saving the record 2) set profit/loss default accounts on the company 3) Fix unit test (partner category count says 3 while actually 2 are included) 4) when the tax group groups 0% taxes, should never be != 0, and notify the user that no rounding took effect 5) Make rounding methods archivable 6) Make the rounding methods list view editable top, and support multi edit 7) Compute new rounding method records names 8) Restrict rounding profit/loss accounts to internal groups of income/expense task-6501537
Users can now open the full composer while editing existing Chatter messages or notes, with the current content carried over. This makes it easier to use richer editing options such as formatting, attachments, and mentions while ensuring the original message is updated rather than duplicated.
Original PR description
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When editing messages or log notes from the Chatter, users are limited to the inline composer…
**Description of the issue/feature this PR addresses:** ---------------------------------------------- When editing messages or log notes from the Chatter, users are limited to the inline composer and cannot switch to the full composer. This restricts their ability to perform advanced editing (rich formatting, attachments, mentions handling, etc.) once edit mode is initiated. **Current behavior before PR:** ---------------------------------------------- - No option is available to open the full composer while editing - Users must either continue with limited inline editing or discard changes - Full composer can only be used when creating new messages, not editing existing ones **Desired behavior after PR is merged:** ---------------------------------------------- - "Open Full Composer" action is available while editing messages/notes - Full composer opens with existing message content pre-filled - Attachments, mentions, and formatting are preserved during transition - Saving from full composer updates the original message instead of creating a new one - Existing behavior for new messages remains unchanged Related Enterprise PR: https://github.com/odoo/enterprise/pull/126622 Task-6015654 ---------------------------------------------- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Indian reporting now includes audit checks for Form 26, helping businesses review required tax return information more consistently. This improves compliance support by flagging relevant items during the reporting process.
Original PR description
This PR adds audit checks for Form 26 in India. task-6182154 Community PR - https://github.com/odoo/odoo/pull/286430
Users can now open the full message composer when editing chatter messages, giving them a more complete editing experience. The underlying context naming was also aligned with existing mail conventions, improving consistency for future maintenance.
Original PR description
The clicked_on_full_composer context key is renamed tomail_full_composer. The new name follows the naming of the other mail context keys. Related Community PR: https://github.com/odoo/odoo/pull/256870 task-6015654
The timesheet assistant now gives more importance to recent activity matches, so suggestions adapt faster when people move to new projects or tasks. It also cleans up outdated local history and reduces unnecessary lookups, making suggestions more relevant and efficient.
Original PR description
Previously, the timesheet assistant's local configuration matched activities to projects/tasks using a strict historical tally. A match made 6 months ago carried the exact same mathematical weight as a match made today. This caused old habits to stubbornly override new assignments. This commit introduces an exponential time-decay algorithm to the frequency computation: - Matches are now weighted based on their `datetime` stamp. - The weight drops by 50% every 5 days (half-life algorithm). - Recent timesheet entries quickly accumulate enough fractional votes to surpass the decayed votes of older, outdated projects. in this commit i updated the matching of local rules to be case sensitive for better matching (eg. "Meeting with client" is the same as "meeting with client") Task: 6267713 Forward-Port-Of: odoo/enterprise#129997 Forward-Port-Of: odoo/enterprise#124669
The AI update process now blocks empty selection criteria in all cases, including flows that ask for confirmation. This reduces the risk of an AI mistake changing every record unintentionally, while still allowing deliberate all-record updates when an explicit matching condition is provided.
Original PR description
The llm can hallucinate and call the update tool with an empty domain which will result in performing the updates on all the records of a certain model. To prevent hallucinations and at the same time allow the llm to update all the records if it actually needs to, an error is thrown if the domain is empty stating that updating with an empty domain is prohibited and a domain that matches all records should be used instead. This will make the llm conscious about passing a domain that actually matches all records and not just use an empty domain. Note: the update tool was already throwing an error if the domain is empty but only if tool_request_confirmation is False. If the confirmation is True, which is the case in mcp, the domain would be accepted and the updates would go through. Forward-Port-Of: odoo/enterprise#130349
Manufacturing now supports packing finished products as part of the production workflow, aligning manufacturing with existing stock packing processes. This helps teams prepare goods for shipping or storage more efficiently, though some automated print actions from detailed stock move lines are not yet triggered and are planned for a later update.
Original PR description
In this commit, we introduce the basic functionality of put in pack in MRP, as it makes sense to pack the manufactured product when needed. Later improvements to be done in order to tweak the behaviour and a `Put in Pack` action might be added on the operation directly. For now, the `Put in Pack` action in stock move lines don't trigger the hooks correctly and it should be fixed in another PR for 19.0 (since this PR targets V20), This means that on putting on pack from the stock move line operations list, f you have the print on "Put on Pack" or similar on, it won't be triggered. Task: 6247512 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Public holidays now appear in Discuss the same way as regular time off, using each employee's company calendar when they have no approved leave. This helps colleagues better understand availability by showing banners, status, and names with an expected return date when relevant.
Original PR description
**Public holidays** are now treated like regular out-of-office status in Discuss. and the holiday is computed on hr.employee from the employee’s company calendar (only when they have no validated leave). The Discuss banner, IM status, and formatted display name show “back on XXX” when appropriate, task-2377854 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Online shop filtering now refreshes key page controls consistently, including breadcrumbs, sorting, search, category links, and floating filter controls. This gives shoppers clearer navigation and prevents old filter options or reset links from lingering after they refine product results.
Original PR description
Applying shop filters without a full page reload left several server-rendered regions stuck at their page-load state. The products header (breadcrumb, sort, filmstrip, search) and the floating bar are now refreshed on each update, so their keep() links are rebuilt against the current filters rather than the ones present at page load. Searching now targets a clean /shop, and the category links, "All Products" and "Clear Filters" share one reset dict, so searching or selecting a category clears the active filters consistently. The on-sale and in-stock ribbon pills now go through the same async flow as the other filters instead of forcing a full page reload. Also fix the collapsible category tree, whose toggle collapsed its own header: after the title became a div, the inheriting xpath matched the title instead of the category list. task-6297769 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Manufacturing barcode workflows now include Put in Pack actions, letting users package finished goods or by-products directly during barcode operations. Manufacturing operation settings also expose the related packaging options, making package handling and package PDF printing easier to configure and use.
Original PR description
After https://github.com/odoo/odoo/pull/267679 and the introduction of `Put in Pack` in MRP. We can now show put in pack options in the configuration of MRP. Task: 6247512
Employee group insurance fields now appear only when group insurance is selected, making employee records cleaner and easier to manage. Group insurance employee contributions are also included in Belgian tax reports and used to reduce withholding taxes where applicable.
Original PR description
Now, the group insurance fields are only displayed on the employee's form when the Group Insurance field is checked. Also changed the _onchange methods for hospital and ambulatory insurances to _compute methods. Added group insurance employee contribution to 281.10 and 281.20 reports. Added reduction for the withholding taxes based on 30% of the personnal employee contribution to the group insurance. task-6263912
The fleet stock planning view now shows recently used docks and responsible people even when they have no batches scheduled in the current period. This makes drag-and-drop planning easier by keeping common planning groups visible and ready to use.
Original PR description
To improve the drag and drop planning inside the gantt view, 'recent' docks and responsibles groups are displayed, even if they don't have any batch for the current period. Task-6294586
Customer reminder information is now handled more accurately per company, reducing confusion in multi-company setups. The update also standardizes report file naming and streamlines how follow-up responsibilities are selected, making reminder workflows more reliable.
Original PR description
- Make last_reminder computed per company. - Add get_default_partner_report_filename as a separate function for renaming the Open Items report instead of doing it manually. - Pass the follow-up line to _get_followup_responsible instead of recomputing it from the partner field in _execute_followup_partner. task-6401457
Quality checks are now created more efficiently when stock move lines are created or updated. This reduces database work for large warehouse operations with category-based quality rules, improving performance without changing user workflows.
Original PR description
Description ----------- Creating or updating stock move lines calls `_create_check()` to find the quality control points applicable to each detailed operation. Category-scoped points previously…
Description
-----------
Creating or updating stock move lines calls `_create_check()` to find the quality control points applicable to each detailed operation.
Category-scoped points previously searched for products once per quality point and category. The method then performed another `quality. point` search for every move line, although those point ids came from the recordset fetched at the beginning of the method.
This commit resolves all category-scoped products in one search and reuse the already-fetched quality points.
Benchmark
---------
```xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--
Reproduces the two query-scaling paths in stock.move.line._create_check:
category-scoped control points and a large batched move-line creation.
The final job is the benchmark target. With the former implementation,
its query count grew with both the control-point/category pairs and the
1,000 move lines. Use the scale option to increase only the move-line count.
-->
<record id="benchmark_move_line_quality_checks" model="populate.blueprint">
<field name="name">Benchmark: Move Line Quality Checks</field>
<field name="definition_xml" type="xml">
<create model="product.category" count="20" id="quality_parent_categories" scale="False">
<value name="counter" generator="misc.counter" start="1"/>
<field name="name" eval="f'Quality Benchmark Category {counter:02}'"/>
</create>
<create model="product.category" count="100" id="quality_child_categories" scale="False">
<value name="counter" generator="misc.counter" start="1"/>
<field name="name" eval="f'Quality Benchmark Subcategory {counter:03}'"/>
<field name="parent_id" ref="quality_parent_categories"/>
</create>
<create model="product.product" count="100" id="quality_products" scale="False" context="{'tracking_disable': True}">
<value name="counter" generator="misc.counter" start="1"/>
<field name="name" eval="f'Quality Benchmark Product {counter:03}'"/>
<field name="type" eval="'consu'"/>
<field name="is_storable" eval="True"/>
<field name="tracking" eval="'none'"/>
<field name="categ_id" ref="quality_child_categories"/>
</create>
<create model="quality.point" count="20" id="category_quality_points" scale="False">
<value name="counter" generator="misc.counter" start="1"/>
<field name="title" eval="f'Benchmark Category Control Point {counter:02}'"/>
<field name="apply_to" eval="'categories'"/>
<field name="product_category_ids" ref="quality_parent_categories" count="5"/>
<field name="picking_type_ids" eval="[Command.set([env.ref('stock.picking_type_in').id])]"/>
<field name="measure_on" eval="'move_line'"/>
<field name="measure_frequency_type" eval="'all'"/>
<field name="test_type_id" eval="env.ref('quality_control.test_type_passfail').id"/>
</create>
<create model="stock.picking" count="1" id="quality_picking" scale="False">
<field name="picking_type_id" eval="env.ref('stock.picking_type_in').id"/>
<field name="location_id" eval="env.ref('stock.stock_location_suppliers').id"/>
<field name="location_dest_id" eval="env.ref('stock.stock_location_stock').id"/>
<field name="origin" eval="'Quality control performance benchmark'"/>
</create>
<create model="stock.move" count="1000" id="quality_moves" scale="False" context="{'tracking_disable': True}">
<field name="picking_id" ref="quality_picking"/>
<field name="product_id" ref="quality_products"/>
<field name="product_uom_qty" eval="1.0"/>
<field name="uom_id" eval="env['product.product'].browse(product_id).uom_id.id"/>
<field name="location_id" eval="env.ref('stock.stock_location_suppliers').id"/>
<field name="location_dest_id" eval="env.ref('stock.stock_location_stock').id"/>
</create>
<create model="stock.move.line" count="1000" id="quality_move_lines" parallel="False">
<field name="move_id" ref="quality_moves"/>
<field name="product_id" eval="env['stock.move'].browse(move_id).product_id.id"/>
<field name="uom_id" eval="env['stock.move'].browse(move_id).uom_id.id"/>
<field name="quantity" eval="1.0"/>
<field name="location_id" eval="env.ref('stock.stock_location_suppliers').id"/>
<field name="location_dest_id" eval="env.ref('stock.stock_location_stock').id"/>
</create>
</field>
</record>
</odoo>
```
The populate benchmark creates 20 quality points linked to 5 categories each, resulting in 100 point/category relationships. It then creates 1,000 move lines in one batch, generating +-4.5k quality checks.
Products belong to child categories while quality points target their parents, this represents large stock operations with category-wide quality rules.
| | Before | After | Improvement |
|-------------|--------|-------|-------------|
| Time | 11.8s | 10.3s | 12.7% |
| Query count | 12487 | 10120 | 19.0% |
Reference
---------
task-6488454Point of Sale reports now show clearer session timing, including opening dates for active sessions and full start-to-end periods for closed sessions. The Sales Details report layout and multi-configuration names are also improved, making reports easier for managers to read and compare.
Original PR description
In this commit: - Display the opening date in the Session report when the session state is opened (X report). - Show the session period (start and end datetime) for closed sessions and sales details report. - Move the "Sales Details" title to the header for the Sales Details report for better layout consistency. - Improve config name display in multi-config reports by joining them in a single line. - Extend `pos.session` display_name to optionally include the session start datetime using the `display_start_at` context. Task: 5980266
Adds support for work injury sick leave calculations required under Hong Kong Cap. 282. This helps payroll and HR processes apply the correct leave amount after accounting for any post-accident earnings.
Original PR description
Implement support for work injury sick leaves as per the Cap. 282 from Hong Kong. These calculations require some special logic to handle the worked day line calculation; as the rate should be applied AFTER reducing the leave amount by any post accident earnings given to the employee. task-6517522 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Product images can now be assigned to shared attributes like color or size, so businesses no longer need to duplicate the same image across every variant. This makes product setup faster and ensures customers see the most relevant images on product pages while shop listings stay consistent.
Original PR description
## Before this commit: - Variant images had to be uploaded and managed separately for each product variant. - Even when multiple variants shared the same characteristics (e.g., the same image for all…
## Before this commit:
- Variant images had to be uploaded and managed separately for each product
variant.
- Even when multiple variants shared the same characteristics (e.g., the same
image for all sizes of a blue T-shirt), the image had to be duplicated across
variants.
## After this commit:
### 1. Image assignment using attribute values
- All images related to a product template, including variant specific images,
are now visible in the Extra Media section on both the template and its
variant forms.
- In the variant form, images that do not apply to the current variant (i.e.,
belonging to other variants) are visually muted.
- Each image can be linked to specific attribute values using a dropdown in the
kanban view.
- An image is applied to a variant only if the variant matches all attribute
values assigned to the image.
- If none of the values of attribute is selected on the image, then that
attribute will not affect the matching logic.
- In the product form view, images with attribute values are displayed first,
followed by images without attribute values.
This removes unnecessary duplication and simplifies variant image management.
### 2. Shop page behavior
- The primary image is always the template's main image.
- The secondary image is the second template image.
### 3. Product page behavior
- For the selected variant:
- Variant specific images are displayed first, with the first image serving as
the variant's main image.
- Template images without attribute values are displayed afterward.
### 4. Variant main image logic
- The first variant specific extra image is used as the variant's main image.
- If the user manually updates the variant's main image, the first variant
specific extra image is updated to match it. If no variant specific extra
image exists, a new one is created using the main image.
- If no variant specific extra images exist, the variant falls back to the
template's main image.
### 5. Template main image logic
- The first extra image is used as the template's main image.
- If the user manually updates the template's main image, the first extra image
is updated to match it. If no extra image exists, a new one is created using
the main image.
task-5405584The Discuss app interface has been updated to better match Odoo's Frost design, with clearer navigation, rounded search bars, stronger visual separation, and more readable message and settings areas. These changes improve day-to-day usability for teams using chat, channels, calls, and notifications without changing core workflows.
Original PR description
This commit adapts the overall UI of Discuss app to match with frost design. 1. Overall layout of Discuss app follows the floating box style of other Odoo screens 2. Messaging Menu style has been…
This commit adapts the overall UI of Discuss app to match with frost design. 1. Overall layout of Discuss app follows the floating box style of other Odoo screens 2. Messaging Menu style has been tweaked for improved readability: less muted items, better spacing, better visual of active item 3. Search bars are pilled-shaped to match search view. 4. Discuss app thread actions have style matching view switcher for panel actions. 5. Channel Member role iconography and action label has been changed to be more natural: crown icon, filled (owner) and unfilled (admin), "Set Member" for cleared downgrading of member role, consistent order of actions based on role hierarchy) 6. More visible border around core UI elements, like composer or message bubble. 7. Add People button has now an icon next to label. 8. Chat bubble message preview now is colored to match the message bubble color. 9. Notification Settings and Voice & Video Settings have their visual slightly simplified, with more spacing and less borders. 10. Call View actions and dropdowns no longer have weird gradient effect in simulated dark theme. 11. Call View Card's context menu stays open even when mouse leaving the card without any click away. Also improved color in this context menu. 12. Orange message bubble (mention to self) color has been tweaked to catch more the eye of the user. 13. Mentions style has been tweaked to pop a bit more. 14. Chat window outline is more separated from the background content through stronger border instead of shadow effect. 15. Add icons to Save as Template and Manage Templates in full composer. 16. Is typing text now shows member names in bold. 17. Autoresize, AutoresizeInput and DiscussContent's header have been fixed to properly follow the shrink-to-fit content aspect of header. <img width="2137" height="563" alt="Screenshot 2026-09-04 at 12 35 50" src="https://github.com/user-attachments/assets/81d317f2-bb56-4bdf-81d8-5aaa07e4eb4b" />
This update brings Odoo's spreadsheet component up to the latest version, improving day-to-day usability and visual consistency. Users should see smoother undo/redo behavior, more reliable area charts, better font handling on Linux, and colors that better match the rest of Odoo.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bb7357a197 [REL] 19.5.0-alpha.16 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/bb7357a197 [REL] 19.5.0-alpha.16 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/75ceb30aaa [FIX] Fonts: fix linux font on css variable [Task: 6452045](https://www.odoo.com/odoo/2328/tasks/6452045) https://github.com/odoo/o-spreadsheet/commit/e8d059f38e [FIX] svg: remove unused commented SVGs [Task: 6317134](https://www.odoo.com/odoo/2328/tasks/6317134) https://github.com/odoo/o-spreadsheet/commit/60c210afc2 [IMP] viewports_store: do not jump viewport on UNDO/REDO [Task: 6481352](https://www.odoo.com/odoo/2328/tasks/6481352) https://github.com/odoo/o-spreadsheet/commit/537711e139 [FIX] chart: connect area charts through invalid values [Task: 6458796](https://www.odoo.com/odoo/2328/tasks/6458796) https://github.com/odoo/o-spreadsheet/commit/ea25ccfa4b [FIX] css: update global gray colors to match Odoo [Task: 6515003](https://www.odoo.com/odoo/2328/tasks/6515003) 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>
Point of Sale sales details now show both VAT-included and VAT-excluded prices. This makes it easier to distinguish gross sales from net sales amounts for clearer reporting and reconciliation.
Original PR description
We now display both prices VAT included and excluded in order to better distinguish the net sale amount. task-6517995
Users can now download German TSS fiscal exports directly from Odoo instead of using the external Fiskaly dashboard. The DSFinV-K export option has also been moved into the Fiscalization reporting area, making compliance exports easier to find and manage.
Original PR description
In this commit: - Introduce TSS export directly from Odoo, allowing users to download the TSS export without accessing the Fiskaly dashboard. - Move the DSFinV-K export from the Orders menu to the Fiscalization section of the Reporting menu for better organization. Task-6421997
Hong Kong payroll now supports work injury sick leave calculations required under Cap. 282. This helps employers calculate affected leave pay more accurately by accounting for post-accident earnings before applying the sick leave rate.
Original PR description
Implement support for work injury sick leaves as per the Cap. 282. These calculations require some special logic to handle the worked day line calculation; as the rate should be applied AFTER reducing the leave amount by any post accident earnings given to the employee. task-6517522
VoIP time condition periods now use clearer, localized time inputs and include an explicit All Day option. This makes period setup easier and prevents users from getting stuck when correcting invalid start or end times.
Original PR description
Time Condition periods used character fields with manual hour validation. The end time was also hidden until a start time was set, which could leave users unable to correct an invalid period when the start time was cleared. Use the standard float time widget for entering period boundaries and add an explicit All Day option. Keep both inputs on the same line as the option to avoid resizing the period dialog. Format period hours in the list with the same localized representation as the form inputs while preserving the HH:MM values expected by Wazo.
Belgian payroll now reports specific partially paid sick leave and work accident salary codes in the correct tax forms. This helps ensure these payments are taxed and counted correctly in annual and withholding tax declarations.
Original PR description
Some salaries for sick days and work accidents are partially paid (e.g., for short-term contract employees). These salaries should not be declared in forms 281.10 and 274.10, but in 281.18 and 274.18, as they are taxed differently (bonus withholding tax base). Following the previous implementation for LEAVE218, LEAVE219, and LEAVE229, this commit adds the missing work accident codes: - LEAVE271 - LEAVE272 Their categories have been updated to use `REPLACEMENT_REVENUE_BASE` instead of the standard remuneration and withholding bases. These codes are also added to the 281.18 sheet generation to properly compute the number of days. Task: 6482702
The Shopee Shops menu now guides users through the correct setup flow instead of leading to a dead end when creating a shop. Users can choose or create the needed Shopee account before authorizing a new shop, making setup clearer and easier.
Original PR description
The Shopee menu now exposes the shops instead of the accounts, as the shops are what the users work with. However, shops cannot be created manually: they only exist once they have been authorized on Shopee, which requires an account. Clicking "New" on an empty form was therefore a dead end. The "New" button of the Shops list now opens the account creation dialog when no account exists yet, and a wizard otherwise. From that wizard, the user selects the account on which to authorize the new shop, opens that account, browses all the accounts, or registers a new one. Accounts are also identified by their partner ID and API endpoint rather than by their name, so that the account to authorize the shop on can be told apart from the others. task-6487410
Half-day time off entries now appear as wide as full-day entries in the payroll Time Off calendar, making monthly reviews easier to scan. The selection count was also adjusted so selected days are reported correctly in both payroll and regular Time Off views.
Original PR description
In the Time Off step of a payrun, a half day time off was displayed half as wide as a full day one, making the gantt hard to read when scanning a month of time off. Pill width comes from the grid:…
In the Time Off step of a payrun, a half day time off was displayed half as wide as a full day one, making the gantt hard to read when scanning a month of time off. Pill width comes from the grid: the leave gantt declares precision="day:half", so a day spans two grid columns and a morning or afternoon time off covers only one of them. Override the precision to "day:full" on hr_leave_gantt_view_payroll, the primary view used by the payrun Time Off step and by the payroll time off action. A day is now a single column there, so half day and full day time off are displayed with the same width. The Time Off app gantt keeps its half day precision. The multi selection counted the selected grid cells and divided them by 2 to get a number of days. That only holds when a day is two cells, so with the new precision selecting a single day displayed "0.5 selected". Divide by the scale cellPart instead, which is the number of cells in a day: 2 with day:half, giving the same result as before, and 1 with day:full.
Repair orders now move through a shorter, clearer process by removing the unnecessary “Under Repair” step and the related “Start Repair” action. The final repaired status is now labeled “Done,” making the workflow easier for users to understand across repair, manufacturing repair, and point of sale repair scenarios.
Original PR description
This commit improves the repair workflow by: - Removing the `Under Repair` state and its related logic, as it provided no functional value beyond an intermediate state. - Removing the `Start Repair` action, which is no longer needed without the Under Repair state. - Renaming the `Repaired` state to `Done` and updating the tests to reflect the new repair workflow. Enterprise PR:- odoo/enterprise#123736 Upgrade PR:- odoo/upgrade#10739 TaskId-6361476
Manufacturing orders now show planning and status options only when they are relevant, especially when work orders are not used. This reduces confusion for users by hiding unnecessary buttons and filters, showing helpful messages, and keeping order statuses aligned with actual production progress.
Original PR description
*: project_mrp_account This improvement enhances the UX by: - Hiding the `Plan` button on the MO form when there are no work orders. - Ensure the MO state moves to `In Progress` only when the user clicks `Start`, when any work order is in `In Progress or Done` state, or when any component is `picked`. For MOs without work orders, the `To Close` state will never be used. - Display all relevant MO states by default, except the `Cancel` state. For MOs without work orders, the `To Close` state is also not displayed. - Showing a `toaster` when the user tries to plan an MO without work orders or an MO that is already planned. - Hide unnecessary actions, buttons, and filters when the `Work Orders` option is disabled in the settings. - Update the `To Plan` filter to include only MOs with work orders. - Update test cases to maintain consistency with the changes. Enterprise PR:- odoo/enterprise#129971 TaskId-6453469
Quality control point forms are now clearer and easier to complete, with better title handling, inline options, and helpful placeholders. Work order planning popovers now show key assignment details, helping users understand responsibilities faster.
Original PR description
*= mrp_workorder, helpdesk_repair The improvement includes: - Use a large title input, remove the `New` heading, and display the title next to the reference after creation. - Display the `Apply to` options inline and rename `Quantity` to `Lot` in the `Control per` field. - Improve the QCP `quick create` by using the entered text as the `title` instead of the `reference`. - Add placeholders to the title and failure location fields. - Display the work center and assignee of the work order in the planning popover - Update the tests to reflect the removal of the `Under Repair` state. Community PR:- odoo/odoo#275310 Upgrade PR:- odoo/upgrade#10739 TaskId-6361476
Payslip forms now show worked day totals that exclude unpaid time, while keeping existing payroll calculations intact. This gives payroll users a clearer view of paid work without disrupting FTE or amount calculations that depend on total worked time.
Original PR description
Rework the previous reverted commit to keep old fields used in FTE and amount of worked_days_line, and add 2 new computed field that only count paid time. Task-6205747
The Sign field list now shows who created each field and provides useful search and grouping options. This helps users quickly find signature fields by name or linked record, and organize them by creator, related record, or allowed user groups.
Original PR description
In the fields list view, there was no way to tell who added a field, and the search bar offered nothing to search or group on. The list now has a "Created by" column, fields can be searched by name or by the record they are linked to, and grouped by creator, linked record, or the groups allowed to use them. task-6480123
Payroll correction handling has been improved for standard payroll and Belgian payroll processes. This should help payroll teams process correction proofs of concept more reliably and reduce manual follow-up in affected payslip workflows.
The replenishment page now updates more smoothly when users close related pop-up wizards, instead of reloading the whole page each time. This reduces interruptions and helps warehouse teams continue working faster.
Original PR description
Do not refresh the entire orderpoint page every time a wizard is closed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Belgian payroll declarations now calculate withholding-tax exemptions for eligible overtime hours and apply annual employee caps across the year. This improves compliance and reporting accuracy for companies using Belgian payroll, with updated XLS/PDF reporting and configuration for sector-specific limits.
Original PR description
Compute the withholding-tax exemption for overtime hours (natures 44–59) within the Belgian 274.XX declaration. Overtime worked-day lines are collected from validated payslips, bucketed by rate and sector (CP124/CP302/immovable work), and allocated to the appropriate nature codes while respecting each employee's annual hour cap. Hours already declared in earlier months of the same year are carried forward so the cap is enforced cumulatively. The exemption rate is stored as an updatable rule parameter. A white-cash-register flag on the company controls the higher cap for CP302 employees. New work-entry types, an XLS extra-hours sheet, a PDF section, and extended tests are included. Task Id: 5430988
The barcode app now opens serial and lot number generation in a dedicated screen instead of a pop-up dialog. This makes the workflow easier to use on mobile devices and keeps it more consistent with the rest of the barcode experience.
Original PR description
In the barcode app currently there's a dialog to generate serial/lot numbers. In this PR the dialog gets replaced by a view since it's easier for users on mobile devices. Task-5469775
The Project app search screens have been reorganized and cleaned up to make finding tasks and project information easier. This improves day-to-day navigation across Project-related areas such as timesheets, sales projects, sharing, and skills reporting without changing core business workflows.
Original PR description
In this commit, we refactor and clean the search view of Project. task-6516390
Call activities in the chatter now show the phone number from the related record, making it easier for users to place calls directly. Standard users get a normal phone link, while VoIP users continue to launch calls through the softphone, with shared handling across phone-related features.
Original PR description
[IMP] mail: display call activity phone numbers in the chatter
This was an enterprise VoIP feature: showing the phone number found on
the related record for call activities, in their chatter, and allowing
to call it by clicking on it.
This is now a standard feature. In standard, it is a `tel:` link. In
VoIP, it will still start a call through the softphone, as before.
[IMP] web, mail: merge activity/phone field code into 1 patchable point
The parent commit basically adds a VoIP feature to all call activities:
showing the phone number and being able to call it by clicking... this
is something the phone field widget also does. This commit factorizes
the code and makes it so VoIP can patch both points as an unique patch.
This also allows web_enterprise to patch both at the same time to add
the "Phone Install Dialog", suggesting VoIP installation to admins when
available.
task-6416875This update improves how Odoo retrieves bus notifications, especially when many notification channels are checked at once. It should reduce delays and server load for real-time updates while keeping behavior unchanged for users.
Original PR description
The `fetch_bus_notifications` method receives a dict mapping channels to be fetched to their `last_fetched_id`, producing several `channel_X = %s and id > %s` OR branches. Since [1], notifications…
The `fetch_bus_notifications` method receives a dict mapping channels to be fetched to their `last_fetched_id`, producing several `channel_X = %s and id > %s` OR branches. Since [1], notifications are fetched by DB, increasing the number of OR branches. Multiple ORs lead to O(n_row * n_groups) complexity as PostgreSQL has to walk through each OR branch for each row. A better approach is to JOIN the groups, which results in an O(n_row + n_groups) complexity: PostgreSQL first builds the hash table then can do a quick lookup for each row. This is an order-of-magnitude win for large batches, with a negligible difference for small ones. [1]: https://github.com/odoo/odoo/pull/278597 ------ Benchmark code, explain analyze for each case + plots: [benchmark.zip](https://github.com/user-attachments/files/31776770/benchmark.zip) Comparing old approach vs new approach with a growing amount of groups passed to `fetch_bus_notifications` on a 30k rows bus table. Median time over 50 run per batch. <img width="400" alt="bench_no_index" src="https://github.com/user-attachments/assets/e8c8dbee-ed1a-4941-867c-9ac0f251693a" />
Timesheet and invoice analytic records now automatically fill in missing sales and product details from related information. This makes reporting and grouping by product or sales order item more accurate for sales and service teams.
Original PR description
Analytic lines are missing two direct links that could be inferred from existing information: a timesheet has a sales order item and no product, and the analytic entries of an invoice have a product and no sales order item. With this PR, each side is filled in from what is already known Task-6486240
Customer lists now show reminder levels and include filters for overdue customers and reminder status. This helps teams quickly identify which customers need follow-up and prioritize collection activity.
Original PR description
- add reminder level column in partner list views - add overdue filter in partner search view - add reminder level in custom filters see odoo/enterprise#128176 task-6462889
The CRM team switcher is easier to use, with simpler team names and a new default option to view all sales teams. It now appears whenever multiple sales teams use opportunities, making it more consistent and less dependent on configuration settings.
Original PR description
Purpose ======= Improve the usability of the crm team switcher. Specification ============= 1) Removing the "Pipeline" prefix from the switcher title. Users will get that it's the specified team…
Purpose ======= Improve the usability of the crm team switcher. Specification ============= 1) Removing the "Pipeline" prefix from the switcher title. Users will get that it's the specified team pipeline. 2) The "multi-memberships" settings shouldn't impact the switcher visibility anymore. The team switcher is now visible as soon as there's at least 2 teams using opportunities in the DB. NB: The teams actually displayed in the switcher could be a subset of those depending on the current user rights. 3) Adding an "All Sales Teams" option at the top of the team switcher acting as default. The switcher will fallback to it when no team has previously been selected or when the previously selected team cannot be found. Selecting it will remove the team id filter from the domain and remove the "default_team_id" context key from the context. With this scenario, the default team on record creation will be set by the crm.lead "team_id" field compute which will call "_get_default_team_id" from the sales_team module. Task-6485445
The Saudi Arabia accounting template has been reorganized to use a clearer six-digit account numbering structure. This makes the chart of accounts easier to navigate, removes duplicate or obsolete entries, and leaves room for future account additions without disrupting the order.
Original PR description
Restructure the Saudi Arabia chart of accounts to follow the standardized 6-digit numbering convention adopted across recent localizations (account group / subgroup / identifier), reorganizing account ordering for a more logical flow within each category and leaving spacing between codes so new accounts can be inserted later without disrupting the sequence. - Removed 9 obsolete/duplicate accounts (incl. duplicate Withholding Tax Payable) - Added 30 new leaf accounts and 19 new parent/header accounts - Re-mapped codes for all retained accounts while preserving their external ids Related PR: https://github.com/odoo/upgrade/pull/11120 https://github.com/odoo/enterprise/pull/128987 task-6390722
Phone numbers on activities are now available more broadly, so users can click to call even when VoIP is not installed. When VoIP is installed, the calling experience stays consistent across activity links and phone fields, with fixes for mobile and desktop phone link behavior.
Original PR description
See community PR for summary of the feature: https://github.com/odoo/odoo/pull/281277
task-6416875Customer lists now show reminder levels and include filters for overdue accounts and reminder status. This helps teams quickly prioritize follow-up work and identify customers needing attention without extra manual checks.
Original PR description
- add reminder level column in partner list views - add overdue filter in partner search view - add reminder level in custom filters see odoo/odoo#282886 task-6462889