Thursday, August 27, 2026
46 changes · master
Enhancements to existing features
Client-facing wording in the Expenses app has been updated to be easier to understand. This helps users interpret expense-related messages more clearly and reduces confusion in day-to-day expense processing.
Original PR description
Changes some client facing texts to make them clearer. task-6060590
New Google fonts added to a website are now hosted locally instead of being served by Google. This improves page performance scores and helps reduce privacy and GDPR compliance concerns, while also improving how fonts load for visitors.
Original PR description
Currently, Google fonts are served by Google, which lowers the Lighthouse score and may impact GDPR compliance. Solution: By default, when a user add a new Google font, it is hosted locally. Task-6009931
Indian state and union territory data has been centralized so it can be used consistently across Odoo. The update also reflects the merged union territory of Dadra and Nagar Haveli and Daman and Diu, improving accuracy for addresses and localization data.
Original PR description
and merge "Diu & Daman" and "Dadra & Nagar Haveli" as one UT. [Task #6126667](https://www.odoo.com/odoo/project/1251/tasks/6126667)
The calendar attendee invitation flow is now simpler and easier to use, with clearer labels, better field ordering, and a smaller dialog. Users can also add attendees more smoothly from quick event creation, including by entering an email address for a new contact.
Original PR description
# Purpose Simplify the attendee invitation wizard a bit & make the attendee pill display in the quickcreates clickable # Specs Event form: - Align invitation buttons with guest count - Clearer attendee placeholder Invitation wizard: - Reorder fields - Move default focus to email - Remove contact image Quickcreate event: - Display attendee pill - Opens invitation wizard for new partners --------------------------------- Task-6209447
Website managers can now edit common HTTP error pages directly in the website builder, including changing layout, content, and whether the default error message appears. The update also improves how website content routes are listed, helping modules expose dynamic pages more clearly for discovery and editing.
Original PR description
This PR improves website content discoverability and website customisation by: - Extending list_as_website_content to support dynamic, structured routes. - Making HTTP error pages editable through…
This PR improves website content discoverability and website customisation by: - Extending list_as_website_content to support dynamic, structured routes. - Making HTTP error pages editable through the website builder. # Dynamic structured routes for `list_as_website_content` Previously, `list_as_website_content` only supported returning a static title, with route URLs inferred automatically from the endpoint. This PR extends the API to also accept callables returning structured route definitions (`route_title` and `route_url`), enabling explicit and dynamic website content entries. This provides greater flexibility for modules exposing multiple or computed website routes. # Editable HTTP error pages HTTP error pages (400, 403, 404, 415, and 422) are now editable from the website builder via: `/website/http_error/<error_code>` ### Users can: - Fully customise error pages using snippets and inner blocks. - Toggle the visibility of the default error message. - Preview and edit pages using a demo error card in edit mode instead of triggering a real HTTP error. task-4714826 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo now lets users and business workflows filter uploaded binary files by their stored filename or file size. This preserves file-name based filtering even as separate filename fields are replaced by the binary field itself.
Original PR description
Add `filename` and `size` as properties that can be used when searching binary fields. Since file name fields can be replaced by just using the binary field, we provide this to be able to search by the name of the file.
`[('bin_field.filename', 'ilike' 'test')]` searches for binary values with file name containing "test".
----
Since we remove the fields (https://github.com/odoo/odoo/pull/284302) and may want to continue support filtering on the file name.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe employee records timeline now displays contract periods more clearly and avoids confusing visual states. This makes it easier for users to understand which version is selected and how contract versions connect over time.
Original PR description
Adapting the misc widgets to the new design versions_timeline.scss as unused styling, but that file owned the timeline's own geometry, and the new markup kept the item wrapper class the statusbar had…
Adapting the misc widgets to the new design versions_timeline.scss as unused styling, but that file owned the timeline's own geometry, and the new markup kept the item wrapper class the statusbar had renamed in the meantime The employee records bar ended up with one contract line per version, drawn inside the bar, instead of a single line spanning the versions of a contract; with a selected version painted in the very grey the statusbar paints on hover, so a hovered version looked selected; and with items never folding into the dropdowns, since the statusbar looks them up by ".o_arrow_button_wrap": the bar wrapped onto a second row and showed a stray duplicate of the selected version. Give the bar a stylesheet again, scoped to a class shared with the other versioned records bars: only the displayed version is highlighted, and the contract line bridges the gap between two versions of the same contract so it reads as one line under the bar. task-6510183 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
The search bar was updated so parent screens can manage its focus behavior more directly. This supports smoother interactions in document-related workflows and prepares the interface for broader framework updates without changing everyday functionality.
Original PR description
- enterprise: https://github.com/odoo/enterprise/pull/126864 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Updated customer-facing text in expense-related payroll and Stripe demo screens to make instructions and labels easier to understand. This helps users complete expense and top-up workflows with less confusion, without changing underlying functionality.
Original PR description
*: hr_expense_stripe_demo Changes some client facing texts to make them clearer. task-6060590
After installing VoIP, users are now taken directly to the phone number list so they can continue setup more easily. The update also clarifies that phone numbers still being processed will refresh automatically, reducing confusion during provisioning.
Saudi payroll now lets companies choose how service duration is calculated for end-of-service benefits: 360 days, 365 days, or actual days in the year. This supports different company policies and improves payroll configuration accuracy for Saudi employees.
Original PR description
Replace the Saudi EOS actual-days boolean with a selection allowing companies to compute service duration using 360 days, 365 days, or the actual number of days in the year. Updated the employee payroll view and EOS tests accordingly. task-6413322
The payroll configuration timeline now uses the correct visual styling and responsive behavior. This makes the selected payroll configuration clearer and ensures timeline items collapse properly into dropdowns when space is limited.
Original PR description
The payroll configuration bar is a copy of the employee records one and lost the same styling: its selected version was painted in the grey used on hover, and its items never folded into the dropdowns because the statusbar looks them up by ".o_arrow_button_wrap". Reuse the class the employee records bar now hangs its styling on, and give the items the class the statusbar expects. task-6510183
Users can now preview text-based attachments such as Markdown, JSON, XML, plain text, and stored emails directly in chatter, Documents, and Knowledge instead of downloading them first. The change also improves safety and performance with private caching, stricter preview protections, and limits on how much large text content is loaded for thumbnails.
Original PR description
Currently, (pre)views of text attachments (ex: Markdown) directly in the browser is a feature exclusive to the Documents app. In the standard chatter, these files only display a generic icon and…
Currently, (pre)views of text attachments (ex: Markdown)
directly in the browser is a feature exclusive to the
Documents app. In the standard chatter, these files only display a
generic icon and force the user to download them to see their content.
This commit extracts the text rendering engine from the `documents`
app and integrates it into the core `mail` module to make it globally
available.
What this improves:
- Users can now see live thumbnails of text-based files
(txt, md, json, xml) directly inside chatter attachment cards.
- Clicking a markdown attachment in the chatter now opens the full-screen
preview instead of forcing an immediate file download.
- Clicking a text attachment in the knowledge app now shows a formatted
view of the attachment instead of raw text.
- Implements checksum-based caching for Documents thumbnails and previews.
This cache is set to 'private' to prevent reverse proxies (like NGINX)
from caching and leaking access-restricted documents.
- Implements a split Content-Security-Policy (CSP) to maximize security:
- Raw HTML and JSON files get a strict `default-src 'none'; sandbox;`
policy, preventing all external resource loading and scripting.
- Rendered Markdown, Text, and Email get a tailored policy allowing same-domain
styles and images, preserving formatting but actively blocking external
images and tracking pixels (which were previously allowed in Markdown renders).
- Increased security by visually neutralizing clickable links in Markdown,
preventing deceptive external navigation.
Server performance is maintained by safely reading only the first few
kilobytes of large text files for the thumbnails, preventing memory
exhaustion on the worker. (Note: HTML files are streamed in full even
for thumbnails to prevent markup breakage).
A separate commit was introduced to add the rendering of emails to the controller
instead of making a client-side rpc call.
Task-5417637The appointment date picker now shows unavailable dates, such as weekends or fully booked days, in muted text. This makes scheduling clearer and improves readability for customers selecting an available time.
Original PR description
With this commit, we want to make the date picker more accessible and readable. For this we change a little element in its UI. Now, unavailable dates (for example weekends or fully booked dates) are now muted to better distinguish them from available dates. Task-6429894
Businesses can now set a maximum bookable capacity for each appointment time slot, helping avoid too many reservations arriving at the same time. This is useful for capacity-sensitive services such as restaurants, and the limit is also reflected in Google Reserve availability.
Original PR description
Allow businesses to configure a max bookable capacity, applied for every slot computed from availabilities. This prevents accepting too many reservations at once and allows some pacing. This is…
Allow businesses to configure a max bookable capacity, applied for every slot computed from availabilities. This prevents accepting too many reservations at once and allows some pacing. This is different from the availability of resources, and is for instance designed for restaurants to avoid clogging the kitchen. The feature is also supported in appointment_google_reserve, and code is adapted to make sure we compute this availability even when selecting manually a given resource (e.g. for resource_time) The heuristic is the following: --- 0. Only for resources, and when managing capacity, for a recurring appointment... 1. For every appointment.slot... 2. 'Subslots' will be created, as usual, every slot_creation_interval. We are using this as the duration of the interval over which we limit the bookings to slot_interval_capacity. The last subslot will also use this value, no matter the appointment_duration. 3. To count how much capacity is currently used on a subslot, we count reserved capacity on booking lines of meetings STARTING in the interval [start, start + slot_creation_interval[. We include the start, as this is the most common use case when booking and matches booked time on the front-end, and exclude the ending as next subslot would start there. Example --- Let us have an appointment configured as follows to illustrate: - slot_interval_capacity = 10 - slot_creation_interval = 15 min - appointment_duration = 1h - 1 appointment.slot: 19.00 to 20.30 - 22 total capacity available on available resources -> 'subslots' are 15 min long and created at 19.00 19.15 19.30 Now, let's add bookings one by one: - From the backend, 2 people at 19.25 - 6 people at 19.00 - 8 people at 19.00. Not enough capacity. They book at 19.15. The subslot [19.15, 19.30[ is now full, as the 19.25 booking also counts. - 4 people at 19.00. Subslot [19.00, 19.15[ is now full. - 4 people. They cannot book because total capacity is already used up to 20/22. They can only book for two, and end up booking the 19.30 subslot. While that subslot is not full in the sense of slot_interval_capacity, the day is now full. Algorithm --- In order to lower the time complexity of the check on booking lines, we implement a sliding window of subslots over booking lines grouped by start. This should end up in O(nlogn) (due to sorting, see below) instead of O(n^2). As this only works with ordered data, we order booking line data (after grouping, more efficient) and slots (only if the computation is needed, a few explicit checks are made for this) in an ascending order of start datetime. Test --- A test is added for both appointment and appointment_google_reserve. In the appointment test, we also include a complex configuration as we want the sliding window algorithm to be robust and work in any configuration. Other change --- To complete this new feature, we enable the total row in the gantt view for appointments. We use the total_capacity_reserved instead of the usual count. We only compute the total row(s) when on a single appointment to avoid clash of definition when manage_capacity is true / false. Task-6191497
The Belgian payroll employee field previously labeled “Relation Start” is now shown as “First Employment Date.” This makes the wording clearer for HR users and better reflects the meaning of the date.
Original PR description
Rename the field `l10n_be_dimona_relation_date_start` string attribute from `Relation Start` to `First Employment Date`. task-6510430
Category header display settings are now managed at the website level instead of separately on each product category. This helps keep the shop experience consistent across all categories on the same website and reduces configuration confusion.
Original PR description
Before this commit, category header settings were stored on each product category, leading to inconsistent behavior across categories within the same website. This commit stores these settings on the website instead, making them consistent for all categories of a website. Upgrade PR:https://github.com/odoo/upgrade/pull/10604 task-6325882
Property fields can now decide individually whether their changes are recorded in the chatter. This gives businesses more control over which property updates are visible in communication history, helping reduce noise while preserving important audit trails.
Original PR description
Allow to track properties. Properties fields are all "tracked" but the property have their own tracking attribute that will define if the change are tracked or not in the chatter. TASK-5131127 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update tidies up icon styling in several Odoo areas so status bubbles and website buttons appear more consistently. It removes outdated icon rules and fixes a small alignment issue in the website scroll button, improving visual polish without changing functionality.
Original PR description
[IMP] event, maintenance, project: clean up the state bubble scss --- Follow-up of 62bab6a4be6e, which sized the state selection bubbles from the shared bubble variables: a few per-module overrides…
[IMP] event, maintenance, project: clean up the state bubble scss --- Follow-up of 62bab6a4be6e, which sized the state selection bubbles from the shared bubble variables: a few per-module overrides were left behind. __Before commit__ The bubbles kept a negative `margin-top` to compensate their old position, and in project the `hourglass_empty` icon had its own `font-size` and `oi-lg` class, plus per-view `!important` overrides on `font-size`, `margin-top` and `padding-left` for the list view. __After commit__ Icons are sized from the bubble variables (`$o-bubble-color-size-xl`, `$o-bubble-color-size`), so all the per-icon nudges and `!important` rules are gone, along with the `oi-lg` class in the template. <img width="717" height="478" alt="image" src="https://github.com/user-attachments/assets/14ee6f32-53a2-40fe-bb72-c276a3f91330" /> task-6377407 [IMP] web, website: drop leftover font-awesome icon selectors --- Social media, share and scroll down button icons, as well as the webclient icon-only buttons, are now always rendered with `oi` classes. The `fa-stack` / `fa-Nx` / `fa-fw` counterparts in the selectors are dead code, so remove them. task-6377407 [FIX] website: vertically center the scroll down button icon --- __Problem__ Since icons are rendered with `oi` instead of `fa`, the arrow of the scroll down button sits slightly off-center in its round button. __Quick fix__ Force `vertical-align: middle` on the `.oi` pseudo-element. <img width="660" height="143" alt="image" src="https://github.com/user-attachments/assets/354ed891-a6e8-4ef1-b10b-a7e6f15925a3" /> task-6377407
This update makes automatic cursor focus more reliable when fields or buttons are displayed through dialogs or shared page areas. Users should see smoother interactions in places like mail GIF selection and quick-entry forms, with tests adjusted to match the intended behavior.
Original PR description
useAutofocus was built on useLayoutEffect, whose dependencies are recomputed from the render/patch cycle of the component calling it, with an untracked read of the ref so that component doesn't…
useAutofocus was built on useLayoutEffect, whose dependencies are recomputed from the render/patch cycle of the component calling it, with an untracked read of the ref so that component doesn't subscribe to it. When the ref is written by a render that component doesn't own, typically content passed to a <Dialog>'s slot, that cycle never runs and the element is never focused. Rewrite the hook on owl's useOnChange: the dependency is a tracked read of the ref, computed in a signal computation of its own, so the element is focused no matter which render writes the ref, and the component is still never subscribed, as its re-render would reset an input bound with t-att-value (e.g. calendar quick-create title). The callback stays untracked: el.focus() synchronously runs the focus handlers, and the signals they read must not become dependencies of the hook, or any later change to them would steal the focus back. navigation_hook.test.js's BasicHookParent fixture combined useAutofocus on an unrelated button with useNavigation's initial-item activation, relying on onMounted registration order to decide which one ended up with real focus. No real component pairs the two hooks that way, so move that call to "navigation with virtual focus", the only test that exercises the interaction, and where virtual focus never touches real focus.
Folded Kanban columns now display their unfold arrows more neatly and consistently, improving visual alignment with the rest of the column. Related tests were updated to focus on the intended scrolling behavior rather than fragile screen-size-specific values.
Original PR description
[IMP] web: align unfold arrows in folded kanban columns --- __Before commit__ <img width="319" height="266" alt="image"…
[IMP] web: align unfold arrows in folded kanban columns --- __Before commit__ <img width="319" height="266" alt="image" src="https://github.com/user-attachments/assets/8947d533-c1cf-43a4-a6dd-0939bc619102" /> The two arrows of the `o_column_unfold` button were spaced with horizontal paddings on the button and a `margin-right` on `arrow_left`, both swapped on hover to keep the folded column at a constant width. With the new icons, that no longer lines the arrowheads up with the rest of the folded column. __After commit__ <img width="216" height="153" alt="image" src="https://github.com/user-attachments/assets/34fb9c16-223e-4a9f-86ef-0bdad05c9363" /> The button has a fixed width and centers its icons, each clipped to the width of its arrowhead; only the `gap` between them grows on hover. The quick create `Add column` button drops its horizontal padding for the same reason. The unfold-scroll test used to pin the exact `scrollLeft` values that `scrollIntoView` produces on the CI viewport, and those depend on the width of a folded column. It now asserts what the feature actually guarantees: whether a scroll happened, and that the group brought into view ends up flush with the right edge of `.o_content`. Its last case also folds the last group, so that it really exercises the "unfolded group has no next group" branch. task-6377407
The accounting dashboard KPI calculations were cleaned up and covered by an automated test. This should help keep dashboard figures reliable while improving performance for important dashboard views.
Original PR description
* add a test for the function `get_account_dashboard_kpis` * use the ORM to compute the consolidated balances * avoid a `OR` in `_get_open_sale_purchase_query` as it would prevent using efficient indexes, while performance is crucial on the dashboard.
Belgian payroll now shows more complementary benefit information on payslips and improves how insurance contributions are configured and validated. This helps payroll teams reduce manual inputs, catch invalid insurance amounts earlier, and provide employees with clearer salary details.
Original PR description
Refactor existing Belgian salary rules to support the complementary information display section on payslips and enhance employee insurance configuration. - Add employee-level ambulatory insurance contribution and setting defaults. - Compute employer share for meal vouchers via new `MEAL_VOUCHER_EMPLOYER` rule. - Refactor termination rules (Hospital, Ambulatory, Group Insurance) to compute directly from contract version history instead of manual inputs. - Enable `display_in_pdf_extra_info` across relevant insurance rules. - Rename `F_SOCIAL_CONTRIB` and configure for extra info display. - Add payroll warnings to catch invalid employee insurance contributions. Task: 6327364
The accounting dashboard KPI cards have been refreshed to stay visible and easier to use. On mobile devices, the cards now appear in a horizontally scrollable row, improving access without taking up excessive screen space.
Original PR description
This commit improves the UI of the KPI cards in the account dashboard. There's no longer a close button on the cards, they're meant to always be visible on the dashboard. Also, the cards are now in a scrollable row on mobile, instead of being stacked vertically. Task ID: 6498831
The AI fields area has been simplified by removing older custom patches that are no longer needed. This should make future changes easier to maintain while keeping the user experience stable.
Original PR description
The property definition is now more expandable, then not needed patched has been removed.
Belgian payroll can now identify when an employee's salary is paid to a bank account owned or managed by someone else. This helps companies capture the required beneficiary details, especially for non-European accounts, improving compliance in exceptional payment situations.
Original PR description
Under specific circumstances, you can have your salary sent to another account, for example, you're under heavy fines and drawbacks, and your salary is managed by a legal advisor. In that case, you're not the proprietary of the account. Moreover, if you're not the proprietary and the account where money is sent is not european, we need to know the beneficiary city + country. Adding 2 new fields on `res.partner.bank` (displayed in form only for BE companies) : - `is_third_party`: computed (editable) boolean checking if `holder_name` and `partner_id.name` are matching or not. - `third_party_beneficiary_id`: res_partner managing the third party account. Task: 6431562
The quotation template form now separates subscription-specific settings into their own column. This makes the form easier to scan and helps users distinguish subscription configuration from general template details when setting up quotations.
Original PR description
Before this change: The quotation template form view displayed subscription specific fields together with the template's general fields in a single column. This made it hard to visually distinguish which fields belonged to the subscription configuration or the general template settings. After this change: The subscription fields are now separated into their own column. This groups related fields visually and makes the distinction between general template info and subscription specific settings clear. Impact: Improves the user experience by making subscription fields easier to locate and distinguish from other template fields, reducing the chance of confusion when configuring a subscription quotation template. task id: 6410262
Datetime fields can now automatically fill in a preset value when a user clicks them. This supports workflows like Social scheduling, where the planned time can default to one hour from now to speed up data entry.
Original PR description
Purpose ======= I social, we would like to automatically set the scheduled date to "now + 1 hour" when we click in the Datetime field. Task-6323897
The spreadsheet dashboard settings panel is now hidden from users who do not have administrator rights. This helps prevent non-admin users from seeing configuration options they cannot or should not manage, making the dashboard experience clearer and more controlled.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: task-6345154 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The graph view toolbar has been simplified by removing repeated text labels for sorting and chart type controls. Users still get guidance through icons, tooltips, and accessibility labels, keeping the interface cleaner without reducing usability.
Original PR description
Before this commit, the graph view toolbar labelled its sort and chart-type button groups with "Order" and "Type". Both groups already carry an aria-label, and every button a tooltip, so the text only restated what the icons convey. After this commit, the groups rely on icons and tooltips alone. task-6497293 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Businesses can now turn an active asset set to no depreciation into a depreciable asset without manually recreating it. The system transfers the current book value to the selected asset account, closes the original asset, creates and validates the new depreciable asset, and makes navigation between the linked records easier.
Original PR description
Allow users to convert a running asset that uses the "No Depreciation" method into a depreciable asset. A new "Activate Depreciation" action is added to the asset modification wizard: - A transfer journal entry moves the book value from the current fixed asset account to a newly selected one. - The old asset is closed and a new asset is created on the target account, inheriting the book value, salvage value, and the depreciation parameters configured on the new account. - The new asset is validated immediately, computing its depreciation board from the activation date. task-6357855
Project sharing now separates collaborators from message followers, so businesses can grant limited task editing access without automatically changing notification followers. This improves control over external or portal user access while keeping project communication settings cleaner.
Original PR description
#TODO --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Indian localization stock demo data now includes a warehouse for the Indian demo company. This makes demos and testing smoother by removing the need for users, developers, or partners to manually create a warehouse when working with Indian e-waybill scenarios.
Original PR description
Following the task-4034713, we used to create warehouse for all company but after this task we only create warehouse for the main company while testing for Indian Demo company considering the ewaybills it's annoying to create a new warehouse for Devs and POs and even for Demos After this commit, we will create demo warehouse for the Indian demo company Task [link](https://www.odoo.com/odoo/project.task/4034713) task-4034713 Forward-Port-Of: odoo/odoo#283797
HR now skips an unnecessary calendar lookup when employee contract or work versions follow each other without a gap. This improves performance for related HR validations, reducing wait times and database load without changing business behavior.
Original PR description
Optimize `has_work_hours_between_versions` by adding a fast path for back-to-back versions. If a new version starts the exact day after the previous one ends, there is no time gap between them (the old version ends at midnight and the new one begins immediately). In this scenario, we can safely return `False` and bypass the expensive calendar lookup entirely. `._get_l10n_be_min_wage_invalid_employees` on next.odoo.com: | | time | SQL queries | |--------|--------|--------| | before | ~7.8s | 6744 | | after | ~2.4s | 491 | <img width="1874" height="995" alt="image" src="https://github.com/user-attachments/assets/2b61179b-10c5-46a6-a3ac-4a0cad14f6d6" /> <img width="1874" height="995" alt="image" src="https://github.com/user-attachments/assets/7a70fb39-ece9-4090-ba2e-f3c4acca2657" /> task-6472490 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282703
The timesheet ActivityWatch assistant now shows the name of the relevant Odoo record when it can identify one from a visited URL, instead of falling back to a broad app name. This makes time suggestions clearer and helps users recognize what they were working on more quickly.
Original PR description
Before this commit, when the ActivityWatch integration encountered unmatched Odoo URLs, it would fallback to displaying the general application name (e.g., "Working on Sales"). With this commit, if the URL path ends with a valid record ID (e.g., /odoo/departments/1) and the corresponding model can be identified, the assistant will attempt to fetch and display the actual record name (e.g., "Working on Research & Development"). task: 6365568 Forward-Port-Of: odoo/enterprise#127981 Forward-Port-Of: odoo/enterprise#124138
Invoice QR code settings and payment method labels now use the correct local payment scheme names, such as Pix, FPS, PayNow, PromptPay, VietQR, MMQR, KHQR, and SEPA where relevant. This makes setup clearer for businesses in each country and avoids showing SEPA-specific wording where it does not apply.
Original PR description
The QR-code setting on invoices was labelled "SEPA QR Codes" for every country, and the Payment QR-code selection offered "SEPA Credit Transfer QR" everywhere, even where SEPA does not exist. The bank account fields driving those codes were named "Proxy Type" and "Proxy Value", which said little to users. Each localization now names the setting and its QR method after the local payment scheme (Pix, FPS, QRIS, PayNow, PromptPay, VietQR, MMQR, KHQR) and offers it only to companies of that country. SEPA naming is kept for the SEPA zone, other countries get a generic "Payment QR Codes" label, and the bank fields become "Account Identifier Type" and "Identifier Value". task-6471076
Point of Sale manual data reloads now clear browser-stored local and session data in addition to the main offline database. This helps prevent outdated or mismatched information from causing inconsistent behavior after a reload.
Original PR description
Manual data reloads reset IndexDB but leave local and session storage intact. The goal is to clear them to avoid inconsistent data. task-6456447 Forward-Port-Of: odoo/odoo#284238 Forward-Port-Of: odoo/odoo#281456
Point of Sale now lets cashiers move on immediately after validating a paid order instead of waiting for receipt printing to finish. This should make checkout feel faster and reduce delays at the register, while automated checks were updated to match the new flow.
Original PR description
- Stop awaiting the receipt print in the POS after order payment validation - Adapt tours to this behavior change task-id: 6425204 enterprise PR: https://github.com/odoo/enterprise/pull/127818 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283823 Forward-Port-Of: odoo/odoo#280002
Bank journals now receive the right outstanding payment accounts automatically for Moroccan and Indian accounting setups. This helps ensure payments are reflected correctly in cash-basis tax reporting, even when bank synchronization or reconciliation is not available.
Original PR description
Reason: - Moroccan companies usually use cash basis accounting. And the cash basis entries are only made when the invoices are reconciled with the bank transactions. However, in Morocco, there is no…
Reason: - Moroccan companies usually use cash basis accounting. And the cash basis entries are only made when the invoices are reconciled with the bank transactions. However, in Morocco, there is no Moroccan bank available for bank synchronization. Before this commit: - We are not assigning the outstanding accounts on the bank journals by default. - Which is causing the issues when the user creates a payment without an entry and without having any bank transactions to reconcile it with. Therefore, the tax report won't show the moves and taxes that occurred in the period. After this commit: - Introduced a method for updating the accounts on the payment method lines of the bank journal in the account module, as we need the same functionalities in l10n_in as well. - For Moroccan localization, from now on, we are setting the outstanding accounts automatically on the bank journals. - The payment accounts are applied by default during CoA loading and whenever payment method lines are recomputed, ensuring accounts remain consistent. Task-6041119 Forward-Port-Of: odoo/odoo#254642
French localization return reports now display the expected status colors for DAS2 and fiscal declarations. This makes it easier for users to quickly understand the state of each return without changing report content or workflow.
Original PR description
During the development of the das2 report and fiscal declaration, we didn't change the _compute_visible_states to accept the return of those reports. By doing so, we now have colors on the returns. task-6297355 Forward-Port-Of: odoo/enterprise#120417
Appointment booking views now group entries by guest automatically, making it easier for staff to review bookings by customer. This helps teams quickly see each guest's reservations without manually changing the view.
Original PR description
Add default Group By Guest Task-id: 6253719 Forward-Port-Of: odoo/enterprise#118681
The replenishment workflow now gives buyers clearer guidance by showing expected daily demand, how long minimum stock will last, and how often replenishment is likely needed. Teams can also update key replenishment assumptions across multiple products at once, reducing manual work and making inventory planning more consistent.
Original PR description
We're refactoring the replenishment wizard: - removing the graph - adding the `sale_delay` field - storing the daily demand, percentage and period time for the demand on the orderpoint - adding 2 fields to show the minimum coverage (days covered by the minimum stock based on daily demand) and the replenishment frequency ((max - min) / daily demand) - adding a wizard to change the `based_on` and `percent_factor` on multiple orderpoints at once, which also recalculates daily demand, min & max - adding demo data task 6304907 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Module descriptions, summaries, and short labels are now exported and loaded with each individual module instead of being bundled into the core translation file. This makes translations work better for custom modules and avoids extra translation export work when modules are added or updated.
Original PR description
Currently a module's `description`, `shortdesc`, and `summary` that are defined in the manifest file are exported in the `base.pot` file. This means that in order to get them translated (in case of an update or a new module), the `base.pot` file needed to be re-exported again with all the possible modules in the addons paths. For custom modules, this also means that their manifest terms are not translated at all, because their terms are not in the `base.pot` file. This commit changes this by exporting the manifest terms in their own modules' POT file, and loading them from there as well. This way, the manifest terms of custom modules can be translated, and there is no need to re-export the `base.pot` file when a new module is added or updated. We also add a test to check that the custom reader implementation is faster than using `polib`.
The channel kanban view has been adjusted to better match the redesigned web interface. Users should see cleaner spacing, better-aligned cards, and more polished channel images when browsing channels.
Original PR description
This PR fixes the layout of the ungrouped kanban view for channels as it was relying on the margin around each `KanbanRecord` for spacing. As we rely on the gap for the spacing, apply the same approach + add some minor fine-tuning like a `border-radius` on the channel image, spacing between category title and cards task-6488068 follow-up of task-6330603 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update strengthens automated checks so outdated frontend code patterns are caught before they can cause hard-to-find user interface issues. It helps prevent silent failures in areas such as messaging and point of sale by flagging incompatible code during quality checks.
Original PR description
Owl 3's useEffect takes a single callback and calls it with no arguments, but Owl 2 code still parses and runs. `useEffect(fn, () => [deps])` silently drops the dependencies, and `useEffect((el) => ...)` gets undefined parameters - nothing fails until a user walks the path. Add two no-restricted-syntax selectors so eslint catches both on the lint build. They are wrong by construction, so no exceptions are needed, and the useLayoutEffect shim keeps its two arguments under a different callee name. The rules go in test_lint/tests/eslintrc and, for point_of_sale, iot and obox, in web/tooling/_eslintrc.json. The chatter composer patch is the last community call site of that shape. Its body already reads both recipient lists, so dropping the dependency argument is enough; it matches master, so the forward-port is a no-op. Enterprise: https://github.com/odoo/enterprise/pull/128751 Forward-Port-Of: odoo/odoo#283883
Payroll users can now tap a full employee row to select it when reviewing payroll runs on mobile. Tapping the employee avatar opens the employee record, making navigation clearer and reducing selection mistakes on smaller screens.
Original PR description
this commit improves the employee selection in mobile view of hr_version_payrun_list making the click event on the record row to select the record and when the avater is clicked the user will be redirected to the employee form view. task-6469653