Daily updates from Odoo
Monday, December 29, 2025
19 changes · master
Enhancements to existing features
This update aligns Odoo's Thailand localization with the specific requirement for 5-digit Branch Codes. The change clarifies how Branch Codes are used and validates them correctly, ensuring accurate reporting and compliance within the Thai market. This improves the reliability of financial data for Thai businesses using Odoo Enterprise.
Original PR description
The related community PR substitutes 'Branch Code' for 'Company ID' (company_registry). Since Thailand uses strictly 5 digit Branch Code, the validation is applied and the test case has been adjusted accordingly in this commit. task-5402592
This update enhances the usability of the appraisal form by moving key assessment fields – including notes and appraisal dates – to a more prominent location. This change makes it easier for users to review and update assessment information, streamlining the appraisal process.
Original PR description
Before: - Assessment Note and Next Appraisal Date were placed lower in the form, making them less visible during appraisal review. After: - Moved Assessment Note and Next Appraisal Date higher in the form for better visibility and logical flow. Impact: - Improves usability during appraisal review. - Makes assessment-related information easier to notice and update. Task: 5438623
This update ensures all work entries are consistently set to 'draft' status, streamlining payroll processing. The change was made to centralize work entry management within the core HR payroll module. This improves data accuracy and simplifies workflows for HR administrators.
Original PR description
-The action_set_to_draft should set any work entry to draft regardless of the situation. -The record has been moved inside hr_payroll module.
Resolved issues and error corrections
This update resolves an error that occurred when sending customer statements. Previously, the system would fail if a user removed the email template during the sending process. Now, the system correctly uses the email template if one is provided, or falls back to the current user's email address, ensuring reliable statement delivery.
Original PR description
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the…
Currently, an error occurs when a user sends a customer statement. **Steps to Reproduce ([Video](https://drive.google.com/file/d/1soOylzCVnNCNsWUBizeBQ9vfFlI5pzSP/view)):** - Install the `account_reports` module. - Go to `Invoicing` > `Customers` > `Customers`. - Switch to `List view`, select `a customer`, then click on `Actions` > `Open Customer Statements`. - Click `Send`, remove the `Email Template`, add a `subject`, and then click `Print & Send`. **Error:** `ValueError: Expected singleton: mail.template()` After [this commit], which checks whether the template has an email_from, when a user sends the customer statement and removes the email template, it still tries to access the template to fetch email_from for a particular customer [1]. If no email template is used, this results in an error [2] when going to extract the email_from. This commit ensures that email_from is taken from the email template if one is used; otherwise, it uses the current user's email address [3], which matches the default behavior. [this commit]: https://github.com/odoo/enterprise/commit/22c46e4f63e7b2dc0eee16fc807656cd4de21fb7 [1]- https://github.com/odoo/enterprise/blob/dc4d5633407ccc728d30de5ce2072a80c16b2766/account_reports/wizard/account_report_send.py#L246 [2]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_render_mixin.py#L691-L693 [3]: https://github.com/odoo/odoo/blob/0dabb221225fba96c0e55779afadd9f12b369777/addons/mail/models/mail_thread.py#L2891-L2892 sentry-7106576491 Forward-Port-Of: odoo/enterprise#102682 Forward-Port-Of: odoo/enterprise#102219
This update restores the intended behavior for the Knowledge composer by hiding the GIF and canned response actions. These features were previously visible after a recent system update, but this fix ensures they are hidden when creating content in Knowledge, streamlining the composing process. This improves the user experience for creating knowledge articles.
Original PR description
The GIF picker was previously hidden in Knowledge, but became visible again after the composer actions refactor. Commit that introduced the change: https://github.com/odoo/odoo/commit/5e1daafeac231c333ea13369fc208627213d67d4 This commit restores the intended behavior by hiding the GIF action again and also hides the canned response action, as neither feature is relevant when composing content in Knowledge, by applying conditions on the corresponding composer actions. Task-5163888 Forward-Port-Of: odoo/enterprise#102927 Forward-Port-Of: odoo/enterprise#100585
This update resolves an error that occurred when a user removed the end date from a planning slot. The fix ensures the system handles the absence of an end date gracefully, preventing a technical error and allowing users to correctly manage their planning slots. This improves the overall stability of the planning module.
Original PR description
Currently an error occurs when user tries to remove end date on slot. Steps to replicate: - Install `planning`. - Create a new planning slot and click on a slot template at the top. - Remove the end…
Currently an error occurs when user tries to remove end date on slot.
Steps to replicate:
- Install `planning`.
- Create a new planning slot and click on a slot template at the top.
- Remove the end date (rightmost) and click elsewhere.
Error:
```
File /home/odoo/odoo18/enterprise/planning/models/planning.py, line 423, in _compute_template_id
if slot._different_than_template():
File /home/odoo/odoo18/enterprise/planning/models/planning.py, line 439, in _different_than_template
slot_time = self[slot_field].astimezone(pytz.timezone(self._get_tz()))
AttributeError: 'bool' object has no attribute 'astimezone'
```
Cause:
- When the end date was removed, [compute] was triggered, calling the `_different_than_template()` method, which iterates through the fields in the slot template.
- Since the user removed `end_datetime`, `self['end_datetime']` became false and caused the error at line [1].
Solution:
- Returned from the function call when `end_datetime` is false.
[compute]: https://github.com/odoo/enterprise/blob/745c1cc0e06f5e0578ec4383439f8be2419adb6b/planning/models/planning.py#L418-L426
[1]: https://github.com/odoo/enterprise/blob/745c1cc0e06f5e0578ec4383439f8be2419adb6b/planning/models/planning.py#L438
No ID
Forward-Port-Of: odoo/enterprise#102762This update resolves an issue preventing the successful installation of the UK Construction Industry Scheme (l10n_uk_reports_cis) when using branch companies. The fix prevents the creation of duplicate account codes, ensuring the module installs correctly and reliably for all UK company setups, including those with branches.
Original PR description
Before this commit: Steps 1) Create a UK localization company 2) Create a branch for that company 3) Try to install UK - Construction Industry Scheme (l10n_uk_reports_cis) => A Validation Error is raised with the message `Account codes must be unique. You can't create accounts with these duplicate codes: 220001, 220101, 220201`, This occurs because the `_l10n_uk_reports_cis_post_init()` method is creating accounts for each UK company even if they aren't root companies (branch). After this commit: UK - Construction Industry Scheme (l10n_uk_reports_cis) is installed successfully with UK companies that have branches. opw-5326079 Forward-Port-Of: odoo/enterprise#99901
This update resolves an issue where payment differences were incorrectly calculated for UrbanPiper orders after payment. The fix ensures that the final payment amount is accurately reflected as $0.00, improving the reliability of financial reporting for these orders. This change impacts the UrbanPiper integration.
Original PR description
In this commit, The amount difference should be 0.0 after the Urbanpiper order has been paid. task-5441252 Forward-Port-Of: odoo/enterprise#102894 Forward-Port-Of: odoo/enterprise#102872
This update fixes an issue where the Payslip Work Days Lines report displayed data for both Indian and Belgium payrolls. The team added a filter to ensure the report only shows data for the currently selected company, improving data accuracy and usability.
Original PR description
**Steps to reproduce:** - Install Indian and Belgium payroll. - Go to Payslip Work Days Lines report. - Employee data of both companies are shown. **Issue:** - Payslip Work Days Lines Report Should Show Only Selected Company’s Data. **Cause:** - Filtering was missing to set the data according to selected company **Fix:** - Added domain in view to show data according to the current selected company. task-5407727
This update resolves an issue where tax mappings weren't correctly set when upgrading to version 19.0 or higher for companies registered with Fiskaly. The fix ensures accurate data transmission to Fiskaly during session closing, preventing errors related to company names or cash move reasons containing hyphens. This upgrade automatically corrects existing issues and ensures future sessions function correctly.
Original PR description
Steps to reproduce: ------------------------- - Upgrade from lower version to 19.0 or higher. - Start a fiskaly registered company's session. - Close the session after transactions. Issue: ------- -…
Steps to reproduce:
-------------------------
- Upgrade from lower version to 19.0 or higher.
- Start a fiskaly registered company's session.
- Close the session after transactions.
Issue:
-------
- Tax mapping used to send data to fiskaly is not set.
- If have `-` in company name or cash move reason and try to do cash move will give a tb.
Cause:
---------
- When the user's database is upgraded, the taxes already exist and the company is already registered. As a result, `l10n_de_vat_export_data` is never set, and since no tax changes occur, `l10n_de_vat_definition_export_identifier` is also not generated. This leads to incorrect values being sent to Fiskaly during the session closing request, causing errors.
- The cash statement name uses - as a separator, the current structure is `{session_name}-{move_type}-{statement_type}-{move_reason}` set from `_prepare_account_bank_statement_line_vals()` If move_reason or company name contains additional `-` splitting the whole name breaks the expected structure.
Fix:
-----
- We have added a check to identify any taxes that are missing their tax mapping If such taxes are found, we filter them and trigger the logic to set their mappings. However, if the main mapping reference value l10n_de_vat_export_data is not set, we first retrieve and update it. Once this reference is available, we update all taxes that were previously unset and then prepare the correct tax data.
As a result, the first session closing after the upgrade will automatically correct all issues both for customers who have already upgraded and for those who upgrade in the future.
- We first remove the `{session_name}-` prefix, then split the rest. Since move_type and statement_type never contain -, we take them directly not user inputs, and then rejoin everything from index 2 onward to reconstruct the correct move_reason.
Additional fixes:
--------------------
- Some places the limit of characters may exceed than what fiskaly is asking than it can give us an error so restricted all places where needed.
- We don't have check if the settlement is present if not getting id directly may cause error.
help ticket: 5362897, 5367425
Forward-Port-Of: odoo/enterprise#102855
Forward-Port-Of: odoo/enterprise#101468This update fixes an issue where Sendcloud delivery address parsing incorrectly handled addresses with multiple dashes or slashes, such as those common in Austria. The change updates a key pattern to accurately capture address numbers with multiple separators, ensuring correct delivery address formatting and preventing delivery errors.
Original PR description
Issue ----- When creating a sendcloud delivery, addresses containing multiple dashes or slashes (eg Austrian addresses) have their number incorrectly parsed. Examples: Innsbruck Straße 8/1/13 -> 8/11 (should be 8/11/13) 7-3/11A Hochköning Straße -> 7-3 (should be 7-3/11A) Fix ----- Update part of the regex pattern from `\d+[-\/]?\d*` to `\d+(?:[-\/]?\d+)*` in order to match multiple occurences of one of '-', '\' or '/' followed by some number. ----- Ticket: opw-5366863 Forward-Port-Of: odoo/enterprise#101594
This update resolves an error that prevented vendor bills from being successfully sent to eTIMS. The issue stemmed from incorrect eTIMS configuration during company setup. Now, the system will correctly handle sending bills to eTIMS when the eTIMS settings are properly configured.
Original PR description
Currently, an error occurs when clicking the `Send to eTIMS` button on vendor bills. Steps to Reproduce: - Install `l10n_ke_edi_oscu` module without demo data. - Create a New company with `Kenya` as…
Currently, an error occurs when clicking the `Send to eTIMS` button on vendor bills.
Steps to Reproduce:
- Install `l10n_ke_edi_oscu` module without demo data.
- Create a New company with `Kenya` as the Country and switch to it.
- Go to Vendors > Bills, create a new bill, and add an invoice line without tax.
- Confirm it, then click `Send to eTIMS`.
Traceback:
```py
File "/home/odoo/src/enterprise/19.0/l10n_ke_edi_oscu/models/account_move.py", line 551, in action_l10n_ke_oscu_confirm_vendor_bill
content = move._l10n_ke_oscu_json_from_move()
File "/home/odoo/src/enterprise/19.0/l10n_ke_edi_oscu/models/account_move.py", line 199, in _l10n_ke_oscu_json_from_move
line_items = self._l10n_ke_oscu_get_json_from_lines(tax_details)
File "/home/odoo/src/enterprise/19.0/l10n_ke_edi_oscu/models/account_move.py", line 250, in _l10n_ke_oscu_get_json_from_lines
tax, line_tax_details = next(
StopIteration: null
```
This error occurs because when a new company is created, the `eTIMS Server Mode` in Settings is empty. As a result, `l10n_ke_oscu_is_active` field becomes `False`, and at [1] the `l10n_ke_validation_message` field will also be `False`, causing the flow to be skipped. Therefore, no error is raised on the frontend side. The field `l10n_ke_oscu_is_active` is set to `True` only when `eTIMS Server Mode` is set to `Demo`.
Here we raise a warning when the `eTIMS` configuration is not set up correctly.
[1]: https://github.com/odoo/enterprise/blob/7fb7b3168039f00b6d815202bc19ac35aa1d9b5e/l10n_ke_edi_oscu/models/account_move.py#L91-L93
sentry-7083978544
Forward-Port-Of: odoo/enterprise#101319This change resolves an issue where currency rate conversions for the UYU BCU were failing due to rates being created on incorrect dates. This prevented accurate financial reporting for users operating in Uruguay. The fix ensures rates are created on the correct date, guaranteeing accurate currency conversions.
Original PR description
This commit fixes an issue in the Salary Calculator where all fields were displayed as empty when selecting an employee with a resource_calendar_id set. Steps to Reproduce : First Change to either…
This commit fixes an issue in the Salary Calculator where all fields were displayed as empty when selecting an employee with a resource_calendar_id set. Steps to Reproduce : First Change to either the default company (MyCompany) or Demo Belgian company Payroll -> Employee -> Salary Calculator -> choose an employee. Bug : All fields in the Salary Calculator view are empty (evaluated as False). Root Cause : Inside _compute_salary, the method _generate_salary_simulation_payslip writes on payslip.version_id using: `payslip.version_id.write(new_payslip_vals)` Because the is_simulation_offer key was missing from the context, this write triggered a full payslip computation, generating payslip lines. During this computation, compute_sheet() performs an unlink() on existing payslip lines. Since the Salary Calculator view fields are only cached at that point, the unlink causes the cached values to be lost, resulting in all fields being evaluated as False. Fix : Ensure that is_simulation_offer is present in the context when writing to payslip.version_id, preventing payslip line generation and avoiding the unintended unlink() during salary simulation. Task - 5387155
This update resolves an issue where recruitment officers couldn't correctly schedule interviews due to limited access rights. The fix grants them the necessary permissions to create appointment types and slots, ensuring a smooth process for qualifying applicants and sending out interview invitations.
Original PR description
Problem: Recruitment officers don't have the rights to create appointment.type nor appointment.interview, Hence when they move an applicant to the qualified stage an error is raised during rendering the body of the mail template `email_template_data_applicant_schedule_interview`. Fix: Grant recruitment officers the access they need in that flow: - Create/Read "anytime" appointment type. - Create appointment slots/invites associated with an "anytime" appointment type. Task-5262936
This update resolves a crash that occurred when using fully flexible employees in payroll and work entry modules. The fix ensures that employee unavailability is correctly generated, preventing errors and improving the stability of these key processes.
Original PR description
Steps to reproduce: - Install hr_work_entry - create an active employee with a running contract and no resource calendar(fully flexible) - try to open work entries/payroll - you get a traceback because of `_gantt_unavailability` Current behavior: - when the employee is flexible, the unavailability is set to an empty interval without accessing the calendar(that doesn't exist) - added `test_gantt_unavailability` to check if the unavailability intervals of employees are generated correctly task-id: 5408752 Forward-Port-Of: odoo/enterprise#102679
This update resolves a problem preventing a key demo tour from running correctly. The issue stemmed from duplicate job entries within the demo data, causing a mismatch during the tour's execution. This ensures the demo tour functions as intended, providing a reliable experience for users.
Original PR description
- fixing tour `hr_contract_salary_tour_sign_again`which was failing with demo data because another job was installed in the demo data with name Experienced Developer so it was matching with it instead of the correct job position task-id: 5413364 Forward-Port-Of: odoo/enterprise#102677
This update adds a field to the salary configuration to require the correct bank account holder name. This is a security fix to prevent payment delays and manual confirmations, ensuring accurate bank transfers. Related tests and a user tour have been added for clarity and verification.
Original PR description
Law is now more secure and you need to have the correct name on the bank account holder otherwise payment need to be manually confirmed everytime. Therefore a field is added to the salary config to allow the user to set his account holder name separately from his actual name in case it is different. Task-5222712 [Related PR](https://github.com/odoo/odoo/pull/233965) Forward-Port-Of: odoo/enterprise#98572
This update restores the ability to generate negative overtime (undertime) in the attendance system. This feature, previously removed to minimize financial losses, is now re-enabled based on specific Absence Management settings. This allows for more accurate tracking of employee hours and reduces potential revenue discrepancies.
Original PR description
…time generation Forward-Port-Of: odoo/enterprise#102880 Forward-Port-Of: odoo/enterprise#102271
Code cleanup and technical improvements
This update streamlines the integration of WhatsApp within the Odoo Enterprise platform. The changes optimize how WhatsApp interacts with channels, enhancing code readability and efficiency. This results in a more robust and maintainable system for managing WhatsApp conversations.
Original PR description
PR community: https://github.com/odoo/odoo/pull/241072