Daily updates from Odoo
Navigate
Branch
Wednesday, July 30, 2025
42 changes
Security fixes and vulnerability patches
This update changes how Kenya OSCU e-invoicing files are stored and accessed to reduce security risks. It helps ensure related accounting and stock documents remain available without exposing attachment records through a less secure link.
Original PR description
To avoid security issues when accessing the field, use binary field instead of many2one attachment. task-4771709
New functionality added to Odoo
Adds the SST02 (B1) tax report for Malaysia, including Malay translations. This helps Malaysian businesses prepare the required sales and service tax reporting in Odoo more directly and consistently.
Original PR description
Add SST02 (B1) custom tax report with embedded translations in `ms_MY`. The change is part of the Malaysian tax + tax improvement task (4749609) together with changes in `l10n_my` module. task-4749609
Odoo spreadsheets can now display hierarchical business data using sunburst and treemap charts. This makes it easier for users to explore breakdowns such as categories, teams, or accounts visually and spot patterns in complex data.
Enhancements to existing features
The Sign app now lets users skip the manual document-filling screen when every field can be completed automatically. For eligible single-signer documents, users can download the signed document directly, saving clicks and speeding up completion.
Original PR description
This PR aims at implementing a new flow in the signing of the sign app, and correcting a small mistake found along the way. The text for the legal discalimer on the adoption of a signature or initials has been slightly reworded since it was referring to text in the buttons that has been changed a while back. The Quick Sign flow is intended to provide an option to avoid the PDFIframe step where you have to compile a document when all the fields in the document can be autofilled. If they are, a Download button appears that autofills every field and goes directly to the Thank You Dialog Window with the button to download the signed document. Task-4858331
The French VAT refund process now asks users to provide the reimbursement reason, date, and optional comment when completing the 3519-SD form. This helps ensure the required information is included in the electronic submission to ASPOne, reducing the risk of incomplete refund requests.
Original PR description
When users request a VAT refund using the French 3519-SD form, they must now indicate the reason for the reimbursement. In this commit: --- - Adds support for specifying the `reimbursement type` (e.g., First asking, Assignment/Cessation.., Others) and `reimbursement date`. - Makes these fields available on each account line in the VAT refund wizard, and includes them in the generated EDI XML sent to **ASPOne**. - Introduces a reimbursement comment field, serialized in the `FX` zone of the XML when provided. --- task-4932961
This update aligns the certified scale checksum with recent error-checking changes for Toledo scales. It helps keep point-of-sale scale integrations compliant and working as expected after the related platform update.
Original PR description
This PR adapts the scale checksum to the PR adding the error checks to Toledo scales: https://github.com/odoo/odoo/pull/217674 Forward-Port-Of: odoo/enterprise#91069 Forward-Port-Of: odoo/enterprise#89602
A new warning banner alerts users when key totals in the French tax report do not balance. This helps businesses spot potential reporting inconsistencies before submission and reduces the risk of inaccurate tax declarations.
Original PR description
This commit will add a warning banner when the sum of field 08+09+9B+10+11+T1->T7 is not equal to sum of field A1+A2+A3+B2+B3+B4 Task-4933787 Forward-Port-Of: odoo/enterprise#91157 Forward-Port-Of: odoo/enterprise#89956
The Field Service “To Schedule” screen now opens in calendar view by default. This helps planners see unscheduled work in a time-based layout immediately, making scheduling faster and more intuitive.
Original PR description
Make the default view of the `To Schedule` in the field service set to calendar view task-4952379
The VoIP keypad search/input area is now easier to recognize and use. Placeholder text and visual highlighting help users understand where to type a name or phone number, reducing confusion during calls.
Original PR description
**Purpose**
The main input field in the keypad widget was visually unclear, leading to
confusion. Users often clicked near the field without realizing it, as there
was no visible cursor or indication of focus. This change aims to make the
input area more obvious and user-friendly.
**Specification**
-Added a placeholder text ("Type a name or number") to the input field.
-Added a border-bottom to the .o-voip-Keypad-searchBar container to visibly
frame the input area.
-Added border highlight to the input container when the user is typing or input
is focused.
**Task**-4922706This update modernizes how interface text and markup are handled across several Odoo Enterprise apps. It is mainly an internal improvement that should help maintain consistency and reduce future maintenance issues without changing day-to-day workflows.
Original PR description
\* = documents, frontdesk, knowledge, planning, project_enterprise, sale_planning, sign, social, social_twitter, stock_barcode, stock_barcode_mrp, stock_barcode_picking_batch, voip, web_cohort, web_enterprise, web_gantt, web_grid, website_helpdesk_forum, website_studio Enterprise counter-part. https://github.com/odoo/odoo/pull/199300
This update makes eBay sales configuration values more consistent by storing defaults in data records instead of relying on dynamic fallback behavior. It reduces the chance of inconsistent setup results and simplifies maintenance for future configuration changes.
Original PR description
dynamic default doesn't make sense for consistency import from data.xml can solve the problem Otherwise, developers have to call the default function when 'get_param' as fallback.
Payroll input types now use clearer choices instead of simple yes/no settings, making it easier for payroll teams to define whether an input is money or quantity-based and whether it is recurring or one-time. Salary adjustment refunds also use more consistent input type logic, improving reliability and future maintainability.
Original PR description
This commit replaces certain boolean fields with selection fields to improve clarity and user experience. Specifically: - The `is_quantity` boolean was replaced with a `input_unit` selection field to explicitly define whether the input is a monetary or a quantity. - The `available_in_attachments` boolean was replaced with a `input_usage` selection field to explicitly define whether the input is a recurring or a one_shot. - The refund logic for salary adjustments now also relies on a `type` field on the other_input_type instead of a simple boolean, improving logic consistency. These changes enhance maintainability, provide better UX in the UI, and offer a clearer foundation for handling payroll input types. Task: 4930632
This update improves how date-based filters are handled across many Odoo apps, so saved views and reports can use dynamic date ranges more consistently. It helps keep information such as accounting, HR, payroll, helpdesk, and field service records aligned with the current period without manual filter updates.
Original PR description
odoo/odoo#219664
This update adds automated coverage for a restaurant point-of-sale flow where an unsent order is selected from a popup, sent to preparation, and paid in one sequence. This helps reduce the risk of regressions in kitchen preparation workflows and supports a smoother staff experience.
Original PR description
In this commit: ----------------------------- - Add test to ensure clicking order in the popup sends the order to preparation and validate payment in one flow. Task: 4804669 Related PR - https://github.com/odoo/odoo/pull/211642 Forward-Port-Of: odoo/enterprise#90959 Forward-Port-Of: odoo/enterprise#86413
When users choose an account while reconciling bank statement lines, the system now automatically applies the default tax configured on that account. This reduces manual entry, improves consistency, and helps accounting teams avoid missing tax details during reconciliation.
Original PR description
In this PR: - When setting the account from the bank reconciliation widget (using 'set_account'), the default tax set on that account will now be automatically applied to the bank statement line. task-4930945 Forward-Port-Of: odoo/enterprise#91232 Forward-Port-Of: odoo/enterprise#89966
The Knowledge command palette now finds and highlights matching article results even when accents differ between the search term and the saved text. This makes searching Knowledge content more forgiving for users working with accented characters or multilingual content.
Original PR description
This commit uses changes made in https://github.com/odoo/odoo/pull/218173 to also make the knowledge command palette accent-insensitive. task-4816162
Tax return processing now combines review validation with the final locking step, so closing entries are generated and lock dates are applied immediately after a user confirms validation. This reduces manual steps, prevents unintended automatic validation, and gives users a confirmation message once the return is finalized.
Original PR description
Removed the separate "Lock" step; the closing entry is now generated and the lock date applied immediately after review validation. Made return validation an explicit user action and removed automatic validation. A toaster notification is shown after validation confirming closing entry generation and locking date application. task-4969377
The ESG Project app now includes ready-to-use sample initiatives and a simple option to load them when the initiatives area is empty. This helps users explore the feature faster and understand how ESG initiatives can be structured before entering their own data.
Original PR description
This PR adds some demo data for the ESG Project and a 'Load sample data' button displayed in the no content helper of views of 'Initiatives' menu item. This button is only displayed if no demo data has been loaded yet. task-4760801
Resolved issues and error corrections
The Starshipit shipping cost banner is now shown only when the selected delivery method uses Starshipit. This prevents confusion for users working with other delivery carriers, especially when carrier pricing is zero.
Original PR description
A Strashipit banner was appearing on all deliveries, un-depending on the Delivery Method. Steps to reproduce: * Install 'delivery_starshipit' * Create a delivery with another Delivery Method selected, and a Carrier Price of 0. * The Starshipit banner "The Shipping Cost is being fetched in the background" appears Fix: Filter out 'invisible' condition on non-Starshipit delivery methods opw-4940717 Forward-Port-Of: odoo/enterprise#90994
Fixed an issue where spreadsheet pivot tables grouped by ID could show blank or raw ID headers instead of meaningful record names. This makes exported and spilled pivot results easier for users to read and aligns spreadsheet behavior with server data.
Original PR description
Steps to reproduce: - Insert a pivot in a spreadsheet - Add a groupby on id - Insert the spilled formula - Headers are empty Before this commit: - _sanitizeLabel treated integer id values as raw, skipping the label in [id, label] - The mock read_group returned plain numbers for id, unlike the server - Enterprise tests still expected FALSE/ids in PIVOT.HEADER and tooltips After this commit: - _sanitizeLabel returns the label for [id, label] without numbering id - The mock read_group now returns [id, display_name] for id - Enterprise pivot tests updated to expect labels and adjusted ranges Task: 4878685 Forward-Port-Of: odoo/enterprise#91166 Forward-Port-Of: odoo/enterprise#90656
The Knowledge editor now restores extra space at the bottom of long articles, making it easier to scroll and keep the final lines in a comfortable reading position. This improves the editing experience after a previous editor upgrade caused the spacing rule to stop applying.
Original PR description
With version 18.1, we migrated from legacy HTML editor to the new one. As part of this upgrade, we revised the templates and reworked the wysiwyg helper. During the migration, several CSS classes were altered or removed. One issue that emerged is that the CSS rules intended to add bottom padding to the editor area are still present in the stylesheet but no longer apply to any element. These rules were especially helpful when working with long-form content, as they allowed users to scroll further and bring the end of the text closer to the center of the screen - improving readability and enhancing the editing experience. To fix this, we'll update the relevant CSS selector to ensure the padding is correctly applied to the editable area. See: odoo/enterprise#67083 Task-4636494 Forward-Port-Of: odoo/enterprise#90770 Forward-Port-Of: odoo/enterprise#86223
This fixes how Indian GST report return periods are calculated after a prior change to quarter handling. Businesses will now see the correct month and year for quarterly return periods, reducing reporting confusion and potential filing errors.
Original PR description
In this commit: https://github.com/odoo/enterprise/commit/75b72df06a109b5e89a2c8e98bc29a1fe120fb68, the quarters key was updated. Previously, it used the start month of the quarter, but it now uses the end month instead. However, the `return_period_month_year` field is still being computed based on the start month. With this PR, the `return_period_month_year` will now be computed correctly based on the updated logic. **opw**-4970000 Forward-Port-Of: odoo/enterprise#91109
Dashboard styling rules have been moved to the correct editing area instead of affecting read-only dashboards. This helps ensure dashboards look and behave correctly depending on whether users are viewing or editing them.
Original PR description
Some css rules were mistakenly added to the readonly action of the dashboard instead of it edition action. Task: 4962437 Forward-Port-Of: odoo/enterprise#90752
The Dutch tax reporting flow now correctly handles returns that have more than one closing entry. Users will only be warned when at least one related closing entry is still in draft, reducing incorrect warnings or missed validation issues.
Original PR description
Before this commit: As multiple closing moves can exist for a return, the check for the state of the closing move was incorrect. It was assuming only one closing move exists, which could lead to issues if multiple closing moves were present. After this commit: The code now checks if any of the closing moves are in 'draft' state before raising a warning. opw-4976827 Forward-Port-Of: odoo/enterprise#91223
Fixed an issue where printing a follow-up letter from a partner's action menu could fail if required report options were missing. The system now safely uses the partner's follow-up information as a fallback, allowing users to generate overdue payment letters reliably.
Original PR description
### Steps to reproduce: - Settings > Technical > Reporting > Reports - Search for "Print Follow-up Letter" - Click on "Add to the Print menu" - Create an overdue invoice for a partner - On the partner page, click the gear to show the actions - Then click "Print Follow-up Letter" - Traceback ### Cause: This [line](https://github.com/odoo/enterprise/blob/82375d181cd138b497e695e747b63c009c0538fc/account_followup/models/res_partner.py#L291) tries to read `options['followup_line']` but with this flow `followup_line` is not in the options. ### Solution: Use `get` and fallback on the followup line on the partner. opw-4864880 Forward-Port-Of: odoo/enterprise#88543
This update adjusts how WhatsApp and helpdesk live chat records prepare related contact and conversation data. It helps keep internal data handling consistent and reduces the risk of incorrect or redundant information being sent to the interface.
Original PR description
\* = website_helpdesk_livechat Enterprise counter-part. Part of task-4775128 task-4676468 task-4676464
This update removes leftover code from earlier reconciliation improvements in accounting-related modules. It helps keep the system cleaner and reduces the chance of unnecessary or confusing behavior, with no expected change to normal user workflows.
Original PR description
In this commit: https://github.com/odoo/enterprise/pull/80787/commits/04a304d58a56c7d2eeb70429340eb048fa9f2be6 We refactored the reconciliation model to be easier to use for users. However, by doing the refactor we forgot to remove some code. no task id Forward-Port-Of: odoo/enterprise#90310
Rental orders with multiple lines for the same planned service now avoid assigning overlapping shifts to the same resource. When no resource is available, the system creates an open shift instead, reducing scheduling conflicts and manual corrections.
Original PR description
Steps to Reproduce: ---------------------- - Install the sale_renting_planning module. - Create a rental service product with `Plan Services` enabled. - Create a rental order with multiple lines for the same product. - Confirm the rental order Issue: --------------------------- - You'll see that some generated shifts are assigned to same resource causing conflict. Cause: --------------------------- - Shifts are being generated at the same time for all the SOL which cause them to be assigned to the same resource and make conflict. Fix: ----------------------------- - In this commit when the shift values are generated we will check if the resources are available or not. If no resource is available then it will create open shift for that SOL. task-4829807 Forward-Port-Of: odoo/enterprise#91164 Forward-Port-Of: odoo/enterprise#88767
Fixed an issue where Sign document reminders could fail if no “Valid Until” date was set. Scheduled reminders now continue running reliably, helping users avoid missed follow-ups on signature requests.
Original PR description
When a `sign.request` record has `validity` as `False`, attempting to send a reminder via the `_cron_reminder` method leads to a crash. **Steps to Reproduce:-** 1. Install the `Sign` module. 2.…
When a `sign.request` record has `validity` as `False`, attempting to send a reminder via the `_cron_reminder` method leads to a crash.
**Steps to Reproduce:-**
1. Install the `Sign` module.
2. Navigate to the Sign section and click on `Upload PDF & Sign`
3. Upload any PDF document and add your signature, then click `Send`
4. In the new wizard, remove the value for `Valid Until` and enable the `reminder` option. Set the reminder to `every 1 day.`
5. When our scheduled action named `Sign: Send Mail Reminder` executes the following day, it will throw an error.
**Error:-**
`TypeError(''<' not supported between instances of 'bool' and 'datetime.date'') while evaluating 'model._cron_reminder()''`
**Root Cause:-**
The SQL query within the `_cron_reminder()` method retrieves all records where:
- The request is `active` and in the `sent` state.
- Either:
- `validity < today` or
- A reminder is due based on `last_reminder + reminder`.
The fetched records are then iterated through at [1].
[1]
https://github.com/odoo/enterprise/blob/ac4aeeea98dcf2fc7f06e6a3fabc55e256330e2c/sign/models/sign_request.py#L454
If `validity` is `False`, this comparison raises a `TypeError` because it is invalid to compare a `boolean` with `datetime.date`.
**Solution:-**
- A safety check was added before the comparison between `request.validity` and today's date, ensuring that `request.validity` exists.
Sentry-6727599497
Forward-Port-Of: odoo/enterprise#91220
Forward-Port-Of: odoo/enterprise#89646This fix updates the AI Fields integration to use the correct OpenAI service address after a recent configuration change. It helps ensure AI-powered field features continue working reliably for users.
Original PR description
Purpose: -------- In commit [1], `/v1` has been added to the openai `base_url` in the `llm_api_service`, but the endpoint used in the ai_fields was not updated accordingly. [1]: https://github.com/odoo/enterprise/commit/d0c10008ce5b971638ae52ea2751628325c04da7 Task-4879318
This update fixes an internal payroll attendance test so it correctly reflects recent date comparison behavior. It helps ensure payroll attendance calculations involving time zones remain reliably validated before release.
Original PR description
The comparison with dates is fixes, so is this test. odoo/odoo#220646
Users can now create a new helpdesk ticket while recording time on a helpdesk project without seeing an analytic account validation error. The timer also correctly recognizes eligible helpdesk projects even when they do not yet have existing tickets, so time is linked to tickets instead of tasks.
Original PR description
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket…
Steps to reproduce: ------------------- - Install 'helpdesk_timesheet' module - Go to Timesheets and click on `Start` to launch the timer - Select `VIP Support` as Project - Create a new ticket Issue: ------ 1. Validation error raised: `At least one analytic account must be set.` 2. When we select a helpdesk project that does not have any ticket linked to it already, the field next to it is set to `Task` (task_id) instead of `Ticket` (helpdesk_ticket_id). Cause: ------ 1. When creating the ticket, we don't provide the default project who got the analytic account linked to it. 2. The field `helpdesk_ticket_id` is hidden because we consider that we the project is not linked to any helpdesk team; this is because we retrieve the projects based on tickets already created only. Solution: --------- 1. Set the default project in the context when creating the ticket (like for a task). In the create method, if no team is provided and we have a default project (from `list_value` or the `env.context`), we set the team based on the project if the project is linked to a helpdesk team. 2. Fetch all projects that have `helpdesk_team` field set. opw-4404097 Forward-Port-Of: odoo/enterprise#91110 Forward-Port-Of: odoo/enterprise#76779
This change prevents installation failures when finance document folders have been archived or moved to the trash. It also makes document handling more intuitive by allowing document owners to move their own documents regardless of the permissions on the current folder.
Original PR description
Four things are fix(/imp)ed in this PR: 1/ We not only want the finance folders records to exist, but to be visible for documents_account to work. 2/ We weren't even moving them, the check in write error was too strict. 3/ Even if we were trying to move them, we can do it if we also set them as active again and don't expect to restore archived children. 4/ Owners should be allowed to move their documents irrespective of permission on containing folder. See details in individual commits. Task-4976579
This fix corrects default setup behavior in Swiss payroll records that was causing automated validation errors. It helps keep payroll-related configuration and processing more reliable for Swiss localization users.
Original PR description
https://runbot.odoo.com/odoo/runbot.build.error/115307 Forward-Port-Of: odoo/enterprise#91173 Forward-Port-Of: odoo/enterprise#90487
This fixes a dashboard filter label that displayed the internal value "not_set" to users. The option now appears as human-friendly text, making spreadsheet dashboard filters clearer and more polished.
Original PR description
Steps to reproduce: - open a dashboard with any relation filter having operators - click on the search bar to open the filter dialog - add a filter => the last select option is the technical value '"not_set"' instead of being a human friendly text. The commit that introduced global filters operators (dddcd8919f0) was done at the same time as commit 7602ca0f61750 which changed "not_set" to "not set" Task: 4937875
Bank statement imports started from the accounting dashboard now process the entire file instead of stopping after the first batch. The import screen also shows the correct uploaded file name, reducing confusion for users handling large bank files.
Original PR description
**PROBLEM** When importing bank statements from the dashboard, it only imports the first batch (by default the first 2000 lines) instead of importing the whole file. This is inconsistent with the…
**PROBLEM** When importing bank statements from the dashboard, it only imports the first batch (by default the first 2000 lines) instead of importing the whole file. This is inconsistent with the behavior of the import done from the reconcilation page. Also, on the import page, the file name is incorrect (it's always `bank_statement_import.csv`) **STEP TO REPRODUCE** file to reproduce the issue : [MP 2280260435_movements_-2025-04-01-191536.xlsx](https://github.com/user-attachments/files/20880784/MP.2280260435_movements_-2025-04-01-191536.xlsx) 1. install the accounting module 2. goes on the dashboard, click on the 3-dot button on the kanban for the bank account, and import a file. 3. make sure the file will be imported in multiple batches (reduced the batch size to 200) and click on import. 4. notice how only the first batch was imported. **CAUSE** In python, The `AccountBankStmtImportCSV` class override the execute_import method of the `base_import.import`. In this override, we add a entry in the `messages` list. (see `enterprise/account_bank_statement_import_csv/models/account_bank_statement_import_csv.py`) In JS, all entry in messages are treated as errors, and the import is interrupted. (see `odoo/addons/base_import/static/src/import_model.js`) https://github.com/odoo/odoo/blob/389b355e7ec761fe8dc2908ac5aec540b0345c48/addons/base_import/static/src/import_model.js#L410-L417 The message entry added in the python was used in the past to automatically open the reconcillation page with the statement lines added. This feature was removed, but not the message. **FIX** - Remove the problematic message entry. - Fix the name of the file in the import action. opw-4823808 Forward-Port-Of: odoo/enterprise#91241 Forward-Port-Of: odoo/enterprise#88343
The Philippine BIR 2307 export checks were updated to match recent spreadsheet changes, including ZIP code handling and the correct payment description source. This helps ensure generated tax certificate data is validated against the expected official reporting format.
Original PR description
The BIR 2307 XLS export was missing the `ZIP_code` and incorrectly showing the `nature` of payment from the invoice line instead of the tax description. In this commit: --- - updates the tests to include the `zip_code` column and fetch the correct `nature` from the tax description. - adjust name fields to reflect individual vs company partner logic. community-PR- odoo/odoo#214940 --- task-4880921 Forward-Port-Of: odoo/enterprise#91202 Forward-Port-Of: odoo/enterprise#91120
Bank reconciliation now handles entries in different currencies more accurately, keeping foreign currency amounts separate from company-currency balances. It also prevents automatic reconciliation models from being created when using receivable or payable actions, reducing unexpected accounting setup changes.
Original PR description
Before this commit when applying a reco model with a different currency, the amount currency and the balance were equals. task-4931177 Before this commit when applying the receivable or payable button, the automatic reco models would be created. We don't want that behavior task-4930730 Forward-Port-Of: odoo/enterprise#91178 Forward-Port-Of: odoo/enterprise#89775
Barcode scans for warehouse locations now only match locations belonging to the active company. This prevents users in multi-company setups from being sent to the wrong internal location when different companies use the same barcode.
Original PR description
Description of the issue/feature this PR addresses: When scanning a location by barcode, the system may return the wrong location if multiple companies have internal locations with the same barcode. This is because the search does not currently filter by company. Current behavior before PR: The system searches for a location using only the barcode and usage='internal', without restricting by company. If multiple companies use the same barcode for different locations, the first match (regardless of company) is returned. Desired behavior after PR is merged: The location search is now restricted to the active company. Forward-Port-Of: odoo/enterprise#89286
AI-related action buttons such as insert, send message, and log note no longer show on a user's own messages. This makes AI-assisted conversations clearer and prevents users from seeing irrelevant actions, while also improving button placement and removing an unnecessary out-of-office alert in AI chats.
Original PR description
Before this commit, ai actions like "insert", "send message" and "log note" were appearing on both the messages sent by the AI and the user's own messages. Of course, the actions shouldn't appear in the user's messages. To fix this, we changed one element in the conditions for these actions. Prior we were fetching the user_id from the author of the message and comparing it with the current user. Recent changes make it impossible to fetch the user_id like so. Now we use the function isSelfAuthored which would return false for AI messages and true for the user's own messages. Forward-Port-Of: odoo/enterprise#88371
The VoIP module was still sending an outdated value that is no longer accepted, which could cause a crash. This fix removes that leftover value so VoIP call handling works reliably again.
Original PR description
"state" is no longer accepted as a kwarg of create_and_format, resulting in a crash when provided. This commit removes a leftover occurrence of the "state" kwarg.
Code cleanup and technical improvements
The Belgian payroll SFTP capabilities for DMFA/ONSS declarations have been consolidated into the main Belgian payroll module. This simplifies setup and maintenance by keeping related payroll declaration automation, configuration, access rights, and screens in one place, with limited expected day-to-day impact for users.
Original PR description
TaskID: 4926000