Daily updates from Odoo
Wednesday, August 19, 2026
59 changes
6 changes
Enhancements to existing features
Cached website generation requests now schedule a quick follow-up trigger instead of waiting or calling webhooks too early. This helps related notifications run reliably without tying up processing workers.
Original PR description
When a request is cached a webhook won't be called because if we did it immediatly it might arrive before the generator commited. And we don't want to delay the webhook call to not stall a worker just for that. So we simply scheldule a trigger if a request was cached. Forward-Port-Of: odoo/enterprise#128206
The Dutch payroll localization now includes the 2026 resident income tax rate values. This helps payroll calculations stay aligned with the latest tax rules for employees in the Netherlands.
Original PR description
Added 2026 values for the residents' income tax rates rule parameter. task-6462877 Forward-Port-Of: odoo/enterprise#127556
Users can now move through return items in the returns kanban view using the up and down arrow keys without triggering an error. This improves day-to-day navigation and prevents interruptions when reviewing or selecting returns.
Original PR description
In returns kanban view, a traceback occurs when pressing down. Fix this by adding the support for up/down keyboard navigation for returns selection. task-6281033 Forward-Port-Of: odoo/enterprise#128308 Forward-Port-Of: odoo/enterprise#125164
The default waiting time for certain web interface test checks has been increased from a very short window to 10 seconds. This reduces false test failures on busy machines without slowing successful test runs, improving confidence in automated quality checks.
Original PR description
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests…
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests give 10 seconds. 430 call sites in addons reach these three helpers and 29 pass an explicit timeout, so 12 frames is what the other 401 get. The problem is that 12 frames is less than what the client needs on a loaded machine. Measured on "should remove file from html editor if removed from attachment list", on the wait that follows the Full composer button: - 5 to 7 frames on an idle machine; - 11 to 18 frames over 8 runs with the machine at load 10 to 20, 5 of the 8 above the 12 frames the default allows. Those 5 are failing runs, and the same test at load 13 to 29 fails 6 runs out of 6 with the 200 milliseconds, 0 out of 6 with 10 seconds. Note that a longer timeout costs nothing on a green build: the wait ends on the frame the DOM matches, so it only delays the report of a test that was going to fail anyway. Hoot fails the test itself after 5 seconds, 15 in test_js.py, which keeps bounding a wait that never resolves. This commit raises the default to 10 seconds, the delay a tour step already gets in macro.js and the one contains() and expect.waitForSteps already have. https://runbot.odoo.com/odoo/error/946094 Forward-Port-Of: odoo/odoo#282702
Online shoppers can now select multiple values within the same product filter, such as choosing both Lenovo and HP while also filtering by storage size. This supports broader product searches and avoids unnecessary filter refreshes, making browsing more flexible and efficient.
Original PR description
Filters are now completely exclusive, which prevent 0 results but also prevents more "open" searches as "Lenovo" OR "HP" AND "512GB SSD". Stop updating the filters based on selected attribute values to avoid the extra product query and allow selecting non exclusive filters from the same attribute. task-6341310 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#273076
The update schedule for IoT boxes no longer runs on weekends. This helps ensure updates happen during support hours, reducing the risk of issues when help may be less available.
Original PR description
This PR removes weekend days from dynamic update for the iot boxes. This allows to follow the support availabilities Forward-Port-Of: odoo/odoo#282780
5 changes
Enhancements to existing features
The Dutch payroll module now includes the 2026 income tax rate values for residents. This helps ensure payroll calculations stay aligned with the latest statutory requirements for Dutch employees.
Original PR description
Added 2026 values for the residents' income tax rates rule parameter. task-6462877 Forward-Port-Of: odoo/enterprise#127556
The default waiting time for web interface test checks has been increased so tests are less likely to fail on busy machines. This improves the reliability of development and release validation without slowing successful test runs.
Original PR description
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests…
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests give 10 seconds. 430 call sites in addons reach these three helpers and 29 pass an explicit timeout, so 12 frames is what the other 401 get. The problem is that 12 frames is less than what the client needs on a loaded machine. Measured on "should remove file from html editor if removed from attachment list", on the wait that follows the Full composer button: - 5 to 7 frames on an idle machine; - 11 to 18 frames over 8 runs with the machine at load 10 to 20, 5 of the 8 above the 12 frames the default allows. Those 5 are failing runs, and the same test at load 13 to 29 fails 6 runs out of 6 with the 200 milliseconds, 0 out of 6 with 10 seconds. Note that a longer timeout costs nothing on a green build: the wait ends on the frame the DOM matches, so it only delays the report of a test that was going to fail anyway. Hoot fails the test itself after 5 seconds, 15 in test_js.py, which keeps bounding a wait that never resolves. This commit raises the default to 10 seconds, the delay a tour step already gets in macro.js and the one contains() and expect.waitForSteps already have. https://runbot.odoo.com/odoo/error/946094 Forward-Port-Of: odoo/odoo#282702
The Time Off configuration now displays the option to create a Calendar meeting when a leave request is approved. This makes the setting easier to find and helps teams control whether absences also appear in the Calendar app.
Original PR description
The `create_calendar_meeting` field on `hr.leave.type` allows users to choose if leave requests created with a given time off type generate a corresponding entry in the Calendar app. However, this field was not displayed on the form view. This commit adds `create_calendar_meeting` to the `hr.leave.type` form view inside the configuration section, along with dedicated help text explaining its behavior. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282698 Forward-Port-Of: odoo/odoo#280593
This PR removes weekend days from dynamic update for the iot boxes. This allows to follow the support availabilities Forward-Port-Of: odoo/odoo#282780
Original PR description
This PR removes weekend days from dynamic update for the iot boxes. This allows to follow the support availabilities Forward-Port-Of: odoo/odoo#282780
This commit adds both Python and JS unit tests for the Mollie POS payment method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282024 Forward-Port-Of: odoo/odoo#281742
Original PR description
This commit adds both Python and JS unit tests for the Mollie POS payment method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282024 Forward-Port-Of: odoo/odoo#281742
6 changes
Enhancements to existing features
The Dutch payroll module now includes the 2026 resident income tax rate values. This helps payroll calculations stay aligned with upcoming Netherlands tax requirements.
Original PR description
Added 2026 values for the residents' income tax rates rule parameter. task-6462877 Forward-Port-Of: odoo/enterprise#127556
The Point of Sale no longer waits for receipt printing to finish before completing order validation. This makes checkout feel faster for cashiers while keeping receipt printing available in the background.
Original PR description
- Stop awaiting the receipt print in the POS after order payment validation - Adapt tours to this behavior change task-id: 6425204 enterprise PR: https://github.com/odoo/enterprise/pull/127818 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282634 Forward-Port-Of: odoo/odoo#280002
Self-billing bills now keep numbering unique for each partner, improving traceability and reducing confusion in accounting records. Self-billing invoices can also be imported into dedicated sales journals, preventing regular sales journals from using the wrong numbering pattern.
Original PR description
This PR handles 2 cases : ===== PART 1 ===== Self-billing bill sequences should be unique per partner, as implemented in v19+. This PR backports that behavior to 17.0. ===== PART 2 ===== Previously, the `is_self_billing` option on `account.journal` was available only for purchase journals. This caused an issue when importing a self-billing invoice into a regular sales journal with quick edit mode (accounting firm) enabled. In such cases, the newly created invoices would use the self-billing sequence pattern, leading to traceability issues. This PR allows the creation of self-billing sales journals to prevent this issue. task-6103142 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282062 Forward-Port-Of: odoo/odoo#259935
This update adds automated tests for the Mollie payment option in Point of Sale, covering both the backend and the POS interface. It helps catch issues earlier and reduces the risk of payment-related regressions affecting customers.
Original PR description
This commit adds both Python and JS unit tests for the Mollie POS payment method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282024 Forward-Port-Of: odoo/odoo#281742
The IoT box update schedule no longer runs on weekends. This better matches support availability and reduces the chance of updates happening when help may not be available.
Original PR description
This PR removes weekend days from dynamic update for the iot boxes. This allows to follow the support availabilities Forward-Port-Of: odoo/odoo#282780
Revert the receipt tax summary design back to the 19.0 format, ensuring that the base amount is always displayed for each tax group. Before this commit, when all tax groups shared the same tax base, the base amount was hidden, leading to a flat tax listing. Now, the template always renders the tax groups in the format: "Tax [Name] on [Base Amount] [Tax Amount]" task-id: 6296906 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-
Original PR description
Revert the receipt tax summary design back to the 19.0 format, ensuring that the base amount is always displayed for each tax group. Before this commit, when all tax groups shared the same tax base, the base amount was hidden, leading to a flat tax listing. Now, the template always renders the tax groups in the format: "Tax [Name] on [Base Amount] [Tax Amount]" task-id: 6296906 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270749
3 changes
Enhancements to existing features
This change gives automated checks more time to wait for page updates before declaring a failure. It reduces false failures on busy machines without slowing successful test runs, helping teams get more dependable build results.
Original PR description
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests…
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests give 10 seconds. 430 call sites in addons reach these three helpers and 29 pass an explicit timeout, so 12 frames is what the other 401 get. The problem is that 12 frames is less than what the client needs on a loaded machine. Measured on "should remove file from html editor if removed from attachment list", on the wait that follows the Full composer button: - 5 to 7 frames on an idle machine; - 11 to 18 frames over 8 runs with the machine at load 10 to 20, 5 of the 8 above the 12 frames the default allows. Those 5 are failing runs, and the same test at load 13 to 29 fails 6 runs out of 6 with the 200 milliseconds, 0 out of 6 with 10 seconds. Note that a longer timeout costs nothing on a green build: the wait ends on the frame the DOM matches, so it only delays the report of a test that was going to fail anyway. Hoot fails the test itself after 5 seconds, 15 in test_js.py, which keeps bounding a wait that never resolves. This commit raises the default to 10 seconds, the delay a tour step already gets in macro.js and the one contains() and expect.waitForSteps already have. https://runbot.odoo.com/odoo/error/946094 Forward-Port-Of: odoo/odoo#282702
Some generic validation errors raised by core account models lack enough context to identify which record caused the issue, making FEC imports harder to troubleshoot. This commit improves the two error cases identified for this use case: - `account.account._check_account_code` now includes the invalid account code in the error message. - `account.move.write` now includes the move name/reference and displays human-readable field labels instead of technical field names when attempting to modi
Original PR description
Some generic validation errors raised by core account models lack enough context to identify which record caused the issue, making FEC imports harder to troubleshoot. This commit improves the two…
Some generic validation errors raised by core account models lack enough context to identify which record caused the issue, making FEC imports harder to troubleshoot. This commit improves the two error cases identified for this use case: - `account.account._check_account_code` now includes the invalid account code in the error message. - `account.move.write` now includes the move name/reference and displays human-readable field labels instead of technical field names when attempting to modify read-only fields on posted entries. Although motivated by FEC import, these are generic core validations, so the improvements are implemented at the source to benefit all callers rather than only the FEC import flow. Enrichment is scoped to the two cases above, other constraints/errors across these models are intentionally left unchanged for now, since editing core error messages more broadly should be done deliberately and on a case-by-case basis, not as a blanket rewrite task-5346068 Forward-Port-Of: odoo/odoo#281746
This PR handles 2 cases : ===== PART 1 ===== Self-billing bill sequences should be unique per partner, as implemented in v19+. This PR backports that behavior to 17.0. ===== PART 2 ===== Previously, the `is_self_billing` option on `account.journal` was available only for purchase journals. This caused an issue when importing a self-billing invoice into a regular sales journal with quick edit mode (accounting firm) enabled. In such cases, the newly created invoices would use the self-
Original PR description
This PR handles 2 cases : ===== PART 1 ===== Self-billing bill sequences should be unique per partner, as implemented in v19+. This PR backports that behavior to 17.0. ===== PART 2 ===== Previously, the `is_self_billing` option on `account.journal` was available only for purchase journals. This caused an issue when importing a self-billing invoice into a regular sales journal with quick edit mode (accounting firm) enabled. In such cases, the newly created invoices would use the self-billing sequence pattern, leading to traceability issues. This PR allows the creation of self-billing sales journals to prevent this issue. task-6103142 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282062 Forward-Port-Of: odoo/odoo#259935
1 change
Enhancements to existing features
The Amazon sales integration now uses Amazon's newer Orders API ahead of the old version being retired in 2027. This keeps order imports working reliably and should improve synchronization efficiency by retrieving order details in a more consolidated way.
Original PR description
Amazon has announced the deprecation of the Orders v0 API, with a removal date of March 27, 2027. In this commit, we migrate to the new v2026-01-01 API. This new version restructures how order data is queried and delivered, shifting from a multi-request architecture to a nested consolidated payload. This optimizes our sync performance by eliminating the N+1 query problem when fetching order items. Key changes: - Operation Consolidation: `getOrders` is replaced by `searchOrders`. Because Amazon now embeds orderItems directly inside each order object natively, we remove our secondary item-fetching loops. - Financial aggregation: Item prices, taxes, shipping, and discounts are no longer flat fields on the item but are centralized into a `proceeds` object. - Replacing of deprecated flags. - Reorganization of order-related fields. task-5972714 Forward-Port-Of: odoo/enterprise#126879 Forward-Port-Of: odoo/enterprise#114591
2 changes
Enhancements to existing features
This change increases the default wait time used by web interface tests so they are less likely to fail on busy or slower machines. It aligns these waits with existing test behavior and improves confidence in automated test results without affecting normal successful runs.
Original PR description
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests…
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests give 10 seconds. 430 call sites in addons reach these three helpers and 29 pass an explicit timeout, so 12 frames is what the other 401 get. The problem is that 12 frames is less than what the client needs on a loaded machine. Measured on "should remove file from html editor if removed from attachment list", on the wait that follows the Full composer button: - 5 to 7 frames on an idle machine; - 11 to 18 frames over 8 runs with the machine at load 10 to 20, 5 of the 8 above the 12 frames the default allows. Those 5 are failing runs, and the same test at load 13 to 29 fails 6 runs out of 6 with the 200 milliseconds, 0 out of 6 with 10 seconds. Note that a longer timeout costs nothing on a green build: the wait ends on the frame the DOM matches, so it only delays the report of a test that was going to fail anyway. Hoot fails the test itself after 5 seconds, 15 in test_js.py, which keeps bounding a wait that never resolves. This commit raises the default to 10 seconds, the delay a tour step already gets in macro.js and the one contains() and expect.waitForSteps already have. https://runbot.odoo.com/odoo/error/946094 Forward-Port-Of: odoo/odoo#282702
Peppol errors are now shown as separate, easy-to-read items instead of one technical line. Known error codes are translated into plain-language explanations so users can better understand the issue and what to do next.
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#276029 Forward-Port-Of: odoo/odoo#265253
33 changes
Enhancements to existing features
Belgian payroll now lets companies calculate meal vouchers based on eligible hours worked instead of only eligible days. The existing day-based method remains the default, while voucher amounts and employee contributions are shown per voucher for clearer payroll setup.
Original PR description
Before this commit: - Meal vouchers were only computed from eligible worked days. - The configured amounts were displayed per worked day. After this commit: - A Calculation Method allows choosing between Days and Hours. - Days remains the default and keeps the existing behavior. - Hours divides eligible worked hours by the daily hours of the employee's Working Hours Reference and rounds the resulting quantity. - Voucher values and employee contributions are displayed per voucher. - Fixed meal vouchers for company executives remain unchanged. Task-6427957
This update refreshes icons across manufacturing lifecycle, work order, quality, and barcode screens with a newer, cleaner visual style. The change improves visual clarity and consistency without altering business processes or functionality.
Original PR description
Icons were updated with the newer, more clean ones. task-6443360
Belgian payroll now warns HR teams when DIMONA declarations do not match employee contract version dates, categories, or joint committees. This helps catch payroll compliance issues earlier and reduces the risk of incorrect employment declarations.
Original PR description
add warning when DIMONA declarations don't cover the same date ranges as contract versions or when dimona category doesn't match between periods and versions. Task Id: 5951989
Employees with referral-only access can now view their own referral links in a read-only format, helping them understand how their shared links are performing. The Points menu is also available to these users, making referral progress easier to follow without granting extra editing permissions.
Original PR description
Before: - User having group: `User: Referral only` was only able to create a referral link but not able to track how there referral link is performing. After: - User will have read-only view for their referral links. - Points sub-menu will be visible to `User: Referral Only`. task: 6402714
The Belgian payroll configuration now includes the required reporting details for recoverable 0% overtime. This helps ensure overtime is classified correctly for social security, withholding tax, and official Belgian payroll declarations.
Original PR description
- Extended the OVERTIME26 work entry type with essential Belgian reporting metadata: category_ids (Remuneration, ONSS, Withholding tax bases), dmfa_code=1, and l10n_be_egov3_code=1102001. Task: 6358853
Customers booking appointments with related accessory products are now sent to the cart first, making it easier to add complementary items before checkout. If an appointment slot becomes unavailable while in the cart, it is removed automatically and the customer is clearly notified, helping avoid payment errors while preserving other valid bookings.
Original PR description
This PR improves the website appointment flow by adapting the checkout redirection when accessory products are present and ensuring proper cart validation for unavailable bookings. When an appointment type includes accessory products, users are now redirected to the cart page to look for complementary items before proceeding, with the button label updating dynamically. Additionally, any booking slots that become unavailable while in the cart are automatically removed during checkout validation, preserving other valid bookings and displaying a clear notification to the user. task-5975874
WhatsApp business accounts can now block repeat spam senders per account, helping teams reduce unwanted incoming messages. Staff can add numbers to a blocklist and manually block or unblock them from the form view, with Odoo syncing the action to WhatsApp automatically.
Original PR description
Purpose: Prevent incoming spam by blocking WhatsApp numbers that repeatedly send unwanted messages to the WhatsApp business account. Specifications: - Allow blocklisting WhatsApp numbers per WhatsApp account. - Creating a blocklist entry automatically triggers an API call to block the number on WhatsApp. - Allow manually blocking or unblocking numbers from the form view. Documentation: https://developers.facebook.com/documentation/business-messaging/whatsapp/block-users Task-5236975
Obsolete internal duplication logic was removed from Sales Subscription and Sales Renting to match the updated core product behavior. This reduces maintenance overhead and helps keep sales-related product handling consistent across Odoo.
Original PR description
Remove obsolete _duplicate_pricelist_rules_on_copy overrides from enterprise modules (sale_subscription, sale_renting) following its removal from the product module. This avoids dead code and ensures consistency with the updated core duplication behavior. task-5470688
The accounting reconciliation interface was updated to work with the newer OWL framework used by Odoo. This helps keep bank reconciliation and related accountant workflows maintainable and compatible without introducing major functional changes for users.
Original PR description
This pr will do some changes to be compliant with owl3. What has been done: - Change of some props to the new system - Remove use of useSubEnv - Remove use of onWillRender Also apply the EsLint on all files. task-6353237
Turkish companies can now generate reconciliation letters in Odoo using a format aligned with local legal expectations. The update adds bilingual letter content, address sections, closing text, and signature areas to reduce manual work and support audit readiness.
Original PR description
SPEC: - TR companies are legally required to exchange reconciliation letters (Mutabakat Mektubu) per TTK Article 94 to confirm outstanding balances with partners. - No standardized reconciliation letter exists in Odoo for Turkish localization, forcing manual off-system processes with reduced traceability. IMP: - Adjust customer statement report to comply with TR reconciliation letter format: title, address blocks, intro/closing messages (EN + TR), and signature blocks. - Provide Turkish translations for all letter content per legal requirement. Impact: - Turkish companies can generate and send legally compliant reconciliation letters directly from Odoo, eliminating manual workarounds and improving audit readiness. taskID-6121545
Cash-basis tax entries created from bank reconciliation can now be removed when payments are unreconciled, as long as accounting locks allow it. If removal is not allowed, the system keeps the safer reversal behavior and adds checks to warn users about sequence gaps that could affect tax return audits.
Original PR description
Problem --------- Currently, once a CABA move is created through the bank reco widget, it is impossible to draft/unlink it, the move can only be reverted. This leads to noisy journal when users unreco - reco their CABA payment. Do this a few times and it gets impossible to audit. Objective --------- The objectives of this change are as followed: 1. Allow for CABA moves to be unlinked once the payment is unreconciled. This is only allowed when the move is not locked behind HARD locks and tax lock. 2. In the case the CABA move is locked behind mentioned locks, revert it as it currently work. 3. Since the deletion/creation of moves can create holes in the CABA journal sequence (which is not really allowed in audits), it adds a Tax Return default check to warns the user in case of a hole sequence in the moves included in the Tax Return/End of the Year Statement. task-6226555
This update makes a small internal change in Web Studio’s report template handling to support future improvements. It does not introduce visible changes for users today, but helps keep reporting customization capabilities ready for upcoming enhancements.
Original PR description
Pass compile_context in parameters of `_compile_expr` to prepare future improvements in QWEB according to expressions. Task-6466187
Project budget information is now more accessible from project tasks and dashboards through a new Budgets tab. The project settings page is also cleaner because the Budget shortcut is hidden when no budgets exist.
Original PR description
- Add Budgets top-bar tab to project tasks and dashboards. - Hide the Budget stat button on the project settings page if zero budgets exist. task-5969230
Austrian small entrepreneurs can now use their domestic tax number when a VAT number is not available, allowing required Fiskaly registration and POS workflows to proceed. The update also improves an internal library patching mechanism to avoid issues when patched libraries need to read bundled data files.
Original PR description
Austrian Kleinunternehmer (small entrepreneurs) aren't issued a VAT number, only a domestic Steuernummer, but Fiskaly registration requires "vat" to be set. Add `l10n_at_stnr` on `res.company` and fall back to it wherever `l10n_at_pos` required "vat" like Fiskaly registration or else. Also fix patching a library's loader after import replaced it with a stand-in missing `get_resource_reader()`, breaking `importlib.resources` for any patched lib reading bundled data files. `exec_module` is now overridden on the loader instance instead. --- Task: https://www.odoo.com/odoo/project/1737/tasks/5993536
Spreadsheet list side panels now use the same drag-and-drop behavior and visual feedback as other spreadsheet areas. This makes reordering dimensions and sorting rules feel more consistent and easier to understand for users.
Original PR description
Current behavior before PR: - Dragging list dimensions and sorting rules felt visually different from pivot dimensions and global filters in the side panel. - The list side panel used a separate drag-and-drop utility that did not match the consistent UX of other spreadsheet components. Desired behavior after PR is merged: - List dimensions and sorting rules now share the same drag-and-drop behavior and visual feedback as pivot dimensions and global filters. - All reorderable items in the side panel now look and feel the same, providing a consistent user experience across the spreadsheet. - Use the `Section` component wherever applicable to keep the UI consistent. Task: [6219600](https://www.odoo.com/odoo/project/2328/tasks/6219600)
Employee document folders are now created directly in bulk instead of being recreated unnecessarily or processed one by one. This improves setup and payroll document organization performance, especially for companies with many employees.
Original PR description
* Employee folders could be unnecessarily recreated * Payroll folders were created one by one Temporary PR related to #127973 Task-6344800
Spreadsheet-related automated tests were updated to align with the move to Material Symbols icons in the spreadsheet library. This helps keep quality checks reliable after the visual icon system change, with no expected direct impact on daily users.
Original PR description
this commit adapts the tests to the switch to Material Symbols icons in the external library o-spreadsheet. Task: 6276321
Users can now use a middle click on the expand button in signing-related form dialogs to open the form in a new browser tab. This makes it easier to keep the current workflow in place while reviewing or editing a related form separately.
Original PR description
This commit adds the ability to detect a middle click on the Expand button to the Dialog API. This is achieved through the `t-custom-click` directive. The expand callback function that is given to the Dialog API, will now receive two parameters: the event and whether it's a middle click. Note that, the custom directives and the global values used for the `t-custom-click` are mandatory for each Owl app. This commit also uses the new API to allow the FormViewDialog and x2ManyFieldDialog form dialogs to expand to a new tab. task-id: 5429014
Online bank synchronization can now automatically reconnect when a connection breaks. This reduces manual follow-up for users and helps keep financial data imports running more reliably.
The signing activity is renamed from "Request Signature" to "Signature Request" so users see wording that matches the rest of the app. The activity icon is also muted to better align visually with other activity icons, creating a more consistent experience.
Original PR description
Renaming activity from "Request Signature" to "Signature Request" to better align with the wording used in other places. Change the template icon to muted to better match the other activities icons. Task-6317051
The Point of Sale navigation menu now displays icons and labels with consistent alignment and spacing. This makes the burger menu and LNA button easier to read and improves the overall visual clarity for users.
Original PR description
In this commit - ------------------------------- icon and label in the burger menu and LNA button are now properly aligned with consistent spacing for better visibility. Task-6391440 Related PR-https://github.com/odoo/odoo/pull/280203
Kitchen staff can now see the course sequence for self-order and kiosk orders in the preparation display. This makes those orders consistent with restaurant point-of-sale orders and helps kitchens prepare items in the intended order.
Original PR description
Following this commit: ==== - Course sequence would also be visible in kitchen display for self-order/kiosk same as pos_restaurant. task-6255005 Related PR : https://github.com/odoo/odoo/pull/269216
Time off that falls in a period already covered by a payslip is now handled automatically instead of requiring manual deferral by HR. This reduces payroll corrections, avoids complex conflicts between overlapping absences, and adds extra approval safeguards for past leave that can affect validated payroll.
Original PR description
Currently when a time off is created for a period already covered by a payslips, a time off officer needs to differ it manually but if there is a conflict with another time off it's too complex to be deferred. In that case the initial payslips should be reverted and then a new one should be created.
The Frontdesk Partnership homepage has been redesigned to better match the existing Frontdesk card-based experience. Visitors can now enter barcodes directly from the card or start camera scanning immediately, making check-in smoother and more intuitive.
Original PR description
In this PR, we have improved the homepage design to provide a more consistent and intuitive user experience: * Kept the card-based design consistent with the Frontdesk app and added an option to manually enter the barcode directly within the card. * When tapping the barcode option, the camera now opens directly for barcode scanning, removing the need for manual barcode entry from the scanning flow. Task-6364852
The signing process now handles PDF updates more carefully, allowing multiple signatures on the same document while keeping the original file structure intact. This improves reliability and supports more complex signing workflows without unnecessarily changing untouched pages.
Original PR description
Refactor PDF signing to use the incremental merge workflow, allowing multiple signatures per document while preserving the original PDF structure. Overlays are now merged incrementally, and only edited pages are updated. This improves consistency in the signing pipeline and supports more complex signing scenarios. task-5426461
The accounting dashboard now avoids repeated bank institution lookups when several unconfigured bank journals are shown. This makes the dashboard become usable faster and reduces stalls when the bank synchronization service is slow.
Original PR description
An accounting dashboard with a dozen unconfigured bank journals took seconds to become usable, and stalled entirely whenever the synchronization proxy was slow to answer. The server resolves the journal to its company and keys the proxy request on that company's fiscal country, and the widget is only rendered for journals of the active company, so the journal argument selected a company that was already known. The hook now sends one request per active company and hands the resulting promise to every widget that asks for it, dropping the journal argument along the way. The fetch also moved from the widget's start to its mount. The shared promise resolves immediately for every widget but the first, and the grid sizes itself from the width of a container that is only laid out once the card is in the DOM.
Payroll run reporting for UAE companies now uses metrics tailored to local payroll needs rather than a generic view. Salary rule and category updates also help payroll teams review UAE pay runs with information that better matches their business requirements.
Original PR description
The payrun metric for AE companies has been modified in order to adapt the payrun to the localization requirement instead of a generic view to cater for the business and payroll officers needs. Moreover few changes have been introduced to salary rules and categories. Task: 6326637
The Ecuador ATS reporting tests were updated to match a platform-level change in how certain grouped results are ordered. This keeps automated checks aligned with the intended behavior and helps prevent false test failures without changing business functionality.
Original PR description
Following changes to the ORM methods _read_group_orderby and _order_field_to_sql, query results are now ordered according to the sequential definition of selection fields (if ordered by a selection field ofc). Adapt the tests to take this new ordering into account. Related: odoo/odoo#280940 Task: 6425647
Payroll teams can now set dashboard warnings relative to today, making urgent warnings appear at the top as time moves forward. Email alerts skip these rolling Today-based warnings to avoid sending the same notification every day.
Original PR description
Dashboard warnings are grouped and sorted by their warning date, and every existing Closing On option anchors to a payrun, a contract, or a calendar boundary. Today is added as the first choice so a warning can sit at the top of the dashboard. The offset applies as usual, so the row reads "N days After Today". The reference moves with the clock, so the distance is constant. _cron_payroll_warning_email_alert skips Today warnings: its (today - warning_date).days == email_alert_days check is constant for them and would otherwise re-send the alert daily. task-6456127
Desktop users can now add call flow nodes by simply clicking an item in the palette, matching the easier mobile behavior. Drag and drop remains available, but it now starts only after the pointer moves far enough, reducing accidental drags and making flow editing smoother.
Original PR description
In the call flow editor, nodes can currently be added by dragging them from the desktop palette onto the canvas. On mobile, selecting a node from the dropdown adds it directly to the center of the canvas. Allow desktop users to get the same behavior by clicking a palette item. Keep drag and drop available by starting it only after the pointer has moved beyond a small threshold. task-6472451
The Colombian electronic invoicing app now has updated demo data and a clearer contact view for DIAN-related information. Demo mode is enabled by default for the demo company, making it easier for users to test and demonstrate the workflow safely.
Original PR description
Updating some demo data and adjusting DIAN partner view. DIAN demo mode is now default for the demo company. task-6454347
The attendance Gantt view now shows the same information bar already available in the calendar view. Managers can quickly see total worked hours, extra hours, and remaining hours in one place when reviewing attendance schedules.
Original PR description
The information bar which was being displayed in the Calendar view will now also be shown in the Gantt view with: - Total Worked Hours - Extra Hours - Left Hours (from hr_holidays_attendance) **task-6259363**
The Belgian payroll employee type previously labeled "PFI/Activa" has been renamed to "PFI/IBO". This makes the label more accurate for regional training contracts in Wallonia and Flanders and avoids confusion with the unrelated Activa scheme.
Original PR description
The employee type "PFI/Activa" is incorrect because Activa is not related to Dimona Category IVT. Renamed "PFI/Activa" to "PFI/IBO" to properly reflect the Belgian regional training contracts (PFI in Wallonia, IBO in Flanders). Task: 6478957
3 changes
Enhancements to existing features
Adds a dedicated view for French e-reporting accounting entries so users can see relevant reporting details more easily. This avoids changing the standard accounting entry view while improving visibility for France-specific compliance workflows.
Original PR description
This commit will add a new view for the ereporting moves to be able to see some specific info without touching the base move view. task-6274213 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The default waiting time used by some web test helpers has been increased so tests can better cope with slower or busier machines. This should reduce false failures in automated testing without affecting normal successful runs.
Original PR description
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests…
Before this commit, waitFor, waitForNone and waitUntil gave the DOM 200 milliseconds, which the loop turns into 12 animation frames, while contains() and expect.waitForSteps sitting in the same tests give 10 seconds. 430 call sites in addons reach these three helpers and 29 pass an explicit timeout, so 12 frames is what the other 401 get. The problem is that 12 frames is less than what the client needs on a loaded machine. Measured on "should remove file from html editor if removed from attachment list", on the wait that follows the Full composer button: - 5 to 7 frames on an idle machine; - 11 to 18 frames over 8 runs with the machine at load 10 to 20, 5 of the 8 above the 12 frames the default allows. Those 5 are failing runs, and the same test at load 13 to 29 fails 6 runs out of 6 with the 200 milliseconds, 0 out of 6 with 10 seconds. Note that a longer timeout costs nothing on a green build: the wait ends on the frame the DOM matches, so it only delays the report of a test that was going to fail anyway. Hoot fails the test itself after 5 seconds, 15 in test_js.py, which keeps bounding a wait that never resolves. This commit raises the default to 10 seconds, the delay a tour step already gets in macro.js and the one contains() and expect.waitForSteps already have. https://runbot.odoo.com/odoo/error/946094
In France, some drom-com (Guadeloupe, Martinique and Réunion) needs to use pdp just like France. So we should add those 3 for the computation of `peppol_eas`, so it will autocomplete to **France FRCTC Electronic Address**. task-6344558 Forward-Port-Of: odoo/odoo#278272
Original PR description
In France, some drom-com (Guadeloupe, Martinique and Réunion) needs to use pdp just like France. So we should add those 3 for the computation of `peppol_eas`, so it will autocomplete to **France FRCTC Electronic Address**. task-6344558 Forward-Port-Of: odoo/odoo#278272