Monday, September 14, 2026
62 changes · master
New functionality added to Odoo
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
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
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
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)
Code cleanup and technical improvements
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.
Original PR description
task-6237033 --- 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
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>
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
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
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
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.
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
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" /> |
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
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
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
Belgian 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
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)
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
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
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-prIndonesian 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
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
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 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
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 ```
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
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
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
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