Daily updates from Odoo
Wednesday, March 25, 2026
15 changes · master
Resolved issues and error corrections
This update fixes an issue where users weren't receiving email notifications for signature requests, even when their notification preferences were set to 'inbox'. Now, all signature requests will trigger email alerts, ensuring signers are promptly informed. The change preserves in-app notifications for users who rely on them.
Original PR description
When a user's notification preference is set to "inbox", no email is sent, which may prevent signers from being notified of signature requests. This commit enforces sending email notifications for signature requests regardless of user notification settings. Notifications are still created in Odoo, preserving in-app visibility for users who rely on it. task-6041834 Forward-Port-Of: odoo/enterprise#111094
This update ensures that payroll moves with analytic distribution rules are correctly anonymized, protecting employee privacy. The fix addresses a previous issue where lines weren't merged properly, leading to unnecessary detail in financial reports. This enhancement improves data security and compliance.
Original PR description
The Batch Account Move Lines option in the settings is used to aggregate together the different payslips of a payrun and to create only one move with aggregated lines, per account. This is done to…
The Batch Account Move Lines option in the settings is used to aggregate together the different payslips of a payrun and to create only one move with aggregated lines, per account. This is done to enforce privacy and avoid having lines for each employee in the payrun. If salary rules with analytic distributions are involved, though, the lines are not merged and we lose the anonimity.
This happens because in the _get_existing_lines funciton, that should return the lines to be merged with the input line (line), the condition for the rules that have an analytic distribution is wrong.
In particular, the condition is wrong because the
distribution_analytic_account_ids field is a recordset of the accounts, while line_id['analytic_distribution'] is a dictionary with keys that are comma separated strings of the ids of the accounts, with values reflecting the percentage.
For example, if a rule has one analytic distribution for 40% and involving accounts 13,7 and 12 + another analytic distribution for 60% involving accounts 3 and 5, line_id['analytic_distribution'] will be {'13,7,12': 40.0, '3,5': 60.0} while distribution_analytic_etc will be a recordset containing (13,7,12,3,5). To fix the problem and keep everything inline, we extract the logic to a new function, where we first unravel the ids from the keys of the dictionary and only then try to match them to the values in the recordset.
Task: 6043957
Forward-Port-Of: odoo/enterprise#111705
Forward-Port-Of: odoo/enterprise#111140This update fixes an issue where salary deductions weren't being accurately calculated for certain payroll rules, specifically 'ATTACH_SALARY'. The changes ensure that these deductions are now correctly processed, leading to more precise net salary figures. This improves payroll accuracy and reporting.
Original PR description
**Behavior before this commit** Some salary rules (e.g. `ATTACH_SALARY`) were ignored in the NET calculation. **Behavior after this commit** - Four rules are now added to the "Total deductions" line: their sequence and category has been changed. - The sign of these lines has also been switched: an attachment of salary of a positive amount should be added to the amount of total deductions, which is then deducted from the net.  opw-5894647 Forward-Port-Of: odoo/enterprise#111080 Forward-Port-Of: odoo/enterprise#107033
This update enhances the performance of Odoo's email functionality by utilizing record rules for access control, leading to more efficient database queries. The changes also address a security improvement by replacing a custom access check method with a more robust record rule approach. This results in a more stable and secure email experience for enterprise users.
Original PR description
Update of query count. odoo/odoo#254381
This update resolves an issue where users were directed to the wrong document form view when configuring PEPPOL document syncing settings. The change adds a dedicated Kanban view for PEPPOL documents within the settings, ensuring users access the correct document management interface. This improves the user experience and streamlines the process of managing PEPPOL documents.
Original PR description
Before this commit: clicking through on the setting of configuring the folder to sync peppol documents would lead to the document form view instead of the kanban view. Task-6040802 Forward-Port-Of: odoo/enterprise#111765 Forward-Port-Of: odoo/enterprise#111341
This update resolves an issue where the AEAT tax report file was being rejected due to an incorrect date format. The fix ensures the file includes a default date ('00000000') when a procuration date isn't specified, meeting AEAT's requirements and allowing successful file uploads.
Original PR description
Steps to reproduce: - Install the `l10n_es_reports` module and switch to the `ES company`. - Go to Invoices and create an invoice with taxes, then confirm it. - Navigate to Accounting > Reporting >…
Steps to reproduce: - Install the `l10n_es_reports` module and switch to the `ES company`. - Go to Invoices and create an invoice with taxes, then confirm it. - Navigate to Accounting > Reporting > Tax Report. - From the smart button, select `Report: Tax Report (Mod 390) (ES)` and choose the year as `This Financial Year`. - Download the `BOE` file using the dropdown and fill the wizard fields (e.g., Natural Person – Name: Test, Principal activity: Test, Activity Code: 12345). - Upload the generated .txt file to the AEAT portal. (AEAT credentials are required) **Observation:** AEAT rejects the file with: `Caracteres no válidos '4. Representante - Personas Jurídicas - Represent. 1 - Fecha Poder (DDMMAAAA)'` **Root cause:** At [1], when `judicial_person_procuration_date` is `false`, an empty string is written to the BOE file, resulting in blank spaces in the exported file. This does not comply with AEAT’s required numeric format and causes the file to be rejected. **Fix:** This commit ensures the file contains '00000000' when `judicial_person_procuration_date` is false, complying with AEAT numeric format requirements. [1]: https://github.com/odoo/enterprise/blob/45d3a537c3b2eaccee425d959e89d26229e376cd/l10n_es_reports/models/aeat_tax_reports.py#L1696 opw-5995290 Forward-Port-Of: odoo/enterprise#109652
This update resolves issues where overtime calculations were incorrect due to timezone discrepancies, specifically impacting employees in UTC+ timezones. The fix ensures accurate overtime interval determination and prevents crashes related to overlapping attendances, while also correctly deleting stale overtime lines.
Original PR description
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a…
Steps to reproduce (singleton crash): Create an employee in a UTC+ timezone (e.g. Asia/Shanghai or Australia/Adelaide) with an overtime ruleset containing a paid rule. Generate work entries for a period, then create two consecutive midnight-to-midnight attendances in the employee's local timezone. Creating the second attendance crashes with: "ValueError: Expected singleton: hr.attendance.overtime.line(...)". Steps to reproduce (stale overtime lines): With the same setup, delete the attendance after it generated overtime lines. The overtime lines remain in the database instead of being removed. The singleton crash occurred because `end_of_day` in `_get_overtime_intervals` was computed as a naive datetime, implicitly treated as UTC. For UTC+ timezones, the actual local end of day is earlier than UTC midnight. As a result, overtime intervals were computed with a stop time extending past the real local midnight into UTC time. When consecutive attendances were processed together, these extended intervals overlapped. The `Intervals` class (`keep_distinct=True`) merges overlapping intervals into a single entry with a multi-record recordset as payload. The subsequent `overtime.rule_ids.work_entry_type_id` and `overtime.status` calls expected a singleton but received a multi-record set, causing the crash. The same multi-record issue also affected the iteration in `_set_real_overtime_intervals` and the overtime work entry loop in `_get_attendance_intervals`. The stale overtime lines issue occurred because `_get_overtimes_to_update_domain` (hr_attendance) built its search date range from raw UTC `.date()` values instead of the employee's local timezone. For UTC+ employees whose attendance spans local midnight, the overtime line is dated in the next local calendar day. Since the domain was derived from UTC dates, that next local day fell outside the search range, so the overtime line was never found and deleted when the attendance was removed. Solution: - In `_get_overtime_intervals`, localize `end_of_day` to the employee's timezone before converting to UTC, so overtime intervals are correctly bounded by the local end of day. - In `_set_real_overtime_intervals` and the overtime loop in `_get_attendance_intervals`, iterate over individual records from potentially multi-record `Intervals` payloads to avoid singleton errors. - In `_get_overtimes_to_update_domain` (hr_attendance), localize check_in/check_out to the employee's timezone before computing the date range so overtime lines for dates that only exist in local time are correctly included in the delete-and-recreate cycle. opw-5931665 Forward-Port-Of: odoo/enterprise#111684 Forward-Port-Of: odoo/enterprise#109419
This update resolves two critical bugs preventing new employee creation in the Belgian payroll module. The first issue involved duplicate record creation due to a mail activity trigger. The second bug occurred when the payroll system attempted to link to a non-existent record before it was fully saved. These fixes ensure proper employee setup and data integrity.
Original PR description
First bug: Steps: - Switch to belgian company - Create new employee - Set contract start date - Click save manually -> boom Cause: in _trigger_l10n_be_next_activities, we create a new mail activity for the created employee which is already created in the default create function leading to duplicate follower records. Fix: in the super.create, pass the context variable mail_create_nosubscribe=True to disable adding the current user as a follower again to the same record Second bug: Steps: - Switch to belgian company - Create new employee - Set contract date - Add a wage then click anywhere -> boom Cause: _trigger_l10n_be_next_activities is called before the record is saved, hence trying to link to a null object Fix: check if the record is created before working on the activities Forward-Port-Of: odoo/enterprise#111780 Forward-Port-Of: odoo/enterprise#109799
This update restores the appointment synchronization onboarding banners, which guide staff users to connect their Google and Microsoft calendars. These banners also display a warning for users with Google Meet set up on appointments, ensuring correct meeting links are added.
Original PR description
: appointment{_google,_microsoft}_calendar This is a revert commit of [1] reintroducing the appointment_microsoft_calendar module, as we bring back the synchronization onboarding banners on the…
: appointment{_google,_microsoft}_calendar
This is a revert commit of [1] reintroducing the
appointment_microsoft_calendar module, as we bring back the
synchronization onboarding banners on the appointment.type
form view that were removed in [1]
- A banner includes a shorcut to setup / connect google /
outlook external calendars as well as an informative message.
- A banner is a warning banner on staff users without
active synchronization in the case of google_meet set up
on the appointment, as those will not have a google_meet
link correctly added to their meetings.
Note: as the original commit removed the whole module
appointment_microsoft_calendar, the revert would also
reintroduce i18n files. To allow a clean module reintroduction,
we do not keep them in this revert commit.
In a separate commit, reintroduce the helper for the field
event_videocall_location.
[1] https://github.com/odoo/enterprise/commit/c64e3435db792508ecec0b25dd25dc6e9360fc63.
Task-5969306This update prevents partner address changes from erasing previously stored location coordinates. This ensures automatic lead assignments continue to function correctly and avoids disruptions for partners relying on their existing geolocation data. Users can still manually update coordinates if needed.
Original PR description
Previously, updating a partner address reset latitude and longitude to 0.0. This removed existing coordinates and could prevent automatic lead assignment. With this change, coordinates are preserved when the address is modified. This avoids losing existing coordinates and allows partners to continue receiving leads based on their stored geolocation. Users can still manually refresh the geolocation if updated coordinates are required. Task-4812621
This update fixes an issue where payroll attendance calculations were incorrectly high when public holidays were present. The change ensures accurate attendance amounts by properly accounting for public holiday hours, preventing inflated attendance figures.
Original PR description
Fixes the calculation of the worked day lines amount, in cases where a public holiday is set. The current computation doesn't account for hours of public holiday when calculating the attendance amount; causing it to be higher than expected. This is caused by the calculation of work_time, which comes from the calendar data from _work_intervals_batch. If there is a public holiday, the work interval for that day is being removed from the result, causing it to wrongly calculate a lower work_time than expected and increasing the attendance line amount. task-5979501 Forward-Port-Of: odoo/enterprise#111819 Forward-Port-Of: odoo/enterprise#111741
This update removes a previous restriction that prevented users from adjusting production quantities on work orders when quality checks were marked as complete. Now, changes to the work order quantity automatically update related quality checks, streamlining the production process and eliminating a potential bottleneck. This improves efficiency and accuracy in managing work orders.
Original PR description
Initially users were blocked from splitting or updating quantity to produce if we have quality check points marked as complete as an old limitation in odoo/enterprise#5193, That doesn't exist anymore. Now when the quantity is updated in MO its also updated for quality checks in shopfloor. Task: 5438445
This update fixes an issue where project budget totals were incorrectly summing expenses and revenue. The fix adjusts how the system calculates totals, ensuring accurate reporting of project spending and allocated funds. This improves the reliability of project financial data.
Original PR description
### Steps to reproduce: - Create a billable project - Create two budgets one expense and the other revenue or both each for 100$ - Create a vendor bill with the analytic account of the created project - Notice in the project dashboard the two budgets are summed up in the total ### Cause: When calculating the total spent and total allocated we add up the amount whether it is an expense or revenue. https://github.com/odoo/enterprise/blob/1dccb87a48ac44735da4c78594e37d4783789cd6/project_account_budget/models/project.py#L120-L121 ### Fix: Set the expense budget to -ve and the revenue/both to +ve amount when calculating the total spent and total allocated opw-5488131 Forward-Port-Of: odoo/enterprise#106504
This update enhances payroll processing, particularly for employees with changing contracts during a pay period. The system now intelligently adjusts calculations to prevent overpayment of contributions and allowances, ensuring accurate payroll processing, especially in Hong Kong.
Original PR description
This commit aims to provide better support for contract changes that happen in the middle of a pay period. It has a few impacting changes, notably: 1) Payslip calculation sequencing As of now, all…
This commit aims to provide better support for contract changes that happen in the middle of a pay period. It has a few impacting changes, notably: 1) Payslip calculation sequencing As of now, all payslips of a same payrun have their line calculated all at once. While this is better for performances, it has a negative effect when a single employee has multiple payslips in the same payrun. In such cases, we may want or need for the payslips to know what was already calculated in the same payrun to avoid overpaying contributions or allowances that have caps. To solve this issue, we now group payslips by employee, sort them chronologically, and evaluate them in horizontal "layers": - Layer 1: Computes the 1st payslip for ALL employees simultaneously. - Layer 2: Computes the 2nd payslip for the subset of employees who have one, etc 2) More tools in HK payroll to support these cases The payslip rules now have a `l10n_hk_payrun_totals` dict that contains the total amount already reported in previous payslips of a same payruns for a selection of rules that needs it. We also provides a `worked_days_prorata_rate` which gives the ratio of worked days vs unworked days in a month for cases where we need to adjust amounts based on that ratio. 3) Rule updates The last part of the fix requires some updates in a few rules that are fixed amounts/not based on the wage and ends up being counted double in our use case. These rules will now take into account already computed amounts as said above to avoid going over the limit. In most cases it will only affect that specific use case, with a small exception for fixed mpf voluntary contributions, which have been updated to be prorated based on the worked days in the month. Forward-Port-Of: odoo/enterprise#111814 Forward-Port-Of: odoo/enterprise#111570
This update resolves an issue where ISO20022 XML files generated for Swiss companies were being rejected by banks due to an outdated configuration. The fix ensures the correct 'PAIN 09' format is used, guaranteeing compatibility with Swiss banking standards after database migration. This prevents delays and errors in financial transactions.
Original PR description
To reproduce the issue:
- Create a database in 17.0, with a Swiss company, and install account_sepa. Make sure the bank journal uses the Swiss IS020022 PAIN version.
- Migrate this database to 18.0
- Generate an ISO20022 xml file for the Swiss company
==> The file is wrongly formatted, and will be rejected by the bank.
This happens because the sepa_pain_version field of the journal is still set to its old selection value ('pain.001.001.03.ch.02') after migration, which is not supported anymore. The ORM hence returns an empty value when accessing the selection field, and does not enter the proper conditions when generating the file.
An upgrade fix has been made here https://github.com/odoo/upgrade/pull/9771. This commit makes sure already-migrated databases dynamically fix the issue as well.
opw-6060612
Forward-Port-Of: odoo/enterprise#111949