Wednesday, September 17, 2025
38 changes · master
Enhancements to existing features
The web enterprise menu now stores cached data in a larger browser storage area instead of the more limited local storage. This helps reduce the chance of cache space issues and supports smoother navigation as other browser caches continue to use local storage.
Original PR description
This commit modifies the menu service so that it uses IndexedDB to cache data instead of localStorage. LocalStorage is more limited in size and is used by all other caches.
The app menu search field now tells browsers and password managers not to offer saved entries. This avoids unnecessary Bitwarden popups and keeps the main menu experience cleaner for users.
Original PR description
Bitwarden pops up small form on top of the main menu for no reason. It is because of the hidden input created to trigger search when you type. Put `autocomplete="off"` to avoid these popups.
The bank reconciliation widget has been visually adjusted so labels and count badges appear less heavy. This makes the interface easier to scan without changing any accounting workflow or behavior.
Original PR description
During this commit:https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e We made some changes on the css of the bank rec widget. This commit will change: - The text weight of the labels is a bit too dark - The circle around the count on button was also a bit too dark task-5091753 Forward-Port-Of: odoo/enterprise#94906
Dark mode colors have been refined for bottom sheet elements so they remain clear and consistent. This improves readability and visual comfort for users working with dark mode enabled.
Original PR description
This commit adjusts the colors of the bottom sheet’s inner elements for dark mode. task-5087158 Requires: - https://github.com/odoo/odoo/pull/227230 Forward-Port-Of: odoo/enterprise#94783
Several country-specific Intrastat and UK reporting modules now use a shared default delay setting to calculate filing deadlines. This makes deadline handling more consistent and easier to maintain, with no expected change to day-to-day user workflows.
Original PR description
Forward-Port-Of: odoo/enterprise#94889
IoT Box records are now displayed alphabetically by name instead of by internal ID. This makes it easier for users to find the right device and improves day-to-day usability.
Original PR description
In order to improve user experience, we now sort IoT Box records by name instead of ID. Task: 5092660
Adds basic permission checks for AI-related models to help ensure internal users have the right access. This reduces the risk of access issues going unnoticed during future changes.
Original PR description
Purpose: --------- This commit adds a few basic tests to check model permissions. (the fix from the original commit about the ai.tool model is not forwardported as the model has been removed in 19.0 (replaced by server actions). Task-5064332 Forward-Port-Of: odoo/enterprise#94483 Forward-Port-Of: odoo/enterprise#93847
This update removes an outdated button layout setting from several Odoo screens to stay aligned with the newer Bootstrap 5 framework. Users should see no functional change, but it helps keep the interface maintainable and consistent across apps.
Original PR description
*: sign, stock_barcode, web_enterprise, web_studio This PR removes the `btn-block` utility Bootstrap class because it's obsolete since Bootstrap 5. task-4637091 PR-commu: https://github.com/odoo/odoo/pull/227114 PR-design-themes: https://github.com/odoo/design-themes/pull/1149
When a field service subtask is created, it now starts with the same warranty status as its parent task. This helps teams avoid manual updates and keeps service billing or warranty handling more consistent.
Original PR description
The subtask `under_warranty` will have a default value of the parent `under_warranty`. --- task-4830511
Resolved issues and error corrections
Appointment booking confirmation emails will now go only to the intended followers, rather than also being sent to attendees. This avoids unnecessary or confusing notifications while keeping internal teams informed when new appointments are created.
Original PR description
[1] introduces the new paradigm of always sending emails to "relevant recipients" which fetches emails and partners linked to the relevant record to send a message.
In appointment the "Appointment Booked" template is only meant to be sent to followers of `mt{_calendar,_appointment}_event_booked` to inform users that a new appointment was created even if they are not personally assigned to it.
`test_request_meeting_message_for_manual_confirmation` is also updated to represent the case of some visitor creating booking an appointment instead of using internal users for everything to better represent real use cases. Additionally each mail.mail record is extracted and checked individually to make sure we send the right contents to the right recipients.
[1]: 1dd6070ecaab385446cc2df7cad444f046812061
task-5075513
task-4711415
Forward-Port-Of: odoo/enterprise#94646
Forward-Port-Of: odoo/enterprise#94456Features or functions removed from Odoo
This update removes an unused internal method from the accounting reports area. It has no expected impact on day-to-day reporting, but helps keep the codebase simpler and easier to maintain.
Original PR description
Forward-Port-Of: odoo/enterprise#94732
Code cleanup and technical improvements
This update makes internal test helper files available for manufacturing work orders and barcode operations. It helps keep automated checks reliable without changing day-to-day user workflows.
Original PR description
In this commit, we add tour_helpers file in manifest. Forward-Port-Of: odoo/enterprise#94150
The Studio AI field setup now requires users to choose a related record type when creating Many2one or Tags fields. This prevents incomplete field configurations from being saved and avoids crashes during field creation.
Original PR description
When adding an AI field of type Many2one or Tags, the Relation field was optional. If left empty, it caused a crash. This commit enforces that a Relation must be selected before confirming the dialog: - Add a red highlight if Relation is missing - Prevent field creation by returning early Task-5055796 Forward-Port-Of: odoo/enterprise#93873
Opening the duplicate transaction wizard directly no longer causes an error when no bank journal is linked. This prevents an avoidable interruption for accounting users and makes the view safer to access from administrative tools.
Original PR description
Currently, an error occurs when users try to open the view directly. Steps to reproduce: --- - Install `Accounting` module - Using Open View, Open `account.duplicate.transaction.wizard` view Traceback: --- `ValueError: Expected singleton: account.journal()` This error occurs because no account journal is linked to the wizard at [1], resulting in an empty `account.journal`. [1]- https://github.com/odoo/enterprise/blob/08564f3312c255f2f3ab95cef5a9bfc57727bd1f/account_online_synchronization/wizard/account_journal_duplicate_transactions.py#L32 sentry-6812500330 Forward-Port-Of: odoo/enterprise#94538
Mexican electronic invoice PDFs now use the same customer fiscal regime as the official XML file. This avoids confusing mismatches when invoicing a child contact whose parent company has a different fiscal regime.
Original PR description
In l10n_mx: - Create a child contact under a company contact. - Set the fiscal regime of the child contact to one different from the company’s fiscal regime. - Create an invoice with the child contact and send it to the CFDI. In the XML, the fiscal regime used is the company’s, whereas in the PDF it is the child contact’s. This commit applies the same logic from _add_customer_cfdi_values to the PDF generation. After this change, the fiscal regime shown in the PDF will be the company’s, consistent with the XML. opw-4989605 Forward-Port-Of: odoo/enterprise#94259 Forward-Port-Of: odoo/enterprise#92482
When a new partner is created from bank reconciliation, the system now shows the correct receivable or payable button based on the statement amount rather than missing customer or supplier history. This prevents users from seeing the wrong payment action for newly created partners.
Original PR description
When creating a new partner from the set partner button, the partner doesn't have any rank (supplier or customer), this lead to have the payable button to be displayed since the condition to have it is to have a partner and not (customer_rank > supplier_rank). Since supplier rank and customer rank are 0 it will be False which lead to the button to be displayed. no task id Forward-Port-Of: odoo/enterprise#90435
This fix stabilizes an automated test related to the WhatsApp command palette so clicks happen only after the interface is ready. It helps prevent false test failures, improving confidence in release validation without changing user-facing WhatsApp behavior.
Original PR description
Before this commit, clicking on some elements of the command palette would not trigger the associated event, this was probably caused by clicking on outdated owl fragments which cannot trigger events while being destroyed. This commit fixes this issue by making sure that the interface is in a stable configuration before clicking. https://runbot.odoo.com/odoo/runbot.build.error/112148 Forward-Port-Of: odoo/enterprise#94075
The Barcode app now avoids showing a product description when it is identical to the product name. This reduces repeated information during receptions, making barcode operations clearer for warehouse users.
Original PR description
Steps to reproduce: - Create a product - Open the Barcode app - Create a new reception and add the product Issue: The description is displayed even though it's the same as the product name. Since in barcode we don't get the product's `display_name` with its code as they're treated separately, we need to reconstitute it to be sure it's not the same as the description in order to know if we want to display it or not. Task-4901289 Forward-Port-Of: odoo/enterprise#94623
Signed document emails now use each document's own name for attachments. This prevents duplicate-looking filenames and avoids adding an extra .pdf extension, making received documents clearer for customers and staff.
Original PR description
Steps to reproduce: 1. Install Sign. 2. Configure an outgoing email server. 3. Send a sign request for 2 or more documents to the admin (use your own email) 4. Open the email, sign and validate the documents. 5. You will receive an email. **Issue:** - You observe there are attachments in the email with same name and an extra `.pdf` as file extensions (e.g. `abc.pdf.pdf`). **Cause**: https://github.com/odoo/enterprise/blob/a1cd174c65fa181701cc3c5883fb5ab43b2803d8/sign/models/sign_request.py#L588-L594 - The code used `record` instead of the current `document` to determine the attachment name, causing the wrong generated name. **Solution:** - Use the `document` name when generating the attachment filename. opw-4965405 Forward-Port-Of: odoo/enterprise#92183
This fixes a problem that could prevent a payroll batch action from working correctly for Swiss payroll. The change restores expected payroll processing behavior by aligning the Swiss payroll customization with the standard action requirements.
Original PR description
Parameter was not added to the overriden method in switzerland Forward-Port-Of: odoo/enterprise#94461
The Documents app now consistently shows the Activities button in the chatter panel for every document, including files linked to other document types such as signing documents. This restores access to activity tracking and follow-up actions where the button was previously missing.
Original PR description
Step to Reproduce: - Install `Documents_sign` module - open Documents - click on 'info & tags` button on the top right corner to show chatter - Open 'Odoo CLA.pdf' document Observation: - The Activities button is not shown in Chatter. Issue: - after this https://github.com/odoo/enterprise/commit/a32825ee00f2b330d99113f4d8c1488903fe744e, the activities button shows only for those documents which are related to `documents.documents` model or a document has no model, but it should be shown for all documents https://github.com/odoo/enterprise/blob/23fb26ae0f91a5bdb74d0d4fce48b31fa7abef86/documents/static/src/views/kanban/documents_kanban_renderer.xml#L21-L26 Solution: - Remove condition for Kanban and list view to show `activities` button in Chatter opw-5013427 Forward-Port-Of: odoo/enterprise#94514 Forward-Port-Of: odoo/enterprise#93093
Users without administrator rights can now open return checks without hitting an access error. This fixes a permissions issue in accounting reports so day-to-day return review works reliably for standard users.
Original PR description
Before this fix, trying to open a return with a user not having the administration rights caused an access error. This was because the computation of that field tried to access the name of an ir.model record. Forward-Port-Of: odoo/enterprise#94759
Odoo Studio now uses an existing shared waiting utility instead of depending on a tour-only component. This avoids unnecessary loading behavior and helps keep Studio more reliable without changing the user experience.
Original PR description
HootDom is lazy loaded and necessary only in tours. Studio uses the waitUntil function, but it is also findable in macro.js in @web/core Forward-Port-Of: odoo/enterprise#94786
The US check printing feature now requires the correct US accounting component. This helps ensure the feature is installed with the accounting setup it needs, reducing configuration issues for businesses using US localization.
Original PR description
It should depend on `l10n_us_account`, not just `l10n_us`. Forward-Port-Of: odoo/enterprise#94801
Fixed an issue where users editing properties on products without a category could see a blank notification instead of a helpful warning. This ensures the intended message appears, reducing confusion during product setup.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Create a new product without a category; 2. try to edit properties. Issue ----- An empty notification appears. Cause ----- The `_getPropertyEditWarning` override in `account_asset` introduced by PR odoo/enterprise#87807 doesn't return the value of the `super` call. This was introduced in a forward port as the logic to display the warning was changed in `web` in saas-18.3, and not requiring a return value in previous versions. Solution -------- Return the `super` call. opw-4980006 Forward-Port-Of: odoo/enterprise#94583
Renamed spreadsheets now keep their chosen name when users create a new spreadsheet and then return through the breadcrumb. This prevents confusion from previously renamed files appearing as untitled.
Original PR description
Steps to reproduce: - Create a spreadsheet - Rename it to "My awesome spreadsheet" - Click on File -> New - Go back to "My awesome spreadsheet" from the breadcrumb => The spreadsheet is untitled. This was caused by the fact that the name was not saved in the local state of the action. Task: 4942117 Forward-Port-Of: odoo/enterprise#93163
This fixes a demo data setup issue when Italian Ri.Ba. payments are installed alongside Stripe expenses. The demo bank partner now handles the extra bank journal created by Stripe expenses, preventing installation errors during demos or testing.
Original PR description
Steps: 1. Install `hr_expense_stripe` and activate demo data 2. Install `l10n_it_riba` 3. `l10n_it_riba` demo data install fails with an error Since [this commit](https://github.com/odoo/enterprise/commit/752ffcbcd0c33e2886aa7bcec469e16d3704d7a9), an additional bank journal is created on every company by `hr_expense_stripe`, and `l10n_it_riba` demo data only expects one. task-none Forward-Port-Of: odoo/enterprise#94437
The mobile template list in Sign now shows the template name as the main information instead of the creation date. This makes it easier for users to identify and choose the right template, while still keeping the creation date available as supporting detail.
Original PR description
### Issue: - In mobile view, the template list was showing the creation date instead of the template name. - This made it hard to know which template you were selecting. --- ### Fix: - Changed the mobile view to show the template name as the main info. - The creation date is still shown, but as extra information. --- ### Impact: - Easier to find the right template on mobile. - Mobile and desktop views now look consistent. --- Task: 5038933 Forward-Port-Of: odoo/enterprise#93072
This fix prevents an error when Shop Floor is set as a user’s default landing page. Users can now log in directly to the Shop Floor view without seeing a crash, improving reliability for manufacturing teams.
Original PR description
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback…
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback after logging in. **STEP TO REPRODUCE** 1. Go in debug mode 2. Change the home action of a user to the 'Shop Floor' action (in the user form, in the preference tab). 3. log out, and log in with this user. 4. a js traceback should appear. **CAUSE** In mrp_workcenter_dialog.js, the Shop Floor action uses the `menu` service to get the name of the current app. `setCurrentMenu()` which set the current app in the `menu` service is not called before the `appName` getter is called. https://github.com/odoo/odoo/blob/5c1234085b1c1e227846b24bde55a0392779069b/addons/web/static/src/webclient/menus/menu_service.js#L29-L36 This lead to a traceback because this.menu.getCurrentApp() is `undefined`. **FIX** Workaround if the current app is undefined. We already check what is returned by `getCurrentApp()` where it is used. opw-4926317 Forward-Port-Of: odoo/enterprise#94655 Forward-Port-Of: odoo/enterprise#93043
Postpaid subscriptions now correctly set the next invoice date to the start of the billing period when the plan is configured to align periods, such as the first day of the month. This helps ensure customers are billed on the expected schedule and reduces manual corrections for subscription teams.
Original PR description
Before this commit, when a subscription whose lines were all postpaid and the subscription plan was meant to align periods to first day of the period (e.g. first of the month), there was an issue at confirmation. The next invoice date was not put at the first day of the period in that case. Forward-Port-Of: odoo/enterprise#94746
This fix removes a fragile test dependency in the website rental sales area that was causing automated runbot failures. It helps keep validation pipelines stable so future rental-related updates can be checked and delivered with less disruption.
Original PR description
runbot-error-232620 Forward-Port-Of: odoo/enterprise#94782
This fix updates automated tests so they match a newer rule for flexible employee scheduling. It helps keep planning, field service, project, and rental scheduling checks reliable without changing business features.
Original PR description
Several existing tests in `planning`, `project_enterprise`, `sale_renting_planning` and `industry_fsm` failed because the new constraint enforces that `work_entry_source`=`'calendar'` requires a `resource_calendar_id`. These tests are now adapted to use a different `work_entry_source` ('planning') for fully flexible employees.
task-5068798Accounting documents no longer show attachments from reconciled moves in the standard chatter by mistake. Those related attachments remain visible only in the bank reconciliation widget, keeping regular accounting records cleaner and less confusing.
Original PR description
Problem --------- In odoo/enterprise#85991, attachments from reconciled moves were displayed in the chatter along side the moves' attachments. This change was meant to affect only the bank reco widget. However, its scope reached the standard accounting behavior. STEPS --------- 1. Have 'account' installed 2. Create a move 3. Confirm and create the PDF attachment from the Send&Print 4. Create a credit note from it 5. Confirm the credit note -> The 2 moves are now reconciled and the PDF of the invoice is shown in the chatter of the credit note Objective --------- Only show reconciled moves' attachments in the bank reco chatter. Solution --------- Add a context key that is added when the Bank Reco widget is created and remove it when it is deleted. opw-####### Forward-Port-Of: odoo/enterprise#94661 Forward-Port-Of: odoo/enterprise#94442
Bookkeepers and other authorized users can now generate tax returns without needing permission to edit company records. The check now confirms they can view the company, preventing unnecessary blocks while still protecting company data from users without access.
Original PR description
Before:
When generating tax returns, the code checked for write access with `company.has_access('write')`. This could wrongly block users with Bookkeeper access right, who have the rights to generate returns but not to modify company records.
After:
The access check now uses `company.has_access('read')`, ensuring users with sufficient read access can generate returns while still preventing access for users without company visibility.
Forward-Port-Of: odoo/enterprise#94858
Forward-Port-Of: odoo/enterprise#94740This update fixes failing payroll localisation tests by ensuring an attendance-related overtime field is only included where the attendance module is available. This helps keep payroll localisation modules stable and reduces build failures without changing business functionality.
Original PR description
**Issue:**
The test_{xx}_contract_template_loading test fails across all localisations due to incorrect fields being passed.
**Cause:**
The issue occurs because the _get_whitelist_fields_from_template() method includes the overtime_from_attendance field, introduced in this https://github.com/odoo/enterprise/pull/92093. This field comes from the hr_work_entry_attendance module, which is not listed as a dependency in all payroll localisations. As a result, the field cannot be found during test execution.
**Solution:**
Remove the overtime_from_attendance field from all _get_whitelist_fields_from_template overrides in the localisation modules, and instead include this field by overriding the function in the hr_work_entry_attendance module.
build_error-231680
Forward-Port-Of: odoo/enterprise#94004A display issue in subscription payment forms was corrected so the “Secured by …” label can use the intended vertical layout. This helps keep payment method information presented cleanly and consistently for customers.
Original PR description
This PR aims to fix an issue where an xpath attribute was preventing from adding `.flex-column` to the "Secured by …" label under the payment methods. task-5081875 Requires: - https://github.com/odoo/odoo/pull/226453 Forward-Port-Of: odoo/enterprise#94884
The Room module’s test setup was updated to stop relying on an old multi-tab service that has been removed elsewhere. This keeps enterprise tests aligned with the main platform changes and reduces maintenance of obsolete internal code.
Original PR description
The community counterpart of this PR removes the legacy multi tab service. This PR adapts the enterprise code to remove it from room's test helpers as well. task-4984247 community: https://github.com/odoo/odoo/pull/225124.
Conversation avatars in AI and WhatsApp now use the correspondent’s avatar by default. This creates a more consistent and recognizable messaging experience for users without changing core workflows.
Original PR description
PR community: https://github.com/odoo/odoo/pull/227415