Saturday, September 12, 2026
24 changes · master
Enhancements to existing features
Activity plans now default to being visible to all companies, making setup simpler for both single-company and multi-company users. Users can assign plans to any company they can access, and the activity scheduling screen has a small layout improvement for clearer badges.
Original PR description
Modify the `company_id` default on activity plans. In multi-company environments, it now defaults to `False` (Visible to all) instead of the current company. For single-company users, the selection used to be hidden, it is now visible and defaulting to `False`. Additionally, remove the `allowed_company_ids` domain from the form view. Users can now assign a plan to any company they have access to, not just the ones currently active in their session widget. Finally, fix a layout issue in the activity schedule wizard. The invalid `classname="pb-2"` attribute is replaced with `class="d-block"` on the `plan_id` field to ensure the activity type badges are properly forced onto the next row. Task-6563538
The payment flow is being streamlined so users can start bank-related actions directly from the payment record without seeing technical batch-payment details. The payment wizard and payment search views are also simplified, and an unnecessary “Sent” ribbon is removed from check printing payments.
Original PR description
Small improvements to the payment initiation UX. Major changes are done in the accompanying enterprise commit. task-6326470
The quick event creation form in Calendar has been adjusted so it can share the same design with POS Appointment while still supporting the larger touchscreen layout needed there. This reduces duplicate styling and helps keep the user experience consistent across scheduling flows.
Original PR description
This PR adapts the code of calendar to improve the form for the quick creation of calendar events in pos_appointment. The design of the forms in calendar and pos_appointment must be the same. So o_calendar_event_form_quick_create should be used to avoid redefining it the css twice. However, this class is targeted to define the width of the modal and this one does not suit to the form in pos appointment as it must be bigger for the touchscreens. Therefore, a new class has been created to manage the size of the form in calendar and to make o_calendar_event_form_quick_create usable by pos_appointment. Enterprise PR: https://github.com/odoo/enterprise/pull/123700 Task-6185312
Belgian payroll can now apply legally required salary indexation alongside manual salary increases. The process also accounts for any applicable salary cap and uses the capped amount when calculating social contributions, helping payroll teams stay compliant.
Original PR description
It is now possible to increase salaries using legal indexation in addition to the manual increases. For a given year, the indexation rate is applied while taking the salary cap (if any) into account. The capped amount is stored in `l10n_be_capped_amount` and is used in the social contribution salary rule. task-6197739
Belgian payroll officers can now enter separate housing benefit amounts for social security contributions and withholding tax. This allows each payroll calculation to use the correct value when the ONSS base and tax base differ.
Original PR description
Before this commit, the housing benefit in kind had one single amount on the employee form. That amount was added to the ONSS base and to the withholding tax base at the same time, so both computations always used the same value. After this commit, the officer fills two amounts, one for ONSS and one for the taxes. Each one feeds only its own base, so the social contributions and the withholding tax can be computed on different values. taskid-6510566
Odoo now records where customer-facing messages come from, such as templates, views, mailings, or automated posting flows. This helps companies audit and review outgoing content more easily, supporting stronger brand control and compliance over customer communications.
Original PR description
RATIONALE In some cases (luxury, big corporate company) people want to be able to review all messages generated by Odoo that are sent to the customers. This is important when branding / copy writing…
RATIONALE
In some cases (luxury, big corporate company) people want to be able to
review all messages generated by Odoo that are sent to the customers.
This is important when branding / copy writing is considered valuable
(e.g. "Your ticket has been closed" → "We are happy to announce that your
care ticket ...").
Currently we have several ways of generating them
* using a mail.template (used either as template.send_mail() in code, either
due to tracked changes, either with manual usage of templates);
* message_post → post a body, and if recipients to notify by email content
is encapsulated in an email layout
-> can be manual (chatter), message_type being email (incoming email) or
comment (user input in chatter)
-> can be automatic (calling message_post in code), generally with
message_type being notification, auto_comment
* message_post using rendered body based on a qweb view (in code), see
message_post_with_source
* mail.mail manual creation → code only (as only admins can create mail.mail)
* message composer
-> may be used to post a message, on a single record or in batch, based
on a template or using custom body
-> may generate mail.mail in batch (standard mailing usage)
* mass mailing → uses message composer to generate emails
It is currently not possible to review through interface all content that
might be sent to clients automatically: mail.templates can be found and
modified, but strings inlined in code cannot (only through code or
customization). Views can be found but there is no easy way to find them
in the UI.
SPECIFICATION: AUDIT LOG
At least give a way to know a mail.mail was created automatically / manually
* when a template is used, keep mail_template_id on message. Note that if
content was modified manually, template_id is still propagated;
* when it is generated through a mass mailing, keep mailing_id on mail.mail
* when it is generated automatically by message_post in code → message_type
is 'notification', which is ok
* when it is generated by users → message_type is 'comment', which is ok
* add a flag on qweb views used in posting process so that we can filter and
find them easily. Add a menu entry below "Email Templates" to find them
Task-6368610 [mail] Track content source
Part of Task-6260135 [mail] Ability to review outgoing contentSubscription-related payments are now handled immediately after payment details are processed, making follow-up actions more consistent and timely. A scheduled backup step remains for invoice-cron subscription payments so those transactions are still completed shortly after processing.
Original PR description
Payment transactions are now synchronously post-processed after their payment data records are processed (see the sibling commit in odoo/odoo). Since transactions whose subscription is flagged with `is_invoice_cron==True` are skipped by the post-processing, the existing cron trigger is kept to post-process them soon after. task-6240311 See also: - https://github.com/odoo/odoo/pull/276561 - https://github.com/odoo/upgrade/pull/10846
Odoo now tags the internal views used to generate chatter posts and outgoing customer messages, making it easier to identify where automated communication content comes from. This supports better review of customer-facing wording and branding across apps such as Helpdesk, Documents, Sign, Delivery Sendcloud, HR, and Data Cleaning.
Original PR description
RATIONALE In some cases (luxury, big corporate company) people want to be able to review all messages generated by Odoo that are sent to the customers. This is important when branding / copy writing…
Employee-paid expenses can now be connected to an existing supplier bill, such as one received through Peppol. This helps keep expense records and vendor bills aligned, reducing duplicate entry and improving traceability for accounting teams.
Original PR description
Link an existing bill to an expense paid by employee (e.g. if you receive the bill by peppol) task-6268863
Employee expenses paid personally can now be linked to an existing supplier bill, such as one received through Peppol. This helps companies reimburse those expenses through payroll while keeping the original bill connected for clearer accounting and tracking.
Original PR description
Link an existing bill to an expense paid by employee (e.g. if you receive the bill by peppol), and reimburse it on salary task-6268863
Mailing list subscription and unsubscription flows now include extension points needed by marketing automation campaigns. The badge selection interface can also exclude specific choices, helping simplify upcoming marketing automation changes.
Original PR description
This PR is adding a few changes to web and mass_mailing so that we can refactor properly marketing_automation. ### [IMP] mass_mailing: add mailing list subscription handling This commit adds method calls to the subscribe/unsubscribe flow. These methods are used for marketing automation campaigns triggered by mailing lists. We are adding a flow for the subscription and a flow for the unsubscription so that they can be overridden in inheriting modules. ### [IMP] web: add blacklistedValues to badges_selection This commit adds the blacklisted_values option present on the filterable_selection widget. This option is useful in the case of the revamp of Marketing Automation as it allows us to limit the usage of JSON fields on an already complex model. task-3866422
This update improves several everyday screens by making user lists easier to filter, invitations easier to understand, and password or two-factor authentication prompts clearer. It also cleans up small visual details and improves navigation after creating employees, helping administrators and users complete common tasks with less confusion.
Original PR description
This PR adds various UI improvements in different modules. # Base - 3 filters to group users by fields: company, language and role in company (user/admin) - 2 new optional fields in the user list…
Settling large sales orders in Point of Sale is now faster and smoother. The change reduces repeated background calls and screen refreshes, improving cashier experience especially for orders with many lines or loyalty rewards.
Original PR description
In `settleSO`, two per-line bottlenecks were addressed: 1. `has_valued_move_ids` was called once per order line via a separate RPC, causing N sequential HTTP round-trips. It is now computed server-side inside `read_converted`, which is already called once for all lines. 2. `addLineToCurrentOrder` was awaited per line, yielding to the event loop each iteration and triggering a full Owl re-render for every line. Lines are now created directly, batching all mutations into a single render. `recomputeOrderData()` is called once after the loop. `updatePrograms` is moved to a `pos_sale_loyalty` patch on `settleSO` so the loyalty concern belongs to the bridge module. opw-6319922 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285822 Forward-Port-Of: odoo/odoo#271742
This update improves online shop search speed by adding the missing database support needed for product description filtering. Businesses with larger product catalogs should see search results load much faster, improving the customer shopping experience.
Original PR description
### Description: Following commit e9d435d1c865e1f462ce2e4bb2c0715ec97c8b10, some fields were missing proper indexes, causing the e-commerce search to be slow. This commit adds an indexes on `description_ecommerce` to optimize the filters of the query. ### Benchmark: | Nb of product | Before | After | |-----------------|----------|---------| | 747 | 6m 15s | 91 ms | ### Reference: opw-6513905 ___ I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287528 Forward-Port-Of: odoo/odoo#287381
Indonesian payroll rules now classify employee health insurance consistently and show company pension and old-age contributions in gross income while keeping take-home pay unchanged. This improves payslip transparency and aligns the related accounting entries with the updated payroll treatment.
Original PR description
Remove unused salary rule categories, reclassify BPJS Kesehatan (Employee) as an Allowance, and add a Gross Total rule alongside matching JHT/JP Company deduction rules so company contributions show in gross income without affecting net pay. Also configures the accounting entries for the reclassified BPJS Kesehatan rule. Upgrade PR: https://github.com/odoo/upgrade/pull/11169 task-6343536
Payroll warnings for Belgian payroll have been cleaned up and improved so HR teams can better understand and act on them. This helps reduce confusion during payroll processing and supports more reliable employee payroll administration.
Original PR description
Cleans and improves payroll warnings task: 6357419
Belgian payroll Dimona declarations can now be prepared for asynchronous batch submission while keeping the existing direct submission flow unchanged. The update also lets employees be saved when some Dimona-required information is missing, flags the issue for follow-up, and prevents duplicate or invalid follow-up declarations.
Original PR description
As part of a partnership with a social secretariat (*chut chut pas de marques*), some Odoo instances that use the Belgian payroll will submit their dimona declarations via the batch channel. This…
As part of a partnership with a social secretariat (*chut chut pas de marques*), some Odoo instances that use the Belgian payroll will submit their dimona declarations via the batch channel. This causes all sorts of problems with the current flow, which uses the ONSS web service and assumes everything happens right away. This PR aims to introduce several hooks/entry points for an async channel to be able to be 'added' on top of the standard belgian payroll without the need to massively rewrite parts of it. It also fixes 2 bugs discovered whilst working on this batch channel flow. Note that without specific code overrides (for which this PR introduces helper methods), the behaviour is nigh identical to what it was before: the REST flow still works as it did before. The only behavourial change introduced by design in commit `l10n_be_hr_payroll: don't abort a save over incomplete Dimona data`: instead of outright preventing a user (or a piece of code) from creating an employee with missing data (with regards to the dimona declaration), it saves it with a note in the chatter + the 'Dimona Issues' flag.
This update consolidates Spanish electronic invoicing settings and aligns the Canary Islands accounting plan with the main Spanish localization setup. Businesses using Spanish localization get a cleaner configuration experience and more consistent tax/account templates across mainland Spain and the Canary Islands.
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
Approved employee expenses are now automatically marked for reimbursement through payroll, removing the need for a separate “Add to Payslip” step. Payroll teams can still remove an expense from a payslip when needed, reducing manual work while keeping control over exceptions.
Original PR description
modules: documents_hr_expense, hr_expense_extract, hr_expense_stripe, hr_payroll_expense, l10n_be_hr_payroll_expense We have now to consider `approved` expenses when including them in an `hr.payslip` Remove the `Add to Payslip` action on `hr.expense`, the expense will now be flagged as `refund` in payslip at the approval step. It will still be possible to remove expenses from a payslip by pressing the `Remove from Payslip` button Community PR: https://github.com/odoo/odoo/pull/279468 Upgrade PR: https://github.com/odoo/upgrade/pull/10950 Task [link](https://www.odoo.com/odoo/project.task/6327097) task-6327097
Manufacturing backorders created from already planned orders are now planned automatically, reducing manual follow-up for production teams. Time estimates and actual durations are also calculated based on remaining and produced quantities, making production planning more accurate.
Original PR description
1) auto plan backorders When a backorder is created from a planned manufacturing order, automatically plan it. 2) adapt duration/duration_expected's calculation Make duration_expected based on 'to produce' quantity (production's quantity minus quantity previously produced) Make duration based on produced quantity (if no time_ids) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When a backorder is created from an already planned manufacturing order, it is now planned automatically as well. This helps keep production scheduling consistent and reduces manual follow-up for manufacturing teams.
Original PR description
When a backorder is created from a planned manufacturing order, automatically plan it. task: 6456386
Bank reconciliation now supports matching rules that can automatically pair and reconcile accounting entries, including configurable payment tolerance and rule order. This brings back useful behavior from the previous bank reconciliation experience and should reduce manual matching work for finance teams.
Original PR description
This commit introduce Matching rules, a new type of reco models to match and reconcile aml automatically, with possibility to add payment tolerance and a matching order. This kind of reco models was already there in the old bank rec widget. Linked:https://github.com/odoo/odoo/pull/287010 task-6425611
The generic Profit and Loss report no longer includes the "Net Profit Left After Allocations and Withdrawals" section. This keeps the report focused on core business income and expenses, without owner draws or profit allocation details.
Original PR description
This commits removes "Net Profit Left After Allocations and Withdrawals" section from the Profit & Loss generic report. This keeps the report clean and focused purely on business income and expenses by removing owner draws and profit allocations. task-6565605
Activities linked to bank transactions now take users directly to the relevant bank transaction instead of a less useful bank statement line. Users can also schedule one activity for multiple reconciliation records at once, saving time and reducing repetitive work.
Original PR description
When an activity is added to a bank transaction ( typically: upload document) the assignee is currently redirected to the bank statement line. It doesn't bring any value and doesn't allow him to do anything. Instead of that, we should lead him to the bank transaction. For the activities applied on the bank transaction, bank statement line is replaced by the said bank transaction. In addition, on the reconciliation view the user can now select multiple records and through a single form schedule an activity for all of them at once. task: 6010147
RATIONALE
In some cases (luxury, big corporate company) people want to be able to
review all messages generated by Odoo that are sent to the customers.
This is important when branding / copy writing is considered valuable
(e.g. "Your ticket has been closed" → "We are happy to announce that your
care ticket ...").
Currently we have several ways of generating them
* using a mail.template (used either as template.send_mail() in code, either
due to tracked changes, either with manual usage of templates);
* message_post → post a body, and if recipients to notify by email content
is encapsulated in an email layout
-> can be manual (chatter), message_type being email (incoming email) or
comment (user input in chatter)
-> can be automatic (calling message_post in code), generally with
message_type being notification, auto_comment
* message_post using rendered body based on a qweb view (in code), see
message_post_with_source
* mail.mail manual creation → code only (as only admins can create mail.mail)
* message composer
-> may be used to post a message, on a single record or in batch, based
on a template or using custom body
-> may generate mail.mail in batch (standard mailing usage)
* mass mailing → uses message composer to generate emails
It is currently not possible to review through interface all content that
might be sent to clients automatically: mail.templates can be found and
modified, but strings inlined in code cannot (only through code or
customization). Views can be found but there is no easy way to find them
in the UI.
SPECIFICATION: AUDIT LOG
At least give a way to know a mail.mail was created automatically / manually
* when a template is used, keep mail_template_id on message. Note that if
content was modified manually, template_id is still propagated;
* when it is generated through a mass mailing, keep mailing_id on mail.mail
* when it is generated automatically by message_post in code → message_type
is 'notification', which is ok
* when it is generated by users → message_type is 'comment', which is ok
* add a flag on qweb views used in posting process so that we can filter and
find them easily. Add a menu entry below "Email Templates" to find them
Task-6368610 [mail] Track content source
Part of Task-6260135 [mail] Ability to review outgoing contentThis PR adds various UI improvements in different modules. # Base - 3 filters to group users by fields: company, language and role in company (user/admin) - 2 new optional fields in the user list view: date of creation and default company - possibility to access an user form by clicking on the pending invitation badge - button to hide/show password in identity check form and password change form - improves the clarity of the password asked during identity check by stating that it requires the admin password # Base_setup - Removes the icon next to the number of active users in general settings # Auth_signup - Adds a filter grouping users by the state of the invitation sent - Changed the color of the "Invited" status from blue to grey, indicating the user is still a draft - Changed the message in the notification received when sending a mail invitation to a user to make it more clear # Auth_totp - Improves the readability of 2FA forms issued from mail 2FA and authenticator 2FA in order to reduce the mental load and make the form clearer and more explicit while also removing the "cancel" button in the forms. - Modifies the mail template containing the code by moving the expiration delay directly under the code. - Updates the tests by removing the verification of a deleted label and modify various string values # Web - Hides logo in webclient forms for companies having no logo or using the default logo # Hr - Makes the error message clearer when trying to create an employee for a company they don't belong to by indicating what to do to fix the issue. - Adds a redirection towards a user's newly created employee form when clicking on the "Create employee" button in the user form, allowing to check if the information are correct # Crm - Add the possibility to search on opportunity in pipeline and leads analysis views Task-6179091 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr