Daily updates from Odoo
Tuesday, July 28, 2026
42 changes
3 changes
Enhancements to existing features
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Chan
Original PR description
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Change Password URL specification by exposing a public route that redirects to `/web/reset_password`. Reference: https://wicg.github.io/change-password-url/ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#277575
In some cases, you want to redirect a record with ModelConverter, whatever the slug value. E.g. /shop/old-name-1 => /shop/alt-product-10 /shop/new-name-1 => /shop/alt-product-10 /fr/shop/nom-1 => /shop/alternatif-product-10 /de/shop/produktname-1 => /de/shop/produktname-10 In this case, adding only one redirect /shop/1 => /shop/10 covers the need to support all the translated slugs and the old name that we remember. On odoo.com we have this need e.g. when we archive a
Original PR description
In some cases, you want to redirect a record with ModelConverter, whatever the slug value.
E.g. /shop/old-name-1 => /shop/alt-product-10
/shop/new-name-1 => /shop/alt-product-10
/fr/shop/nom-1 => /shop/alternatif-product-10
/de/shop/produktname-1 => /de/shop/produktname-10
In this case, adding only one redirect /shop/1 => /shop/10 covers the need to support all the translated slugs and the old name that we remember.
On odoo.com we have this need e.g. when we archive a Job Position, we create a redirect, but in some cases the job position is translated or has been renamed and we don't remember all the old urls. With this change, we will be able to redirect all old urls, translated urls, ... with only one redirect.
/jobs/10 -> /explore-more-opportunities-with-us
task-6391567
Forward-Port-Of: odoo/odoo#276515We now avoid sharing logs to the database in favor of logging using sentry. task-6329137
Original PR description
We now avoid sharing logs to the database in favor of logging using sentry. task-6329137
2 changes
Enhancements to existing features
It is mandatory in BE to add a legal note on the invoice when using a "Co-Contractant" tax task-5905176 Forward-Port-Of: odoo/odoo#276628 Forward-Port-Of: odoo/odoo#251797
Original PR description
It is mandatory in BE to add a legal note on the invoice when using a "Co-Contractant" tax task-5905176 Forward-Port-Of: odoo/odoo#276628 Forward-Port-Of: odoo/odoo#251797
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Chan
Original PR description
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Change Password URL specification by exposing a public route that redirects to `/web/reset_password`. Reference: https://wicg.github.io/change-password-url/ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#277575
3 changes
Enhancements to existing features
When reconciling a bank statement line with a different partner than the one currently linked, users now see a notification offering to move the bank account to the correct partner. This helps keep partner bank details accurate and reduces manual cleanup after reconciliation.
Original PR description
Add a new notification in the bank reco widget when a user do a reconciliation with a partner different from the one on the st_line. The idea is to let the user chose if he wants to move the bank account from the st_line partner to the move he tries to reconcile. task-6303397 Forward-Port-Of: odoo/enterprise#120900
Belgian payroll bicycle reimbursements are updated for the rates applicable from October 1, 2026. The allowance increases to €0.32 per kilometer and the daily tax-exempt cap rises to €12.80, helping payroll calculations stay aligned with current regulations.
Original PR description
This PR updates the Belgian bicycle reimbursement rates to reflect the amounts applicable from October 1, 2026. ### Changes - Increase the bicycle reimbursement rate from the previous amount to €0.32/km. - Increase the maximum daily tax-exempt reimbursement to €12.80/day. These values are aligned with the latest Belgian regulations and are required for payroll calculations from October 1, 2026. Task-6385742
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Chan
Original PR description
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Change Password URL specification by exposing a public route that redirects to `/web/reset_password`. Reference: https://wicg.github.io/change-password-url/ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#277575
3 changes
Enhancements to existing features
Pakistan payroll rules have been updated to apply the latest 2026 income tax brackets. The previous extra tax surcharge mechanism has been removed, helping payroll calculations stay aligned with current tax requirements.
Original PR description
[IMP] l10n_pk_hr_payroll: update 2026 tax brackets . tax brackets are updated . extra tax surcharge mechanism is deleted task-6401729 Forward-Port-Of: odoo/enterprise#124988
Bank reconciliation now alerts users when they reconcile a transaction with a partner different from the one already linked to the bank statement line. This helps users decide whether to move the saved bank account to the newly selected partner, reducing accidental partner/account mismatches.
Original PR description
Add a new notification in the bank reco widget when a user do a reconciliation with a partner different from the one on the st_line. The idea is to let the user chose if he wants to move the bank account from the st_line partner to the move he tries to reconcile. task-6303397 Forward-Port-Of: odoo/enterprise#120900
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Chan
Original PR description
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Change Password URL specification by exposing a public route that redirects to `/web/reset_password`. Reference: https://wicg.github.io/change-password-url/ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#277575
2 changes
Enhancements to existing features
Comply with new provincial fiscal transparency regulations (CABA, Entre Ríos, Chubut, and other provinces still not defined) that mandate detailing Perception IIBB taxes on B2C invoices (Factura/Invoice B): - Some jurisdictions mandate a new description for IIBB perception taxes on the invoice, - We need to put the IIBB perception taxes in the special "Fiscal Transparency Regime" table, and exclude them from the standard tax table, task-6367087 Forward-Port-Of: odoo/odoo#277673
Original PR description
Comply with new provincial fiscal transparency regulations (CABA, Entre Ríos, Chubut, and other provinces still not defined) that mandate detailing Perception IIBB taxes on B2C invoices (Factura/Invoice B): - Some jurisdictions mandate a new description for IIBB perception taxes on the invoice, - We need to put the IIBB perception taxes in the special "Fiscal Transparency Regime" table, and exclude them from the standard tax table, task-6367087 Forward-Port-Of: odoo/odoo#277673
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Chan
Original PR description
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Change Password URL specification by exposing a public route that redirects to `/web/reset_password`. Reference: https://wicg.github.io/change-password-url/ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#277575
26 changes
Enhancements to existing features
The Discuss interface has been refreshed with a vertical navigation rail, clearer search and filter controls, and more readable channel rows across desktop and mobile. Channels without custom images now show consistent initials-based avatars, making conversations easier to recognize.
Original PR description
Rework the Discuss sidebar to match the new design. The tab navigation becomes a vertical icon rail on every viewport (it was a bottom bar on mobile), the "New" action and the search box share a…
Rework the Discuss sidebar to match the new design. The tab navigation becomes a vertical icon rail on every viewport (it was a bottom bar on mobile), the "New" action and the search box share a first row, and the tab filters render as pill toggles on a second row. Channel rows are restyled with rounded corners, an action-tinted hover/active state and an accent bar on the active row, replacing the global contrast() filter that read too dark on the light surface. The three surfaces now form a consistent elevation hierarchy in both light and dark mode: the rail is deepest (a faint pastel of the brand primary), the channel list sits above it, and the thread is lightest. Subchannel rows abbreviate the parent channel to its first few letters so the subthread name stays the prominent label. Channels without a custom image now get an avatar generated from the name initials over a stable pastel color derived from the record, instead of the fixed monochrome SVG. task-6392371 https://github.com/odoo/odoo/pull/276874
UrbanPiper food delivery settings are now managed in a dedicated store setup instead of being spread across each point-of-sale configuration. This makes store management cleaner and adds more flexible options for pricing, taxes, notifications, timings, and customer creation.
Original PR description
*: pos_restaurant_urban_piper, pos_enterprise, l10n_in_pos_urban_piper Introduces a dedicated `pos.urbanpiper.store` model to manage UrbanPiper store configurations for food delivery. Configuration…
*: pos_restaurant_urban_piper, pos_enterprise, l10n_in_pos_urban_piper Introduces a dedicated `pos.urbanpiper.store` model to manage UrbanPiper store configurations for food delivery. Configuration fields previously scattered across `pos.config` are migrated to this new model, giving each POS configuration its own linked UrbanPiper store record. This results in cleaner separation of concerns, easier extensibility, and a more streamlined UI for store management. **New model: `pos.urbanpiper.store`** - Replaces UrbanPiper-related fields previously stored directly on `pos.config` - Each POS config is linked to exactly one UrbanPiper store - Supports additional configuration fields without polluting `pos.config` **New features** - Provider-based pricelist support - Tax type configuration (inclusive or exclusive) - Customizable order notification sound - Preset support for managing: - Fiscal position - Store global pricelist - Store operating timings - Customer creation control ## Related - Task: `4977992` - Community: https://github.com/odoo/odoo/pull/260408 - Upgrade: https://github.com/odoo/upgrade/pull/9757
Accounting teams can now configure depreciation models and related asset accounts more flexibly, with key fields always visible and fewer restrictions during setup. Asset imports are also easier because depreciation model data and related accounts can be included directly in import templates.
Original PR description
This commit applies several improvements to the account and depreciation model. These changes are: - The `accumulated depreciation` and `depreciation expense` fields on the account form view are…
This commit applies several improvements to the account and depreciation model. These changes are: - The `accumulated depreciation` and `depreciation expense` fields on the account form view are changed to be always visible even if no depreciation model is selected. - Remove condition to limit asset creations for accounts being used as accumulated depreciation on other fixed asset accounts. It caused problems for many users trying to configure the accounts. Each country could have different configuation needs. - The depreciation model's name can now be edited while still keeping the auto-naming - The depreciation model auto-naming is slightly changed to be shorter when it's has a linear or degressive method. - The depreciation model export now includes more fields by using new export template - The asset import template has a new sheet for depreciation model data to be used to import depreciation models. Also depreciation and expense accounts can be imported directly to the asset, they are added as non-required fields to the asset template. The whole purpose is to ease asset imports as much as possible without having to pre-configure fixed asset accounts. - New button was added in the accounting import screen for importing depreciation models. task-6283929
The Discuss header no longer shows separate star and delete buttons because those actions are already available in the More menu. This reduces duplicate options and makes the interface simpler and more consistent with the Discuss team's intended workflow.
Original PR description
Remove the star and delete buttons from the Discuss header since both actions are already available from the "More" dropdown menu. This avoids duplicate actions in the UI and aligns the interface with the Discuss team's requested behavior. task-6420174 <img width="1197" height="308" alt="image" src="https://github.com/user-attachments/assets/f424e605-d4c8-4d29-9b7e-fe69b853324c" />
The appointment selection page now uses a clearer card-style layout consistent with the website appointment flow. Portal users also get a clearer preview notice, helping them understand when they are viewing appointment options before choosing one.
Original PR description
Purpose ======= Improve the look of the appointment selection page in the appointment module to match the look of the appointment selection in website appointment. Specification ============= Changing the appointment dropdown to match the website 'appointments list' layout. Moving templates from website appointment to appointment, cleaning scss rule, and remove now useless javascript interactions and test helpers. Adding a portal alert to inform that it's a preview of the appointment list selection, like it already existed after selecting an appointment type, except instead of redirecting to the selected appointment form, it redirects to the appointment list view. Inheriting the appointment template in website appointment to add the 'published' ribbon and sample images. Task-6185274
The employee time-off planning view now loads data in batches and only retrieves the relevant date range. This makes large team views much faster, reducing wait times from several seconds to about one second in key scenarios.
Original PR description
At odoo, our friendly kitchen chef needs to know who is off on any given day. To know that, they use the holiday gantt view and display all employees and check the sum. For 200+ employees working at GR2, `get_gantt_data` takes 7+ seconds `_unavailable_intervals_batch` is called for each individual version, which means it's not batched. Ultimatly, it leads to lots of sql queries that could be grouped together. With this commit, the calls are batched per calendar before: ~7s after: ~900ms-1s Forward-Port-Of: odoo/enterprise#125490 Forward-Port-Of: odoo/enterprise#124820
The time off Gantt view now offers a cleaner popup when creating multiple requests at once. It also handles multi-day and half-day selections more reliably, reducing validation errors caused by overlapping requests.
Original PR description
task-5941912
The Peru electronic invoicing module updates debit note reason options to match new SUNAT requirements effective August 1, 2026. Businesses creating Peruvian debit notes will have the new “Penalties” reason available and the existing “Other concepts” label updated for compliance.
Original PR description
Purpose: SUNAT has issued new validation rules and database updates for EDI. The changes are mandatory and is effective starting August 1, 2026. To stay compliant, the debit note reasons need to be updated when creating a debit note in Peru. A new code 13 with label "Penalties" is added to the list of reasons. Code 03 reason need its label to be updated to "Other concepts." Task [link](https://www.odoo.com/odoo/project.task/6312025) task-6312025 Forward-Port-Of: odoo/enterprise#122320
Belgian payroll now flags paid public holidays that fall within the first two weeks of economic unemployment and assigns them to the correct leave type. Payroll officers receive a warning when this split occurs, helping them review payslips and reduce payroll classification errors.
Original PR description
This change aims to grab the attention of payroll officers to the paid public holidays during the first two weeks of economic unemployment "LEAVE6665" and change the leave type to "LEAVE207" instead of "LEAVE500" Moreover, the split will be highlighted through a warning popup. Task: 6275590
Egyptian payroll rules now calculate pay more consistently using actual working days instead of a mix of fixed 30-day assumptions and working-day logic. Required employee payroll details are restored as standard employee fields, helping ensure accurate calculations and compliance exports across employees.
Original PR description
Purpose: - Some salary rules result in wrong computation as they are already handled in working days - Revert property inputs to fields as they are not optional and they need to be on all employees - Some of the calculations are based on working days and some are based on 30, we want to change that and make everything based on working days and have the user adapt the working schedule according to their needs. task-id: 6289200
Belgian payroll DMFA checks now show all validation issues and anomalies in a dedicated tab instead of stopping at the first problem. This helps payroll users review and resolve blocking and non-blocking issues more efficiently before creating declarations.
Original PR description
Currently, validation errors and anomalies on dmfa are raised one by one, making it a UX nightmare to fix the errors (you only see one at a time). Here, we refactor the code so that we have a new issues field on dmfa which computes the errors that are now defined as records of hr.payroll.warning we display this in a new tab in the form view of the dmfa. Task: 6267586
Marketing automation now processes campaign participants, activity traces, and WhatsApp-related messages in batches, improving performance for larger campaigns. The change also clarifies participant statuses and centralizes related update logic, making the feature easier to maintain and scale.
Original PR description
Improve traces and participants synchronization performance by batching operations. Introduce slicer usage so that batching is done under manageable chunk sizes. Improve whatsapp performance by batching part of the message creation process. Centralize code managing traces and participants status update, easing code understanding, maintenance and update. See sub commits for more details. Task-4224152: [marketing_automation] Performance / Scalability
Belgian payroll now offers two clear flexi contract employee types: Flexi-Employee with worker code 450 and Flexi-Worker with worker code 050. This replaces the previous generic Flexi-Job type, helping HR teams select the correct classification more easily and reduce setup errors.
Original PR description
Currently, there is two possibilities for people in flexi contracts, either they use worker code 450 or 050. In the current employee type, default flexi-job doesn't has default worker code. In this PR, expected to introduce new employee types - Flexi-Employee with worker code 450 - Flexi-Worker with worker code 050 It also removes the existing Flexi-Job employee type. This implementation simplifies HR operations by providing dedicated employee types with predefined worker codes. task: 6364410
The Dimona check button for Belgian payroll is now shown when debug mode is enabled or when the sandbox environment is open. This makes it easier for authorized users to test and verify Dimona-related employee information in the right contexts without affecting normal production use.
Original PR description
Update the check dimona button to appear if the debug mode is open or sandbox is opened Task Id : 6398635
Payroll payment export options can now be tailored by country and extended more easily. This reduces irrelevant choices in multi-country payroll setups and helps select the right default export format automatically.
Original PR description
Update the export_format field to use a callable for both the selection list and the default value. It has a few goals: - Allow to add new options without needing to update the module, for cases where it could make sense. - Allows to make the options country specific, reducing the amount of irrelevant options shown in multy countries databases. - Allow a better handling of default values, allowing to make them country specific. task-6363995
Belgian payroll now applies a quarterly cap to employer social security contributions, preventing employer contributions from exceeding the allowed limit across payslips in the same quarter. The change adds the required payroll rule, reporting support, and tests so Belgian payroll calculations and DMFA reports reflect the capped deduction correctly.
Original PR description
[IMP] l10n_be: employer contribution capping
. Quarterly employer contribution capping should be applied for Belgium.
. New salary rule parameter for capping amount
. New salary rule ONSSEMPLOYERBASICDEDUC to calculate the deduction of ONSSEMPLOYERBASIC in each payslip.
. In short, we are looking (cap_amount - total ONSSEMPLOYERBASIC this quarter)*basic_rate - previous deductions in this quarter
. By this way, you can't overflow the capped employer contribution.
task - 6279204India payroll employer cost calculations now use gross salary instead of net salary by default. This gives businesses a more accurate view of employee cost because gross salary better reflects the cost baseline before net pay deductions.
Original PR description
In this PR, for the India localization, we were using NET as the default value for employer cost computation. Instead of NET, we will now use GROSS, as it provides a more accurate representation of employer cost: Employer Cost >= GROSS >= NET. Technical - set appear_in_employee_cost_dashboard=False in India:Intern and India:Employee pay in NET salary rule. - set apprear_in_employee_cost_dashboard=True in India:Intern and India:Employee pay in Gross salary rule. task: 6323947
Saudi payroll now helps HR track employees whose wage, housing allowance, or other allowances have changed. HR managers receive a notification, and the required GOSI wage update report is available from the reporting menu for upload to the GOSI platform.
Original PR description
GOSI wage update report is needed to be uploaded to GOSI platform for each employee that changes their wage, housing allowance, or other allowances. Consequently on the change on any of these fields, a notification will be created for the HR manager and the report to be uploaded will be accessible through the reporting menu with the employees that were updated. Task: 6380424
Belgian payroll now includes the required pension and subsistence fund contribution rules for both workers and employees. This helps employers calculate and report the correct DMFA contribution codes in line with social security requirements.
Original PR description
add for Workers → 826 & 827 For employees → 836 & 837 rules depending on Source: https://www.socialsecurity.be/employer/instructions/dmfa/fr/latest/instructions/special_contributions/other_specialcontributions/subsistenceprotectionfunds.html and add it in the dmfa Task Id: 6259626
Belgian payroll now records the fiscal month and quarter used for 274.xx withholding tax declarations and carries that information into related accounting journal items. This makes it easier to reconcile payroll taxes when declarations are settled in a different period than the work performed.
Original PR description
**Why:** In Belgian payroll accounting, taxes can legally be declared and settled in a month or quarter other than the one in which the actual work was performed. Currently, this mismatch makes it difficult to reconcile financial journal entries with the official 274.xx withholding tax forms. **What:** - Added fiscal_month and fiscal_quarter fields to track the 274.xx tax declaration periods. - Extended the payroll journal entry mapping to pass this fiscal period information directly down to the generated account journal items. task-6233232
This update makes BioTime attendance integration easier and safer to use by hiding related menus until setup is complete and improving how punch records are processed. It also improves time conversion, attendance deletion handling, and adds tests to reduce errors in daily attendance workflows.
Original PR description
- Hide the Transactions/Terminals menus and block their views until BioTime is configured; Test Connection reloads so the menus surface. - Convert BioTime punch times to UTC using the employee timezone. - Reset and flag linked transactions when their attendance is deleted, and keep the guard against deleting processed-and-linked ones. - Replace the cog server action with Fetch/Process/Re-Fetch list-header buttons; allow editing punch_type when the fetched value is unsupported. - Compute processing_note from the transaction state instead of writing it ad hoc across methods. - Add shared _notification and _mark_processed helpers and drop dead code (unused params, unreachable guards, redundant cache clearing). - Add tests covering the processing, sync, and access-gating paths. Task-6181807
Belgian payroll declarations can now include an employee's risk class when one is defined. This helps produce more complete DMFA filings and reduces the need for manual adjustments or missing declaration data.
Original PR description
The `ActivityWithRisk` tag is currently disabled by hardcode. This commit populates the tag with the value of the employee's risk class, if any. TaskID: 6409073
The payroll dashboard no longer shows an invalid language warning for Belgian payslips. Instead, it now warns users when the DMFA work location language is missing, helping payroll teams fix the setting that matters for official payslip delivery.
Original PR description
Currently, Payslip is sent both in employee language and the DMFA work location language. This happen to make sure the payslip is sent in one of the official language. In this PR, expected to improve the warning that appears in Payroll Dashboard. The specifications required to: - Remove the warning about "Invalid Language" - Add a warning regarding the DMFA work location if the language is not set task-6377966
Payroll localization modules are now installed through Odoo's standard country-based auto-install process instead of a later setup hook. This reduces upgrade surprises and keeps payroll localization status more consistent during installations and updates.
Original PR description
Previously, a post-init hook was used in `hr_payroll` to install `l10n_XX_hr_payroll` modules for each country where a company is located. This could lead to issues and unexpected behavior during upgrades as this is run later in the process. Modules installed by the hook were considered as `uninstalled` until the `hr_payroll` was loaded. However, this auto_install behavior is now fully handled by the `auto_install` + `countries` mechanism in the manifests. The hook can then be safely removed. All the `l10n_XX_hr_payroll` modules where already using the configuration `auto_install: ['hr_payroll']` with `countries: ['XX']`, no change is needed in those modules. Only `l10n_us_hr_payroll` was still using that hook since it had a dependency on `l10n_us`. This was fixed in a [dedicated PR]. [dedicated PR]: https://github.com/odoo/enterprise/pull/120279
Payroll now supports optional categories on time off types, letting businesses add extra classifications when creating time off and use them in payroll calculations. Belgian premium pay rules are being moved to this more flexible approach, alongside a correction to non-recurring benefit contribution calculations.
Original PR description
Allowing to define optional categories on time types, which can be optionally added on time off creation. Migrating the Belgian premium pay to utilise this system. task-6297699
Document-related counters now update automatically when attachments are added or removed, so users see accurate information without manually reloading. This improves reliability for records that use document management and adds test coverage to protect the behavior.
Original PR description
This commit enables the chatter to automatically trigger a reload of the stat buttons whenever an attachment is added or removed from a model inheriting `documents.documents_mixin`. To achieve this at the frontend level, a new computed attribute was added to the `mail.thread` store to serve as a marker, allowing the chatter to detect the mixin's presence and adjust its reload behavior accordingly. Tests in `test_documents_full` have been updated to ensure the bridge logic correctly handles document creation and deletion. Related-PR: https://github.com/odoo/odoo/pull/265280 Task-6148224
1 change
Enhancements to existing features
Australian payroll now applies the required superannuation contribution limit in the relevant salary rule. This helps employers stay compliant with ATO rules, including the updated Super Guarantee calculation from 1 July 2026.
Original PR description
Added superannuation limit to the QE rule. Task-6221399
2 changes
Enhancements to existing features
### [FIX] website: fix GMaps deprecation console warning for s_google_map Google deprecated the synchronous script loader for initializing the Maps JS API. This caused browser console warnings. The fix adopts Google's official `importLibrary()` bootstrap pattern, which loads map libraries (places, maps, marker) lazily on demand rather than all at once.The version is updated to `v=weekly`, which Google recommends as it receives updates weekly versus quarterly for version numbers(`v=num
Original PR description
### [FIX] website: fix GMaps deprecation console warning for s_google_map Google deprecated the synchronous script loader for initializing the Maps JS API. This caused browser console warnings. The…
### [FIX] website: fix GMaps deprecation console warning for s_google_map Google deprecated the synchronous script loader for initializing the Maps JS API. This caused browser console warnings. The fix adopts Google's official `importLibrary()` bootstrap pattern, which loads map libraries (places, maps, marker) lazily on demand rather than all at once.The version is updated to `v=weekly`, which Google recommends as it receives updates weekly versus quarterly for version numbers(`v=number`). Steps to reproduce: 1. Add the `s_google_map` snippet(not the`s_map`, enable debug mode) 2. Open the browser console and observe the deprecation warning ### [IMP] website: warn user to reload after GMaps config changes Switching from the legacy Google Maps APIs to the new APIs requires enabling additional services in Google Cloud. Existing maps using the legacy API continue to work, but when an admin edits a map without a proper configuration, the `GoogleMapAPIKeyDialog` dialog opens. Google Maps configuration changes (API key update or enabling services) do not take effect during the current editor session because the Maps JavaScript API is loaded at page initialization. Before this commit, such misconfigurations (disabled services or invalid API keys) only triggered a dialog showing a generic Google Maps error. After this commit, a notification informs the user that the page must be reloaded for configuration changes to take effect. The setup instructions are also updated to reference the "Places API (NEW)" service. ### [IMP] website: replace deprecated Places API calls in GPS picker The GPS picker relied on `PlacesService.nearbySearch` and `getDetails`, which are part of the deprecated Places API. The new places API replaces these with `Place.searchNearby` and `fetchFields`. Error handling is consolidated into a single try/catch since the new Places API throws on failure rather than returning a status code, removing the need for `PlacesServiceStatus` checks. ### [IMP] website, *: replace deprecated Google Autocomplete *: website_form_project google.maps.places.Autocomplete is deprecated in the new Places API. The replacement (`AutocompleteSuggestion.fetchAutocompleteSuggestions`) does not fire DOM events, making it incompatible with the old event-listener pattern used in GPSPicker. A new Owl component (`PlacesAutoComplete`) is introduced to wrap the new API, built on top of the existing `AutoCompleteWithPages`. References: https://developers.google.com/maps/documentation/javascript/load-maps-js-api https://developers.google.com/maps/documentation/javascript/advanced-markers/migration https://developers.google.com/maps/documentation/javascript/legacy/places-migration-overview task-[4441041](https://www.odoo.com/odoo/project/974/tasks/4441041) Forward-Port-Of: odoo/odoo#242765
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Chan
Original PR description
Password managers and browsers rely on the standardized `/.well-known/change-password` URL to automatically locate a site's password change form, instead of relying on unreliable heuristics to detect it inside the page. Without this endpoint, users depending on password manager integrations (Chrome, Safari, 1Password, Bitwarden, etc) have no reliable way to be redirected to the actual reset form, resulting in a degraded UX and inconsistent behavior across browsers. This implements the Change Password URL specification by exposing a public route that redirects to `/web/reset_password`. Reference: https://wicg.github.io/change-password-url/ --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#277575