Friday, September 11, 2026
135 changes · master
Security fixes and vulnerability patches
Sales quotes will no longer be confirmed just because any payment succeeds. This prevents very small or incorrect payments from triggering an order confirmation, while still allowing flexible payment links and clearer payment amounts in the customer portal.
Original PR description
Partial revert of da720a8563570a6c0860699d0a542dfa2ee3c392. The automatic confirmation on first payment is error-prone since forged requests could lead to a confirmed SO with a 0.1cents payment regardless of whether a payment link was issued with the given amount. Keep requiring the prepayment amount for SO confirmation, while keeping the payment links open for any amount. Adapt the portal SO views so that the payment amounts are correctly displayed in most situations. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
New functionality added to Odoo
Field Service managers can now plan daily work using a combined map and timeline view, making it easier to balance routes, locations, and schedules at the same time. The two panes stay synchronized for folding, hovering, routes, stop numbers, and resource colors, reducing confusion during dispatch planning.
Original PR description
Introduces a new "Map Timeline" view for Field Service (Maps > Timeline), combining a map and a Gantt timeline side by side so managers can plan daily interventions from both a spatial and a temporal angle at once, grouped by resource, with inherited features (create, edit, drag-and-drop, buffer times, routing, etc.) preserved in both panes. On top of the base view, the map and timeline are also kept coherent with each other: - folding a resource group in one pane folds it in the other, including the "Open Shifts" and "Shifts to assign" groups - hovering a pin, a pin group, or a shift highlights its counterpart(s) across the map and the Gantt, as well as their side panels - hovering a pin group also highlights its route on the map, with stop numbers shown along it - resource colors (including materials) stay consistent across the Gantt, the map pins, and the map side panel task-6273718 Co-authored-by: Maxime de Neuville (mane) <mane@odoo.com>
Enhancements to existing features
The attendance menu now shows a more compact review, with details expanded only when needed, making it easier for employees and managers to use. The kiosk also keeps users on the break entry screen when a break is too long, so mistakes can be corrected immediately without starting over, and break totals now match the attendance records shown.
Original PR description
This PR brings a few improvements to the attendance review of the systray so that it takes less room and only details an attendance on demand. It also fixes the break duration of the kiosk: 1. Enable "Break Management on Checkout" in Settings > Attendances and open the attendance kiosk 2. Identify as an employee to check in, then identify again to check out 3. On the goodbye screen, click "Add my break times" and enter a duration longer than the attendance that was just closed 4. Confirm -> the error is shown but the kiosk has already gone back to its main screen, so the break has to be entered again from scratch With this PR, the duration is checked against the attendance before being sent and the dialog stays open until it fits. Task-6542050
Resolved issues and error corrections
The website theme color editor now keeps edit buttons visually stable when users navigate with the keyboard. This prevents a small but distracting layout jump, improving usability and polish in the website editor.
Original PR description
Steps to reproduce: - Open the website editor. - Open the theme color picker. - Focus an edit color preset button with the keyboard. => The button shifts when it receives focus. Before this commit, a transparent border reserved space outside focus. Since [1], the focus indicator uses a `box-shadow`, so that border disappeared on focus and changed the button size. After this commit, the obsolete border is removed and the button keeps a stable size when focused. [1]: 8f41224083f198c5d86cdf6f43824b42bdc73d36 task-6259086
Features or functions removed from Odoo
The Winbooks import feature has been removed from Odoo. This matters for businesses that previously relied on this import option, as they will need to use another supported way to bring Winbooks accounting data into Odoo.
Original PR description
removing account_winbooks_import task-id: [6560446](https://www.odoo.com/odoo/project/967/tasks/6560446)
Code cleanup and technical improvements
Updated internal spreadsheet component setup to use the current supported approach for handling component inputs. This helps keep the spreadsheet experience maintainable and reduces the risk of future compatibility issues, with no expected functional change for users.
Original PR description
Replaced deprecated uses of `static props` with calls to `useProps()`, providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.Adds a French annual report template aligned with the official Plan Comptable Général format, helping companies prepare the required reporting document in Odoo. The update also reuses information already available in fiscal declarations to reduce duplicate data entry and make the report more practical to complete.
Original PR description
The French companies have to submit a report containing a lot of info on their business. That report format is dicted by the Plan Comptable Général (PCG), Titre VIII. This PR adds a new knowledge article template for the Annual Report in accounting, following the format described by the PCG. Heavily helped by AI. task-6349733
Odoo Social now supports direct messages for Facebook and Instagram pages, making it easier for teams to manage private customer conversations from social channels. Businesses can also use AI assistance to respond when operators are unavailable, while respecting Instagram messaging rules and account requirements.
Original PR description
Purpose ======= Support direct messages for Facebook and Instagram pages. For Instagram, we have 24h to respond to a user, we also need to inform the Instagram user that he's talking to an automated…
Purpose
=======
Support direct messages for Facebook and Instagram pages.
For Instagram, we have 24h to respond to a user, we also need
to inform the Instagram user that he's talking to an automated
agent when it's the case. Only professional account are supported.
See https://developers.facebook.com/docs/instagram-platform/instagram-api-with-instagram-login/messaging-api/
When a message arrive, we fetch the last messages to get the user / LLM
some context of the previous conversation. One limitation for Instagram,
when fetching the message, we can get only the 20 last messages.
See: https://developers.facebook.com/docs/graph-api/reference/v25.0/conversation
Like `ai_livechat`, we can configure an LLM to answer to the user
(if no operators are available, etc). For traditional live chat, the
visitor has a button "Ask Human". This is not possible for all media,
so the LLM has a tool and it can ask a human when it's necessary.
Configuration Facebook
======================
Configure the webhook URL in the settings of the application
("Messenger" -> "Messenger API Settings" -> "Configure webhooks")
Configure the verify token in the settings of Odoo / IAP with the value
you want (you will need to use the same token in the Facebook
application settings).
Enter
- "<url of the database>"/social_facebook/webhook
- "<url of IAP>"/api/social/facebook/1/webhook
Then subscribe to the "messages" and "message_reactions" in the list.
The permission `pages_messaging` and `pages_manage_metadata` are needed.
Configuration Instagram
=======================
For Instagram, we need to setup the callback URL in "Messenger -> Instagram Settings",
the configuration is very similar to the Facebook steps.
Task-5948062Adds support for automatically issuing simplified invoices during Spanish eCommerce checkout. This helps Spanish online stores apply the right invoicing flow and only request VAT details when an order exceeds the simplified invoice limit.
Original PR description
This commit introduces the logic to automate issuing simplified invoices during the E-commerce checkout process. task-6090096 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
Employee leave records can now be accessed directly from employee information in the Time Off area. This supports related business processes that need to read leave data without relying on payroll components.
Original PR description
Allows to read it (without payroll). See enterprise PR. Task-6344800
Adds support for India's GST Composition Tax Scheme for eligible businesses, including company registration settings, composition tax rates, and purchase tax handling where input tax credit is not allowed. It also updates GST reporting and hides features that do not apply to composition taxpayers, such as e-Invoicing and HSN validations.
Original PR description
Previously, only the regular GST scheme was supported. India also provides the Composition Tax Scheme for eligible taxpayers, including goods suppliers with an annual turnover of up to ₹1.5 crore and service providers with an annual turnover of up to ₹50 lakh. This commit adds support for the Composition Tax Scheme. Added features: - Add a GST registration type and composition tax rate on the company. - Add composition purchase taxes, as taxpayers under the Composition Scheme cannot claim Input Tax Credit (ITC), and the tax amount must therefore be included in the cost of goods. - Add the `sale_composition_supplies` GSTR section for composition supply sales move lines. - Add a new `composition` value to `l10n_in_tax_type` for composition taxes. - Hide features that are not available under the Composition Scheme, such as e-Invoicing and HSN validations. ent:https://github.com/odoo/enterprise/pull/121367 upg:https://github.com/odoo/upgrade/pull/11250 task-3637966
The website AI assistant can now review external webpages to gather text, images, and screenshots for better page creation. It also saves externally referenced AI images into Odoo attachments when pages are saved, improving reliability and ownership of generated website content.
Original PR description
Added a new ai tool that allows the website ai agent to access webpages. It has the option to receive the text, images and screenshot for each indiviual page. The tools allow the ai agent to take inspiration from existing pages, provide appropriate sources and thanks to images tend to make the end result prettier. Since the ai will copy external image urls into the html, a new process has been added to download and save the images as attachments. This happens on all tagged images (all images produced by the ai are automatically tagged) when a page is saved. This works thanks to an async call to the website scraper server, this is the reason behind the new 'external' tool confirmation mode. Since the call is async, we need a way to resume the conversation once the result is finished. Since this process can be long (1-2 minutes), we hide the composer to prevent user from sending new messages while this is happening. Task: https://www.odoo.com/odoo/project/974/tasks/6143475
Indian GST Composition Scheme users can now access the CMP-08 and GSTR-4 returns and related reports in Odoo. The system also checks a company’s GST registration type so the relevant returns and reports are shown only when applicable.
Original PR description
As support for the Composition Tax Scheme is being added, this commit introduces the necessary reports and returns for CMP-08 and GSTR-4. It also includes checks for returns and ensures that reports and returns are available based on the company's GST registration type. com:https://github.com/odoo/odoo/pull/271318 upg:https://github.com/odoo/upgrade/pull/11250 task-3637966
Adds support for Pakistani retailers to report paid POS orders to the Federal Board of Revenue in real time through Odoo. Receipts and invoices now include the required FBR invoice number and QR code, helping businesses meet local fiscal compliance requirements.
Original PR description
Description of the issue/feature this PR addresses: The Federal Board of Revenue (FBR) requires Pakistani retailers to report every POS sale in real time and print the returned fiscal invoice number…
Description of the issue/feature this PR addresses: The Federal Board of Revenue (FBR) requires Pakistani retailers to report every POS sale in real time and print the returned fiscal invoice number and QR code on the receipt. This PR adds l10n_pk_edi_pos to implement this for the Pakistani localization. Current behavior before PR: Odoo POS has no FBR integration: orders are not reported to the tax authority and receipts carry no FBR invoice number or QR code. Desired behavior after PR is merged: Each paid POS order is submitted to the FBR through the IAP proxy. The FBR invoice number and QR code are stored on the order and printed on the receipt and customer invoice; invoicing stays blocked until the order is reported. Refunds, the FBR service fee, 3rd Schedule products, buyer NTN/CNIC reporting and a sandbox mode are supported, all configured from the Point of Sale settings. task-4426796 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The ESG app now replaces the former project-based approach with dedicated policies, actions, and targets, making sustainability work easier to structure and track. These items are also reflected in VSME and CSRD reporting templates, helping businesses align operational ESG plans with reporting requirements.
Original PR description
task-5253296
Odoo Sign now lets each signer apply their own itsme qualified electronic signature to documents, instead of relying only on the company seal. This strengthens signer attribution and supports stricter legal signing flows, while preserving existing signatures as documents move through each signing step.
Original PR description
Lets each signer sign the document with their own itsme® qualified certificate, producing a qualified electronic signature (QES) attributable to the signer instead of the company seal alone. In sign,…
Lets each signer sign the document with their own itsme® qualified certificate, producing a qualified electronic signature (QES) attributable to the signer instead of the company seal alone. In sign, the completed document is now built as a chain of incremental updates over the original bytes and sealed once at the end, so the signatures already applied stay valid. The model `sign.completed.document` becomes `sign.request.document`, a working copy that belongs to one request and carries the file through its whole life. A signer can now sign the document themselves (using external service), which puts the request in a strict signing order so that every signature covers the contributions made before it, and freezes the file while their signature is being produced before it is embedded or discarded. Because such a signature attests values that must not move under it, the flow is guarded on every side. The signer reviews the frozen bytes before their signature is collected. An answer changed afterwards gives the pending attempt up instead of signing content that is no longer current. The authentication of a role can no longer change once its turn has started, and a request can only hold one working copy per document. Those working copies and the signatures they carry are read only for sign users and they are removed together with the request. Signing for everyone in one session is refused if at least one signer signs the document externally, because each of them has to sign in person. In `sign_itsme`, a new signing role produces the signature with itsme®, charged in itsme® credits. Unlike the identity check it cannot be skipped when credits are missing, because here the qualified signature is the signature itself. A signer can sign several documents of the same request in one itsme® action (up to 70 documents). `sign_emsigner` is adapted to the incremental flow. --- task-4951149 Depends on odoo/odoo#253372 (incremental PDF signing utilities) and on the "generalize PDF signing with incremental merge" PR this branch is stacked on, #110345.
Website editors can now choose a rounded icon style in addition to the existing outlined and sharp options. The setting is easier to understand with added guidance, loads only the selected icon font for better efficiency, and now applies consistently in the media dialog.
Original PR description
[IMP] web, website: add rounded icon style for the website --- __Before this commit__ The user could only choose between Outlined and Sharp icon style fonts. __After this commit__ - The rounded…
[IMP] web, website: add rounded icon style for the website --- __Before this commit__ The user could only choose between Outlined and Sharp icon style fonts. __After this commit__ - The rounded Material Symbols style font is added as a choice in the website builder. - The option is moved to the *Advanced* section since it's a once in a website lifetime change. - Some tooltips are added because the differences are subtle, especially at small font sizes. [IMP] web, website: fetch only a single icon style font in the frontend --- __Problem__ It's possible to choose the icon style in the Theme tab of the website builder. However, all the Material Symbols style fonts are currently fetched regardless of which is selected. __Fix__ Add a `_get_icon_font_family` method on the website that allows to retrieve which icon style is used and call this method to replace the font asset with the right one. [FIX] html_editor, website: use website icon font in Media dialog --- __Problem__ It's possible to choose the icon style in the Theme tab of the website builder. However, the icons inside the Media Dialog aren't reflecting the icon style of the current website. __Fix__ Pass the current document to `IconSelector` to retrieve the current icon font family and use this font for the Media Dialog icons.
The Sales menu has been reorganized to reduce clutter and make commonly used options easier to find. This improves navigation across sales, delivery, loyalty, and eCommerce-related areas, helping users work more efficiently.
Original PR description
*: delivery,loyalty,sale,sale_loyalty,sale_management,
website_sale,website_sale_loyalty
Sales menu was cluttered with too many things. This change is meant to simplify it.
task-6523967Employees using both Attendance and Timesheets now see a more compact systray menu with better-organized tabs and actions. The update also prevents both tab contents from appearing at the same time after checking out and back in, making the experience clearer and less cluttered.
Original PR description
This PR brings a few improvements to the systray of an employee who has both the attendance and the timesheets features, reorganising its tabs and the actions around them to take less vertical room. It also fixes the tabs themselves: 1. Enable both the attendance and the timesheets systray for an employee and check them in 2. Open the systray and go to the "Attendance" tab 3. Unfold the running attendance, set a "Check Out" and save -> the employee is checked out, so the tabs disappear, as expected 4. Click "Check in" without closing the systray -> the tabs are back but the "Timesheets" and the "Attendance" panes are displayed one under the other With this PR, the active tab is tracked by the component instead of the bootstrap tab plugin, which cannot keep up with panes that come and go. Task-6542050
The Sales and Rental apps now have cleaner menus, with commission options simplified and rental promotions grouped together. This makes it easier for users to find related sales, rental, and promotion features with less menu clutter.
Original PR description
As an extension of the sales menu simplification we also grouped the Promotions in the Rental app. Community PR: https://github.com/odoo/odoo/pull/285971
Bank reconciliation users can now select one or more lines and specify the amount to assign to each account. This gives accounting teams more flexibility and accuracy when splitting or matching statement lines.
Original PR description
This commit will add a new feature to be able to have a set account where we choose the amount we want to set. Clicking the line will do a basic set account. Selecting the line will enable the edit on the amount, and so you will be able to select multiple lines and choose an amount for each. task-6307681
Time-off accrual plans can now be linked to work entry types and working schedules, making it easier to compensate employees for extra worked days. When work exceeds the company reference schedule, the system can automatically create the appropriate accrual allocation, reducing manual HR adjustments.
Original PR description
Task#6360628
Field-level access groups defined in code are now shown in the Access Rights tab, matching what the system already enforces behind the scenes. This improves transparency for administrators reviewing model fields and prevents confusion when configuring or auditing access rights.
Original PR description
**Purpose**: Fields defined in Python with a groups attribute (e.g., `test_field = fields.Char(...,groups='base.group_user')`) did not display associated groups in the "Access Rights" tab, although access was enforced at runtime. **Specification**: Display the group(s) under the Access Rights tab of `base.view_model_fields_form`. To do this, a new method `_reflect_field_groups()` reads the groups attribute from base fields, finds the real group from the XML ID, and populates the `ir_model_fields_group_rel relation`. task-4285741 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Buying, manufacturing, and subcontracting routes are once again managed at the warehouse level, so products can be prepared for these flows by adding the relevant vendor or bill of materials instead of manually selecting routes. This simplifies day-to-day product configuration while related automated tests were updated to match the intended behavior.
Original PR description
In this [PR](https://github.com/odoo/odoo/pull/223685), the Buy, Manufacture and Resupply Subcontractor on Order routes were made warehouse routes to simplify product configuration. Adding a vendor…
In this [PR](https://github.com/odoo/odoo/pull/223685), the Buy, Manufacture and Resupply Subcontractor on Order routes were made warehouse routes to simplify product configuration. Adding a vendor or a BoM is enough to make a product ready to buy or manufacture, without manually selecting the corresponding route on the product. Later, this [PR](https://github.com/odoo/odoo/pull/274672) made the ORM check the comodel domain when linking records to x2many fields and set `product_selectable` to [True](https://github.com/odoo/odoo/pull/274672/changes/c758a2dcd9ecf464ca8b9aa8f19dfadf30bf4755#diff-e018fe59e11c4e0078e9bc19879f9e98c731bb84c71766ef360ccc482c59d2d8), making these routes available for selection on the product form again. This commit makes routes as warehouse routes [again](https://github.com/odoo/odoo/pull/280682/changes#diff-e018fe59e11c4e0078e9bc19879f9e98c731bb84c71766ef360ccc482c59d2d8L393) to simplify product configuration and updates the affected tests to explicitly enable `product_selectable` when they need to assign a route to a product. Enterprise PR:- https://github.com/odoo/enterprise/pull/126863 TaskId:- 6442488
Existing payroll accrual plans now include the appropriate work entry type information introduced by a related payroll model update. This helps ensure leave and accrual data stays consistent across localized payroll setups for supported countries.
Original PR description
Populate the work entry type field on existing accrual plans following its addition to the accrual plan model in the related community commit. Task#6360628
Point of Sale now applies employee role permissions more consistently across planning, settle-due, appointment, barcode lookup, sales planning, and UrbanPiper-related screens. This helps businesses limit sensitive actions to authorized staff and reduce operational mistakes at checkout and order management.
Original PR description
**= planning, settle_due, urban_piper Following this commit: ==== - Restricted POS features based on the employee's assigned role. task-6317141 Community PR : https://github.com/odoo/odoo/pull/284182 Upgrade PR : https://github.com/odoo/upgrade/pull/11117
AI agents can now create and update automations more reliably, with clearer validation, previews, and run logs. Agent profiles also get a broader avatar set and more consistent first-person descriptions, while a preview crash for empty selection fields is fixed.
Original PR description
Add a dedicated ai_tool_create_update_automation tool so agents manage base.automation records without going through the generic create/update tools: it takes model and field names instead of ids,…
Add a dedicated ai_tool_create_update_automation tool so agents manage base.automation records without going through the generic create/update tools: it takes model and field names instead of ids, validates the trigger and the ai_action_prompt against the target model, and shows a single preview instead of one per underlying record. Log automation runs properly in their own chat: post a kickoff note with field placeholders resolved to the record's actual values instead of their labels, log "has run <automation>" when triggered from the chat, and steer the agent to update the right automation when asked to change one. Forbid Markdown in ai_action_prompt (the field only renders HTML) and fall back to converting it when the model writes it anyway. Ship the full agent avatar set: 3 silhouettes x 5 colors x 8 job roles, under a consistent AvatarN-<Color>[-<Role>] naming. An agent gets a random silhouette on creation; picking a role via the Self Update skill redraws it in the same color and number. Rewrite the standard agent subtitles in the first person, and align the Self Update skill so agent-generated subtitles follow the same voice. Fix a crash in ai_tool_update_records's preview when a Selection field being updated is currently unset (e.g. res.partner.type, ai.agent.avatar_role): field._selection[value] raised a KeyError on a falsy value instead of falling back to displaying "None". task-6512101
Bank statement imports in CAMT, OFX, and QIF formats now populate transaction details with a clearer, formatted view of the imported values. This helps accounting users review imported bank transactions more easily and consistently with CODA imports.
Original PR description
Fill the `transaction_details` field as we do with coda to display a well formated version of the values. task-4744298
AI agents can now build their knowledge from attachments, documents, knowledge articles, and web pages without first copying everything into attachments. This makes the AI knowledge system more flexible, improves cross-source answers, and avoids showing not-yet-processed content in search results.
Original PR description
Before, `ai.embedding` was geared specifically towards `ai.agent.source` and its attachments: every source had to materialise an `ir.attachment` before it could be vectorised, and RAG retrieval could…
Before, `ai.embedding` was geared specifically towards `ai.agent.source` and its attachments: every source had to materialise an `ir.attachment` before it could be vectorised, and RAG retrieval could only look at one model at a time. This PR generalises the embedding layer so that any model can be embedded and retrieved, and converts the existing source types to use it. ### `ai.embedding.mixin` New mixin owning the `embedding_ids` one2many and the embedding lifecycle. A model inheriting it implements the hooks: content extraction, chunking (tabular-aware), duplicate detection by checksum, domain of the records to embed, and the embedding models to use. Embedding creation is cron-driven, which supersedes `_update_sources_status`. `ai.embedding` itself loses `attachment_id`/`checksum` and gains `res_model`/`res_id`, so a chunk can point at any record. ### Direct embedding of every source type | Source | Before | Now | |---|---|---| | Attachment | embedding logic carried by `ir.attachment` | `ir.attachment` inherits the mixin | | Document | copied into an attachment, then embedded | `documents.document` embedded directly | | Knowledge article | HTML extracted into an attachment | `knowledge.article` embedded directly | | Web page | fetched into an attachment | `ai.web.page` embedded directly | The attachment-copy flows (`_sync_sources_content`, `_recreate_attachments_for_sources`) are dropped. Each model only picks up the records actually linked to an agent source. ### Retrieval - `_get_similar_chunks` now takes a `target_by_model` mapping instead of a single `res_model`, so one similarity search spans embeddings of heterogeneous models. `ai.agent.source._get_rag_target` is the overridable hook returning the (model, id) pair a source is embedded through, and `_get_models_map` builds the mapping. - Chunks whose `embedding_vector` is still NULL are excluded from retrieval. Their similarity was NULL and `NULLS FIRST` is the default for `ORDER BY ... DESC`, so between the creation of a source and the next cron run they outranked every genuine match and took all the `top_n` slots. ### Citations Inline citations reference `ai.agent.source` ids instead of attachment ids, and the link rendering is delegated to `_get_source_link`, implemented per source type (attachment/url in `ai`, document in `ai_documents_source`, article in `ai_knowledge`) instead of a hardcoded `/web/content` URL. The prompt instructions are updated accordingly. ### Also in this PR - `ai.agent.source.type` becomes a computed field, derived from whichever record field is set (`attachment_id`, `web_page_id`, ...). - `ai_app` accepts `.md` files as agent sources: the allowed extensions are extracted into a single `allowedExtensions` getter used both by the file input `accept` attribute and by the client-side validation. Markdown attachments are indexed as plain text, so no server-side change is needed. task-6283960 Upgrade PR: odoo/upgrade#10929
Test coverage was updated across manufacturing, quality, rental, inter-company sales, and subscription stock flows to match recent changes in warehouse-specific routing. This helps ensure business processes continue to select the correct warehouse routes consistently after related platform updates.
Original PR description
*: sale_{mrp_renting, purchase_stock_inter_company_rules, stock_renting, subscription_stock}
Update the test cases stay consistent with community changes.
Community PR:- https://github.com/odoo/odoo/pull/280682
TaskId:- 6442488Approval requests no longer require approvers to act in a predefined sequence, so any assigned approver can approve when ready. This removes waiting statuses and next-approver handoffs, making approval workflows faster and less dependent on a strict order.
Original PR description
Previously, there was a sequence or ordering in approvals, the user was not able to approve if it is order hasn't come yet. 1 - Sequence field is deleted, there is no waiting status anymore. 2 - Setting the next approver mechanisms are dropped Test: Unit test to check random ordering in approvals task-6563332
Odoo Box actions are now kept for 24 hours instead of 3 hours. This gives teams more time to investigate and troubleshoot issues from the previous day, improving support and debugging without changing day-to-day user workflows.
Original PR description
We now keep obox actions for 24h instead of 3h to be able to debug until one day after. Forward-Port-Of: odoo/enterprise#130965
Payroll runs now open directly on the payslips step, removing the previous multi-step flow and making payroll processing more direct. Key payroll actions have been moved to the main toolbar, with list and kanban views updated to keep important status, journal, and action information easy to access.
Original PR description
This PR aims to to completely remove the payrun steps logic (which could be visualized as bubbles in the header of any payrun views). Instead of having the `versions -> time -> payslips` flow, we now…
This PR aims to to completely remove the payrun steps logic (which could be visualized as bubbles in the header of any payrun views). Instead of having the `versions -> time -> payslips` flow, we now always end up on the payslips step by default, which is now the only step left! The payrun button used to validate/mark as paid/pay the payrun has been moved next to the "New" button at the top right corner. Since it relied on a custom compiler and rendering context, we had to move all of that from the payrun layout/payrun mixing to the payrun control panel. Other minor UI changes have been introduced, such as: - Added the states and the journal button in the payrun list view - Added back the action buttons (the one needing a custom compiler) on the kanban view cards - Added some columns on the payrun list view - Added back the paid time off allocation wizard - Added a variant to the t-menu of the kanban cards (that gets generated to a PayRunButtonBox) to make its three vertical dots render as a "More" button instead. - etc. (see the task's escalidraw) task-6486910
Odoo’s PayPal integration now supports guided seller onboarding, more local and alternative payment methods, and saved payment details for eligible merchants. This helps businesses activate PayPal faster, offer customers more ways to pay, and support repeat or subscription-style payments more easily.
Original PR description
**[IMP] payment_paypal: add seller onboarding via OAuth** First party Integrated Sign-Up enables partners to integrate the seller onboarding into their software allowing to seamlessly and securely…
**[IMP] payment_paypal: add seller onboarding via OAuth** First party Integrated Sign-Up enables partners to integrate the seller onboarding into their software allowing to seamlessly and securely onboard sellers before activating PayPal payments. In this commit, we integrate First party Integrated Sign-Up to Odoo. --- **[IMP] payment_paypal: add payment methods** We currently only support PayPal Wallet, but PayPal can also be integrated as a regular payment provider, offering many payment methods, and worldwide coverage. In this commit, we add the following payment methods: - Via PayPal's JS SDK: Pay Later, Venmo, and Advanced Credit and Debit Cards. - Via Orders API: Bancontact, BLIK, EPS, iDEAL, Multibanco, MyBank, Przelewy24, and Trustly. We also migrate PayPal Wallet integration from JS SDK to Orders API to uniformize the look of payment methods through different payment providers. --- **[IMP] payment_paypal: add tokenization support** Before this commit, customers had to re-enter their payment details for every PayPal transaction, and merchants could not charge them offline (e.g., for subscriptions or invoice follow-ups). This commit introduces the ability to tokenize PayPal Wallet and PayPal-provided cards. Tokenization is available if the merchant's account has the advanced vaulting capability enabled. We also handle the case where PayPal creates the vault asynchronously, generating the token via a webhook rather than the immediate checkout response. --- task-6095035
Work entry categories are simplified so unpaid work entries use a clearer single “Unassimilated” category where relevant. This improves HR payroll classification, reporting, and search by aligning categories, DMFA codes, and related filters more consistently.
Original PR description
Purpose: Currently in the system, we have categories for `Unpaid and unassimilated` and `Unpaid and assimilated` but we only need one category because if the time type is paid, it's assimilated by default. So we only need to have a category for `Unassimilated` to differenciate between unpaid types. - removed category `Unpaid and Assimilated` - renamed category `Unpaid and Unassimilated` to `Unassimilated` - corrected category and dmfa code on some work entry types - added a filter for assimilated work entries and allowed to search with dmfa code and salary rule categories - added an `Unassimilated` for some work entry types that become unassimilated after 9 or 12 months task-id: 6478968 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves how Odoo handles social media direct messages through Discuss and Live Chat, including conversations that arrive when no operator is available. It also makes failed message sending clearer for users by showing the reason for the failure and improves several messaging views for easier customization.
Original PR description
Purpose ======= Improve the form view of the mail guest Move code from the controller to the model to be able to re-use it in enterprise. Allow to change reaction on mail message without specifying…
Purpose ======= Improve the form view of the mail guest Move code from the controller to the model to be able to re-use it in enterprise. Allow to change reaction on mail message without specifying the emoji (in Facebook / Instagram, we can react only once per message, and when we remove the reaction, we don't know the emoji). When posting a message on discuss, if an error occurred, we can retry to send the message. But in some cases, it's useful to know why it failed, and so we show the error message. Allow creating a channel without operator. For social, we would like to be able to create a channel without operator. For website, we don't show the chat button if no operator (human, script, AI) are available, but for social, users can send messages when no operators are available. For the chatbot script, we have a related archived partner, same for AI. So we skip the creation of the member if we have no operator partner. Set the "left channel" message as "notification type". Improve the view of the live channel. Task-5948062
The status bar design has been refined to better align with Odoo's new Frost visual layout. This improves visual consistency in web and mail views without changing business workflows.
Original PR description
This commit refines the status bar styling to better match the new Frost layout. task-6545990 Requires: - https://github.com/odoo/enterprise/pull/130906 | Before | After | |--------|--------| | <img width="366" height="53" alt="Screenshot 2026-09-10 at 11 28 04" src="https://github.com/user-attachments/assets/7602ff8d-ae89-4232-b01e-20d60c93f6e8" /> | <img width="377" height="49" alt="Screenshot 2026-09-10 at 11 27 45" src="https://github.com/user-attachments/assets/93efa0af-ec4a-4d57-b15d-f1c71ec7567f" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Belgian payroll tax reports now use a configurable mapping table instead of hard-coded payroll rules. This makes it easier for support teams to update fiscal reporting logic, including reports 281.45 and 273S, without requiring code changes.
Original PR description
l10n.be.281.mapping: one row per (year range, tag, declaration), pointing at a salary rule, a python expression, or a sum of other rows. 281.45 and 273S are both rebuilt on it. Adding a rule to a report is a data change Salary rule and total links are real relations now (many2one/many2many). Also added a Fiscal Nature field on hr.salary.rule showing which mapping rows use it, and a debug-only menu so support can edit the mapping table directly. Task 6413391
Belgian payroll now makes employee seniority easier to manage by grouping related information and allowing a custom fictive hire date. End-of-collaboration notice durations can also be adjusted manually, helping HR teams better reflect individual employment situations.
Original PR description
- Moving seniority information in dedicated group under employee Payroll tab. - New fictive hire date field in orer to use a custom seniority. - Using year + month to set seniority at hire. - Notice duration manually editable in end of collaboration wizard. Task: 6381058
Belgian payroll now uses one clearer “Unassimilated” category for unpaid absence types, removing duplicate classification. This improves payroll reporting accuracy by correcting relevant work entry categories and DMFA codes, and makes it easier to find assimilated or unassimilated entries.
Original PR description
Purpose: Currently in the system, we have categories for `Unpaid and unassimilated` and `Unpaid and assimilated` but we only need one category because if the time type is paid, it's assimilated by default. So we only need to have a category for `Unassimilated` to differenciate between unpaid types. - removed category `Unpaid and Assimilated` - renamed category `Unpaid and Unassimilated` to `Unassimilated` - corrected category and dmfa code on some work entry types - added a filter for assimilated work entries and allowed to search with dmfa code and salary rule categories - added an `Unassimilated` for some work entry types that become unassimilated after 9 or 12 months task-id: 6478968
The Partners filter in accounting reports now shows how many partners or partner categories are selected. This makes it easier for users to see active report filters at a glance without opening the filter menu.
Original PR description
Before this commit: In partners related reports, there was no way user can know if there are any partners and partner categories selected or not in Partners filter without opening the Partners filter. After this commit: In Partners filter, display number of partners and partner categories selected if any selected or else display "Partners" like before. [task-6504449](https://www.odoo.com/odoo/my-tasks/6504449)
The Belgian advance payment return screen now shows the relevant checks directly and includes the payment setup within the same view, reducing the need to open a separate wizard. Users also receive a clearer warning when a missing VAT number would prevent correct payment communication.
Original PR description
Embed the advance payment return wizard into the return/checks view The advance payment return view previously did not display any checks and only allowed opening a separate configuration wizard. task-5490631
The status bar has been visually refined to better align with Odoo's new Frost layout. This creates a cleaner, more consistent interface for users without changing business workflows or functionality.
Original PR description
This commit refines the status bar styling to better match the new Frost layout. task-6545990 Requires: - https://github.com/odoo/odoo/pull/287341 | Before | After | |--------|--------| | <img width="356" height="58" alt="Screenshot 2026-09-10 at 11 28 14" src="https://github.com/user-attachments/assets/3cc9e02c-6f53-4664-87e3-f3a76f9f88c7" /> | <img width="357" height="55" alt="Screenshot 2026-09-10 at 11 27 41" src="https://github.com/user-attachments/assets/d3b5dd06-14cd-458d-bf3f-aca472670df4" /> | | <img width="358" height="51" alt="Screenshot 2026-09-10 at 11 28 24" src="https://github.com/user-attachments/assets/b3170dec-d103-49f7-93d4-471dc57fdaee" /> | <img width="356" height="59" alt="Screenshot 2026-09-10 at 11 27 27" src="https://github.com/user-attachments/assets/6786bb28-a174-482c-9d6c-7bb52c78cef8" /> |
Tax return types can now store separate profit and loss accounts for small rounding differences in tax closing entries. This prepares the accounting setup for a later update that will automatically reconcile differences between declared tax report amounts and cleared tax account balances.
Original PR description
Add two company-dependent accounts on account.return.type holding the rounding difference of the tax closing entry (a profit and a loss account), together with their configuration on the return type form. These fields are introduced on their own, ahead of the freeze. An upcoming task, merged after the freeze, computes the tax closing entry from the tax report and reconciles the difference between the amount the report declares and the balances actually cleared from the tax accounts onto these two accounts. Landing the fields now lets that later change stay purely functional, without a model addition on a post-freeze branch.
Spanish balance sheet and profit and loss reports now better match the official Spanish accounting plan. The update adds abbreviated report formats and corrects existing full and SME versions, helping Spanish companies produce more accurate statutory reports.
Original PR description
Spanish PGC defines three distinct balance sheet and profit and loss reports: full, abbreviated and PYMES(SMES). Until now this module only had the pymes and full report data. This commit adds the abbreviated and corrects the full and pymes reports which were not updated to the accounting spanish plan. A matching entry for the abbreviated balance sheet was added to test_balance_sheet_balanced.py
This update improves Odoo VoIP reliability when users receive calls across multiple browser tabs or devices, reducing duplicate call records and missed rings. It also adds QR-code setup for Linphone mobile calling and exposes a protected recovery payload so phone service tenants can be rebuilt if accidentally deleted.
Employee, payroll, and project document folders are now created and connected to the right business records automatically, reducing setup gaps and manual synchronization. HR and payroll access now relies on role-based groups, so new officers can access the relevant company folders without extra updates, while uploaded documents are linked to the correct employee or project more reliably.
Original PR description
### HR refactor Every feature of the HR bridges had to check `documents_hr_settings` and the existence of the company folder before doing anything. Those guards were fragile, easy to forget, and made…
### HR refactor Every feature of the HR bridges had to check `documents_hr_settings` and the existence of the company folder before doing anything. Those guards were fragile, easy to forget, and made the bridges harder to extend. As recently done for the other bridges, an installed bridge is now always used: the "Employees" folder of a company is required and created with it, and every employee of an active company gets their folder(s). Sharing relies on functional groups rather than on a copy of the HR (resp. payroll) officers on each folder, so a new officer reaches the folders of their companies without any resynchronisation. All payroll documents now end up in the employee's Payroll folder, which belongs to documents_hr_payroll alone. ### Documents mixin for employees and projects Employee and Project *folders* are now also linked to the record they belong to and documents inherit that link from their parent folder. Therefore, documents uploaded in such folders will automatically be linked to the record. Task-6344800 Task-6310302
Invoices and sales orders in the South Korea localization can now record the proof of issuance used for each transaction, such as tax invoice, credit card, or cash receipt. This improves VAT report accuracy and reduces manual setup by using customer or vendor defaults while simplifying the tax list businesses need to manage.
Original PR description
South Korean tax law classifies each transaction under a specific proof of issuance (세금계산서, 계산서, 신용카드, 현금영수증, ...), and which VAT report box a transaction is reported under depends on that…
South Korean tax law classifies each transaction under a specific proof of issuance (세금계산서, 계산서, 신용카드, 현금영수증, ...), and which VAT report box a transaction is reported under depends on that classification, not just on its taxes. Add `l10n_kr_issuance_type` to `account.move` so this can be recorded per invoice and used to drive VAT report generation. Since a given customer or vendor typically uses the same proof of issuance across transactions, add `l10n_kr_default_issuance_type` on `res.partner` (under Customer Invoices) so users don't have to pick it manually every time. `sale.order` carries the same field and passes it along when an invoice is created from the order, so issuance type can be set from the Sales app without needing access to Accounting. Also add: - `l10n_kr_edocument_number` on `account.move`, next to Customer Reference, to record the e-document number issued for the transaction. - South Korea's Tax ID label (`res.country.vat_label`) as "BRN" (Business Registration Number), matching local terminology. Now that proof of issuance is tracked separately, the `account.tax` templates no longer need one tax per rate/issuance-type combination: collapsed ~64 taxes (e.g. separate `10% TI`, `10% CR`, `10% Card` sales taxes) down to ones keyed only by rate and nature (standard, zero-rated, exempt, fixed-asset, non-deductible, deemed/recycled input VAT, ...), carrying just the base VAT tag. `general_tax_report.xml` and `simplified_tax_report.xml` were updated to derive their per-issuance-type boxes from `l10n_kr_issuance_type` on the move directly instead. [task-6216393](https://www.odoo.com/odoo/my-tasks/6216393)
Website shoppers can now search for products by barcode, including variant barcodes and barcodes on single-variant products. Matching searches take users directly to the relevant product or variant page, making product lookup faster and reducing friction for barcode-driven workflows.
Original PR description
Barcode search was not supported on the website product search, making it difficult to find products directly using their barcode values. This update adds support for searching products using: - Variant barcode - Single-variant product barcode The search now redirects users to the matching product or product variant page. Additionally, the Barcode and Reference fields are kept visible on product templates even when variants exist. task-6213261 For upgrade PR see : https://github.com/odoo/upgrade/pull/10895
Email composers can now choose whether to include the standard notification header. This helps businesses send simpler, cleaner emails when the default header is unnecessary.
Original PR description
When sending emails, we sometimes don't want to include the default header to keep the email clean and simple. This commit adds the email_notification_allow_header field to the mail composer to control the header visibility. Task-6065493
Website tours can now be marked inactive instead of being deleted. This helps teams keep old or temporarily unused tours available for later while preventing them from appearing in searches or starting automatically.
Original PR description
Allows disabling a tour without deleting it, so it no longer shows up in searches or gets suggested/played automatically. Task-id: 6563776
Korean VAT reports now alert users when invoices or bills in the filing period are missing proof of issuance, helping prevent transactions from being left out of the return unnoticed. The update also completes VAT return setup for general and simplified taxpayers with the correct filing periods.
Original PR description
The VAT report boxes now dispatch on `l10n_kr_issuance_type` rather than on the taxes alone, so an invoice or bill left without a proof of issuance (발행 증빙) belongs to no box at all and silently disappears from the return. Nothing on the report itself signals this, so a user could file a return missing entire transactions without ever noticing. Attach a custom handler to both VAT reports raising a warning when moves of the period are missing the field, with a link to the offending records so they can be fixed before the return is closed. While at it, complete the return types, which were only stubbed: - Rename `kr_tax_return_type` to "VAT Return" and give it the trimester deadline periodicity general taxpayers actually file on. - Add the yearly "VAT Return (Simplified Taxpayer)" type for the simplified report. [task-6216393](https://www.odoo.com/odoo/my-tasks/6216393)
Users can now download a fiscal declaration template, fill it in, and import the data back into the French fiscal reporting workflow. Existing declaration values are included in the template, making updates easier and reducing manual re-entry.
Original PR description
This commit will add a way for users to import data into the fiscal declaration. For that, we give a template that the user has to follow. If the user already has value in a line, it will be put in the template. task-5914069
Belgian companies can now record their NSSO immatriculation date in payroll settings. The payroll dashboard warns users when this date is missing, helping ensure first-hire reductions can be checked correctly.
Original PR description
The NSSO immatriculation date is required to properly check the first hires reduction for Belgian companies. This change adds the NSSO immatriculation date to the company and a warning to the payroll dashboard if that date is not set. task-6527410
Users who are allowed to create products can now use barcode lookup to create products without needing administrator access. This makes inventory and barcode workflows more consistent with existing product creation permissions.
Original PR description
Currently, the barcode lookup functionality is available only for users with administrator right. However, in user access rights we have a setting that allows users to be able to create products without being admins. Due to that, even if user can create a product from Inventory or other apps, they are not able to do it via barcodelookup. This commit ensures that such users are able to create products. task-6005042
The website generator has been updated to use the latest snippet package for Odoo 20. This gives users access to refreshed and newly available website building blocks when generating websites.
Original PR description
Updated the version number to get the updated and new snippets
This update records failures when automatic cancellation of Mexican electronic invoicing documents cannot be completed. This gives support and accounting teams better information to investigate cancellation issues without changing the user workflow.
Original PR description
In the current state, when an edi document is set to cancelled, the journal entry will attempt to cancel. However, if the cancellation throws a `UserError`, the flow simply continues. This PR adds a logger call to record the failure and help investigate the potential causes. Forward-Port-Of: odoo/enterprise#123511
UK reporting is being prepared to better support companies that operate with multiple legal entities. This update adds the underlying company settings needed for a later rollout, with no immediate change expected for day-to-day users.
Original PR description
These fields will be used in another branch (#[12854](https://github.com/odoo/enterprise/pull/128542)2) that will be merged post-freeze.
Czech invoicing now supports a dedicated QR code method and lets companies set a preferred QR code option on customer or vendor records. When an invoice is created, the partner preference is applied automatically, helping streamline payment setup and reduce manual choices.
Original PR description
- Introduce a new QR code method for Czech localization. - Make the 'qr_code_method' field of account.move compute stored. - Add a QR code method field to partners. - Automatically apply the partner's QR code method to the invoice when configured. task-[6024259](https://www.odoo.com/odoo/project/967/tasks/6024259)
Invoices can now show a partner's company registry identifier when no valid VAT number is available. This helps businesses include the best available official identification on invoice documents across affected localizations.
Original PR description
Adding functionality for displaying multi ID of "Company Registry" type for partners that do not have a valid VAT provided, if available. task-6152210 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Manufacturing work centers can now have their own barcode. This makes it easier for shop floor users to quickly select the right work center by scanning it, reducing manual selection time and potential mistakes.
Original PR description
This commit adds a `barcode` field on workcenter model. The purpose is to be able to scan it to select the workcenter in Shopfloor. task-6545274 **Enterprise PR**: odoo/enterprise#131006
This change makes system logs display the actual clock time even when tests simulate a different date or time. It helps teams reviewing runbot logs understand when events really happened and better analyze long-running test behavior.
Original PR description
When using faketime the logs are not showing the real time but the faketime one which can be confusing when listed in the runbot interface. Before the usage of the JSONFormatter, the logs were using the PostgreSQL time, which is the real time. This restores the previous behaviour. Having the faked time oustide JsonFromater is also painful: long running faketimed tests end up with most of their logs stamped to nearly the same real date, preventing any analysis of execution time based on the logs. One drawback of this change is the inability to identify at first sight whether a log was faketimed or not, but at this point it is just a tradeoff, and the faked_created field on the record still allows getting this info if needed. Forward-Port-Of: odoo/odoo#287455 Forward-Port-Of: odoo/odoo#287159
The accounting dashboard has been simplified to focus on the most useful indicators, with clearer receivable and payable cards and more direct links to relevant audit views. Margin reporting and sales/purchase graphs were adjusted for more accurate, easier-to-read business insights, while dashboard cards were improved for tablet layouts.
Original PR description
[IMP] account: improve dashboard KPIs - redirect some cards directly to their relevant audits - split receivable and payable into separate cards and redirect them to open items with receivable or payable selected accordingly - remove the net margin card to make the dashboard less overwhelming for the users and to keep only the important kpi cards - change the gross margin formula to use cost of revenue instead of expenses becuase this is the accurate one, using expenses here was not correct - simplify sale and purchase graphs to show monthly totals - enhance journal cards responsivity to show two cards per row for ipad screen size - highlight the invoice layout setup card task-[6526878](https://www.odoo.com/odoo/project/967/tasks/6526878) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Companies can now choose whether customers receive confirmation emails when field service shifts are published. This helps reduce unnecessary notifications for long-running projects while still allowing businesses to keep emails enabled and customize the template when needed.
Original PR description
- Publishing a shift always sends a confirmation email to the customer. This is too noisy for long-running projects (e.g. construction). - Add a company-specific setting (enabled by default) to control whether the email is sent and which template is used. Archiving or deleting the selected template disables the option. task-6420326
Planning now includes standard, morning, afternoon, and night shift templates by default. This helps new users get started faster by reducing the manual setup needed when configuring schedules.
Original PR description
Add standard, morning, afternoon, and night shift templates by default to make the initial Planning setup easier. task-6180740
Adds an option to generate sample live-location data for field service planning when demo data and debug mode are enabled. This helps teams showcase and test the live map with located resources, without affecting normal users.
Original PR description
This commit adds geolocation to some resources so to show their live location on the live map. task-6460606
Invoice templates for Mexico and Peru were adjusted to stay compatible with the updated shared invoice layout. This helps localized invoices continue to render correctly when using the newer template structure.
Original PR description
Adjusting Enterprise l10n templates to work with updated main template. task-6152210
Shop floor users can now scan a workcenter barcode to quickly select the correct workcenter. This reduces manual selection steps and helps operators move faster with fewer selection mistakes during production.
Original PR description
Allow the user to scan a workcenter barcode to select the workcenter in shopfloor.. [Task 6545274](https://www.odoo.com/odoo/project/966/tasks/6545274) Community PR: odoo/odoo#287683
Users can now open related records shown in embedded list sections in a full page view. This makes business tools like search filters, grouping, export, and bulk actions available without extra configuration.
Original PR description
Before this commit, the records of an x2many could only be consulted through the sub view embedded in the form. The search panel, the groupbys, the export and the multi-record actions are features of a full blown action, and none of them was reachable from there. After this commit, every x2many displayed as a list gets a button in the header of the table, next to the optional columns dropdown, which opens its records in an act_window on the comodel. It is a property of the field itself, so it comes for free on all of them, without any widget or option in the arch. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Belgian payroll now uses the standard work location setup for DMFA location units, reducing duplicate configuration and making payroll reporting easier to maintain. This helps companies keep Belgian social security reporting aligned with employee work locations more consistently.
Original PR description
task-6476798
Mobile calendar navigation is smoother because scrolling and swiping are now kept separate, reducing accidental day changes and jittery movement. The update also improves mobile layouts for calendar headers, sync status, and the homeworking location wizard, including clearer employee setup guidance when needed.
Original PR description
[IMP] calendar,hr_calendar: UX improvements Several smaller ux improvements: - Updated the homeworking location wizard to work with mobile view - Updated header and sync status for mobile view - In…
[IMP] calendar,hr_calendar: UX improvements Several smaller ux improvements: - Updated the homeworking location wizard to work with mobile view - Updated header and sync status for mobile view - In the worklocation wizard, if the user doesn't have a linked employee_id but has the rights to set one, they now see a button redirecting them to the employees view [IMP] web: prevent scrolling and swiping at the same time In the calendar view on mobile devices, if the user starts scrolling vertically and then switches to horizontal swiping, both motions are triggered at the same time, leading to some very janky movements. When scrolling up/down, the swiper input is very sensitive to left/right motions, which means you can very easily accidentally swipe to the next day when scrolling The idea behind this change is to: - scroll down or up OR left or right - NEVER both at the same time This commit introduces an `axis lock` which only enables scrolling in one direction at a time. Test changes: The drag called in tests performs an initial movement to start up the dragging motion. This motion can happen on either axis, which can trigger the axis lock before the actual drag we want to test happens. The change to the test removes this initial motion. When calling navigate, the swipe was performed from (0, 0) to the middle right of the target element. This introduced a significant Y offset to the drag, and was considered a vertical scroll. With this update, we start the swipe in the center of the element to ensure a ~0 Y delta. Task-6396805
This update combines the usual work location group with the work location information in the HR app. It makes employee location details easier to manage and reduces confusion for HR users.
Original PR description
task-6476798 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
Loyalty programs can now set an expiration period for earned points, helping businesses manage outstanding rewards more accurately. Customers can see when their points expire, and the system uses points nearing expiration first so balances better reflect usable rewards.
Original PR description
Loyalty points had no expiry, and `loyalty.history` was only a log kept beside the balance: `loyalty.card.points` was a stored column, and the rows recorded what an order earned and spent without either side being authoritative. Expiring points needs to know which points are which, so the history becomes the balance itself. `points` is now computed from it, and a row records one movement in one direction. A line spending points links to the award it draws from, so it stops counting once those points expire, and a spend with no award behind it never expires. Awards are drawn from oldest expiry first, so the points closest to lapsing are used before the ones that are not. Programs of type `loyalty` gain an `expire_after` delay in days, and the portal shows the customer when each award expires. task-4711900 Enterprise PR: https://github.com/odoo/enterprise/pull/125634 Upgrade PR: https://github.com/odoo/upgrade/pull/10869
Support, website support, and subscription loyalty flows were updated to keep working correctly after loyalty card points became calculated on demand rather than saved. This helps ensure coupon generation and subscription-related loyalty behavior continue to show accurate point information without disrupting users.
Original PR description
_* = helpdesk_sale_loyalty, website_helpdesk_sale_loyalty. adapt as the field `points` on `loyalty.card` is non-stored. task-4711900 Community PR: https://github.com/odoo/odoo/pull/206048 Upgrade PR: https://github.com/odoo/upgrade/pull/10869
Kanban cards now show a complete highlighted border when users hover over them, including in grouped views. Document cards have also been visually aligned with the standard Kanban card style for a more consistent interface.
Original PR description
Prior to this commit, there was a border issue when hovering a grouped Kanban card: the entire border was not always emphasized on hover. This commit ensures that the entire Kanban card border is…
Prior to this commit, there was a border issue when hovering a grouped Kanban card: the entire border was not always emphasized on hover. This commit ensures that the entire Kanban card border is consistently highlighted on hover. It also updates the Documents card border to align its design with the general Kanban card design. task-6517831 | Before | After | |--------|--------| | <img width="415" height="435" alt="Screenshot 2026-09-07 at 10 20 47" src="https://github.com/user-attachments/assets/b40e4614-954f-4d7b-94cb-e0a9b629def8" /> | <img width="416" height="433" alt="Screenshot 2026-09-07 at 10 21 55" src="https://github.com/user-attachments/assets/de112c8a-aa7c-4583-8127-3de1a099bda8" /> | | <img width="342" height="242" alt="Screenshot 2026-09-07 at 10 20 59" src="https://github.com/user-attachments/assets/99320ea4-aae4-44aa-b2c4-ed2b6582a99a" /> | <img width="341" height="243" alt="Screenshot 2026-09-07 at 10 22 02" src="https://github.com/user-attachments/assets/ae5e32fd-9221-40eb-baf8-2fb4f0341536" /> | | <img width="688" height="267" alt="Screenshot 2026-09-07 at 10 21 06" src="https://github.com/user-attachments/assets/2f5196f3-b557-4422-9113-1679f5296e9a" /> | <img width="679" height="261" alt="Screenshot 2026-09-07 at 10 22 15" src="https://github.com/user-attachments/assets/67de11bb-8706-4992-87a2-9b9b91c99143" /> |
The appointment calendar share option has been moved into the main control panel menu on mobile. This removes an extra bottom sheet, making the mobile calendar experience simpler and less cluttered for users.
Original PR description
Moving the button to the control panel removes the extra bottom sheet from the mobile view. Instead, the button is shown only with the vertical dots menu in the control panel Task-6396805
The HR module removes older wage helper logic to streamline how contract wage information is handled. This is an internal cleanup that should make the system easier to maintain without changing everyday HR workflows.
Original PR description
Task-5043999
The delivery planning Gantt view for fleet-related stock operations has been improved to make scheduling easier to read and manage. This helps teams coordinate delivery batches and fleet resources more efficiently.
Original PR description
WIP task-6542620
Field service planners can now use a combined map and schedule view to see where jobs are located alongside their timing. This makes it easier to coordinate technician assignments, routes, and availability in one place.
Original PR description
Proof of Concept: this commit introduces a customization of the map view that combines a map and a gantt views for planning field service. task-6273718
Ecuador electronic invoicing settings now use a provider contact instead of a free-text system value for the billing software provider RUC. This helps ensure the RUC is properly validated and gives users non-blocking reminders when the provider is not configured.
Original PR description
Purpose: Users can now configure the billing software provider's RUC for electronic invoicing in stable thanks to this PR: https://github.com/odoo/enterprise/pull/129456. In stable, it introduced a system parameter to store the RUC for the database, but there was no validation enforced on the RUC. To improve this, the system parameter storing the RUC is replaced with a many2one res.partner field, so the user can add the billing software provider contact instead. Configuring the RUC on the contact enforces the RUC validation. Non-blocking warnings are added to the flow to remind users to configure the billing provider in settings if empty. task-6432810
The timesheet access level descriptions have been updated to be clearer for users and administrators. This helps people better understand what each access level allows when configuring timesheet permissions.
Original PR description
Update the access level tooltips for the timesheet --- task-6353758
The access level descriptions for Helpdesk, Planning, and Field Service have been updated to make permissions easier to understand. This helps administrators choose the right access levels with clearer in-product guidance, without changing the underlying permissions.
Original PR description
Update the access level tooltips for the helpdesk and planning --- task-6353758
ESG metric screens and wizards are now clearer and easier to use, with better guidance, improved layouts, and support for creating partners during stakeholder reviews. Businesses can also archive outdated or duplicate metrics instead of deleting them, helping preserve history while keeping current workspaces tidy.
Original PR description
This commit improves the ESG metrics wizards and views by making the following changes: - Added help text to the `revenues_value` and `assets_value` fields in the `metrics_ai_generation_wizard` - Updated the score gap warning messages in the esg_metric model to provide clearer guidance to users. - Improved the layout and organization of the metric views. - Allow the creation of partners from the stakeholder review wizard. task-6333207
Inventory screens for batch and wave operations were adjusted to make navigation and setup clearer. Users will see cleaner filtering in planning views, a visible transfer line image, and easier side-by-side source location settings.
Original PR description
Batches and waves were previously merged (see odoo/odoo#280326).Some details on the UX still needs refinements: - On `stock_picking_batch_action`, there is no `groupby` but instead a `search_default_...` filter that needs to be removed for the gantt view. - The 'Batch Transfer Line' image (prev. Wave Picking) is transparent although they are accessible from this view. - Have side by side the two Source Location settings in the Operation Type form view task-6542620
Manufacturing orders now use the newly generated serial number when production is reset and resumed, instead of accidentally producing with an old serial number. The serial number button label was also clarified so users can better distinguish generating new serials from editing existing ones.
Original PR description
This PR addresses a bug introduced in the PR https://github.com/odoo/odoo/pull/277276 To reproduce the bug: 1- Produce a serial tracked product with serial number 00001 for example. 2- Set MO to…
This PR addresses a bug introduced in the PR https://github.com/odoo/odoo/pull/277276 To reproduce the bug: 1- Produce a serial tracked product with serial number 00001 for example. 2- Set MO to progress. 3- Clear the lot_producing_ids, and generate a new one 00002. 3- Produce again. = The MO produces a product with the old serial number 00001 instead of 00002. This happens because while producing the MO, it finds the move already has its own lot_ids but we need to check it's different than the `lot_producing_ids` generated on the MO to re-assign it again. Side improvement: The button `Generate Serial` is now named `Generate Serial Numbers` and becomes `Edit Serial Numbers` whenever there are already multiple generated serial numbers on the MO. This is more relevant to the user now since they now have the ability to set a done MO to progress and change the quantity to produce hence, it makes sense to edit the serial numbers when they are asked to specify a serial number in that case.
The WhatsApp account screen now only shows the Disconnect option to the right administrators and only for accounts that can safely use it. This prevents manually configured WhatsApp accounts from accidentally losing incoming messages and avoids access errors for regular internal users.
Original PR description
It was previously deprecated in a different commit. task-6544628
Fixes a visibility issue where the Update BoM action could be hidden on manufacturing orders when the PLM module was installed. This ensures users can access the action in the appropriate production stages, reducing workflow confusion.
Original PR description
This PR fixes a bug introduced in the PR: https://github.com/odoo/odoo/pull/277276 where Update BoM action on MO now shows when the MO is also in `progress` or `to_close` states but when the module `mrp_plm` is installed the `invisible` attribute of the button is overridden missing the new states. After this PR, the override is now updated to have the new states where the action should also appear.
When users update the shipment weight while adding shipping to a sales order, the system now saves that change before recalculating carrier rates. This prevents outdated shipping prices from being shown and makes rate comparisons more reliable.
Original PR description
Steps to reproduce: 1. Open a Sales Order 2. Click Add Shipping 3. Click `Get all rates` button 4. Change the weight 5. Click `Get all rates` button again 6. Observe that `get_wizard_carrier_rate` was called with the same weight The problem is that the record is not saved before fetching the rates. This commit ensures it happens every time the button is clicked. Also, some code in the `choose.delivery.carrier` is not reusable. This commit fixes these issues. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue in Documents where clicking an already selected item in kanban view could stop showing its details. Users can now repeatedly click a selected document without losing the expected selected, focused, and inspected state.
Original PR description
Reproduce * Open Documents on kanban view * Select a record, it is selected, focused and inspected * Click on the record again, it should remain in the same state but is in fact not inspected anymore. * Click on the record again, it should still be selected, focused and inspected and isn't. Cause: render sequence change on updating records from owl3 refactor. Task-6562749
This fix ensures cash basis tax amounts are properly matched when an invoice is reversed with a credit note, even when the transition account is not set for payment reconciliation. This helps keep accounting records accurate and avoids lingering unreconciled tax balances after reversals.
Original PR description
Steps:
---------
1. Activate Cash Basis
2. Set a tax as being Cash Basis
a. The transition account must have Payment Reconciliation == false
3. Create an Invoice with a tax on it, post it.
4. Create a Credit Note for that invoice, post it
The Tax Amount is not reconciled, but it must be.
If the transition account is Payment Reconciliation == true, it works.
Solution:
---------
Before unreconciling, we store the accounts that were previously stored. During reversal, lines that are not reconciled and are part of the move are auto-reconciled.
Most of the reversal reconciliation logic has been moved in the `_post` method, this is because we want this behavior to apply each time we _post and not only when passing through the wizard with a forced reversal.
task-6499274
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prA field grouping setting has been moved from the general HR area to Payroll, so it is managed in the right place. This helps keep employee payroll information organized under the correct module and reduces configuration confusion.
Peruvian point-of-sale receipts now wait for the electronic invoice authorization data needed to print a valid legal receipt. The change keeps checkout efficient by delaying PDFs and emails as before, while ensuring the QR code and summary hash are available immediately on the printed receipt.
Original PR description
In Peru, the printed PoS receipt is the legal electronic invoice/receipt (Factura/Boleta Electronica): it must carry the QR code and the summary hash from the signed e-invoice. Since 19.4, PoS…
In Peru, the printed PoS receipt is the legal electronic invoice/receipt (Factura/Boleta Electronica): it must carry the QR code and the summary hash from the signed e-invoice. Since 19.4, PoS invoice PDF/EDI generation became asynchronous by default (deferred to a cron) to speed up checkout, but l10n_pe_edi_pos was never updated to opt out of that for Peru, so the signed data doesn't exist yet when the receipt is printed right after validating the order. Steps to reproduce: ------------------- * Install l10n_pe_edi and activate SUNAT Signature Provider Setting * Create and validate a PoS order and set "invoice" to true * Print the receipt (Full Receipt or Simplified Receipt) > Observation: Neither receipt includes the QR code or the summary hash, so the printed receipt is no longer a valid electronic document. Why the fix: ------------ Forcing the whole invoice (PDF + email + e-invoice) to be generated synchronously would block checkout on a live SUNAT call, and would leave failed orders with no way to be retried by the deferred-invoice cron. PosOrder._generate_pos_order_invoice() now lets the PDF/email stay deferred to the cron as before, but posts the e-invoice to SUNAT synchronously on its own (no PDF, no email), so the receipt gets its QR code/hash right away. This matches the pattern already used by l10n_sa_edi_pos (generate_pdf=false + a synchronous EDI-only step), as opposed to l10n_co_edi_pos, the only module forcing generate_pdf=true. A chatter message is posted on the invoice if SUNAT rejects it, since calling the EDI step directly bypasses the notification that account.move.send would otherwise post. opw-6426510 Forward-Port-Of: odoo/enterprise#126345
Scheduled financial reports now use the intended company instead of including data from every company available to the scheduler. This helps businesses with multiple companies receive accurate report emails for the selected company only.
Original PR description
This commit https://github.com/odoo/odoo/commit/94ef1127dfa8af17795f39590c8a37edfa117994 changed how with_company() works to ensure it only adds a new company to the allowed companies. This made the reports options include all companies when sent through the cron (since crons have every company enabled by default). This commit fixes this issue by relying on the context key allowed_company_ids instead of with_company(). task-6505248 Forward-Port-Of: odoo/enterprise#129728
The Belgian salary contract demo data now includes the CP200 category in the basic demo setup. This helps ensure demo scenarios better reflect expected Belgian payroll conditions and avoids issues when using or testing the sample data.
The WhatsApp account screen now hides the Disconnect option for manually configured accounts and limits it to WhatsApp administrators. This prevents accidental service disruption where Meta stops sending messages while Odoo still shows the account as configured, and avoids access errors for regular internal users.
Original PR description
Problem: The Disconnect button showed on every account holding a token, so manually configured accounts got it too. Pressing it tells Meta to stop sending messages to the database, then fails while…
Problem: The Disconnect button showed on every account holding a token, so manually configured accounts got it too. Pressing it tells Meta to stop sending messages to the database, then fails while clearing the token, which a manual account needs, so Odoo rolls back while Meta does not. The account keeps looking configured and incoming messages stop, and there is no way back from the interface, Meta only allows re-subscribing through the API. The button relied on `show_disconnect`, a computed field reading `token`, which is restricted to WhatsApp administrators while every internal user has read access on `whatsapp.account`. Opening the account form as a regular user therefore raised an AccessError. Solution: Restrict the header to WhatsApp administrators and test the account fields directly in its `invisible`, which hides the button on manual accounts and removes the need for the computed field. Add a safety check on write access in `button_disconnect`. Hiding a button only removes it from the screen, the method stays callable over RPC, and the request to Meta happens before the write that would have been refused. Task-6544628 Forward-Port-Of: odoo/enterprise#130759
This fix prevents an error when users open the My Events portal page in community-only installations. The event date used for sorting is now available in the community event module, so event registrations can be listed reliably without requiring enterprise add-ons.
Original PR description
Purpose ======= Fix the SQL error when accessing '/my/events' without the enterprise addons. Specification ============= The 'event_begin_date' field is only stored when 'event_enterprise' is installed meaning the 'order by' done on the field when loading the '/my/events' page would fail with an SQL error. => Moving the 'store' on the field from the enterprise module to community. This was previously not spotted as the 'event_enterprise' was auto-installed because all its dependencies were also auto-installed if the enterprise addons was found. Task-6560355 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a user fixes an accidental mention in a message, Odoo now correctly removes the replaced contact from the notification list. This prevents unintended recipients from being notified when their name only appears as part of a longer corrected mention.
Original PR description
When a user mentions the wrong partner and corrects it by continuing to type, e.g. picking "John" by mistake, typing further so the text becomes "@ John Doe" and picking "John Doe" in the suggestion…
When a user mentions the wrong partner and corrects it by continuing to type, e.g. picking "John" by mistake, typing further so the text becomes "@ John Doe" and picking "John Doe" in the suggestion popup, the discarded first pick stays in the composer's mentioned partners. On post, mentions are validated by searching the body for "@<name>", and "@ John" is found inside "@ John Doe", so the partner the user tried to replace is kept in the recipients and gets notified even though no mention of them remains visible in the message. Validate mentions from the longest mention text to the shortest, counting the occurrences of each text and blanking them out before looking for shorter ones. A partner whose mention text only appears inside a longer mention is dropped, while distinct partners sharing the same name each consume one occurrence. Steps to reproduce: - Create contacts "John" and "John Doe" - On any record, open the chatter and type "@John", pick "John" by mistake, then keep typing " Doe" and pick "John Doe" in the suggestion popup to correct it - Send the message => The message is also sent to "John" although only "@John Doe" appears in the body. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287267 Forward-Port-Of: odoo/odoo#284239
The product catalog order line now correctly receives stock-related details such as tracking and minimum quantity information. This prevents missing or incorrect information when working with sale order lines in field service planning flows.
Original PR description
- https://github.com/odoo/odoo/pull/287603 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed an issue in Documents where clicking an already selected file in the kanban view could incorrectly remove its inspected state. This keeps the file selection experience consistent and avoids confusion when users review documents.
Original PR description
Reproduce * Open Documents on kanban view * Select a record, it is selected, focused and inspected * Click on the record again, it should remain in the same state but is in fact not inspected anymore. * Click on the record again, it should still be selected, focused and inspected and isn't. Cause: render sequence change on updating records from owl3 refactor. Task-6562749
Event registrations in the customer portal now sort more reliably by event start date. This helps users see events in the expected order and avoids confusion when browsing registrations.
Original PR description
Moving the store on 'event_begin_date' from 'event_enterprise' to 'event (cf com PR) Task-6560355
Time off requests now keep the correct duration when an automation rule creates an activity during save. This prevents one-day requests from incorrectly appearing as zero days, improving reliability for HR workflows that use automated reminders or tasks.
Original PR description
Problem: A time off request is saved with a duration of 0 days instead of 1 day as soon as an automation rule on Time Off has an action that creates an activity. Cause: `_compute_field_value` runs…
Problem: A time off request is saved with a duration of 0 days instead of 1 day as soon as an automation rule on Time Off has an action that creates an activity. Cause: `_compute_field_value` runs the actions while the fields of the computation it wraps are still protected and not written yet. On `hr.leave` the actions run from a computation nested in `_compute_date_from_to`, so `date_from` is empty when the activity notification reads `display_name`, and `_compute_duration` stores 0. Setting `date_from` afterwards does not mark `number_of_days` to compute again since it is protected. Solution: Extract the snapshot `_filter_pre` already does into `_keep_to_compute` and wrap the post filter and the actions with it, so the fields depending on the running computation stay to compute. Same treatment as 488419a5ca49 (odoo/odoo#243611) on the pre filter. Steps to reproduce: - Enable the developer mode. - Go to Settings > Technical > Automation Rules and create a rule on the Time Off model with the trigger On create and edit. - Add an action of type Create Activity, set its Responsible to another user, and save. - Go to Time Off > New, pick an employee and a time off type, and request one working day. - Observe that the request shows a duration of 0 days. Ticket [link](https://www.odoo.com/odoo/project.task/6498783) opw-6498783 Forward-Port-Of: odoo/odoo#287536 Forward-Port-Of: odoo/odoo#286791
New employee versions now appear immediately in the correct place on the timeline based on their effective date. This prevents confusion when HR users add current, past, or future versions and removes the need to refresh the page to see the right order.
Original PR description
**Issue** Creating a new employee version places the timeline tab at the wrong end of the timeline instead of its correct chronological position. It only corrects itself after a page refresh. **Steps to reproduce** 1. Open an employee record. 2. Click the **+** button on the timeline to add a new version. 3. Select an effective date (e.g., between two existing versions) or in the future. 4. The new tab appears at beginning of the timeline instead of in chronological order. **Solution** Override `getSortedItems` in the timeline widget to explicitly sort elements by date during the render cycle. This ensures dynamically added versions are instantly placed in their correct chronological position. Added UI tests to verify the ordering. task-6525190
Inventory overview buttons now appear correctly without requiring batch picking to be enabled. Related settings were also aligned so transport management correctly depends on batch, wave and cluster transfers, reducing configuration confusion.
Original PR description
During the PR [^1], the group `stock.group_stock_picking_batch` was accidentally added on the buttons to quickly see the number of opened pickings by operation type. As result, those buttons weren't displayed until the batch picking setting was enabled. This commit fixes that issue. [^1]: https://github.com/odoo/odoo/pull/282884
Mobile dashboard carousels now use the correct figure size when calculating their layout. This prevents carousel content from appearing at the wrong size on phones, improving readability and usability for dashboard users.
Original PR description
Now the carousels in o-spreadsheet use the figure dimension to compute their layout. It means that the previous implementation of the mobile dashboard where we gave the wrong figure size and relied on the css to resize the figure was not working anymore. This commit correcly size the figure POJO passed as props of the mobile dashboard figures. Task: [6534166](https://www.odoo.com/web#id=6534166&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) 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
This fixes a purchase stock test setup issue that occurred only in empty databases without demo data. It helps ensure Odoo's automated checks can run reliably in minimal installations, reducing false test failures for developers and maintainers.
Original PR description
Steps to reproduce ------------------ 1. install purchase_stock in a database without demo data 2. run any test in TestReorderingRule 3. observe the error: can't write on invisible field 'tracking' Note: This fix is only relevant when you run the test on an empty database, the demo data enables the Lots & Serial Numbers. Forward-Port-Of: odoo/odoo#286519
This fixes the Record button used for creating or capturing web tours after an internal refactor changed where the recorder is accessed. Business users and testers can again start recording tours from the tour list without hitting a broken action.
Original PR description
… refactor The button called `tour_service.startTourRecorder()`, but that method moved to `TourRecorderPlugin`, exposed on `TourPlugin` as `recorder`. closes odoo/odoo#287203 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
This fix prevents test sessions from being unexpectedly rotated during login checks. It makes automated test results more consistent and reduces false failures, helping teams trust test outcomes without changing customer-facing behavior.
Original PR description
The test harness patches the CryptContext object to spend less time hashing to decrease total test runtime. Because the hash parameters have changed, every first login (per transaction) per user will result in a hash rotation. The session_id is also rotated when the password hash rotates. When multiple requests are sent to the server while a session rotation is underway, the session datastore holds either a valid, or expired, or logged-out user session. This is a source of indeterminism in tests that can be prevented by always returning None value for replacement hash. REF Runbot; https://runbot.odoo.com/odoo/error/242811 REF Runbot; https://runbot.odoo.com/odoo/error/233722 Forward-Port-Of: odoo/odoo#287350 Forward-Port-Of: odoo/odoo#285710
This fix stops manufacturing orders from copying display-only sales order lines onto stock moves. It helps keep manufacturing and inventory records accurate by preventing non-product sales lines from being selected or carried forward.
Original PR description
Issue: ====== before this commit, user was able to select a display SOL and at MO confirmation the SOL was copied to the stock move, so we end up with a stock move linked to a display SOL, which is not correct. Solution: ========= - add a domain on the SOL field as first guard layer - add check on the SOL on MO confirmation to prevent copying a display SOL to the stock move opw-6473017 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287491 Forward-Port-Of: odoo/odoo#286534
Fixes several Belgian payroll issues affecting CP200 sectoral bonuses, including eligibility for departing employees, bonus caps, prorated amounts, and gross income reporting. This helps ensure final payslips, tax forms, and payroll declarations reflect the correct bonus amounts.
Original PR description
- Employment bonus cap read 'BONUS_ONSS' / 'BONUS_TOTAL'. Neither rule exists Use ONSS_BONUS. - Eligibility only checked contract_date_end, which is set on the employee only once the departure is applied. Accept departure_date too, like the eco-vouchers rule. - BONUS_GROSS was missing from the monthly structure: empty total gross on the payslip, and the 281.10 declared the tax without the income. and BONUS_GROSS and BONUS_PP now display only when non zero. - Worked day lines credited only the immediate parent category, every other path walks the whole chain, now it goes up the parent chain recursivly - Drop the unused bonus withholding helper and an unreachable guard in the prorata loop. task - 6032929
Users who request a French PDP migration will now see a clear, consistent message instead of misleading timing information. This helps reduce confusion by avoiding the previous promise that availability would happen "tomorrow" when that was not reliable.
Original PR description
Currently when the user requested a migration, we don't show it in any way to the user, and the only timeline we give ("available tomorrow") is completely false. Because we don't have any field we could use for this client-side (maybe from 19.3 we can use the catch-all-json field) So just make the message same for everybody.
no-task
Forward-Port-Of: odoo/odoo#285599
Forward-Port-Of: odoo/odoo#283594Website builder users can now click inside editable navigation link text without the cursor jumping to the start of the link. This makes editing menu links smoother and prevents small but frustrating text editing interruptions.
Original PR description
Problem: Clicking inside a navigation link in website builder causes the caret to jump to the start of the link element. Cause: `LinkPlugin` unconditionally reset the selection to the start of non-editable link elements, ignoring whether the anchor node was inside an editable child element. Solution: Do not reset selection if the anchor node is inside a `contenteditable` element. Steps to reproduce: - Open website builder. - Click inside a navbar link to place the caret. => Caret no longer jumps to the start of the link. opw-6535386 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287479 Forward-Port-Of: odoo/odoo#286527
This update corrects how the Belgian payroll expense module connects to the employee form. It helps ensure mobility budget benefits can be archived without errors caused by the form referencing the wrong underlying view.
Original PR description
…rm view Fix the inherit-id of the hr.employee form view in l10n_be_hr_payroll_expense module to match the correct view id. The previous inherit-id was incorrect, which could lead to issues when trying archive mobility budget benefit task-6542045
Campaigns created from an existing marketing automation template now correctly link their generated mailings to the new campaign. This ensures the Mailings button shows the real number of mailings, helping users verify campaign setup at a glance.
Original PR description
Issue ------ Wrong mailing count in the mailing stat button in the campaign form. How to reproduce ------ 1. Open marketing automation 2. Click `New` to create a new campaign 3. Choose an existing template 4. See the `Mailings` stat button The mailing stat button shows 0 but it must display the number of mailings that are used in that campaign. Fix ------ When loading a template, and after the activites and mailings have been created, set the campaign_id of the created mailings to newly created campaign. task-6564215
Changing a Belgian employee’s contract start date no longer overwrites a manually selected joint committee. This preserves payroll setup choices for student employees while still applying standard defaults when appropriate.
Original PR description
Steps to reproduce: - Create a Belgian employee, select Student and choose a joint committee. - Save the employee, then set or change the contract start date. - The committee is replaced by the default or cleared. Task 6542868
The website mega menu now keeps proper side spacing when viewed on mobile. This prevents menu content from touching the screen edge, improving readability and the overall mobile website editing experience.
Original PR description
Steps to reproduce: - Open a website in mobile preview. - Add a mega menu and select the "Odoo Menu" template. - Open the mega menu. => Its content touches the left edge of the mobile panel. Before this commit, the mega menu rework [1] removed the horizontal padding override required by nested `.container` elements. After this commit, mega menu containers keep the expected grid gutter on mobile. [1]: https://github.com/odoo/odoo/commit/ff5423bc3aa75e47b210ce98f3efba8c75459a5a
This fixes VoIP so the same user can receive calls reliably when signed in from multiple browser tabs or devices. It also aligns allowed extension numbers with the phone service range, preventing invalid extension setups and keeping configuration simpler.
Original PR description
## [FIX] voip: one registration binding per softphone window Asterisk identifies a registration binding by its Contact URI alone: the registrar compares candidates with pjsip_uri_cmp() and names the…
## [FIX] voip: one registration binding per softphone window Asterisk identifies a registration binding by its Contact URI alone: the registrar compares candidates with pjsip_uri_cmp() and names the stored object after the MD5 of that URI. Neither `+sip.instance` nor `reg-id` is consulted, RFC 5626 section 5.4.1 not being implemented on the inbound registrar side. Every window of a user therefore advertised the same Contact and collapsed into a single binding, so only the last one to REGISTER could be rung - across tabs and across devices alike. The discriminator has to be a URI parameter rather than part of the user part: res_pjsip_path.c matches the user part against the AOR name to decide whether to attach the edge proxy's RFC 5626 flow-token Path, and without that Path an inbound INVITE cannot be routed to the browser at all. Parameters after the host are ignored by that lookup yet do make two URIs compare unequal, so `x-odoo-unique` buys distinct bindings at no cost to the Path. It is assigned once per user agent instead of being computed in the configuration getter, so that reading the configuration twice cannot yield two different Contact URIs. ## [FIX] voip: restrict voip.extension range Before this commit: - voip module validates against voip.extension number length: between 100 and 99999 - phone service configures tenants to allow extensions between 10 and 9999 As there is a discrepancy between those 2, we decided to allow the ranges that overlap between both parts. So, after this commit: - voip module allows extensions numbers between 100 and 9999. Rationale We decided to remove the 5-number range on that part instead of adding it in the phone service part, because: - 9900 extension numbers is plenty enough and it can lower a bit the complexity of the asterisk dialplan, which makes the asterisk dialplan regeneration more lightweight - it is easier to add a range in the future than remove one, due to migration nightmare
This fix moves a shared styling helper into the core web module so pages can build correctly even when the editor module is not installed. It prevents styling errors on bare databases and removes an unintended dependency between modules.
Original PR description
Since Commit[1], `bootstrap_review_frontend.scss` calls `increase-contrast()`, which web never defined: it lives in web_editor, now html_editor. This hidden dependency went unnoticed as long as the editor module was auto-installed on every database. The issue surfaced as a side effect of Commit[2] which added `http_routing` to html_editor's dependencies. `http_routing` is not auto-installed, so `html_editor` no longer gets installed on a bare database and `increase-contrast()` is undefined. [1]: https://github.com/odoo/odoo/commit/7c69596e7997 [2]: https://github.com/odoo/odoo/commit/bff477da4753 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a display issue where feature icons could become hard to read when a website used a dark color palette. Icons now keep the right contrast whether they use a custom background color or the default shaped icon background, improving readability and visual consistency.
Original PR description
Steps to reproduce: - Select a dark website color palette. - Drag and drop a "Features" snippet onto the page. => The icons use dark text over their dark `bg-o-color-3` backgrounds. Before this commit, [1] gave shaped icons a dark fallback color to make their default light backgrounds readable. The shaped icon selector was more specific than `bg-o-color-*`, so it also overrode the contrast color computed for explicit backgrounds. After this commit, the fallback applies only without a `bg-*` class. Explicit backgrounds keep their automatically contrasted color while icons with the default background remain readable. [1]: c5e16ae task-6485048 Forward-Port-Of: odoo/odoo#287386
Fixed a visual spacing issue in Marketing Automation timelines that could show an unwanted gap after a related kanban view update. This keeps campaign timelines looking consistent and easier to read for users.
Original PR description
Make the gap reset rule more specific, so no gap shows up after the nested kanban fix in community. COM: https://github.com/odoo/odoo/pull/287428 task-6527607
This update adjusts automated tests so they behave correctly when Odoo is configured to use a custom database notification function. It prevents false test failures in messaging and Viva.com payment flows without changing behavior for end users.
Original PR description
# [FIX] bus: adapt test to custom imbus & cron_trigger notifications Similar as to https://github.com/odoo/odoo/pull/178986, When a custom postgresql function is used (`ODOO_NOTIFY_FUNCTION` environment variable is set), testing to listen to imbus should be skipped # [FIX] pos_viva_com: adapt test to custom imbus notifications Similar as to https://github.com/odoo/odoo/pull/178986, When a custom postgresql function is used (`ODOO_NOTIFY_FUNCTION` environment variable is set), the webhook confirmation notification cannot be relied upon to reach the client via `listen imbus` in time. This makes the client fall back to polling `viva_com_get_payment_status` with the real session id, which the test's mock doesn't expect, causing the tour to time out.
This fixes an issue where some SEPA direct debit payments could be created without the required mandate linked. The change helps ensure direct debit payment flows remain reliable and avoids failures caused by missing mandate information.
Original PR description
When registering a payment (e.g. through the payment register wizard), the mandate was not always linked to the created payment, leaving `mandate_id` empty and breaking SEPA direct debit…
When registering a payment (e.g. through the payment register wizard), the mandate was not always linked to the created payment, leaving `mandate_id` empty and breaking SEPA direct debit flows(`account.direct.debit.mandate()` instead of the expected mandate). During `create`, the `_validate_mandate_id` constraint reads `needs_mandate_of_type`, a non-stored computed field. Its computation triggers a recompute of `payment_method_id`, which re-enters the same constraint while `needs_mandate_of_type` is still being computed. The ORM then protects the field: reading it returns a bogus `False` and caches it. `_compute_mandate_id` consumes that poisoned value and permanently stores an empty `mandate_id`, since its actual dependencies never change afterwards. Fix: make `_compute_needs_mandate_type` and `_compute_mandate_id` depend on `payment_method_line_id` instead of `payment_method_id`, so mandate is computed without reading a field that can be in a protected context. note: I was only able to replicate the runbot error through testing, and not through web ui/functionally. runbot-error-946999 runbot-error-947001 runbot-error-947010 runbot-error-947011 runbot-error-947012 runbot-error-947013 runbot-error-947014 runbot-error-947015 runbot-error-947016
The obsolete WinBooks accounting import module has been removed because it was rarely used. Accounting import screens will no longer show the WinBooks section, simplifying the import experience for users.
Original PR description
This module is obsolete, and rarely used. Removing account_winbooks_import and updating account import view to not show winbooks section anymore. task-id: [6560446](https://www.odoo.com/odoo/project/967/tasks/6560446)
Point of Sale employee roles have been renamed to clearer business terms and a new supervised role has been added. POS actions are now limited according to each employee's assigned role, helping businesses better control who can perform sensitive operations.
Original PR description
Following this commit: ==== - New `PosAccessRightPlugin` plugin has been inroduced for managing employees role in pos. - Minimal Employee has been renamed to Restrictive. - Basic Employee has been renamed to Cashier. - Advanced Employee has been renamed to Manager. - Introduced the Supervised Employee role. - Restricted POS features based on the employee's assigned role. task-6317141 Enterprise PR : https://github.com/odoo/enterprise/pull/128957 Upgrade PR : https://github.com/odoo/upgrade/pull/11117
This change reorganizes several internal Odoo test modules into a single shared test_base module. It helps simplify maintenance of the test suite without changing day-to-day business functionality for users.
Original PR description
enterprise: https://github.com/odoo/enterprise/pull/130186 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change removes an unused navigation bar template from the web module. It has no expected impact on day-to-day use, but it helps keep the codebase cleaner and easier to maintain.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update modernizes internal website component setup so it uses the current validation approach. It reduces deprecated code and helps keep website-related features easier to maintain without changing visible functionality for users.
Original PR description
Replaced deprecated uses of `static props` with calls to `useProps()`, providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.This update modernizes internal VOIP screen components by replacing an outdated validation pattern with the current approach. It should not change day-to-day behavior for users, but it helps keep the calling interface easier to maintain and less prone to future compatibility issues.
Original PR description
Replaced deprecated uses of `static props` with calls to `useProps()`, providing actual props validation for Owl components.
Whenever possible, also removed "empty" props definition, being either:
- `static props = ["*"]` with no use of `this.props`;
- `static props = {}`.This update removes unused internal pieces from the report editor in Web Studio. It does not change the visible experience, but helps keep the codebase simpler and easier to maintain.
Several internal test modules have been reorganized into a single base test area. This keeps the testing structure simpler and easier to maintain without changing business features or user workflows.
Original PR description
community: https://github.com/odoo/odoo/pull/285672
Odoo’s mail and discussion tools now handle temporary messages through the standard server-driven process instead of special browser-side logic. This reduces complexity and helps messages behave more consistently, including unread markers and message ordering.
Original PR description
Before this commit, a dedicated bus handler builds the transient message in JS: it fills the author, the note subtype and an id made of the last known message id plus 0.01, then pushes the message in the message lists of its thread. There is no need for custom JS code here, as all these values can be computed server side. This commit sends the message as a plain store insert, so the handler goes away and the client applies it like any other record. Its id comes from the message sequence. A transient message therefore holds a real id, where two mechanisms counted on a fractional one. The persistent message getters of a thread now test is_transient and isPending, as persistentMessages already does, and the unread separator skips transient messages. https://github.com/odoo/enterprise/pull/130112
This change updates internal automated tests for the Helpdesk live chat feature to use a standard verification method. It does not change customer-facing behavior, but it helps keep future updates safer and easier to maintain.
Original PR description
Enterprise counterpart of "[REF] mail: drop the transient message bus handler", which explains why a transient message is sent as a store insert. Before this commit, the test searches the last bus record of the operator and digs the message body out of its json payload. There is no need for that, as the bus tests provide assertBus. This commit asserts the notification with assertBus. The Load More case expects the whole reply, as the tool compares the payload as a whole. https://github.com/odoo/odoo/pull/280252
Mail and live chat now calculate certain status values only when they are needed instead of storing duplicate internal data. This keeps the underlying messaging data model simpler and reduces unnecessary writes, with no expected change for users.
Original PR description
Before this commit, a value like isVideoStreaming or offlineMembers is a field with a compute. Nothing else writes it, so the field only stores what the compute makes. This commit declares each of them as a computed instead, made on read. A member list writes nothing when it sorts now, so its FIXME goes.
The mail interface’s tab structure was simplified so each tab is defined in one place instead of split across separate header and content lists. This reduces the chance of configuration mistakes and makes future maintenance of mail-related screens easier, with minimal expected impact for end users.
Original PR description
Tabs used two static slots (headers/panels) as a workaround for Owl not supporting dynamic slot names, forcing callers to keep two parallel lists in sync by id. This was cumbersome to could cause errors (tab id set in two different places. Portal a Tab's header into the nav bar instead, so header and panel content live on one <Tab> declared once, including from a single t-foreach. 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
This update modernizes internal component setup across several HR-related Odoo apps to align with the newer interface framework. It helps keep expense, time off, recruitment, skills, timesheet, and work entry screens maintainable and ready for future upgrades without changing business workflows.
Original PR description
- https://github.com/odoo/enterprise/pull/131078 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update refreshes internal HR app screen components to align with the newer interface framework. It helps keep appraisal, attendance, salary, expense, and payroll features stable and easier to maintain without changing day-to-day user workflows.
Original PR description
- https://github.com/odoo/odoo/pull/287445 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr