Monday, September 14, 2026
132 changes · master
Security fixes and vulnerability patches
Project and task access is now managed separately from follower notifications, so customers and team members can keep visibility without receiving unwanted chatter emails. The update also adds clearer read-only and edit sharing modes, improves portal task assignment, and prevents sensitive sharing links from being exposed in chatter.
Original PR description
Currently, portal users get access to the projects and tasks they follow. This tightly couples communication with access rights, creating a frustrating experience for customers: they receive chatter…
Currently, portal users get access to the projects and tasks they follow. This tightly couples communication with access rights, creating a frustrating experience for customers: they receive chatter notifications about tasks they are not actively interested in, but if they unfollow to stop the spam, they completely lose access to view the task. This PR fundamentally separates the concepts of "followers" (communication) and "collaborators" (access rights), allowing us to decouple email notifications from project and task visibility. ### Implementation & Progression This refactoring was implemented in distinct phases : Collaborator Split for Edit Access: Migrated portal users with limited_edit access away from the follower-based access model, relying instead on explicit project.collaborator records and shifting the restriction from row level to fields level. Read-Only Project Sharing: Introduced a new read-only project sharing view. This allows us to support collaborators with view access, ensuring they can browse the portal without needing to be injected into the followers list. Internal User Split: Extended the collaborator/follower separation to internal users to unify the access logic across all user types. task-6453619
Point of Sale self-invoicing now prevents unauthorized changes to customer records and checks that required invoicing details are present before creating invoices. This protects customer data integrity while still allowing valid users to complete invoicing, and includes a small ticket screen display fix.
Original PR description
Before this commit: ------------------- - During self-invoicing, a public user could create a new customer or update the current order's customer data by submitting the self-invoicing form, without any access rights validation. - For logged-in users (portal or internal), invoice generation could proceed even when the user or the selected customer lacked the required invoicing information. After this commit: ------------------- - During self-invoicing, a public user can create a new customer for the order, but cannot modify the existing customer linked to the order. - For logged-in users (portal or internal), required customer information is validated before generating an invoice. Customer data can only be updated when the customer is the logged-in user's partner or a child contact of that partner. Extra fix: - Handling fix for numpad visible for draft order in ticket screen. Task-6272660 Forward-Port-Of: odoo/odoo#287482 Forward-Port-Of: odoo/odoo#270112
This update fixes cases where portal users could change a task status but were blocked by related deadline permissions. It also tightens access around private project timesheets and prevents task creation from shared Gantt views when required deadline fields are read-only.
Original PR description
in some cases portal users can update state but they are not allowed to update date_deadline task: 6453619
New functionality added to Odoo
Companies can now record concrete ESG actions with baseline, target, and current values, making it easier to monitor progress toward sustainability objectives. The ESG dashboard and CSRD reporting now include action status information, while the previous project-task based approach is replaced by a simpler dedicated model.
Original PR description
Companies need a way to track the concrete actions they take to reach their ESG objectives, alongside the baseline, target and current values used to measure progress over time. This adds a new…
Enhancements to existing features
Tax closing accounts are now configured on tax return types instead of being repeated across individual tax groups. This makes setup easier to find, reduces duplication across country localizations, and restores the onboarding wizard for setting return periods.
Resolved issues and error corrections
The web translation dialog now correctly shows and saves XML field attributes that contain special HTML characters. This prevents translated content from being displayed or saved with incorrect extra escaping, improving reliability for users managing translations.
Original PR description
Have an xml field with special html characters in an attribute that should be translatable Before this commit, the translation dialog rendered that case badly, doube escaping when saving After this commit it works as expected 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
Features or functions removed from Odoo
The partner ledger no longer includes two unused residual amount columns. This simplifies the report setup and removes outdated fields without changing the core ledger information users rely on.
Original PR description
removing residual_at_date and residual_currency_at_date since they are not used anymore in partner ledger see odoo/upgrade#11285 task-none
Code cleanup and technical improvements
This update reorganizes how notebook tab styling is applied in the web interface. It keeps the same user experience while making the underlying code easier to maintain and less prone to styling inconsistencies.
Original PR description
part of task-6526153 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
Documentation and clarification updates
NioSystems has added its Corporate Contributor License Agreement signature to the project records. This confirms the company is authorized to contribute code under Odoo's contribution requirements, supporting clear legal ownership for future submissions.
Original PR description
This Pull Request adds the Corporate CLA signature file for NioSystems to authorize contributors to submit code. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Companies need a way to track the concrete actions they take to reach their ESG objectives, alongside the baseline, target and current values used to measure progress over time. This adds a new `esg.action` model to record such actions: each one can optionally be linked to a CSRD metric (and its ESRS), carries a baseline/target/current value (physical quantity or monetary) with their respective periods, and keeps a history of recorded values used to compute the current value. A "Reached" indicator is automatically computed by comparing the current value to the target, based on whether the action aims for growth or decline (derived from the baseline vs target values), and can be overridden manually. The `esg_project` module, which used project tasks to represent ESG actions, is removed in favor of this dedicated, simpler model. The ESG dashboard now shows a count of actions by status (reached, not reached, no target set), and the CSRD report includes a table of actions linked to metrics reported for the period. task-5253296
Planning Service can now price interventions based on the distance between a technician’s work address and the customer location. This gives businesses a more accurate way to charge for travel-heavy service work, while still keeping the existing fixed-fee option.
Original PR description
…distance" In this task, we improved the Planning Service feature by introducing distance-based intervention pricing. When a planning technician provides a service to a customer, the intervention quantity is calculated according to the Planning Service settings. A new "Fee per Distance" pricing option has been added to the Planning settings. The intervention quantity is determined based on the selected pricing method: - Fixed Fee: The intervention quantity is always 1. - Fee per Distance: The intervention quantity is based on the distance between the technician's work address and the customer's location. Example: If Customer A is 110 km away from the technician's work address, the generated intervention line will have a quantity of 110. Task-6322981
Hong Kong payroll users can now generate the Bank of China iGTB KC05 file in the Non-Payment Type format. The existing Bank of China format is also renamed as the Payment Type variant, making it clearer which upload file should be used for each payroll process.
Original PR description
Add support for the Non-Payment Type variant of the Bank of China iGTB KC05 payroll upload file. The existing format is relabelled as the Payment Type variant to tell the two apart. task-6565137
Philippine payroll now supports five common employee loan repayment adjustments for SSS and Pag-IBIG loans. These repayments are deducted after tax, helping payroll teams reduce take-home pay correctly without lowering taxable salary, and the employee salary adjustment view now highlights remaining balances by default.
Original PR description
Add five loan rules that can be used as salary adjustments: SSS Salary Loan, SSS Calamity Loan, Pag-IBIG Multi-Purpose Loan, Pag-IBIG Calamity Loan and Pag-IBIG Housing Loan. They belong to a new Loan Deduction category, placed under the post-tax deductions so that repayments reduce the take home pay without reducing the taxable salary. In the Salary Adjustments tab of the employee form, the Beneficiary Bank Account column is now hidden by default, and the Remaining Amount column is shown instead. task-6522331
Odoo can now connect to Mexico's SAT mass download service to automatically retrieve issued and received CFDI documents using the company's e-Firma certificate. This reduces manual invoice importing work for accounting teams and adds tracking tools to review downloaded documents and request status.
Original PR description
Before this commit, the only way to bring received CFDIs into Odoo was to manually import them. This process is especially slow for companies that creates a lot of invoices, keeping accountants away…
Before this commit, the only way to bring received CFDIs into Odoo was to manually import them. This process is especially slow for companies that creates a lot of invoices, keeping accountants away of fully integrating with Odoo. To solve this, we integrate with SAT Mass Download Service of CFDI. This service provides some endpoints to retrieve all the Issued/Received CFDI documents by RFC, using the taxpayer e-Firma certificate. Basically the process is resumed to: - An authentication is done to the service to use the other endpoints - A request is then created for a package for specific criteria of documents, receiving an uuid to request later. - Since the package can take time to create, we need to poll the service - to check if it is ready or rejected, if ready a package uuid is given to us - Finally we use the uuid to download the final package (CFDI or Metadata) A new model is added to persist the state of the request until the download is ready and completed. This requests can be created automatically or manually and they are created/processed by a combination of crons until ready to import. The imported documents can be reviewed on a new menu for all created CFDI documents. Also, now MX certificates can be identified between their scope "CSD or E-FIRMA (FIEL)", this is to distinguish between a certificate used to sign CFDI and the E-FIRMA. task-4565658
Field Service teams can now add materials to jobs by scanning product barcodes from the materials catalog. This speeds up on-site product entry, reduces manual searching, and helps avoid selection mistakes.
Original PR description
This commit allows adding products from the Field Service materials catalog by scanning their barcode. task-3270454
Original PR description
task-6237033 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Kanban group settings cog now matches the round quick-add button beside it. This creates a more consistent and polished interface with no change to business workflows.
Original PR description
Before this commit, the group config cog was a btn-light rounded rect while the quick add button next to it was a circle. This commit reuses o_btn_circle for the cog. requires: https://github.com/odoo/enterprise/pull/131254 task-6541909 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Manufacturing users can now record an extra cost directly on a bill of materials. This cost is included in BoM and manufacturing order overviews and their printed PDFs, giving clearer visibility into total production costs including subcontracting costs after confirmation.
Original PR description
This commit adds a field so the user can define an `extra cost` for a manufacturing BoM. This value will be added to the reporting in the enterpise module. Also will this commit display the extra cost in the BoM Overview, MO Overview and the printed pdf's of those overviews. Additionally will the extra cost from subcontracting also show up in the overview once the MO is confirmed. Task-6542702
Tax return closing accounts are now configured on shared return types instead of separate setup flows, making configuration more consistent across companies and localizations. The redundant configuration wizard was removed, while settings remain available through return type configuration and accounting settings.
Original PR description
task-6237033
The AI assistant no longer needs to keep a single request open while it works through answers and tool actions. Conversations can continue through secure background callbacks, support delegated sub-tasks, and keep users updated in the browser more reliably.
Original PR description
Previously, we kept an HTTP request open while the agent went through successive model rounds and tool calls. The worker waited for each model response until the conversation finished or paused for…
Previously, we kept an HTTP request open while the agent went through
successive model rounds and tool calls. The worker waited for each model
response until the conversation finished or paused for an interaction.
We now store the pending work on ai.session and advance the conversation
across separate requests, each using its normal transaction boundary:
- /ai/start_session_advance starts an exchange from a new user message.
- /ai/completion_result_ready receives the model result from IAP, then
runs tools or finishes the exchange.
- /ai/resume_pending_interaction continues a paused tool batch from a
user or browser response.
```text
[ 1. Start / Resume Request ]
|
v
[ 2. Save Request & Commit ] <---------------+
| |
Submit Request | | Next Round
v |
[ 3. Asynchronous IAP Processing ] |
| |
HTTP callback to webhook |
v |
[ 4. Process Result & Run Tools ] -----------+
|
+----> [ 5. Final Answer / Pause ]
|
+----> [ 6. Child Session (Subagent) ]
|
(Same loop, steps 2-6)
|
(Result to parent batch)
```
Requests are saved before commit and submitted to IAP afterward, ensuring
their state is visible when the result arrives. IAP delivers model results
through signed HTTP requests to our webhook endpoint. The signature and
request UUID are checked before we restore the saved user and context
and process the response. Tool calls still run synchronously within
that request.
Agents can now delegate work through tools that start or continue child
sessions. Each child has its own conversation history and uses the same
loop, including further delegation. Its result returns to the parent's
pending tool batch, which continues once the required results arrive.
The browser now receives messages, loop state, pending interactions, and
client tools through the bus instead of the response stream. User and
browser responses resume the saved tool batch, with client tools
targeted to the requesting tab.
Existing AI integrations and tests are adapted to the webhook-driven flow.
TASK-ID: 5153883
Co-Authored-By: Andrzej(pian) <pian@odoo.com>Odoo Studio users can now move notebook pages to a new position using drag and drop. This avoids deleting and recreating tabs with their content, making form customization faster and less error-prone.
Original PR description
When a page is defined in the UI; it is not possible to entierly move it. It needs to me removed and re-ceated at the right place with all of its content. This commit allows users to reorder notebook pages with drag&drop. task-6526153 Co-authored-by: Lucas Perais (lpe) <lpe@odoo.com>
The Kanban group configuration cog now uses the same secondary button styling as related controls. This creates a more consistent visual experience while removing redundant styling rules.
Original PR description
Before this commit, the circle style was only applied to the kanban quick add button, repeating classes o_btn_circle already provides. This commit applies btn-secondary to the group config cog too and drops the redundant ones. requires: https://github.com/odoo/odoo/pull/287845 task-6541909
Visitors can now join a public discussion channel directly from the channel page header instead of opening the sidebar and finding the Follow button. This makes joining public conversations easier while still limiting the action to visitors who have an identified user or guest profile.
Original PR description
Before this commit, the only way to join a channel from its public page is the Follow button of the channel tab, which requires the visitor to open the sidebar and find the channel there. This commit moves the `join-channel` thread action to the bundle the public page loads, so the channel header offers it there too. Its call becomes `joinRpc()` on the channel, shared with the Follow button, and sends the visitor's user id or guest id. Note that the action stays hidden until the visitor has a persona, as an anonymous visitor has no guest record to add as a member.
Production analysis reports now include extra costs defined on Bills of Materials in key cost totals and averages. This gives business users a more complete view of manufacturing costs for planning, monitoring, and decision-making.
Original PR description
This PR adds an extra cost field to BoM's and in this commit the following values are updated to include this extra cost in the `Report/Production Analysis`: - `Expected Total Cost / Unit` - `Average Total Cost` - `Total Cost` Also a field is added in the report to display the `Extra Cost` Task-5259448
The Discuss app now separates personal settings from broader configuration options by grouping Notifications and Voice & Video under a dedicated User Settings section. This makes the menu easier to understand and more consistent with other Odoo apps.
Original PR description
Before this commit, the "Configuration" menu contain items that were both global on Discuss application and user-specific settings. This contributes to making the app not as intuitive as it should. The "Configuration" menu is meant to reflect consistently the other "Configuration" menu items in other apps, which are meant to make global configurations on the app. This worked for all but the menu items "Notifications" and "Voice & Video" that are clearly settings affecting only the current user. This commit improves by moving "Notifications" and "Voice & Video" menu items to their dedicated "User Settings" group, still inside the Configuration menu. Task-6560201 <img width="454" height="262" alt="Screenshot 2026-09-08 at 23 12 57" src="https://github.com/user-attachments/assets/84f670ea-d277-4b90-93f2-369dd7e698fa" />
Inventory accounting now prepares product value records using product, lot, and stock movement information. This makes valuation data more complete and easier to manage through updated screens and related record handling.
Original PR description
Adapt product value model Create product value from product/lot/move Adapt user interface with all required fields/functionalities Also added ondelete cascade on product.value and on stock.move as already present on stock.move.line task: 5362246 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Scheduled call activities now prefill an editable phone number for single records and save the chosen number on the activity. The update prevents accidental overwrites of existing contact phone numbers, keeps batch scheduling record-specific, and makes call numbers easier to copy and use.
Original PR description
Prefill single-record Call activities with an editable phone number and persist the chosen value on the activity. Keep batch values record-specific. Fill only a blank, uniquely related contact when the user changes the prefilled number. Never overwrite an existing phone or let automation copy an untouched prefill. Render the number as selectable text, show Copy on hover or focus, and place Call immediately before Done. Task-6538978 Enterprise: https://github.com/odoo/enterprise/pull/130805
Users can now enter duration-based formulas directly in time fields, such as adding or subtracting 30 minutes or combining hours and minutes. This makes bulk edits and day-to-day time entry faster and more accurate because calculations are applied consistently per record.
Original PR description
The float_time widget can now use formulas that use "duration" (e.g.: =2h+30m-45m or -=30m) All arithmetic operators are supported (+, -, * and /), by reusing the existing ArithmeticOperation machinery instead of custom logic. This also means an increment (e.g. +=30m) is applied individually on each record when editing several records at once, instead of forcing the same value on all of them. It's using parseFloatTime under the hood, so the operation accepts everything that you could put in the field. (2h 30m or 2:30 or 2.5) task-6481324 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Pakistan localization settings now manage the IP address service in the base Pakistan module, making it available more consistently across related features. Point-of-sale settings now show the IP address field, and POS invoice reporting uses the correct Odoo service endpoint for more reliable connectivity.
Original PR description
Moved the IAP address system parameter to the base `l10n_pk` module. Also added the IP address field to the POS settings view. Additionally, fixed the endpoint targeted by `l10n_pk_edi_pos`, which was incorrectly set to `iap.odoo.com`. The proxy should be `iap-services.odoo.com`, consistently with `l10n_pk_edi`. task-6569742 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Loan accounting entries are now posted on the first day of the relevant month instead of waiting for the payment due date, while avoiding dates before the loan begins. This improves cash and profit-and-loss visibility, reduces month-end workload, and supports faster automatic reconciliation.
Original PR description
Previously, loan journal entries were posted based on the payment due date. There is no need to wait until the due date since loan details are fixed and known in advanced. Additionally, posting the loan entries on the first of the month reduces month-end bottlenecks, allows for better Cash and P&L visibility, and allows instant auto-reconciliation. Modifications: - Modified `action_confirm` to calculate the accounting date and set journal entries to the first of the month (without pre-dating the loan start date) - Set due date (`date_maturity`) on the short term account line of main payment entry. - Updated the reclassification reversal move to post exactly one month after the accounting date using `relativedelta(months=1, day=1)`. Task-6237907
Scheduled call activities now align with the updated call action experience, making phone numbers easier to select while still supporting native dialer fallback. The VoIP scheduling dialog also uses a cleaner editable phone input without an extra call button, reducing confusion for users.
Original PR description
Community renders scheduled Call numbers as selectable text and exposes an explicit Call action. Adapt the Enterprise and VoIP tests to that action, keep the native-dialer fallback, and use a formatted editable phone input without a call button in the VoIP schedule dialog. Task-6538978 Community: https://github.com/odoo/odoo/pull/287192
Quality managers can now validate stock transfers, manufacturing orders, and repair orders even when some quality checks are still pending. This helps avoid operational delays when checks take longer, while still allowing quality controls to be completed afterward.
Original PR description
Quality checks must currently be completed before validating pickings, manufacturing orders, or repair orders. However, some checks can take a significant amount of time, causing unnecessary bottlenecks in the workflow when immediate validation is required. Allow quality managers to validate these documents with pending checks so that quality controls can be completed after the fact. Enterprise PR: odoo/enterprise#129545 Task-6365390 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
Quality managers can now validate transfers, manufacturing orders, and repair orders even when some quality checks are still pending. This helps avoid operational delays when immediate validation is needed, while still allowing the checks to be completed afterward.
Original PR description
Quality checks must currently be completed before validating pickings, manufacturing orders, or repair orders. However, some checks can take a significant amount of time, causing unnecessary bottlenecks in the workflow when immediate validation is required. Allow quality managers to validate these documents with pending checks so that quality controls can be completed after the fact. Community PR: odoo/odoo#285240 [Task-6365390](https://www.odoo.com/odoo/966/tasks/6365390)
Updates Belgian payroll termination fee calculations so meal vouchers and withholding taxes are based on more accurate salary, work schedule, public holiday, and time-off data. This helps produce more compliant final payslips and related payroll declarations for departing employees.
Original PR description
## Meal Vouchers In the meal voucher rule for terminations fees structure: 1. correct the quantity from 220 to number_of_days_per_week * 52 - 10 (public holidays) - time-off allocation (paid time off + extra legal). 2. correct the result: meal_voucher_amount - meal_voucher_employee_share ## Withholding taxes 1. Creation of a new rule: Reference Salary = BASIC2 + YEAREND_BONUS + VARIABLE_SALARY + RESIDENCE + EXPATRIATE + PAY_VARIABLE_SALARY + ATN_CAR_TERM 2. Redefinition of the Yearly taxable salary for Termination fees: Reference Salary - ONSS 3. Redefinition of withholding taxes: Yearly taxable salary (Termination fees) - children exoneration - ONSS __ task-6247703
Website editors can now translate chart descriptions used for accessibility. This helps multilingual websites provide clearer, localized descriptions for visitors using assistive technologies.
Original PR description
It was possible to add a description (aria-label) to a chart, but not to translate it. This commit makes it translatable.
Odoo Sign can now let signers apply their own qualified electronic signature through itsme, instead of only sealing completed documents with the company certificate. This strengthens legal assurance for signed documents and preserves each signer’s contribution as the document progresses through the signing process.
Original PR description
Until now the completed document was signed with the company certificate only. An identity check like `itsme` told us who the signer was, but the signature on the file stayed the company one. The signer can now sign with their own qualified certificate. The file then carries their signature and not only the company one. For that, the completed document is now built with incremental updates over the original file. Each signer's values are added as a new revision, so a signature already on the file stays valid when the next signer adds theirs. The qualified signature is made by a service running on its own server. It shows the signer the document before signing it. That service is added in odoo/iap-apps#1890 and the `itsme` role needs it. task-4951149
Belgian payroll configuration now requires the company sector to be filled in. This helps prevent payroll calculation errors for outplacement and payslip reductions that depend on the sector information.
Original PR description
The l10n_be_sector field is essential for computing outplacements and payslip reductions. Making it mandatory during the configuration of the company prevents computational errors. task-6560105
The Indian time off module now uses clearer names for sandwich leave policy options and updates the related tooltip. This makes the policy settings easier for HR users to understand without changing underlying leave calculations.
Original PR description
The names of sandwich leave policy selections are updated. The tooltip is renamed. task-6538163 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
When users create a resource from a specific working schedule, Odoo now keeps that schedule selected instead of replacing it with the company's default schedule. This reduces manual corrections and helps ensure new resources are assigned to the intended calendar from the start.
Original PR description
When creating a new resource from a working schedule stat button, `default_calendar_id` is provided in the action context. However, on form initialization, `_onchange_company_id` overwrites `calendar_id` with `company_id.resource_calendar_id`. Check for `default_calendar_id` in the context inside `_onchange_company_id` to preserve the pre-selected calendar when creating resources from a schedule. task-6515306 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update makes it easier for businesses with multiple companies to move goods between warehouses without creating matching sales and purchase documents each time. It also improves visibility and valuation of these inter-company transfers, helping teams track stock movement and internal recharging more accurately.
Original PR description
Improves inter-company flows by reducing the friction in multi-company settings, as well as allowing easier inter-company transfers without going through SO <-> PO inter-company transactions. Summary…
Improves inter-company flows by reducing the friction in multi-company settings, as well as allowing easier inter-company transfers without going through SO <-> PO inter-company transactions. Summary of the changes: - Always set the right `inter-warehouse transit`/ `inter-company transit` locations to warehouse partners - Refactor the way resupply from warehouse to warehouse works - Now always consists of 3 rules, regardless of the delivery steps, but now make use of the push delivery routes. - If more than one company is accessible, warehouse from other companies can be selected for resupply - Allow to select a warehouse from another company as the SO's warehouse and trigger its delivery from there. - Allow to select a warehouse from another company as the PO's warehouse and trigger its receipt from there. - When computing a move's value, if the product came from a previous company, then use the value it had there when leaving the company. - Add a favorite filter in Move Analysis to better track these new inter-company transfers Task-4816396 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mobile VoIP users now see a clear option to enable audio when microphone access is missing or blocked. This helps users resolve call audio permission issues directly from the softphone menu, while keeping desktop audio device selection unchanged.
Original PR description
Commit [1] restored audio device selection while in a call, improving the softphone top-left dropdown menu that was reviewed at [2], breaking a bit what was introduced at [3] and [4]. The mobile UI…
Commit [1] restored audio device selection while in a call, improving the softphone top-left dropdown menu that was reviewed at [2], breaking a bit what was introduced at [3] and [4]. The mobile UI regarding audio settings was still to restore though. Indeed, before [2], it made sense: there was a dedicated audio button that showed an error if the microphone was not accepted (yet) or blocked and, on mobile, clicking on it would open the permission dialog with indication how to fix the browser-side error if any. Now, since [2] (and [1]), the error icon is still shown... but on mobile there is no entry to have those permission dialogs. This commit restores that. - Desktop, microphone error: show an error icon (both on the top-left dropdown and on the audio settings entry). The audio settings entry allows device selection. - Desktop, no microphone error: no error icon, still the audio settings entry to allow device selection. - Mobile, microphone error: show an error icon on the top-left dropdown, and a "Enable Audio" entry with an error icon in the dropdown. Click on that opens the permission dialogs. - Mobile, no microphone error: no error icon and no audio settings entry (we still keep device selection disabled on mobile as not supported by the vast majority of mobile browsers). [1]: https://github.com/odoo/enterprise/commit/7250e8dda350019f739b91fa6cc7533395ec45da [2]: https://github.com/odoo/enterprise/commit/763bfc77cfae341d95967fa04dd514bd3095cb9d [3]: https://github.com/odoo/enterprise/commit/35d0ce76818e4e6efc8ab502aa03d8047e0c880e [4]: https://github.com/odoo/enterprise/commit/e964e4b28604f32550566ad1b9f17aed89653597 Related to task-6533808
Belgian payroll can now correctly handle the same worker being employed by more than one company in the same database. This prevents duplicate employee relationship conflicts and avoids mixing payroll declarations or employment periods between companies.
Original PR description
The dimona relation represents a relation between a worker (identified by their NISS) and an employer. Before this commit, the relation model had a unique(name) constraint, where name is the NISS of the employee. Notably, this constraint was company-unaware; this meant that a person who was employed be 2 companies in the same database would effectively break the constraint, and their 2nd relation could never be saved in the database properly. This commit scopes the unicity constraint per company and ensures that computed fields are scoped by company to avoid accidentally linking declarations/periods/relations together across different companies.
Inter-company sales and purchase flows now stay better aligned when quantities, prices, discounts, or display lines change. Related deliveries and receipts are linked more consistently, reducing manual follow-up and improving visibility across companies.
Original PR description
Summary of the changes: - Update inter-company transaction settings to remove intercompany user / warehouse / picking type - Now when the intercompany sync is active, it will link moves from the SO <-> PO pickings through the `move_dest_ids`/`move_orig_ids`, the same way they would be linked through an inter-company resupply - Correctly updates and notify the corresponding SO/PO when a quantity/price/discount is updated on a PO/SO line. - Minor updates to follow the changes made in community Task-4816396
The Belgian payroll flow no longer shows the working schedule change wizard when an employee has a contract but no payslip. This reduces unnecessary interruptions for payroll or HR users when schedule changes do not require payslip-related handling.
Original PR description
Normally, when we change the working schedule of the employee (the one with different work_rate) that has a contract:
- working schedule wizard was appearing
Now when the employee does not have a payslip, we don't open that wizard
task-6562466The accounting field that describes deductible percentages now has clearer wording. This helps internal tools and AI interpret it correctly and avoid confusing it with other VAT or fiscal deductibility concepts.
Original PR description
Provides a better description to the field deductible_percentage to help AI understand its meaning and differentiate it from other deductibility features such as partial VAT deductibility or fiscal categories. task-6180199 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Kanban list-style cards have been standardized across several Odoo apps to provide a more consistent and polished user experience. The update aligns these views with the newer Frost design and removes layout conflicts that could affect visual cues such as selection tooltips and colored borders.
Original PR description
*: base_automation, hr_holidays, hr_recruitment, mass_mailing, survey, website Several Kanban views previously duplicated card-list rendering customizations. This commit fine-tunes the layout to…
*: base_automation, hr_holidays, hr_recruitment, mass_mailing, survey, website Several Kanban views previously duplicated card-list rendering customizations. This commit fine-tunes the layout to match the Frost design and standardizes it with the `o_kanban_list` class. It also replaces the `::after` pseudo-element with `::before` to avoid conflicts between the Kanban card's colored border and the selection tooltip. task-6528164 Requires: - https://github.com/odoo/enterprise/pull/131237 | Before | After | |--------|--------| | <img width="1437" height="449" alt="Screenshot 2026-09-11 at 13 13 20" src="https://github.com/user-attachments/assets/ee414f87-96f8-49e5-93eb-aa3d08f31c51" /> | <img width="1439" height="458" alt="Screenshot 2026-09-11 at 13 13 14" src="https://github.com/user-attachments/assets/a33dc71d-2316-4f08-b520-db437f503be3" /> | | <img width="1428" height="603" alt="Screenshot 2026-09-11 at 13 14 18" src="https://github.com/user-attachments/assets/da645979-e8f2-4849-98d7-db7a51d40a11" /> | <img width="1427" height="535" alt="Screenshot 2026-09-11 at 13 14 09" src="https://github.com/user-attachments/assets/3f208b19-7475-4426-8d67-13a71aeabac7" /> | | <img width="1438" height="582" alt="Screenshot 2026-09-11 at 13 14 35" src="https://github.com/user-attachments/assets/8c47cfb8-50f9-4019-b8ef-104a9f49f703" /> | <img width="1440" height="516" alt="Screenshot 2026-09-11 at 13 14 43" src="https://github.com/user-attachments/assets/6e47647d-4257-40d0-9f97-c63ae3c7e474" /> | | <img width="1429" height="754" alt="Screenshot 2026-09-11 at 13 14 57" src="https://github.com/user-attachments/assets/eba0a087-0864-4287-9359-4d654ca1e2e8" /> | <img width="1438" height="576" alt="Screenshot 2026-09-11 at 13 14 53" src="https://github.com/user-attachments/assets/496dd898-607a-4f48-9026-587278c75ddb" /> | | <img width="1438" height="430" alt="Screenshot 2026-09-11 at 13 15 17" src="https://github.com/user-attachments/assets/f543a688-91c1-4f24-8d17-ca0bb13d230b" /> | <img width="1437" height="426" alt="Screenshot 2026-09-11 at 13 15 32" src="https://github.com/user-attachments/assets/235f262b-5545-40d9-a735-5f01c7368610" /> | | <img width="1430" height="685" alt="Screenshot 2026-09-11 at 13 16 31" src="https://github.com/user-attachments/assets/764a54db-284d-4782-a516-f0caf0f4d234" /> | <img width="1440" height="557" alt="Screenshot 2026-09-11 at 13 15 57" src="https://github.com/user-attachments/assets/7141872c-acc3-4435-8667-10adbeee6110" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Kanban column quick-create area has been updated to better match Odoo’s new Frost design, giving users a more polished and consistent interface. Button borders in grouped controls now display correctly when users hover or click, improving visual clarity during everyday interactions.
Original PR description
### Bring hover buttons to the front in input-group Prior to this PR, when several buttons were defined within an input-group, their borders could overlap incorrectly on hover. This PR ensures that the entire border around a button remains visible when it's hovered, just as it does when the button is focused. ### Fine-tunes `column_quick_create` design This PR updates the design of the `column_quick_create` component to match the new Frost design. task-6533946 | Before | After | |--------|--------| | <img width="722" height="419" alt="Screenshot 2026-09-07 at 10 27 33" src="https://github.com/user-attachments/assets/449018cf-3190-4c85-b2ec-629b855f5536" /> | <img width="725" height="425" alt="Screenshot 2026-09-07 at 10 28 22" src="https://github.com/user-attachments/assets/915ee7a1-1818-40cc-a3fb-695ea27235cc" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The editor toolbar now uses more intuitive icons for text color, image preview, and image resizing. This makes common editing actions easier to recognize and helps users work more confidently in content editing screens.
Original PR description
- The `text_fields` icon is replaced by a simple Arial font "A" for the text color selector. | Before | After | | :---: | :---: | |<img width="222" height="79" alt="image" src="https://github.com/user-attachments/assets/1ac02ca2-4a6e-4eb5-a68e-7f396572de91" />| <img width="219" height="75" alt="image" src="https://github.com/user-attachments/assets/c9092f92-837a-41f0-abbb-b6218c423368" /> | - The image preview button is now a magnifying glass. - The image resizing button is now represented by the `resize` icon instead of `expand_content`. | Before | After | | :---: | :---: | | <img width="314" height="77" alt="image" src="https://github.com/user-attachments/assets/f8e7b942-2821-4e52-b470-52377144f795" /> | <img width="327" height="72" alt="image" src="https://github.com/user-attachments/assets/87e90b4e-ac5d-4df8-9e4f-17dad8ca28d7" /> | task-6472088
Belgian reporting now includes an added check related to VAT deductibility. This helps businesses improve the accuracy of tax reporting and reduce the risk of incorrect VAT treatment.
Original PR description
task-6180199
Appointment types and Sign templates now use a more consistent Kanban list layout aligned with the updated Frost design. This reduces visual inconsistencies between screens and makes list-style cards easier to scan for users.
Original PR description
*: appointment Several Kanban views previously duplicated card-list rendering customizations. This commit fine-tunes the layout to match the Frost design and standardizes it with the `o_kanban_list` class. task-6528164 Requires: - https://github.com/odoo/odoo/pull/287821 | Before | After | |--------|--------| | <img width="1440" height="687" alt="Screenshot 2026-09-11 at 13 16 44" src="https://github.com/user-attachments/assets/9e2a5bf6-7357-45c9-b913-07435b77a3be" /> | <img width="1442" height="652" alt="Screenshot 2026-09-11 at 13 16 43" src="https://github.com/user-attachments/assets/9e8a1ca0-3655-482f-b283-3c6ed83fd607" /> | | <img width="1437" height="424" alt="Screenshot 2026-09-11 at 13 17 03" src="https://github.com/user-attachments/assets/19f2b418-5301-4efc-818b-9b2f2e68185a" /> | <img width="1437" height="454" alt="Screenshot 2026-09-11 at 13 17 13" src="https://github.com/user-attachments/assets/2000b1a1-d823-4fc1-b6fc-ebac07963d35" /> |
This update adds an internal explanation for how a Belgian payroll dependent-related field is calculated compared with what users see in the interface. It helps developers avoid confusion when maintaining the payroll rules, with no direct change to employee or payroll behavior.
Original PR description
The `dependent_juniors` field was a bit confusing as the computation did not reflect the UI. This commit adds a comment to clarify things for developers.
Documents and folders uploaded under employee or project records are now automatically connected to the related record, reducing manual linking and making files easier to find. The update also shows the linked record in the folder details panel, while preserving existing links in several move, copy, and deletion scenarios.
Original PR description
Documents uploaded in a folder were not automatically linked to the folder's related record. The record's folder is now automatically linked to the record on create/update, and documents inherit the…
Documents uploaded in a folder were not automatically linked to the folder's related record. The record's folder is now automatically linked to the record on create/update, and documents inherit the link from their parent folder. Add create/write/unlink hooks in DocumentsMixin to auto-link folders to records. Activated (_documents_must_link_folder) for hr.employee and project.project. Propagation rules: - Re-linking a folder propagates to unlinked child folders only. - Moving an unlinked folder under a linked one inherits the link and propagates to unlinked descendants (folders + docs). - Propagation stops at linked or non-writable folders (barriers). - Unlinking does not propagate; descendants keep their existing link. - Copies (and their descendants) inherit from the destination parent, not the source. - Shortcuts never inherit res_model/res_id automatically. UI: linked record now displayed on folders in the details panel. Limitations: - The details panel allows an editor to unlink a folder from its record or re-link it to another record, even while the original record still holds a reference to that folder (ex.: an employee through hr_employee_folder_id). The link can be restored from the same panel, but no server-side constraint prevents the desync. - Changing a record's folder (ex.: a project's documents_folder_id) links the new folder to the record but does not clear the link on the previous one; the old folder retains its res_model/res_id, which may be intentional (e.g. yearly archive folders) or not depending on the use case. If the new folder is already linked to a different record, a user error is raised (folders cannot be linked to multiple records). - Deleting a record clears res_model/res_id on all linked documents, but only those also linked to an attachment are moved to the Trash. Note: no folder link sync on bridge activation/deactivation (toggle removal planned). Task-6310302
The helpdesk gift card portal now uses Odoo's standard message loading flow instead of a separate older route. This helps keep the customer portal experience consistent and easier to maintain, with minimal visible change for users.
Original PR description
This commit replaces `/mail/chatter_fetch` with `/mail/thread/messages` in order to reuse the base mail code in portal as much as possible. part of task-3599659 [Community PR](https://github.com/odoo/odoo/pull/182334)
Belgian payroll payslips now include overtime hours directly on the printed payslip. This makes it easier for employees and payroll teams to review overtime details clearly without checking separate payroll records.
Original PR description
task~6467985
Belgian payroll now separates worked days by premium pay options so payroll users can see which hours belong to each premium category on payslips. It also improves sickness relapse handling and ensures certain non-monthly-pay time is deducted from normal hours instead of added on top, helping produce more accurate payroll results.
Original PR description
Steps to reproduce: - Encode Attendance time entries carrying premium pay options. - Compute the payslip and open the Worked Days tab. All the attendances would land on one line, so the options are invisible and the hours behind them cannot be told apart. This is now fixed. Also: Time on a type that is not "Added to Monthly Pay" is taken out of the normal hours instead of adding on top of them. Task 6445439 https://github.com/odoo/upgrade/pull/11070
The CRM pipeline switcher now uses the shorter label "All Teams" instead of "All Sales Teams". This improves readability and helps the interface fit better on smaller screens.
Original PR description
Reword the "All Sales Teams" label of the pipe switcher to "All Teams" to shorten it and have a better display on smaller screen sizes. Task-6568144 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Payroll users now receive a warning before starting a pay run when employee data, attendance, or time off records may be incomplete or invalid. This helps teams review and correct issues early, while still allowing them to continue if they choose to ignore the warning.
Original PR description
Before starting a pay run, the user should be warned about: - Employee with missing or erroneous data - Unapproved attendances for based on attendance employees - No time off at all for the period - No attendance for an employee based on attendance - Time off not validated A wizard pop up when the user clicks on the "Start Pay Run" button and when one of the previous conditions are met. Allowing the user to see the faulty records and either fix them or ignore the warning and continue with the pay run. task-6530800
Belgian payroll now supports holiday certificates for workers as well as employees. This helps calculate worker holiday entitlement and holiday pay recovery according to ONVA rules, reducing manual handling and improving compliance.
Original PR description
## Purpose Belgian holiday attestations currently only support employee certificates. Worker certificates follow different rules because holiday pay is paid by the holiday fund (ONVA), and holiday…
## Purpose Belgian holiday attestations currently only support employee certificates. Worker certificates follow different rules because holiday pay is paid by the holiday fund (ONVA), and holiday entitlement is determined using the worker conversion table. This PR adds complete support for worker holiday attestations when registering a certificate from a previous employer. ## Changes - Add an employee/worker type to holiday attestations. - Allow entering the total holiday pay from a worker certificate. - Compute worker leave entitlement using the ONVA conversion table for a five-day full-time week. - First convert worked and assimilated days to that five-day full-time equivalent with the formula A × 5/R × Q/S, look the result up in the table, then convert the entitlement to the employee's current working schedule. - Apply the configurable 1% holiday-fund solidarity contribution to recoverable simple and double holiday pay. - Recover holiday pay only when the certificate belongs to a former worker who is currently an employee. - Use the worker time-off work entry type when the person is still a worker, without employer holiday-pay recovery. - Adapt the holiday-attest form view to the selected certificate type. Task-5979520
The accounting reporting screens were updated as part of a technical cleanup of the underlying interface framework. This should help keep financial reports and return-related views easier to maintain and ready for future improvements, with little expected day-to-day impact for users.
The Frontdesk app now appears in the app overview between Lunch and Expenses. This makes the app list more logically ordered and easier for users to navigate.
Original PR description
In this PR we have updated the sequence of the **Frontdesk** app so that it appears between the **Lunch** and **Expenses** apps in the overview. Task-6568726
Payroll users are now warned when changing an employee version that is tied to validated payslips. They can either create a new version from a chosen date or deliberately correct the current version, reducing the risk of accidental changes to payroll history.
Original PR description
**Description :-** This PR introduces a front-to-back version control mechanism for the version records (hr.employee / hr.version). When an end-user attempts to modify a version that is protected…
**Description :-**
This PR introduces a front-to-back version control mechanism for the version records (hr.employee / hr.version). When an end-user attempts to modify a version that is protected with validated payslips, the system intercepts the modification in real-time and prompts the user with an interactive confirmation dialog (VersionUpdateDialog).
The user can choose between two operational modes:-
. Create New Version: Closes the current version and creates a new active hr.version record incorporating the modified fields, and relinks the employee.
. Correct Current Version: Bypasses version splitting and applies modifications directly to the active version record (displaying a warning regarding payslip impacts).
**Implementation :-**
The feature is implemented cleanly by inheriting the base hr form view (hr_employee_version_form) and extending HrEmployeeFormController without using global record patching, onRecordChanged() method overridden to intercepts the version updates flow
1. [ Field Modification on the version form view ]
│
▼
2. Controller Interception (onRecordChanged)
│ • check the version status via RPC: action_check_version_status
│ • Halts execution flow with an asynchronous Promise wrapper
│
▼
3. Interactive Protection Prompt (VersionUpdateDialog)
│ • Renders responsive options ("Create New Version" vs "Correct Current Version")
│ • Captures effective start date for new versions
│
▼
4. Promise Resolution & State Caching
│ • Apply: Resolves selection object { mode, dateStart } -> Cached in this.versionChoice
│ • Discard / Close: Resolves null -> Triggers record.discard() to revert pending edits
│
▼
5. Intercepted Save Execution (save())
│ • Mode A ("create_new_version"): RPC calls action_create_version_from_update,
│ resets old record state, and reloads view model to the new version.
│ • Mode B ("correct_current_version"): Executes standard ORM write via super.save().
▼
6. Apply the changes
task-6482857Belgian payroll users can now manage paid time off allocation again from employee list and kanban views. December payroll checks now warn when remaining time off balances or postponed amounts may affect allocations, helping payroll teams close year-end runs more accurately.
Belgian payroll now works correctly with the employee departure screen so activity plans can be created during a departure process. This helps HR teams organize follow-up tasks more smoothly when an employee leaves.
Original PR description
Update of l10n_be_hr_payroll to correctly use the notebook in employee departure view defined in hr module. task-6233311 odoo/odoo#288008
Accounting reports can now use a consolidation availability setting so they appear only when multiple companies are selected and the report is affected by more than one company. This keeps single-company report views cleaner while ensuring consolidation-related reports remain available in multi-company contexts.
Original PR description
With the related enterpise pr, add a new variant availability "consolidation" which makes the report visible only if it is impacted by several companies (company selector has at least 2 companies selected and options['companies'] is more than 1. This new type of variant should prioritize the other types in the selection. task-6398453 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286730
Accounting reports now include a consolidation availability option so relevant report variants appear when multiple companies are selected. This helps multi-company users see the right consolidation-related reports by default while keeping country- or chart-specific variants tied to the main company.
Original PR description
1) Add a new variant availability "consolidation" which makes the report visible only if it is impacted by several companies (company selector has at least 2 companies selected and options['companies'] is more than 1. This new type of variant should prioritize the other types in the selection. 2) Activate by default the "consolidation" filter in multi-company. 3) In multi-company, the variants of availability type "Coa match" or "Country match" should only be visible if they match the main company, not the secondary ones. task-6398453 Forward-Port-Of: odoo/enterprise#130484
Obox queues can now be linked back to the point of sale orders that created them, making it easier for teams to investigate queue issues. The related Obox and queue screens were also improved so staff can review this information more clearly.
Original PR description
In order to debug obox queue creation linked to pos orders. Also improve views of Obox queue and Obox.
The AI website assistant now gets clear feedback when page or CSS edits fail, so it can correct issues instead of assuming changes worked. It also uses a dedicated, validated process for creating website forms, making forms more reliable, editable in the website builder, and better suited for advanced flows like multi-step wizards and live calculations.
Original PR description
Previously, the "Apply HTML to Page" and "Write Custom CSS" tools blinded the agent to actual edit failures by always returning a success string. Additionally, the agent hand-wrote form markup, which…
Previously, the "Apply HTML to Page" and "Write Custom CSS" tools blinded the agent to actual edit failures by always returning a success string. Additionally, the agent hand-wrote form markup, which frequently resulted in broken forms that were not editable in Odoo's website builder or missed a destination. This commit introduces comprehensive edit reporting and a dedicated tool to safely handle webforms: - Edit Reporting: The HTML and CSS tools now return a `client_tool`entry (`website_apply_html`, `website_reload_css`). The builder applies the actions and returns a detailed report (success/errors, dropped elements, post-edit content, duration). - Edit Webform Tool: Form work is now handled by a dedicated tool rather than raw HTML edits. Specs (actions, fields, visibility, layouts) are validated server-side and applied via the builder's form plugin machinery. Raw form HTML in the standard apply tool is now explicitly rejected. - JSON Form Context: Webforms are exposed to the agent as JSON under `website_page.forms` instead of raw HTML, replacing the markup with a marker. The tool result returns the updated form in the same JSON shape. - Advanced Primitives: The webform tool supports multi-step forms, choice display variants, sliders, and computed fields. - Skill Updates: The agent's instructions are updated to check edit reports, retry failed actions, and steer wizards/live totals towards the new form primitives instead of hand-building them. task-6251785
Website forms can now offer multi-step flows, improved choice displays, sliders for numeric answers, and live calculated totals. This helps businesses create clearer, more interactive forms while also resolving issues that could disrupt saving forms or editing builder lists.
Original PR description
Forms gain four building primitives: multi-step layout (step containers with runtime-inserted Previous/Next navigation, a dots/bar progress indicator and per-step validation), buttons/boxed display variants for choice fields with an explicit checked state and focus ring, a slider display for number fields with a keyboard-editable value input, and a computed field type displaying a live total from a declarative formula over field values and option weights. Also fixes saving a form containing an unnamed field (the whitelist computation crashed on the empty name) and stops the builder list from clobbering item ids when a non-display_name column is edited. task-6251785
The mail app is being prepared so AI agents can show intermediary updates before their final response. This groundwork supports a smoother future experience by making conversations feel more transparent while an AI reply is being generated.
Original PR description
Purpose: -------- In the related enterprise PR, agents will be able to send intermediary messages before sending their final response. This commit introduces new getters that are overridden in that PR. Task-6272649
AI assistant conversations now show clearer progress updates while an answer is being prepared, replacing vague thinking messages with current activity statuses. Users can optionally reveal step-by-step details, helping them understand what the assistant is doing without cluttering the default chat view.
Original PR description
Purpose: -------- When the agent is generating an answer, it can now send "intermediary" messages. These messages allow the agent to explain what he is doing on each turn, (such as "I will now search for leads in the qualified stage"). Additionally, the "thinking" messages have been replace by a "tool status". This tool status is generated by the agent itself on each tool call, and shows what the agent is currently doing (such as "Reassigning new leads"). The intermediary messages are hidden by default, but can be shown either by clicking on the "current tool status", or by enabling the "Show steps" option in the composer's "More options" menu. In debug mode, these intermediary messages contain technical information. Tool calls will also be logged in between these intermediary messages. To do so, the tool should return a dict with `summary` entry with an icon and some text. Task-6272649
The Planning search view has been reorganized and simplified across related Planning apps. This should make it easier for users to find and filter planning slots consistently across field service, holidays, HR skills, projects, sales, and timesheet-related workflows.
Original PR description
In this commit, we refactor and clean the search view of Planning. task-6507326
Field Service reports generated from planning slots can now show the equipment used during an intervention, including its name and serial number. This gives customers and service teams clearer documentation of what equipment was involved in each visit.
Original PR description
Before this commit, when a user created a Field Service planning slot that included equipment, the generated report did not display any information related to that equipment. After This Commit, reports generated from planning slots can now include an equipment section, allowing users to see the equipment name and serial number used in the context of the field service. task-[6460149](https://www.odoo.com/odoo/project/4105/tasks/6460149)
This temporary change prepares the Discuss/mail messaging area to handle intermediary AI-generated messages in conversations. It is an internal preparation step, so business users should not see a major immediate change, but it supports upcoming AI-assisted communication features.
Original PR description
[This PR will be dropped when https://github.com/odoo/odoo/pull/283207 is merged]
This fix ensures VoIP sales test data is created with the right permissions after a recent testing change. It helps keep automated checks reliable, reducing the risk of false failures during development.
Original PR description
With commit a452ee4de2927327b56ae6922f395482e3dbd50f, now test methods run as a dedicated `_test_user` whose groups are limited to the ones defined by `_test_user_groups`. The test added by 94bfdb15f9af369493cfeeda01593a901993f110 sets up its own records without sudo and therefore lacks the required groups. To solve, we create data with sudo(). runbot: https://runbot.odoo.com/odoo/error/947154
Fixed an issue in Shopfloor where saving a measurement instruction could leave the confirmation popup open even though the value was saved. This reduces confusion for operators and lets them continue work order steps smoothly.
Original PR description
Steps to reproduce: 1. Go to Shopfloor 2. Select some Work Order 3. Click update instructions 4. Add a measure instructions 5. Try to validate this step by putting a value and saving 6. Notice that the pop up is not closing. This is happening that due to the change in this pr: https://github.com/odoo/enterprise/pull/124697 `startWorking` function, which is called by `doActionAndNext` and returns its result, now can return `true` or `false`. `doActionAndNext` is called by `saveMeasurement`, which also returns its result. Since `saveMeasurement` is bound to confirm, if `startWorking` returns false, `saveMeasurement` will return false, and the ConfirmationDialog will not be closed. (https://github.com/odoo/odoo/blob/19.0/addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js#L79) Since the result of `saveMeasurement` is not used, it now just awaits for `doActionAndNext`, and return no value. task-6569826
Website builder content inserted through editing options now uses the website's language instead of the editor user's language. This improves consistency for multilingual sites and also fixes a form editor issue where descriptions for Cc and recipient email fields could not be removed.
Original PR description
This PR moves to `*.edit.xml` the templates that are rendered by options and whose content is inserted in the page. And uses `websiteBridge` to render those. With this, the text content of those templates is in the language of the website instead of the language of the user (to be consistent, this is also done for templates that have no text to translate) A few of those templates where files in `website/static/src/xml`. Other files in that directory are templates for interactions, to be consistent with other interactions, those are moved to the directory of the interactions. The template `website.prompt` was not use at all so it is removed. To avoid issues caused by `markup` from the iframe that is different from the `markup` out of the iframe (thus consider each other as text to escape), the options of forms are refactored to avoid using them (and a bug was found and fixed in there)
Product listings now show the correct variant image instead of the generic product template image in product snippets and wishlists. This helps shoppers see the exact product variant they are considering, reducing confusion and improving the browsing experience.
Original PR description
We wrongly displayed template images instead of variant images in product snippets (with "split variant" toggled on) and on the wishlist page.
Belgian customers who changed their Peppol registration identifier can now be re-checked automatically when invoices are sent. This helps prevent valid partners from being marked unreachable and reduces failed electronic invoice delivery.
Original PR description
Some partners were registered on Peppol with EAS 9925 (Belgian VAT) but have since moved to 0208. They became unreachable via Peppol because we never check if they exist on the network with EAS 0208, which makes their status `not_valid`. This fix forces the re-checking of the status with EAS 0208 for partners having EAS 9925 and a `not_valid` status. task-6296017 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287297 Forward-Port-Of: odoo/odoo#270742
The AI website builder form tests now load the needed iframe templates so they match recent multilingual website behavior. This helps ensure forms continue to work correctly when the website language differs from the user's language.
Original PR description
The corresponding PR in community fixes the way templates added by options are rendered to use the correct language when the website's language is not the sames as the user's language. This changes requires tests that use those options to enable `loadIframeBuilderTemplates` to function. This commit enable this options for 2 tests modifying forms. task-6452676
This fixes an issue where accounting return screens could keep running loading steps after the user had already left the page. The change helps avoid unnecessary errors or interruptions during account and Belgian reporting workflows.
Original PR description
When loading the return we need to do multiple async calls Previously it tried to make all the calls whether or not the component was destroyed. Now between each call we check if we should exit early or not.
This fixes a visual issue in Kanban views where cards could overlap the column header when hovered in a scrolled column. The header now stays on top, keeping the interface clearer and easier to use.
Original PR description
Since the changes introduced in commit [1], hovering a Kanban card in a scrolled column causes the card to appear in front of the Kanban header, resulting in visual glitches. This commit updates the Kanban header z-index to ensure it remains above the cards. task-6569549 [1]: https://github.com/odoo/enterprise/commit/a52d671ff63a4238040ee93320fcaf7f5fcdccce Requires: - https://github.com/odoo/enterprise/pull/131381 | Before | After | |--------|--------| | <img width="918" height="383" alt="image" src="https://github.com/user-attachments/assets/2bf46643-b7b3-41ee-a292-5cbbb3f596b4" /> | <img width="880" height="373" alt="image" src="https://github.com/user-attachments/assets/f4f6152a-2be9-4246-a412-5cf890db2e06" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Sales order lines without a linked product now use the first line of their description as the short name, preventing display issues in the customer portal. The sales form also now requires a label for these lines, reducing the chance of blank entries.
Original PR description
Fix the computation of `name_short` to use the first line of the description for productless SOLs. Previously, `name_short` was always computed from the product's `display_name`, causing the sale order portal view to break for productless SOLs. Also make label field required to avoid having line with empty label. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Starting the first work order on a planned manufacturing order no longer removes its planned status. This prevents confusion for production teams and keeps the planning action from reappearing unnecessarily after work has already started.
Original PR description
This commit fixes the issue of unplanning a planned MO when a workorder is started (among other workorders as one workorer doesn't reproduce the bug). To reproduce the bug: 1- Confirm an MO with multiple workorders. 2- Plan it 3- Start the first workorder = The MO becomes unplaned and the button `Plan` reappear. The bug was happening becasue the write method of the mrp_production was unplanning the MO when the `date_start` changes unless the state is in progress by this commit: https://github.com/odoo-dev/odoo/blob/39db3c9c19ccd5c9c20e2ec61e921d3c3acdfbea/addons/mrp/models/mrp_production.py#L1117. However, in our case the state is not yet written, so we used the context guard in this case. Task-6566626
The VoIP softphone empty screen now shows the intended phone icon instead of a blank space. This provides a clearer, more polished experience for users when there is no call content to display.
Original PR description
`oi` icons are resolved through `content: attr(data-icon)`, so the class-based `<i class="oi oi-voip"/>` painted nothing. Use the systray's icon: `oi oi-filled` with `data-icon="call"`. Task-6524634
This fix removes a visual glitch that appeared when users dragged cards between Kanban columns. The highlighted drop area now displays more smoothly, improving the user experience without changing functionality.
Original PR description
When dragging a card into another column, a highlighted area is displayed. This area is divided into two sections: the Kanban header and the column itself. Before this commit, the header had a transition applied to it, which caused a visual glitch when dragging cards. This commit refines the transition so that it only applies to the relevant CSS property and prevent visual glitches. task-6569549 Requires: - https://github.com/odoo/odoo/pull/288012 | Before | After | |--------|--------| | <img width="840" height="619" alt="image" src="https://github.com/user-attachments/assets/c941fd7c-c2c9-434a-a837-f3acd7771aa7" /> | <img width="585" height="584" alt="image" src="https://github.com/user-attachments/assets/025fde6c-b36e-477a-99a5-3db0c42ca387" /> |
This fixes a crash that could happen when the Indian localization setup did not have a template code available. The change makes the setup check for the code before using it, improving reliability during configuration or automated checks.
Original PR description
Previously, the template code was directly checked with `startswith('in')`, which caused a traceback when no template code was there.
In this commit, the template code is checked first, and `startswith('in')` is only called when a template code is available.
error: https://runbot.odoo.com/odoo/runbot.build.error/947112Fixed an issue where translated labels for identifiers linked through a commercial partner were not always shown. This helps users see the correct localized information when working with partner records.
Original PR description
When an identifier comes from the commercial partner, the translation was not properly loaded because it was not part of the computed available_additional_identifiers. task-none
This update prevents an error when Turkish Nilvera e-Dispatch records have no related deliveries to process. It adds a safety check so users avoid a runtime failure in this situation.
Original PR description
… boolean the function `_get_related_pickings` can return False. So before iterating over the results, we need to check whether there it is False or not to avoid iterating over a boolean and hitting a runtime error. 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 change corrects how Belgian payroll data is initialized for DMFA reporting when time credit proration is involved. It helps ensure payroll declarations use the right calculation logic and reduces the risk of reporting errors.
Original PR description
. Fix _l10n_be_get_time_credit_proration() call parameters on DMFA Occuptaion init . Update l10n_be_get_time_credit_proration() name to _l10n_be_get_time_credit_proration() task-6565810
This fixes the employee deactivation flow so that cancelling or closing the departure dialog no longer archives the linked user by mistake. HR users now get clearer choices to deactivate only, deactivate and end collaboration, or discard the action, reducing accidental employee access changes.
Original PR description
Bug reproduction: 1 - Install hr module 2 - Create some user in the settings, create an employee for it. 3 - Give contract to the employee make it 1 January 2020. 4 - Press to invited button in the…
Bug reproduction:
1 - Install hr module
2 - Create some user in the settings, create an employee for it.
3 - Give contract to the employee make it 1 January 2020.
4 - Press to invited button in the top -> Deactivate
5 - Press to discard or X button in the opened pop-up.
6 - The button in the top converts to archived and user is archived.
Bug cause:
1 - In function: action_toggle_user_active, the active field of the user is toggled first
2 - If employee has a contract, we open the departure pop-up.
- 2.1 - But in pop-up, we can select discard or press to X to cancel it.
Bug solution:
1 - If the user is active and employee has a contract, I open the pop-up.
2 - Otherwise, I'm toggling the active field of the user. By that way, if discard or X is pressed, the active does not toggled.
task-6535464
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-prThe applicant refusal form now only shows active refusal reasons, preventing outdated archived options from appearing in the selection list. This keeps recruitment workflows cleaner and reduces the chance of choosing obsolete reasons when rejecting candidates.
Original PR description
When refusing an applicant, the archive_applicant function was passing `'active_test': False` in the **context** to the refusal wizard. This disabled the active records filter, **which caused archived refuse reasons to appear in the dropdown selection.** This commit removes `'active_test': False` from the context to restore the default filtering behavior as it seems harmless to remove.
Indonesian payroll now calculates Employer Cost from the Gross Total instead of Net Salary. This gives companies a more accurate view of their full payroll expense, including allowances, benefits, taxes, and company contributions.
Original PR description
The Employer Cost of a payslip sums the rules flagged as contributing to it, and only the Net Salary rule was flagged. The amount therefore showed the employee's take-home pay instead of what the company actually spends. Flag the Gross Total rule instead, which sums every employer-paid component: basic salary and fixed allowance, allowances, benefits in kind, tax allowance and company contributions. task-6371974
Australian payroll opening balance templates now include annual leave after the older paid leave category was replaced. This helps ensure year-to-date payroll balances reflect paid leave correctly for reporting and payroll setup.
Original PR description
The Other Paid Leave work entry type was dropped in favour of a single AU.AL Annual Leave entry, but the YTD opening balances template was left without any Paid leave entry. Task-6529559
This fix prevents errors when the system looks up currency rates without a specific invoice or journal entry selected. It keeps Turkish live currency rate handling reliable while preserving special rate-type behavior when a single entry is available.
Original PR description
## Short fix summary: `account.move.get_currency_rate` ignores `self` and can be called with no record at all, which the override in `l10n_tr_currency_live_rate` did not allow: it opened with `ensure_one()` and raised `Expected singleton: account.move()`. The rate type is now applied only when there is a single move to read it from, deferring to `super()` otherwise. no-task-id I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Time Off overview now displays the correct leave duration next to each employee instead of always showing 0 days. This helps managers and HR users quickly understand requested or scheduled time off without opening extra details.
Original PR description
Steps to reproduce: 1- Open time off app 2- Open overview tab 3- Click on any time off entry Issue: The duration next to the employee name is always "0 day(s)" Cause: the duration was calculated in '_getDurationLabel' based on number_of_hours or number_of_days. That was assuming that the model can only be hr.leave which is true for the management tab but in the overview tab the model is hr.leave.report.calendar which doesn't have those fields. Fix: Both models instead have a field called duration display which includes a string for the duration with hours/days and translation handled. The field is added in the 'addtionalFieldsToFetch' in the renderer as it was not present in the hr.leave form view. The '_getDurationLabel' method was discarded as there was no need to build the duration string and used duration_display directly. Task-6542267
Belgian payroll now calculates the structural deduction using the actual payroll amounts being computed, rather than the employee's standard contract wage. This helps avoid incorrect deductions when pay differs due to part-time work, variable pay, or other payroll adjustments.
Original PR description
The structural deduction 3000 (`_get_l10n_be_structural_deduction_3000`) needs the total remunerated wage (ww) for the quarter, built from the sum of payslip lines tagged with remuneration codes 1, 2, 4, 5 and 12. For the payslip currently being processed (state == draft), those lines don't exist yet, so the previous implementation approximated ww by simply adding the contract's wage. This is inaccurate whenever the actual computed amount differs from the wage, e.g. partial occupations, variable pay elements, or any other rule that lowers/raises the base pay for the period. Instead of falling back to the contract wage, look up the rules on the payslip's structure that map to the missing remuneration codes and read their real computed amounts directly from the rule engine's in-progress results (result_rules) for the current computation pass, since `line_ids` is not yet populated on the slip being computed. Task: 6516341
After installing VOIP, the setup flow now opens the available phone number list correctly. This prevents users from landing on an empty screen when they need to buy or configure a number.
Original PR description
Since 01d284d7916 ("[IMP] voip: introduce number requests"), voip_did_number_menu is a parent menu without an action: the list action moved to its voip_did_number_list_menu child. selectMenu returns early on a menu without an action, so the post-install client action opened nothing.
Select voip_did_number_list_menu, which holds the list action.Mexican electronic payment complements now report tax amounts using the decimal precision required for the payment currency. This prevents valid payments from being rejected by PAC providers such as Quadrum and improves compliance with SAT validation rules.
Original PR description
The 'ImpuestosP' node of the payment complement (Pagos 2.0) is reported with 6 decimals while the SAT expects the amounts to be expressed with the number of decimals supported by the currency of the…
The 'ImpuestosP' node of the payment complement (Pagos 2.0) is reported with 6 decimals while the SAT expects the amounts to be expressed with the number of decimals supported by the currency of the payment ('MonedaP'), as published in the 'c_Moneda' catalog, for example 2 decimals for MXN.
Steps to reproduce:
- Have an MX Company setup with Quadrum as PAC.
- Create and sign a customer invoice in MXN with a 16% IVA tax.
- Register a full payment and send the payment complement to the PAC.
Issue:
Payment will be rejected
```
Code : CRPER654
Message : El importe del campo BaseP que corresponde a Traslado, no tiene la cantidad de decimales que soporta la moneda (MonedaP)
```
Analysis:
Quadrum recently aligned its validation on that rule and now rejects the document having fields with too much decimals and, currently, fields like BaseP, ImporteP are pinned to 6 decimals in the template.
Reporting them with the decimals of the payment currency is not enough when the payment settles a document expressed in another currency: those amounts are also compared with the ones of the related documents converted with 'EquivalenciaDR', and the PAC expects the values truncated or rounded
```
Code : CRP20274
Extra Info : Traslados: La sumatoria de ImporteDR es mayor al ImporteP 1.30.
Valores minimos permitidos: Truncado: 1.29 o redondeado: 1.3
```
opw-6561617
Forward-Port-Of: odoo/enterprise#131343
Forward-Port-Of: odoo/enterprise#131267This update cleans up references to an old developer option that no longer exists. It helps avoid confusion for administrators and developers by keeping Odoo's configuration behavior aligned with currently supported features.
Original PR description
The feature was removed in odoo/odoo#115076 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 Forward-Port-Of: odoo/odoo#287719 Forward-Port-Of: odoo/odoo#283352
This fixes an issue where some monetary totals appeared blank in pivot reports, such as the Invoices Analysis report. Users can now see key financial amounts consistently in pivot views, matching what already appeared in graph views.
Original PR description
Steps to reproduce: - Install Accounting - Go to the "Invoices Analysis" report -> The default "Untaxed Amount" doesn't display any value. Same for fields like "Total," for example. However, currency fields don't have the issue. Any Monetary measure whose own aggregator is `sum_currency` (e.g., price_total in the account.invoice.report model) renders completely empty in the pivot view, while the graph view for the same model/measure displays correctly. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed a small configuration error that could cause an error when users opened the return kanban view and used the View Entry button. This restores expected access to related entries in Indian localization reports.
Original PR description
A `,` was missing in the `invisible` condition of the `View Entry` button, causing a traceback. Add the missing `,` to fix the return kanban view.
The French accounting module no longer forces companies to install partner autocomplete just to use shared partner lookup logic. This keeps the needed functionality available while avoiding an optional feature that cannot currently be disabled.
Original PR description
In this commit: https://github.com/odoo/odoo/commit/bc4bb545aa1b7451cf46ec64879ded93c457d411 We added a dependecy for the partner auto complete but it could be a problem because partner_autocomplete don't have a way to disable it. This pr will move the function to the base module to be sure it can be use. no task id co-authored: @remi-filament --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that could stop the marketing automation screen from loading when adding a record to a campaign. Users should now be able to open that campaign action without encountering a crash caused by incorrect component setup.
Original PR description
A props validation error happens when the component is rendered due to the wrong props definition. ``` > UncaughtPromiseError > TypeError > > Uncaught Promise > type is not a function > > Occurred on…
A props validation error happens when the component is rendered due to the wrong props definition. ``` > UncaughtPromiseError > TypeError > > Uncaught Promise > type is not a function > > Occurred on 125085990-master-all.runbot132.odoo.com on 14/Sep/2026 05:43:28 > > TypeError: type is not a function > validate@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:647:291 > validateObject@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:691:34 > validateLooseObject@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:695:108 > validateType@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:648:67 > assertType@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:645:109 > makeProps@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:1192:48 > __exports.AddRecordToCampaign<@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:39471:954 > AddRecordToCampaign@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:39471:812 > ComponentNode@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:1035:999 > createComponent/owl@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:1123:6 > slot1@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js line 1511 > Function:13:12 > callSlot@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:1089:25 > __template__14@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js line 1511 > Function:30:10 > render@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:1026:199 > initiateRender@https://125085990-master-all.runbot132.odoo.com/web/assets/31cc50d/web.assets_web.min.js:1041:56 ```
The French reports module now correctly declares a required internal service used for AspOne features. This helps ensure the module installs and runs reliably without missing-component errors.
Original PR description
This module use some function from iap for using aspone, but the dependency wasn't there. This commit will add it. no task id
The Mexican POS electronic invoicing test was updated to match the newer self-invoicing process. This helps ensure receipts can still be self-invoiced correctly while preventing public users from changing existing customer records.
Original PR description
Before the related pr commit: - Public users could update customer data during the self-invoicing flow. - The test_qr_code_receipt_mx test relied on this behavior when updating customer data. After the ref commit: - Public users can no longer update customer data during self-invoicing. - Update test_qr_code_receipt_mx to create a new partner with the required customer data when the order is not linked to a customer. Related PR: odoo/odoo#283470 Task-6272660 Forward-Port-Of: odoo/enterprise#131018 Forward-Port-Of: odoo/enterprise#129948
This fix adds a check to ensure Belgian payroll remuneration codes use whole-number values. It helps prevent invalid payroll configuration data that could cause reporting or calculation issues.
Original PR description
Task: 6536560 Forward-Port-Of: odoo/enterprise#131261 Forward-Port-Of: odoo/enterprise#130425
This update fixes subscription dashboard information so non-admin users see the correct subscription status. It also hides sensitive database management options from non-admin users and adds a clearer Odoo Account section for safer, easier account navigation.
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
Validated future leave requests are now counted against an employee's available leave balance when the days are granted upfront. This prevents employees and HR teams from seeing an overstated remaining balance after future time off has already been approved.
Original PR description
**Steps to reproduce:** - Create and validate an allocation of 10 days. - Take and validate a leave of 5 days in the future. - Issue: the allocation's `virtual_remaining_leaves` still shows 10 instead of 5. **Issue:** `hr.leave.allocation._compute_leaves()` calls `_get_consumed_leaves()` with `ignore_future=True`, which filters the leaves domain to `date_from <= today`. A validated future leave is excluded from the query before it can be deducted, even though the allocation grants its days upfront and isn't gated by any accrual plan. This flag was intentionally dropped from this call by (https://github.com/odoo/odoo/pull/193685), then came back by accident via a forward-port of (https://github.com/odoo/odoo/pull/249441). **Solution:** Drop `ignore_future=True` from `_compute_leaves()` Task-6534125
Corrects the receipt type value sent for Egyptian electronic POS reporting so it matches the tax authority's expected format. This helps prevent sale receipts from being rejected because of a simple capitalization mismatch.
Original PR description
Fixes a typo in the documentType, where it was previously uppercase 'S' --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Kit sales now correctly exclude deliveries completed after the selected accrual date when calculating delivered quantities. This prevents orders from appearing as ready to invoice when their delivery happened outside the reporting period.
Original PR description
When selling a kit, the qty_delivered_at_date was not ignoring moves that were done after the accrual_entry_date. Steps to reproduce: ------------------- * Create a kit with any component and make it's invoice policy "Delivered quantities" * Create a sale order for this kit and confirm it, change the order date to any date in the past * Validate the picking * Go check the "Invoiced to be issued" * Change the accrual_entry_date to a date before the picking was validated > Observation: The order still appears opw-6290222 Forward-Port-Of: odoo/odoo#286406 Forward-Port-Of: odoo/odoo#274745
The Frontdesk Members kiosk now loads correctly after fixing where its barcode input component is sourced from. This prevents the kiosk from crashing when staff open it, helping member check-ins continue smoothly.
Original PR description
Steps to reproduce: -Open the Frontdesk application. -Open the Frontdesk Members station. -Open the Kiosk. Problem: -The Members Kiosk crashes because BarcodeInput is imported from manual_barcode, which does not export it, preventing frontdesk_members from being registered. Solution: - Import BarcodeInput from `@barcodes/components/barcode_input` so the Members Kiosk component loads and registers correctly. Issue introduced by https://github.com/odoo/odoo/commit/90f6801a3ab96f01197f61259ff31a501877ab88 TaskId-6562097
A small configuration error was corrected so Indian localization return screens can open as expected. This prevents users from being blocked when accessing those return views.
Original PR description
There is a missing comma in an invisible clause causing the return views to no load.
New VAT-related reports and return types are now activated or deactivated at the right point in the setup process. This prevents records from being handled before their system identifiers exist, improving reliability when accounting report data is loaded.
Original PR description
The logic to toggle the `active` field on newly created reports / return types was in `create`. There the new records do not have an xmlid yet. But we retrieve some of the the reports / return types via `ref`. Reports / Return types should basically always have an xmlid an be loaded via the module data. So there is not really a point in having such a logic in `create` task-None
A payment-related setting was renamed to make its purpose clearer and avoid confusion with the existing payment enabled status. This helps teams understand when online payment functionality is intentionally blocked, reducing setup and support misunderstandings.
Original PR description
During this commit: https://github.com/odoo/enterprise/commit/1c4865cdcc191fea06a87e742556e080aa2478d7 we added a field to block the payment feature. The name of the field was a bit confusing with is_payment_enabled. no task id
General Ledger exports now include the same accounts shown on screen when users apply a search filter. This prevents missing lines in exported reports and makes downloaded results more reliable for reconciliation and review.
Original PR description
When applying a search filter in the General Ledger, the lines displayed in the UI differ from the ones exported. The discrepancy comes from the fact that the UI search bar filters lines using a simple "contains" logic on the displayed line name, while the backend export relies on the account model’s `_name_search` behavior, just as in the chart of accounts. For example, searching for "40" displays the accounts 400000, 400010, and 124000 but the last one (124000) is not is in the export results. task: 5917435 Forward-Port-Of: odoo/enterprise#131011 Forward-Port-Of: odoo/enterprise#107928
French accounting localization can now be used without requiring the Partner Autocomplete feature. This lets businesses disable partner autocomplete without unintentionally removing French localization, and avoids forcing extra services in Community Edition setups.
Original PR description
*: base,partner_autocomplete Description of the issue/feature this PR addresses: Pull Request #283584 added a dependency between l10n_fr_account and partner_autocomplete. Some comments on that PR…
*: base,partner_autocomplete Description of the issue/feature this PR addresses: Pull Request #283584 added a dependency between l10n_fr_account and partner_autocomplete. Some comments on that PR proposed to not add dependency (cf https://github.com/odoo/odoo/pull/283584#discussion_r3822664753). Adding this dependency does not allow anymore to deactivate partner_autocomplete on an Odoo instance. Tested on runbot on both Community and Enterprise Edition, if you install French localization and then you want to untick "Partner autocomplete" option in General Settings, it would try to remove French localization. In addition, on most Community Edition integration, this module partner_autocomplete is not installed (nor is IAP) and this change would force installation and usage of partner_autocomplete. <img width="1164" height="596" alt="image" src="https://github.com/user-attachments/assets/d4378241-ffea-4236-8d2f-d75adedae1df" /> Current behavior before PR: With French localization installed you cannot deactivate Partner autocomplete option. Desired behavior after PR is merged: French localization does not depend on partner_autocomplete and the function to retrieve identifiers to enrich is moved to base module (since the other default field retrieved, vat is part of base module). The method may need to be renamed though, but I did not want to change too much the existing signatures. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixed Taiwan ECPay B2B e-invoices so tax amounts are sent based on the invoice's booked tax instead of recalculating them differently. This prevents rejected invoices involving down payments and helps ensure the e-invoice tax matches accounting records.
Original PR description
Current behavior: -- Sending a B2B invoice that deducts a down payment is rejected by ECPay with "(item tax discrepancy exceeds 1 NT$)", so the invoice cannot be issued at all. When it is accepted,…
Current behavior: -- Sending a B2B invoice that deducts a down payment is rejected by ECPay with "(item tax discrepancy exceeds 1 NT$)", so the invoice cannot be issued at all. When it is accepted, the tax on the e-invoice can still differ from the tax the invoice books. Expected behavior: -- The invoice is accepted, and the tax reported on the e-invoice is the one the invoice booked. Steps to reproduce: -- - Set a company up in Taiwan (TWD) with the ECPay credentials filled in - Create a sale order of 190,630 for a customer with a VAT number - Invoice a 50% down payment through the down payment wizard, then a 30% one, and post both - Invoice the remainder and post it - Send the final invoice to ECPay Cause of the issue: -- _l10n_tw_edi_prepare_item_list rebuilt the tax from the raw amount of every line and rounded that total once. Both steps also disagree with the invoice. Negative lines resulting from downpayments seem to be more strictly checked on ECPay and taxes cannot be re-derived easily by ECPay's system. There is a also a relevant but slightly different issue where the invoice amount is calculated differently but the ECPay page will show a different value. e.g. the invoice rounds each computation key on its own: 50.00 - 16.50 = 33.50 rounds to 34 where the invoice books 50 - 17 = 33. No issue was detected for purely positive lines (a transaction with different products but no downpayment) Fix: -- Use the tax amount the line carries when it has one, and fall back to the raw amount otherwise, so the payload reports what the invoice booked. Send the tax of each line in the ItemTax field. Let ECPay derive its own per-item tax and checks it against the declared total for purely positive lines, and recalculate them for negative so the rounding difference between them is spread one unit at a time across the lines, the way ECPay distributes it. opw-6424237 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281928
This update fixes several issues introduced by the blog redesign so existing blog pages keep their intended look after upgrades. It restores important cover sizing and color choices, improves scheduled post labels and dates, and makes sidebars, tags, and table of contents behavior clearer for editors and visitors.
Original PR description
Related to task-3083656
This fixes a display issue where product cards could lose their padding when using the Chips layout outside the main shop page. Website editors and visitors will now see consistently spaced product cards in dynamic product sections, improving page appearance without changing functionality.
Original PR description
Steps to reproduce: --- - Install the website_sale module with demo data. - Go to /shop and switch the product layout to Chips. - Exit the editor. - On the home page, open the editor and add the…
Steps to reproduce: --- - Install the website_sale module with demo data. - Go to /shop and switch the product layout to Chips. - Exit the editor. - On the home page, open the editor and add the Dynamic Products snippet. Issue: --- The Products snippet has collapsed card padding when the Chips layout is active. Root cause: --- - The Chips card layout defines `--_padding-base` using `var(--o-wsale-products-grid-gap)` with no fallback value. https://github.com/odoo/odoo/blob/4307f657c73a860c755e1499138a878268882f7a/addons/website_sale/static/src/scss/product_tile.scss#L632 - When the Products snippet renders outside /shop, the variable is undefined, causing the `calc()` to resolve to a guaranteed-invalid value which collapses the card padding. All other layouts are unaffected because they either do not use `--o-wsale-products-grid-gap` in their padding chain, or already provide a `16px` fallback at the point of use. https://github.com/odoo/odoo/blob/4307f657c73a860c755e1499138a878268882f7a/addons/website_sale/static/src/scss/product_tile.scss#L407-L410 Solution: --- - 16px matches the default value of `shop_gap` on the website model, ensuring correct padding whenever the variable is not explicitly set. https://github.com/odoo/odoo/blob/4307f657c73a860c755e1499138a878268882f7a/addons/website_sale/models/website.py#L128 ### Before: <img width="1456" height="563" alt="image" src="https://github.com/user-attachments/assets/c28ab183-0af3-4a2a-858d-b85d9995eb07" /> ### After: <img width="1427" height="550" alt="image" src="https://github.com/user-attachments/assets/e0ba80ec-10ad-433f-bf9a-acbaffd56a76" /> opw-6511483 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286185
Copying and pasting list items that contain nested lists now preserves the intended content more accurately. This prevents users from accidentally copying extra nested items or losing the outer list structure when editing rich text.
Original PR description
Problem: Copying content from a list item containing a nested list can either include the unselected nested list or lose part of the copied content. Solution: - Detect whether the whole `<li>` was selected before copying the full list item with its nested lists. - When only part of the list item is selected, copy only the selected content and rebuild the required `<li>` wrapper. - Apply this logic only to list items with multiple top-level children. Steps to reproduce: - Add bullet list with nested list. - CTRL+A - Press Enter twice to create new paragraph. - Paste. - Observe the outer list is lost. task-6438347 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#281205
This fixes an issue where opening the Project Pivot view from a saved My Tasks favorite could crash. Saved task reporting views now handle personal stages correctly, improving reliability for users who track work through favorites and Pivot reports.
Original PR description
Since the introduction of `read_grouping_sets` for Pivot views, opening the Pivot view from a saved favorite filter can crash. ### **Steps to reproduce:** - Install Project. - Open My Tasks. - Save…
Since the introduction of `read_grouping_sets` for Pivot views, opening the Pivot view from a saved favorite filter can crash. ### **Steps to reproduce:** - Install Project. - Open My Tasks. - Save the current filter as a favorite. - Switch to the Pivot view. ### **Error:** ``` ValueError: Cannot convert project.task.personal_stage_id to SQL because it is not stored. ``` ### **Root Cause:** Since [commit](https://github.com/odoo/odoo/pull/194413/changes/166a546ec52784c413f5b5d7d29af89d618d6519), Pivot views use `_read_grouping_sets` instead of `_read_group`. `project.task` only remaps `personal_stage_type_id` to the stored `personal_stage_type_ids` in [_read_group](https://github.com/odoo/odoo/blob/5f6fb63d5d7585805642c702d096b2f882e73761/addons/project/models/project_task.py#L2169-L2179), so the remapping is bypassed for Pivot views. The ORM then attempts to group by the non-stored `personal_stage_type_id` relation, leading to the SQL conversion error. ### **Fix:** Mirror the remapping logic in `_read_grouping_sets` so Pivot views use `personal_stage_type_ids` before the ORM generates the SQL query. **opw-6306389** Forward-Port-Of: odoo/odoo#272985
This fixes an issue where manually changing an order's total weight did not refresh the delivery price for rule-based shipping methods. Businesses using weight-based delivery pricing will now see the correct shipping charge applied before adding the delivery line, preventing undercharged orders.
Original PR description
Steps to reproduce ------------------ - Install `website_sale_stock` and `sale_management` module. - Create a product. - Create a rule-based delivery method with: - In Pricing tab click add a line -…
Steps to reproduce ------------------ - Install `website_sale_stock` and `sale_management` module. - Create a product. - Create a rule-based delivery method with: - In Pricing tab click add a line - condition: `Quantity >= 0` - variable factor: `weight` - price per unit: 2 - Create a quotation containing the product. - Open the delivery method wizard by clicking into `Add Shipping` - Select the rule-based delivery method. - Change the total weight from 0 to 10. - Add the delivery method. Issue ----- - Changing the total weight does not recompute the delivery price. - The delivery line is added with a price of 0 instead of 20. Cause ----- The delivery wizard defines `_onchange_carrier_id` for both `carrier_id` and `total_weight` https://github.com/odoo/odoo/blob/9860ba5a593c5e7723494674b62890d16ae1a9a8/addons/delivery/wizard/choose_delivery_carrier.py#L41-L50 The call flow is expected to be: `total_weight` change -> `_onchange_carrier_id` -> `_get_delivery_rate` -> `rate_shipment` `_get_delivery_rate` passes the manually entered weight through the `order_weight` context key: https://github.com/odoo/odoo/blob/9860ba5a593c5e7723494674b62890d16ae1a9a8/addons/delivery/wizard/choose_delivery_carrier.py#L87-L90 The rule-based carrier gives this context value priority over the saved order weight and the weight computed from order lines: https://github.com/odoo/odoo/blob/9860ba5a593c5e7723494674b62890d16ae1a9a8/addons/delivery/models/delivery_carrier.py#L588-L594 For example, with `total_weight = 10` and a price factor of 2, the expected calculation is: `delivery_price = 0 + 2 * 10 = 20` However, the pickup-location implementation added an override in `website_sale_stock` that declared only `carrier_id` as an onchange trigger: https://github.com/odoo/odoo/blob/0da3259034ff3b2b79f417df53969fe017207195/addons/website_sale_stock/wizard/choose_delivery_carrier.py#L13-L16 Since the override uses the same method name, its decorator replaces the base onchange specification. Therefore, changing `total_weight` does not call the method and the initial `delivery_price = 0` is kept. This does not occur in saas-19.2. because `website_sale_stock` does not override the delivery wizard there. The base method remains registered for both `carrier_id` and `total_weight`: The conflicting override was introduced later in this [commit](https://github.com/odoo/odoo/commit/0da3259034ff3b2b79f417df53969fe017207195) from saas-19.3 Fix --- Add `total_weight` to the `website_sale_stock` onchange decorator so the inherited delivery-rate computation runs when the user edits the weight. --- opw-6516301 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285864
This fixes a mobile and tablet issue where opening a file picker inside an editable list could trigger an automatic save and close the row being edited. Users can now attach files in these embedded form lists without silently losing the changes they were making.
Original PR description
The form view autosaves on 'visibilitychange' (e.g. when the user switches tab/app) to avoid losing unsaved changes. On mobile, opening the native file picker for a binary field also fires 'visibilitychange', which triggered this autosave. When that binary field was part of an editable x2many list, the autosave forced the row out of edition before the file could be selected, silently discarding the edition in progress. Skip the autosave when a x2many field of the root record currently has a row in edition. Can be reproduced in eLearning > course > content > Additional Resources, on mobile devices (must force "desktop mode" in the browser), and on tablets. opw~6517735 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 Forward-Port-Of: odoo/odoo#287855 Forward-Port-Of: odoo/odoo#287581
Creating multiple helpdesk teams with website forms no longer adds repeated Help menu entries on the website. Existing Help menus are reused across teams, keeping website navigation clean and avoiding confusing duplicate links.
Original PR description
Currently on creating new helpdesk team everytime a new website menu is created. ### **Steps to Reproduce:** 1) Install website_helpdesk 2) Navigate to `Helpdesk>Configuration>Helpdesk Team`. 3)…
Currently on creating new helpdesk team everytime a new website menu is created. ### **Steps to Reproduce:** 1) Install website_helpdesk 2) Navigate to `Helpdesk>Configuration>Helpdesk Team`. 3) Create 2 helpdesk team with `Website Form` option enable. 4) Navigate to Website. ### **Observed Behavior:** Two Help menus are created. ### **Expected Behavior:** Multiple menus should not be created. ### **Root Cause:** The menu creation logic relies on the following [condition](https://github.com/odoo/enterprise/blob/b66097122ba3a758734ac6fb2b26579c35cb72c2/website_helpdesk/models/helpdesk.py#L111-L112) `team_count_by_website` is built from `_read_group(..., ['website_id'], ...)`, which keys its result by the `website_id` *recordset*, not its id. Looking it up with `team_count_by_website.get(website.id, 0)` therefore always misses and falls back to `0`, so `team_count <= 1` is always `True` regardless of how many teams already exist for that website. The only thing left guarding menu creation is `any(team.website_menu_id for team in teams)`, which only looks at the teams in the current create/write call, not every team on that website. So saving a second team in a separate call always creates another menu. ### Fix: Make the website menu a resource shared by every team with the website form enabled on a given website, instead of "owned" by whichever team created it: - Before creating a new menu, look up other teams (active or archived) that already point to a menu, matched through the `website_menu_id` relation between teams rather than a hardcoded `/helpdesk` URL, so a customized menu URL doesn't cause a duplicate to be created. Reuse that menu when found. - Only delete a menu once no team (active or archived) still references it, checked before removing a team's own reference. **opw-6303846** Forward-Port-Of: odoo/enterprise#130401 Forward-Port-Of: odoo/enterprise#121120
The HTML editor now properly clears file-related event handlers when an editor is closed or destroyed. This prevents small memory leaks that could build up over repeated editor use, improving long-term stability without changing the user experience.
Original PR description
FilePlugin registered its click, keydown and pointerdown handlers with raw `addEventListener`, so they were never removed when the plugin was destroyed. The pointerdown one is bound to the document, which outlives the editable, leaking a handler per editor instance. Use `addDomListener` so Plugin.destroy() removes them. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286491 Forward-Port-Of: odoo/odoo#286144
This change refreshes internal mail and live chat model definitions so they match the current application code. It helps developers avoid outdated references and keeps future mail-related changes more reliable, with no direct change expected for end users.
Original PR description
Before this commit, the @types/models.d.ts files are behind the models: they declare fields that were since renamed or dropped, and miss the ones that were added, because the generator was not run. This commit runs it again. The generator types the values declared with this.computed() as `unknown`, so their entries are written by hand for now.
This update reduces repeated behind-the-scenes calculations in the website builder and configurator. Users should see smoother typing, scrolling, and preview rendering without any change to visible features or workflows.
Original PR description
A getter recomputes on every read, and a few of them are read several times within a single render: - `DescriptionScreen` builds `previewImages` 19 times, as the image showcase is rendered through `t-call` and therefore shares the screen's context - `BuilderListDialog` runs `fuzzyLookup` four times per keystroke, once for the emptiness check and once for the loop, on each of its two panels - `BuilderList` parses its item list again on every `getIncludedRecords` call, up to three times per scroll frame This commit moves them to `computed`, which recomputes only when the state it reads changes. `computed` was introduced in OWL3 [1]. [1]: https://github.com/odoo/odoo/commit/efb95b76a4e48d42e888d8d05eb6d93b3f267412
The HTML builder sidebar code was updated to align with the newer Owl 3 framework used by Odoo. This is an internal modernization that helps keep the editor maintainable and ready for future improvements, with no expected change to everyday user workflows.
Original PR description
As part of the Owl 3 migration, replace onWillUpdateProps hook with the appropriate Owl 3 alternatives. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update refreshes internal component handling across inventory, manufacturing, accounting, survey, and website areas to align with the latest Odoo interface framework. It helps keep these screens maintainable and better validated without changing day-to-day business workflows.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The HTML builder module no longer lists dependencies that are already guaranteed or only needed for tests. This keeps installations leaner and avoids pulling in the Mail app when it is not needed for actual HTML builder use.
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 how several Odoo interface components handle their internal settings across product, purchase, sale, spreadsheet, and related areas. It should not change day-to-day workflows, but it helps keep these screens compatible with the latest front-end framework and improves validation behind the scenes.
Original PR description
- https://github.com/odoo/enterprise/pull/131109 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Timesheets Assistant has been refactored to load and display weekly timesheet data more consistently, especially when users navigate quickly between weeks. It also prevents non-timesheet entries from appearing, giving users a cleaner and more accurate timesheet view.
This update modernizes internal component definitions used across several sales-related apps. It helps keep the interface compatible with the latest framework standards and improves validation behind the scenes, with no expected change to day-to-day user workflows.
Original PR description
- https://github.com/odoo/odoo/pull/287604 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 modernizes internal user interface components by replacing an older way of handling component inputs with the current supported approach. It helps keep live chat, localization, loyalty, lunch, mail, manufacturing, payment, point of sale, portal, printer, and related project areas maintainable and ready for future platform updates, with no expected change to day-to-day behavior.
Original PR description
- https://github.com/odoo/enterprise/pull/131262 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr