Daily updates from Odoo
Thursday, December 4, 2025
30 changes · master
New functionality added to Odoo
This pull request integrates holiday functionality into the core HR Payroll module. It updates various files to align with the existing payroll system, ensuring accurate tracking and reporting of employee time off. This enhancement improves payroll accuracy and reporting capabilities.
Original PR description
TaskID: 4179953
Enhancements to existing features
This update replaces all 'Cancel' buttons with 'Discard' throughout the Odoo interface. This change simplifies the user experience by aligning the terminology with common user expectations and reducing potential confusion. It's a minor improvement focused on usability.
Original PR description
## Description:
Replaced all cancel buttons with discard
Task: [5353199](https://www.odoo.com/odoo/2328/tasks/5353199)
## review checklist
- [ ] feature is organized in plugin, or UI components
- [ ] support of duplicate sheet (deep copy)
- [ ] in model/core: ranges are Range object, and can be adapted (adaptRanges)
- [ ] in model/UI: ranges are strings (to show the user)
- [ ] undo-able commands (uses this.history.update)
- [ ] multiuser-able commands (has inverse commands and transformations where needed)
- [ ] new/updated/removed commands are documented
- [ ] exportable in excel
- [ ] translations (\_t("qmsdf %s", abc))
- [ ] unit tested
- [ ] clean commented code
- [ ] track breaking changes
- [ ] doc is rebuild (npm run doc)
- [ ] status is correct in OdooThis update enhances the visibility of the AI button within the Odoo interface. The contrast and alignment have been adjusted to ensure it's easily noticeable in both light and dark modes, improving the user experience. The button has also been centered on the toolbar for better usability.
Original PR description
This PR optimizes the AI logo's contrast to make it more visible and more consistent with the other WYSIWYG icons in both light and dark mode. It also centres the ai button on the toolbar. | Before | After | |--------|--------| | <img width="246" height="33" alt="wysiwyg-light-before" src="https://github.com/user-attachments/assets/8357ff78-06cc-4bbf-8ed8-ff14cf3e79c9" /> | <img width="261" height="42" alt="Screenshot 2025-11-07 at 15 29 29" src="https://github.com/user-attachments/assets/36cda5b2-7937-4ba0-97d2-4d345cf1a160" /> | | <img width="254" height="43" alt="wysiwyg-dark-before" src="https://github.com/user-attachments/assets/0807c8bd-a18e-4c86-920b-4d83ece31b78" /> | <img width="252" height="39" alt="Screenshot 2025-11-07 at 15 29 12" src="https://github.com/user-attachments/assets/49a67995-bc4a-4a74-9223-b0310e7c25f9" /> | task-5095689 PR-commu: https://github.com/odoo/odoo/pull/232281
This update simplifies receipt printer management within Odoo Enterprise by removing receipt printer logic from the hardware proxy service. This change improves the system's architecture and prepares it for future updates, ensuring smoother operation of point-of-sale systems. It’s part of a broader effort to streamline POS processes.
Original PR description
In order to deprecate the hardware proxy service, we moved the receipt printers logic out of it. see odoo/odoo#238347
This update enhances reporting by adding key performance indicators (KPIs) for social media clicks and online appointment bookings. The changes involve refining calculation methods and supporting cross-company data analysis, ultimately providing better insights into business performance.
Original PR description
[IMP] social: add/improve digests We add the #Social Media Clicks KPIs. Note that we use raw sql queries to calculate it as the field click_count on social.post is computed. [IMP] appointment: add digest KPI We add nbr_of_online_appointment KPI. [IMP] various: improve digest Following the improvement of the method _calculate_company_based_kpi to also support the cross company computation, and we rename its call to _calculate_kpi. Following the introduction of the method _get_kpi_custom_settings, we use it to define the KPI's action and remove the method _compute_kpis_actions. Task-2705154
This update enhances the AI draft feature by providing more accurate suggestions through improved LLM integration and a refined user interface. Key configuration changes streamline agent identification and data sharing, resulting in a smoother and more reliable AI experience.
Original PR description
Follow up with minor improvements for the AI draft and the keys config features. These include: - Feeding the already exisiting text of the editable to the LLM for more accurate suggestions - Use the AI app icon in the knowledge button - Prompt button label is now a mandatory field - you cannot add "empty" buttons - Agent subtitle is inserted above prompt buttons - users have better idea of agent they speak to from the UI - m2m_tag widget was used for the models in the default prompts config list view - m2o_avatar widget was used for agents in all default prompts config views - prompt buttons are now hidden for the email prompt evaluator key - model selection is now hidden for the email prompt evaluator, the knowledge html, and the ask AI key. - message date is included when sharing the chatter information
This update simplifies the creation of spreadsheet pivots by automatically loading a default view, eliminating the need for users to manually set up rows, columns, and measures. A fallback count measure is added if none is specified, and the code has been consolidated for easier maintenance. This improves the user experience and reduces setup time.
Original PR description
## Description Current behavior before PR: - Creating an Odoo Pivot from a spreadsheet opened an empty pivot, forcing users to configure rows, columns, and measures from scratch. - The addEmptyGranularity function was duplicated across multiple places, leading to redundant code and harder maintenance. Desired behavior after PR is merged: - New spreadsheet pivots now load the default pivot definition, similar to the web pivot view, with no filters applied. - If no explicit measure is defined in the pivot architecture, a fallback count measure is automatically added. - The addEmptyGranularity function is moved to pivot_helper so it can be reused from anywhere without redefining it in several places. Task: [5253761](https://www.odoo.com/odoo/project/2328/tasks/5253761) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves the user experience by making the share-target feature more intuitive and versatile. It now supports creating expenses, bills, and other records (like leads and tasks) more seamlessly, and allows other apps to contribute to share targets. The update also includes new options like triggering share targets via file drops on the home screen.
Original PR description
In this commit, we update the share-target to the v2. The main goal is to improve the user experience when using the existing share-target. Previously, the share target was only useful for creating an expense, but it wasn't clear to the user. We added a dialog to enhance the user experience before creating an expense, rework the share-target service to allow other app to propose another share target item, the default behavior of a share target is to append the file as an IrAttachment linked to the record. We can need trigger the share target when we drop file(s) on the homescreen Here the list : - Bill - Expense (the only available in v1) - Time-Off - Lead - Task - To-do task-5184941
This update enhances the ability to access data associated with 'sign' records linked to multiple records (X2Many). Previously, limitations prevented developers from utilizing this data effectively. Now, customization of the `SignerX2Many` class allows for broader access to information from the `sign.send.request.signer` model, streamlining data retrieval.
Original PR description
The class `SignerX2Many` is inheritable, but if we need another value from the o2m, we can't use it because the `signerX2Many` is not exportable. Enable `signerX2Many` customization, allowing more fields to be read from the `sign.send.request.signer` model. Forward-Port-Of: odoo/enterprise#99977
Resolved issues and error corrections
This update prevents the import process from accidentally changing the names of existing journal codes. Previously, importing data would overwrite journal names, causing confusion and potential data discrepancies. The fix ensures that existing journal names are preserved during the import process.
Original PR description
**Steps to reproduce:** * Install the **Accounting** module. * Go to **Accounting > Configuration > Settings**. * Download the **Import Journal Items** template. * Keep the default journal codes in…
**Steps to reproduce:** * Install the **Accounting** module. * Go to **Accounting > Configuration > Settings**. * Download the **Import Journal Items** template. * Keep the default journal codes in the template (e.g. *MISC*, *SAL*, *BNK*). * Import the file containing these existing journal codes into it by **Accounting > Configuration > Settings > Initial Setup > Import > Import Journal Items > Upload data file**. **Observed behavior:** * Existing journals have their names overwritten by the values provided in the import file. * For example, a journal with code **MISC** and name *Miscellaneous Operations* is updated to name **MISC** after import. **Cause:** * Journals are looked up by their `code`, but `_load_records()` passes both `name` and `id` for all rows. * As a result, existing journals are updated instead of preserved. **Fix:** * Pass only `id` for journals already found by code. * Pass `name` only when creating new journals. * This prevents unintended updates to existing journal names. opw-5345876 Forward-Port-Of: odoo/enterprise#100143
This update fixes a minor issue in the Belgian payroll module (l10n_be_hr_payroll_acerta) related to the error message displayed when an Acerta code is entered incorrectly. The message has been clarified to be more user-friendly and unambiguous, ensuring accurate data entry for Belgian companies. This improves the overall user experience and reduces potential errors.
Original PR description
Steps to reproduce: 1. Install l10n_be_hr_payroll_acerta 2. Switch to a Belgian company 3. Go to Payroll → Configuration → Work Entry Types 4. Edit a record and enter an Acerta code with only 2 characters Issue: - The validation message is missing a space between `that` and `is` - The message wording is ambiguous (PO request - fdav) Fix: - Updated the validation message to: `The following work entry types have an Acerta code that is not between 3 and 6 characters` opw-5347488 Forward-Port-Of: odoo/enterprise#100432
This update fixes an issue preventing correct XML generation for Colombian e-invoices related to the 'INC Bolsas' plastic bags tax. The changes add a dedicated tax flow and ensure accurate reporting of this tax in the invoice XML, resolving DIAN validation errors and enabling successful invoice submissions.
Original PR description
Before PR: -The plastic bags tax (INC Bolsas) was not handled by a specific flow. -This resulted in incorrect XML generation for Colombian e-invoices, leading to validation errors from the DIAN. After PR: -Dedicated logic flow has been added to correctly handle the INC Bolsas tax. -Generated XML now correctly reports this tax in a separate `TaxTotal` block. -It populates the `BaseUnitMeasure` and `PerUnitAmount` fields with the fixed tax rate per bag. Impact: -Colombian e-invoices that include plastic bags tax are now generated correctly. -Ensures compliance with DIAN's specific requirements for this nominal tax. -Prevents validation errors and allows for successful submission of invoices containing this tax. task-5086926 Forward-Port-Of: odoo/enterprise#100391 Forward-Port-Of: odoo/enterprise#95311
This update resolves a test failure that occurred when the demo data was used. The change ensures the test runs correctly without disrupting the demo environment, preventing potential issues during testing and demonstration of the Odoo Enterprise module.
Original PR description
Some tests were failing when the demo data were installed. This commit fixes the test so that it doesn't interfere with demo data. Related build error: https://runbot.odoo.com/odoo/runbot.build.error/234529 task-5386529
This update fixes an issue where the IoT printer was still being used when both an IoT and ePos printer were set up. Now, the system automatically prioritizes the ePos printer, ensuring the correct printer is selected for the user's workflow. This improves the user experience and prevents errors.
Original PR description
When setting an IoT printer and an ePos printer, a message is displayed to inform the user the ePos printer will be used. However, this is not the case and the IoT printer is still loaded. We now avoid loading if there already is a printer. Forward-Port-Of: odoo/enterprise#101130
This update corrects a reporting issue where payment reports incorrectly included bank accounts with zero allocations. The change ensures that reports only display accounts with positive allocations, providing more accurate and reliable payment information. This improves the clarity and trustworthiness of financial reports.
Original PR description
-In case of creating payment reports for an employee with multiple bank accounts, if one of the accounts has an allocation of 0%, it still appears in the report. -This approach has been changed to include only accounts with positive allocations. Backport for odoo/enterprise#100643 Forward-Port-Of: odoo/enterprise#101080
A bug preventing users from adding salary inputs to payslips has been fixed. This issue arose after a recent update and was caused by an incorrect field reference. The fix utilizes the correct `struct_id` field to link payroll structures, ensuring smooth operation.
Original PR description
Currently, an error occurs when user tries to add a salary input on a payslip. Steps to replicate: - Install `hr_payroll`. - Go to any Employee payslip > Salary Inputs > Add Inputs. Error: `AttributeError: 'hr.payslip' object has no attribute 'structure_id'` Cause: - Error occurs after addition of a new [feature]. - The [code] tries to access `self.structure_id` on a record of `hr.payslip`, but since there’s no field named `structure_id`, it resulted in an error. Solution: - Used the field `struct_id` that keeps the record of linked `hr.payroll.structure()`. [feature]: https://github.com/odoo/enterprise/pull/98151 [code]: https://github.com/odoo/enterprise/blob/eda93203ec8da207768357ae91132a49881a2978/hr_payroll/models/hr_payslip.py#L2159 No ID Forward-Port-Of: odoo/enterprise#100966
This update corrects issues in tax reporting for businesses using multiple companies within a shared tax unit. It ensures that OSS reports and domestic tax returns are correctly linked to the appropriate main company, resolving inconsistencies and improving data accuracy. This enhances compliance and reporting reliability.
Original PR description
This PR delivers multiple fixes to ensure consistent and accurate behavior when working with tax units across OSS and standard tax return reports: [FIX] l10n_eu_oss_reports: Correct Tax Unit…
This PR delivers multiple fixes to ensure consistent and accurate behavior when working with tax units across OSS and standard tax return reports: [FIX] l10n_eu_oss_reports: Correct Tax Unit Detection for OSS Reports OSS reports lack a country, causing _get_available_tax_units to return no results. As a consequence, only the environment's main company was considered. This fix ensures that when multiple companies belong to the same tax unit, their OSS reports are correctly consolidated under that shared unit. [FIX] account_reports: Link Tax Unit Returns to the Main Company When generating domestic tax returns for a company that is part of a tax unit, the main company of the unit should be used since it is responsible for filing. This update ensures tax return generation is always aligned with the appropriate main company. [FIX] account_reports: Enforce Main Company When Generating Report Options get_options previously relied on the order of companies within a tax unit, assuming the first entry was the main company. Because this order is not guaranteed, the call is now explicitly scoped using with_company to ensure the main company is always used when preparing report options. Forward-Port-Of: odoo/enterprise#99715
This update improves the speed of processing overtime on attendance records. The previous system was slow due to a missing database index, which caused delays when removing existing overtime entries. Adding an index has significantly optimized this process.
Original PR description
Updating the overtime on attendance may take huge time. The issue comes from the lack of index on work entries so it takes a lot of time to unlink an existing overtime line. So we add an index on the work entries (which is mainly null) Forward-Port-Of: odoo/enterprise#101223
This update fixes a previous issue where the AI agent's transcription summaries weren't displayed in the user's preferred language. Now, the agent automatically generates summaries in the language selected for the transcription, ensuring a more natural and user-friendly experience. This change also applies to date formatting within the summaries.
Original PR description
This commit introduces a change that makes the agent produce a summary in the selected language from the transcription tab. It injects a specific prompt using the `currentLanguage` of the transcription the component. Instructing the LLM to generate in the proper language. Forward-Port-Of: odoo/enterprise#101075
This update enhances the bank reconciliation widget to accurately display early payment discounts (EPD) when batch payments are used, particularly with invoices linked to payments. It now correctly handles EPD calculations and displays the discount amount alongside the payment, ensuring accurate reconciliation and reporting of early payment benefits.
Original PR description
In the bank reconciliation widget, it is now possible to have batch payments containing payments linked to only invoice_ids. Such batch payment, once mounted in the widget, should reflect the invoice or move amounts of its payments, and not only the payments amount. In the case of a payment-invoice combo that's elligible for an early payment discount, the early payment discount should also be displayed in the widget. Example: Invoice of 1000$ with possible EPD of 2%. A payment (with no move) is done (paid in the "early" period) for 980$. The payment is then put into a batch payment. Once in the bank rec widget, when mounting the 980$ batch payment to a statement line of 980$, the widget should display it as a batch payment line of 1000$ and add another 20$ Early payment Discount line. task-4681366 Forward-Port-Of: odoo/enterprise#100533 Forward-Port-Of: odoo/enterprise#83077
This update enhances the performance of our reports by streamlining how cached data is handled. The team removed a technical detail that was causing issues with report caching, now managed entirely on the client-side. This results in faster report loading times and a smoother user experience.
Original PR description
This commit is needed by PR https://github.com/odoo/enterprise/pull/96946, which introduces a cache for rpc calls executed by the reports, like the one we use for views. When setting an option filter to value A, then switching to B and finally coming back to A, we'd expect the cache to work, and basically reload the original value computed for A instantly. It did not work because of the loading_call_number key, which was always set with a different value in the options dict. We now entirely remove the loading_call_number from the options, and don't pass it to the server at all. Instead, everything is handled js-side, with function parameters. In the meantime, we address some potential async issues in the reports' js code, essentially by reordering some lines or assigning return values to variables before calling await.
This update resolves a bug where a previously unlinked call continued to appear in the Odoo softphone. The fix ensures that calls are immediately removed from the softphone interface when they are no longer linked, improving the user experience and data accuracy.
Original PR description
A call that was unlinked previously remained visible in the VOIP softphone. This fix ensures that the call is correctly removed from the softphone view as soon as it is unlinked. Task-5262162 Forward-Port-Of: odoo/enterprise#100803 Forward-Port-Of: odoo/enterprise#100036
This update addresses a potential instability issue in the Odoo payroll system. By adding a 'super call' to the `check_modification_allowed` method, the system now maintains a more complete call stack, helping to diagnose and resolve unexpected errors. This ensures the payroll process runs more reliably.
Original PR description
Add super call in `check_modification_allowed` method to maintain a call stack. task-5379473
This update simplifies the process of attaching expense documents. Users can now upload attachments to expense forms even if they haven't yet filled in the expense name or product details. This removes a previous requirement, making it easier to record expenses in draft form.
Original PR description
Enable the uploading of expense attachment on the form view even if the required fields "name" and "product_id" aren't provided yet. We therefore make these fields not required if the expense is in draft state. task-4684825
This update fixes a performance issue within Odoo's email testing process. The tests now correctly disable all relevant user groups, ensuring accurate results. Additionally, the tests have been optimized to reduce unnecessary database queries, improving overall efficiency.
Original PR description
https://github.com/odoo/odoo/pull/222290
This update fixes a problem where users continued to experience access errors after uninstalling the HR Payroll module. The changes ensure proper access rights are restored for relevant user groups (like HR Managers) during payroll removal and installation, preventing disruptions to work entry access.
Original PR description
Steps to reproduce: - install hr_payroll - unistall hr_payroll (you should still have hr_work_entry) - when you try to access work entries you get access error because it's still linked to payroll access Fix: - made the access rule for `group_hr_payroll_user` not override the access rule for `group_system` when installing payroll - added `uninstall_hook` to give access back for `group_hr_manager` when uninstalling hr_payroll - fixed an issue where `overtime_from_attendance` is not accessible for `group_hr_manager` (when having hr_work_entry installed without hr_payroll) task-id: 5177443
This update fixes a reporting issue by ensuring the NIF (tax identification number) is included in the BOE export for model 347 reports in Spain. This aligns with Spanish tax regulations (specifically pages 3 & 12 of document 347) and improves the accuracy of tax reporting data. Users are responsible for providing a correct VAT number.
Original PR description
[FIX] l10n_es_reports: include NIF in boe export for model 347 The NIF must be included in the BOE export for modelo 347 https://sede.agenciatributaria.gob.es/static_files/Sede/Disenyo_registro/DR_300_399/archivos/347.pdf pages 3 & 12. Before this commit, we read the vat but if it doesn't start with 'ES' we return an empty string because we based on TIN. Now we'll read the vat (without 'ES' if it starts with it). The user is responsible to fill a correct number in the vat field of the company. opw-5207241 Forward-Port-Of: odoo/enterprise#100489
Features or functions removed from Odoo
This update removes the 'Registerer' component from the VoIP module. This change simplifies the VoIP system and aligns with evolving best practices for user experience. The removal addresses potential complexities and improves the overall stability of the system.
This update removes WebRTC support from the IoT modules, streamlining the system and reducing complexity. With the introduction of LNA for local networks, WebRTC is no longer necessary, and HTTP now provides a reliable alternative without requiring SSL certificates.
Original PR description
Community PR: odoo/odoo#238626 Since the introduction of LNA for communication on local networks, there is not much reason to use WebRTC as HTTP now also works without an SSL certificate. For this reason we remove it to reduce the complexity of the code. task-5386539
Code cleanup and technical improvements
This update adjusts WhatsApp channel permissions, specifically regarding the ability to leave or unpin messages. Previously, these actions were tied to individual conversations. Now, they are controlled at the channel level, providing more granular control over channel management. This change enhances security and simplifies channel administration.
Original PR description
PR community: https://github.com/odoo/odoo/pull/237705