Friday, January 30, 2026
12 changes · 19.0
Enhancements to existing features
This update aligns the TDS XLSX report with the official utility format, ensuring accurate reporting for tax purposes in Russia. A key change is automatically retrieving partner information from AML records, which now correctly formats miscellaneous entries in the report. This improves data reliability and compliance.
Original PR description
This commit aligns the TDS XLSX report with the official TDS utility format. Additionally, We now fetch the partner from AML record, so even miscellaneous entries generate a correctly formatted XLSX sheet. task-5237518
Resolved issues and error corrections
This update fixes a previous issue where users with standard access rights couldn't open the documents application. The change restricts access to a sensitive field and limits visibility of certain features within the application to only system administrator users, ensuring proper access control and stability.
Original PR description
Internal Users with the "Access Rights" access right were not able to open the documents application, which raised an access error traceback on the `ai_sort_prompt` field - which has restricted access to only admins. The access error was raised because the `ai_sort_prompt` field was added to the search_panel_fields for users with Access Rights access rights. We changed it so it is only added when users have the document system adminstrator role. We also changed the document_service's start method to also define the documentSystem user which is the system adminstrator user. With that we could limit visibility of the System Prompt item in the cog menu to those users. task-5375110
This update streamlines the database synchronization process by removing outdated XMLRPC support and enhancing error handling. The changes improve stability and user experience by preventing errors from halting synchronization and providing clearer error messages.
Original PR description
### [IMP] databases: remove xmlrpc fallback for odoo.com Since odoo.com migrated to 19.0, it will always support the json2 API, and XMLRPC support will be dropped on the next version. In order to…
### [IMP] databases: remove xmlrpc fallback for odoo.com Since odoo.com migrated to 19.0, it will always support the json2 API, and XMLRPC support will be dropped on the next version. In order to simplify the code and avoid subsequent requests in case of errors on the json2 API, the XMLRPC fallback is stripped off from `databases.api`. In this commit, we only adapt the tests so that they don't test the fallback to XMLRPC when calling odoo.com. In the next commit, we will remove the dead code. The configuration parameter `databases.odoocom_apiuser` is removed, as well as the corresponding field in the Settings page. ### [FIX] databases: disable the KPI-selection wizard With this commit, we disable the wizard displayed at the end of a synchronization to select which KPIs are added to the properties field. Instead, we always store all the KPIs that are provided by the databases, and the users can still select which ones they want to display on the list view. The wizard is still used in the background for stable compliance, but it is not displayed to the user any more. It will be removed in the next stable version (saas~19.2). Task-id: [5868314](https://www.odoo.com/odoo/project.task/5868314) ### [FIX] databases: handle fetch errors better With this commit, fetching errors like 502 Bad Gateway are handled better, as they are reported as an error message in the final summary instead of interrupting the whole synchronization and showing a traceback to the end user. ### [FIX] databases: synchronize up to immediate_sync_limit databases synchronously Previously, if the number of databases to be synchronized exceeded `databases.immediate_sync_limit`, no databases were synchronized synchronously. Instead, all were queued for a triggered scheduled action. With this commit, the synchronization process will handle up to `immediate_sync_limit` databases synchronously, while the remaining databases will be sent to the scheduled action.
This update fixes an issue where the system incorrectly blocked automatic reconciliation when an invoice's reference matched its payment reference. Now, the system correctly identifies and matches invoices with their corresponding payments, streamlining the accounting process. This change was driven by a user report and ensures accurate reconciliation.
Original PR description
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also…
The aim of this commit is to make the automatic reconciliation works in case of an obvious matching that was prevented because the reference of the invoice was also it's payment reference. It also modify a docstring of a test because it was lying about what it was really testing. The usecase it says it forbid is actually enforced by `test_matching_algorithm_for_multiple_invoices`. Before this commit: - functionally: The obvious matching was denied and the accountant had to manually make the match. - technically: The `aml.ref` and the `move.payment_reference` were the exact same and thus postgres regrouped the invoice (through aml) with itself as if there were 2 invoices matching the same word. After this commit: - functionally: The obvious match is made. - technically: The initial intend was to avoid having several invoices (proxy by amls) reported for a specific matching word preventing the system to take a difficult and arbitrary functional decision which might be wrong. In order to comply with that and to not block the match of an invoice that would be matched through several matching words, we don't gather twice the same aml for the same word. task-id: None (The issue arose on odoo.com and was brought by APFA) Forward-Port-Of: odoo/enterprise#105648
This update fixes a misclassification of account 649 in the French Profit and Loss report. The change aligns with French accounting standards (PCG 2025 & 2026) by correctly categorizing this account within Wages and Salaries and Social Security Charges. This ensures accurate financial reporting for French businesses using the Odoo Enterprise system.
Original PR description
## Issue In the *Profit and Loss* report for the French localization (`l10n_fr_reports`), the account 649 was mentioned in the *"Reversals of provisions (and depreciation), expense transfers"*…
## Issue
In the *Profit and Loss* report for the French localization (`l10n_fr_reports`), the account 649 was mentioned in the *"Reversals of provisions (and depreciation), expense transfers"* section, instead of *"Wages and salaries"* and *"Social security charges"*. This classification is described in the *"Recueil des normes comptables françaises"* (Versions [2025](https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/Reglements/Recueils/PCG_Janvier2025/Recueil-NF-Janvier-2025.pdf) and [2026](https://www.anc.gouv.fr/files/anc/files/1_Normes_fran%C3%A7aises/recueil/RECEUIL-PCG-2026-AVEC-COUVERTURE.pdf)).
## Steps to reproduce
1. Install *France - Accounting Reports* (`l10n_fr_reports`)
2. Go to the *Profit and Loss* report
3. In debug mode, click the information buttons on the following rows:
- *Reversals of provisions (and depreciation), expense tranfers*: **649 is mentioned**
- *Wages and salaries*: **649 is not mentioned**
- *Social security charges*: **649 is not mentioned**
## Note
The account 649 was added at the beginning of the formula for the *"Wages and salaries"* section in order to respect a logical order. In the *"Social security charges"* formula, since no logical order appears to be used, the account was added at the end.
opw-5724559
Forward-Port-Of: odoo/enterprise#105856
Forward-Port-Of: odoo/enterprise#105474This update fixes a potential issue where Stripe account creation would fail intermittently, leading to duplicated accounts. It now ensures the Stripe account is always set correctly, even if subsequent steps fail, and sanitizes URLs to prevent errors when requesting Stripe account information. This improves the overall reliability of the expense tracking feature.
Original PR description
## [FIX] hr_expense_stripe: Fix account duplication Add a transaction commit when the account is created, to ensure that even if any further action fails the stripe account is properly set on the company. This will prevent users from creating accounts every time if the account creation part succeeded ## [FIX] hr_expense_stripe: Sanitize values for webhook url Sometimes the web.base_url is the http version of the database url, where the https is properly setup. At account creation we test the https connection, and allow the creation of the account forcing https on IAP side. But when we request the links for the account, the database will still send the http version of the url, refused by stripe. This adds a sanitization of the URLs on the database side
This update resolves an issue where custom role names entered in the sign template were not being saved correctly, causing the 'Signature Item' to reset. The fix addresses a problem with how the system recognized and updated role names, ensuring that users can now consistently save and use their desired role names within the sign template.
Original PR description
Currently, On renaming or updating roles in the sign template doesn't get saved due to which drag-drop 'Signature Item' is reseted back to 'Signer 1'. **Steps to reproduce:** 1) Install sign app. 2)…
Currently, On renaming or updating roles in the sign template doesn't get saved due to which drag-drop 'Signature Item' is reseted back to 'Signer 1'. **Steps to reproduce:** 1) Install sign app. 2) Open the Sign app and select a template. 3) Case A (Direct Rename): In the sidebar, rename a role from 'Signer 1' to 'Signer 1-Test'. 4) Case B (Edit Button): Click the '3-dots' button on the role and click `edit`, change the name to 'Signer 1-Test', and save. 5) Drag and drop 'Signature Item' to template. **Observed Behaviour:** - The Role is not updated as `Signer 1-Test` and reset back to `Signer 1` **Expected Behaviour:** - The Role should be updated as `Signer 1-Test`. ## **Root Cause:** ### **Case A:** The `updateSignerNames` method(see[1]) checks `if (signer.name.includes(str))` where `str` is `Signer` This condition evaluates to true for any custom name containing that substring, causing the code to overwrite the user's custom input with the default generated name string. ### **Case B:** 1) The method `updateRoleNameAndAvatar` see([2]) updated the local state `this.state.roleName` but failed to trigger the `onChangeRoleName` prop. As a result, the parent component (`SignTemplateSidebar`) remained unaware of the change and overwrote the name with its stale value during the next update cycle (triggered by the drag-and-drop action). 2) **when `sign_emsigner` module is installed:** The module patches `openSignRoleRecord` to manually set `this.state.roleName = data.name` before the role update process completes. However, `onChangeRoleName` relies on the condition `name !== this.state.roleName` to decide whether to notify the parent component (via `this.props.updateRoleName`). Since the state is already updated manually, this check fails (returns false), the parent is never notified, and the database is not updated. When `sign_emsigner` subsequently triggers a re-render (via `displayAddDocumentButton`), the parent passes down the old, state name, reverting the user's changes. ### **Fix:** 1) Remove all `updateSignerNames` logic since it is difficult to distinguish between a default-generated name and a user-customized name. 2) Update `updateRoleNameAndAvatar` to call `this.onChangeRoleName` with the new name, ensuring the parent component's state is synchronized. [1]- https://github.com/odoo/enterprise/blob/382dd07b8ef93e9315963825e69066155a534ba0/sign/static/src/backend_components/sign_template/sign_template_sidebar.js#L92-L102 [2]- https://github.com/odoo/enterprise/blob/afc32de0a2757d8f241886ce27736fb7c07ab8c7/sign/static/src/backend_components/sign_template/sign_template_sidebar_role_items.js#L121-L122 **opw-5389063**
This update resolves an issue where bank statement lines incorrectly appeared in account reports, making analysis difficult. It also includes enhancements to support fiscal year periods and custom return dates, ensuring reports align with accounting data and provide greater flexibility for users. This improves the reliability and usability of the account reporting module.
Original PR description
It wasn't possible to create audits on a period that didn't match a fiscal period. task-5417418
This update fixes a bug that prevented users from editing the 'Email From' and 'Reply To' fields when creating new email templates within marketing campaigns. Previously, these fields were read-only, limiting customization options. Now, users can modify these fields to accurately reflect the desired sender information, improving campaign effectiveness.
Original PR description
Currently when a user creates a new template from a marketing campaign, they can’t edit the `email_from` and `reply_to` fields, even though these should be editable in the template. **Steps to…
Currently when a user creates a new template from a marketing campaign, they can’t edit the `email_from` and `reply_to` fields, even though these should be editable in the template. **Steps to replicate:** * Install `marketing_automation` * marketing automation > Create a New campaign > Add a new activity * Mail template > Create a new template > Settings **Observed Behavior:** The fields `Send From` and `Reply To` are not editable which should be editable. **Root cause:** * After commit [1], the form view `mailing_mailing_view_form_marketing_activity` [2] was removed, so `email_from` and `reply_to` now come from the view [3]. Because that view inherits the `mass-mailing form`, its `readonly` rules apply (see [4]), and with `default_state` set to “done” (see [5]), those fields become `readonly` when creating a new mail template. **Solution:** Modify the readonly conditions to match how they were handled in earlier versions (see [6]). **Before:** <img width="1182" height="591" alt="image" src="https://github.com/user-attachments/assets/72006a7f-1ee5-40dd-8899-4eb932f503b7" /> **After:** <img width="1182" height="591" alt="image" src="https://github.com/user-attachments/assets/d5d6bdf2-1fb6-4e7b-9527-412c44986050" /> [1]: https://github.com/odoo/enterprise/commit/a469218b32943ddaa83271565e73311cfd188f84 [2]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/mailing_mailing_views.xml#L75-L143 [3]: https://github.com/odoo/enterprise/blob/307b23b0f6b377c43463a04aabf0b2f03c256072/marketing_automation/views/mailing_mailing_views.xml#L107 [4]: https://github.com/odoo/odoo/blob/9e04aadb83d482d05fc2fa66fa3c3bebb6ac1528/addons/mass_mailing/views/mailing_mailing_views.xml#L328-L337 [5]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/marketing_activity_views.xml#L23 [6]: https://github.com/odoo/enterprise/blob/97f6f87cca3939e48d3488672aba0df68acd8f9b/marketing_automation/views/mailing_mailing_views.xml#L96 opw-5401422,5449345,5369836
This update fixes an issue where overtime approvals weren't consistently linked to attendance records. Previously, only one attendance was correctly associated with overtime, leading to data inconsistencies. This change ensures accurate tracking of overtime hours against employee attendance, improving reporting and payroll accuracy.
Original PR description
…dance and overtime
STEP TO REPRODUCE:
------------------
1- Create an overtime rule with this configuration :
quantity rule differs from hours defined in the contract
2- Create two attendances on the same day (should be a worked day and should not be today)
one from 1AM-2PM
second from 2PM-undefined
3- Approve the overtime of the first attendance
REASON:
------
The link between overtime to attendance is not correctly done Attendance -> overtime (only the first attendance have a link with overtime) overtime, attendance -> the two will be returnedThis update corrects a bug that caused incorrect overtime line calculations when multiple overtime periods were assigned to an employee. The fix ensures that overtime lines are properly separated, preventing errors in time tracking and reporting. This improves the accuracy of overtime records.
Original PR description
To reproduce: ============= 1. Create an new Overtime Ruleset using these options: - The rule is based on: Timing - With tolerance in favor of the employer of: 00:00 - If the employer works: Outside…
To reproduce: ============= 1. Create an new Overtime Ruleset using these options: - The rule is based on: Timing - With tolerance in favor of the employer of: 00:00 - If the employer works: Outside of a specific schedule - Schedule: 40/hour work week - Pay extra hours: with rate of 100% - Work entry type to use: Overtime Hours - Give back as time off 2. Create an employee or edit an existing employee to use the overtime ruleset in the settings of the form view of the employee. 3. Navigate to attendance and create a new entry for that employee. 4. Make clock in time and clock out time run through a Friday. For example: Clock in: 12/22/2025 12:00:00 AM Clock out: 12/26/2025 6:30:00 AM 5. Then edit the entry to run through the Saturday or Sunday. For example: Clock out: 12/27/2025 6:30:00 AM 6. Navigate to Work Entries and navigate to the month or week that that entry was made at. 7. There should be a traceback error for more than one overtime line related to that specific entry. Problem: ======== When allocating multiple overtime lines to consecutive time periods, the `_set_real_overtime_intervals` method was merging them into single intervals with recordsets of overtime lines (e.g., hr.attendance.overtime.line(102, 106, 103, 104)) instead of keeping each overtime line in its own separate interval. This happened because the allocation logic incorrectly calculated the position within intervals and subtracted the wrong duration from remaining overtime, causing the `|=` merge operator to combine adjacent allocations into recordsets. Solution: ========= Refactored the overtime allocation loop to maintain singletons opw-[5468598](https://www.odoo.com/web#id=5468598&view_type=form&model=project.task)
This update resolves a performance issue in the project timesheet report that prevented it from loading with large datasets. The team optimized the query by using a more efficient join technique (CROSS LATERAL JOIN) to reduce the amount of data processed, resulting in faster loading times (approximately 2 seconds).
Original PR description
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report…
After this commit https://github.com/odoo-dev/enterprise/commit/6c33bde74342b634d9f6fbda4ef407ffe9bac54f we introduced a new left join which seems that it slowed down the query a lot. So the report doesn't load at all if we have a lot of records. In this PR we are introducing CROSS LATERAL JOIN as we want to generate only the the relevant dates not all dates between the min starting date and max ending date of all slots. Query plan after modification https://explain.dalibo.com/plan/eh5293ba2354f43c The testing cardinality of the tables: `planning.slot` 7178 rows `hr.employee` 332 rows `resource.resource` 332 rows `resource_calendar_leaves` 4061 rows `account_analytic_line` 267376 rows `generate_series()` will produce 206417 rows | Before | After | |-----------------------------------------|-------| | Query keep being active with no results | ~2s | opw-5089052 Forward-Port-Of: odoo/enterprise#105696 Forward-Port-Of: odoo/enterprise#102283