Daily updates from Odoo
Thursday, October 30, 2025
41 changes
2 changes
Enhancements to existing features
This update makes the bank reconciliation widget look and behave more consistently across versions. It also prevents users from choosing accounts that cannot produce useful reconciliation rules and removes duplicate partner information in expanded transaction details.
Original PR description
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of:…
[IMP] account_accountant: css backport To have a consistent css across all version of the new bank rec widget, we decided to backport few changes. backport of: https://github.com/odoo/enterprise/commit/524a7a46a0c2888b591de7ad1a0a6d744e345f5a https://github.com/odoo/enterprise/commit/2a83c85cb2c9a7a5da3d4a8483120eeda6b2e6cb https://github.com/odoo/enterprise/commit/e3cb3ab3ec8c64297d8e97d941e0d2eea3e64667 https://github.com/odoo/enterprise/commit/fdbb93abbf831cfa2fdc75e79aa76c094d6e522a https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e [FIX] account_accountant: restrict some account in the set_account Before this commit, we could select the liquidity account or bank suspense account which could create a reco model for it that would do nothing. [FIX] account_accountant: partner_name Before this commit, when a transaction had no partner_name and some lines with the same partner. When unfolded, we had the info of the partner on the statement line and on the line itself which was a duplicate of information. This commit will change when the line is unfolded so that the partner is visible on the statement line only when there is a partner_name [FIX] account_accountant: payable and receivable button Before this commit, the payable and receivable buttons where on the top line only when the reconcile button was not there anymore. Now We decided to always have them present in secondary next to the reconcile button. no task-id Forward-Port-Of: odoo/enterprise#96852
Inventory users can now reset cached links between printers and reports directly from the Inventory app. This makes it easier to resolve printer-report connection issues without navigating to more technical IoT settings.
Original PR description
In order to simplify resetting the link between printers and reports in cache, we added the "Reset Linked Printers" button to the Inventory app. Forward-Port-Of: odoo/enterprise#98364 Forward-Port-Of: odoo/enterprise#98028
2 changes
Enhancements to existing features
VoIP browser tabs now try to unregister when closed, and idle registrations expire sooner if that cleanup does not succeed. This helps avoid provider registration limits being reached when users have multiple or recently closed Odoo tabs.
Original PR description
Some providers like OnSIP allow for a limited number of registrations per user. This is a problem in Odoo because each tab opened creates a new registration for one hour. This commit mitigates the problems in two ways: - Sends an "unregister" request onbeforeunload to try to invalidate the registration upon closing the tab. - Reduces the TTL of registrations so that they get invalidated quicker in case the unregistration failed. Forward-Port-Of: odoo/enterprise#98305 Forward-Port-Of: odoo/enterprise#97963
Journal item searches in Accounting now find matching accounts and partners more efficiently, avoiding slow database scans on large datasets. This can significantly reduce wait times for users working with high volumes of accounting entries, with benchmarks showing multi-second searches becoming much faster.
Original PR description
Description ----- Currently, the default journal items view searches ilike over `account_id` and `partner_id`. This generates subqueries and causes Postgres to use a sequential scan instead of hitting the trigram indexes when OR'd. Instead we can leverage the fact that the number of accounts and partners are usually low compared to the number of aml's, by resolving the many2one domain first and injecting the matched ids into the final domain. We make use of the existing `search_account_id` field and apply a similar logic for a new `search_partner_id` field. Since the number of partners can be much larger than the number of accounts, we fall back to the original domain if too many ids are returned. Benchmarks ----- |Counts |Before|After| |------------------------------------|------|-----| |700k amls, 80k partners, 5k accounts|2.87s |0.45s| |7M amls, 800k partners, 50k accounts|29s |4s | opw-5047423
1 change
Enhancements to existing features
VoIP now tries to unregister a browser tab when it is closed and shortens how long unused phone registrations remain active. This helps customers avoid hitting provider registration limits when users have multiple Odoo tabs open.
Original PR description
Some providers like OnSIP allow for a limited number of registrations per user. This is a problem in Odoo because each tab opened creates a new registration for one hour. This commit mitigates the problems in two ways: - Sends an "unregister" request onbeforeunload to try to invalidate the registration upon closing the tab. - Reduces the TTL of registrations so that they get invalidated quicker in case the unregistration failed. Forward-Port-Of: odoo/enterprise#98305 Forward-Port-Of: odoo/enterprise#97963
18 changes
Enhancements to existing features
Egyptian payroll benefits are now managed through flexible salary rules instead of older fixed payroll inputs and employee fields. This aligns the localization with the newer benefits system while preserving the familiar employee form layout and required legal social insurance reference.
Original PR description
purpose: adapting the new system of flexible benefits coming from salary rules for eg localization - adapted the fields in `hr.version` to become salary rules with `condition_select` as `property_input` which makes it appear in the input section - removed the records in `hr.payslip.input.type` and converted them into corresponding salary rules - added 2 `hr.salary.rule.section` to preserve the old look of the employee form view - changed the allowance benefits in the salary configurator to be linked to salary rules instead of removed fields - changed the tests in `test_salary_rules` to use salary rules instead of hardcoded fields - Note: the field `l10n_eg_social_insurance_reference` is kept because it's mandatory by the law and will have constraints for it's bounds task-id: 5122336
Bank statement corrections now support statements that show separate credit and debit columns. Users can select those amounts directly from the attached document, making manual corrections faster and reducing entry errors.
Original PR description
Previously, there was no way to use the manual correction tool on a bank statement that displayed the lines using credit/debit columns. Now, the debit/credit amounts can be selected on the attachment to fill in the amount of each line. task-[5126902](https://www.odoo.com/odoo/project/2068/tasks/5126902) Forward-Port-Of: odoo/enterprise#97374
The bank reconciliation screen now reopens the chatter on the last statement line the user selected when moving back and forth. This saves time and reduces friction for accounting teams reviewing or reconciling bank statement lines.
Original PR description
This commit ensures that the bank reconciliation widget chatter shows the last selected statement line when the user navigates back and forth to the widget chatter. It does so by storing the statement line in the session storage. task-5114688 Forward-Port-Of: odoo/enterprise#96051
VoIP searches now match phone numbers even when they include spaces, hyphens, parentheses, or other formatting characters. This makes it easier for users to find contacts and call history entries using only the digits they know, while also improving server-side handling of search text.
Original PR description
Introduces the `matchPhoneNumber` function, a new utility designed to match search terms against fully formatted phone numbers. The function converts a digit string like "123" into a flexible regex (e.g., /1\D*2\D*3/i) that matches digits regardless of any non-digit characters (spaces, hyphens, parentheses) between them. **Example:** * **SearchTerms**: "123" * **Target**: "+1 (2)-345" * **Match**: "1 (2)-3" Task-5160296 Forward-Port-Of: odoo/enterprise#98341 Forward-Port-Of: odoo/enterprise#97711
HR teams can now add employee salary inputs directly to Belgian payroll contract templates. This makes template setup more complete and helps ensure recurring payroll-related inputs are applied consistently when preparing contracts.
Original PR description
Add a button in the contract template form view so salary inputs applicable on employees can also be added to a contract template. [task-5156839](https://www.odoo.com/odoo/project/1251/tasks/5156839)
This update improves Saudi payroll WPS file generation by simplifying payment dates, using clearer payment descriptions, and requiring the correct employee identification before files are created. It also adds missing bank identifiers and changes WPS downloads to the expected .SIF format, reducing errors and improving compliance readiness.
Original PR description
* Added tooltip to Value Date * Removed Debit Date field; using Payment Date only. * Fixed Payment Description to use PayRun or Payslip name instead of the employee record. * Updated demo data to include Bank SARIE ID for all banks. * Added Bank SARIE ID and Bank Establishment ID to the bank info tab; fixed traceback when Bank Establishment ID is missing. * Made Saudi National/IQAMA ID required for WPS file generation. * WPS file downloads in .SIF format; Excel version logged in chatter. task-4946564
Demo employee data for Egypt, Jordan, Saudi Arabia, and Turkey payroll has been updated to include work addresses. This makes sample payroll setups more complete and realistic for testing, demonstrations, and evaluation.
Original PR description
Added the work address for employees in demo data of eg, jo, tr, and sa hr payroll. Task-5075966
The Referral app now presents configuration options in a clearer structure and improves how hired candidates are linked to referral contacts. Dashboards better support larger teams by showing repeated referral contacts when relevant, making profile images easier to manage, and limiting the dashboard to a manageable set of up to 8 friends.
Original PR description
Purpose: Better UX for the referral app especially for big teams Previous behavior: - the configuration menu wasn't nested - some hired applicants could exist without being linked to a friend - when 2 hired applicants had the same friend linked, it showed the friend image only once in the dashboard - the head image was required in friend creation New behavior: - added nesting to the configuration menu (recruitment, referrals, dashboard) - always checks if new applicant is hired and allows to link a friend to it even if it's chosen for another applicant - the friend image is show multiple times for all hired applicants linked to it - the head image is not required and takes default value from the dashboard image - the head image is now editable by clicking on it - the dashboard is limited to have at most 8 friends task-id: 5008726
Time off that is cancelled, refused, or only partially approved will no longer be treated as something payroll needs to defer. This reduces unnecessary warnings during payslip validation and keeps payroll screens focused on actionable leave items.
Original PR description
When a leave is cancelled, refused or partially approved,
we shouldn't care about deferring it.
This commit:
- Sets the `payslip_state` to "done" when the leave is refused.
- Hides the `payslip_state` field within the leave form view when the leave is cancelled, refused or partially approved.
- Adjusts the domain of the "To Defer" filter, to not show cancelled, refused nor partially approved leaves.
- When validating payslips:
= Don't show the error "Employee has time off to defer" on the payslip, if it overlaps a blocked leave that is partially approved (or cancelled/refused).
Task-5103880The Indian GSTR2B reporting process now matches late vendor bills more precisely by using invoice reference details differently depending on whether an IRN is available. This helps reduce duplicate or incorrect reconciliation matches and improves confidence in tax reporting.
Original PR description
- Adjusted domain construction in GSTR2B late bill matching logic. - Split condition to handle the presence or absence of IRN separately: - If IRN exists, match on both `ref` and `l10n_in_irn_number`. - If IRN is missing, match only on `ref`. - Improves the accuracy of bill reconciliation and avoids redundant matches. Forward-Port-Of: odoo/enterprise#98370 Forward-Port-Of: odoo/enterprise#97469
Inventory users can now reset the cached links between reports and IoT printers directly from the Inventory app. This makes it easier to resolve printer/report pairing issues without navigating through more technical IoT settings.
Original PR description
In order to simplify resetting the link between printers and reports in cache, we added the "Reset Linked Printers" button to the Inventory app. Forward-Port-Of: odoo/enterprise#98364 Forward-Port-Of: odoo/enterprise#98028
Changes made to POS categories, such as names or display order, are now sent to UrbanPiper when menus are synced again. This helps keep online menus aligned with the latest in-store point-of-sale setup and reduces manual corrections.
Original PR description
Before this commit: ----------------------------------------- - After syncing the menu, changes in a POS category (e.g., name or sequence) were not reflected in UrbanPiper when the menu was synced again. After this commit: ----------------------------------------- - Category updates (name or sequence) are now synced with UrbanPiper on subsequent menu syncs. Task-5122804 Forward-Port-Of: odoo/enterprise#96270
This update adjusts payroll localization tests to match the current employee contract template workflow. It helps ensure contract templates continue loading correctly across multiple country payroll modules, reducing the risk of payroll setup regressions.
Original PR description
Update contract template whitelist unit tests to stop using hr.version.wizard and assert contract template loading via the employee’s contract_template_id onchange instead. task-5022102
Tax reports no longer show a general warning banner when archived tags are found in the selected period. Instead, this issue is handled through tax return checks, making the review process more targeted and aligned with how returns are validated.
Original PR description
Currently, when there are archived tags used on move lines in the selected period, the tax report shows a warning banner. The idea behind that is that such tags are likely to come from an outdated version of a report, after a -u was performed on the database, and the related move lines might need to be reallocated to some other tags. Though, it's a bit old-fashioned and we'd prefer a check on the tax returns for that ! The check cannot be created if it successes and cannot be deleted when it exists and successes. task-5163963
The employee form no longer shows a separate extra hours checkbox because overtime is already managed through company settings. The extra hours field now appears only when an overtime ruleset is configured, making employee setup simpler and less redundant.
Original PR description
The extra hours checkbox in the employee form view was redundant, since overtime rules are already configured through the settings. This change removes the checkbox and makes the visibility of the extra hours field dependent on whether an overtime ruleset is defined. task-5082639 Forward-Port-Of: odoo/enterprise#94572
Saudi payroll overtime now uses the correct work entry type and reads overtime values directly from workday records. This helps payroll teams calculate overtime more accurately and consistently for Saudi Arabia payroll.
Original PR description
- add the right work enty type to the SA overtime rules - update the overtime salary rule to read the value from the workdays Task: 5102385
The product form now shows UrbanPiper-specific options only after an UrbanPiper point of sale is selected. This reduces clutter and makes setup clearer with improved labels and placeholders for food delivery-related details.
Original PR description
In this commit: --- - Improved visibility logic for UrbanPiper-related fields. - Now, fields like Meal Type, Is Recommended, Is Alcoholic, and Aggregators are only visible once a UrbanPiper: Point of Sale is selected. - Updated field labels and placeholders for better clarity. task-5215536
Accounting teams now get clearer warnings when bank statements are invalid, including dashboard alerts, reconciliation warnings, and form-level messages. The update also prevents risky transaction deletions and ignores empty or locked statements in balances, helping users avoid reconciliation mistakes.
Original PR description
* accountant|bank_statement_import This commit brings more clarity on invalid statements. The reflected changes are : - Hiding Last Statement if its date is <= Lock Date - "Invalid Statement(s)" alert on the journal dashboard - Red balance amount and warning in the BankRecW when it contains invalid statements (clicking on the warning applies the filter) - Possibility to choose a statement when creating a transaction - Invalid statement warning in the statement creation form - Displays all warnings in the statement form view - When a file generate a statement, it is kept in its attachments - Prevent deletion of transactions if they belong to a valid statement - Empty statement are not taken into account for the dashboard Last Statement and the BankRecW balance task-4413473 Forward-Port-Of: odoo/enterprise#97552 Forward-Port-Of: odoo/enterprise#92078
12 changes
Enhancements to existing features
Barcode users can now open the return wizard directly from the barcode interface and choose between returning items, returning all products, or returning products for exchange. This makes warehouse return handling more flexible and consistent with the standard stock picking workflow.
Original PR description
Currently, when a user wants to return a product using the barcode interface, The user can either return a single product or return all products. However, there is no option to exchange products directly from the barcode interface. After this commit, the user has access to all options - `Return` - `Return All Products` - `Return for Exchange` through the return wizard, similar to the one available on the stock picking form view. When the user clicks the `Return Products` button in the barcode interface, the return wizard will open directly in the barcode view. This improvement provides a smoother and more consistent user experience within the barcode interface, offering users more flexibility and options. Task - 5144914
The Indian tax reporting workflow now matches delayed vendor bills more precisely by using the invoice reference together with the IRN when available. This reduces duplicate or incorrect reconciliation matches and helps improve the reliability of GSTR2B bill processing.
Original PR description
- Adjusted domain construction in GSTR2B late bill matching logic. - Split condition to handle the presence or absence of IRN separately: - If IRN exists, match on both `ref` and `l10n_in_irn_number`. - If IRN is missing, match only on `ref`. - Improves the accuracy of bill reconciliation and avoids redundant matches. Forward-Port-Of: odoo/enterprise#97469
Marketing users can now show or hide parts of an email based on recipient criteria, making campaigns more personalized without creating separate mailings. The editor also adds visual cues that help users understand these rules while designing, without affecting the final sent email.
Original PR description
This commit adds an option in the new Mail Builder to enable users to only show elements based on a domain on the recipients. This option uses the DomainSelectorDialog so that the user has an easier…
This commit adds an option in the new Mail Builder to enable users to only show elements based on a domain on the recipients. This option uses the DomainSelectorDialog so that the user has an easier time working on it. The resModel is the model chosen by the user for the whole mailing limiting the choice of fields to a limited list. The option populates a data attribute: `data-filter-domain` that is supposed to contain a valid domain notation. When processing the htmlField to be inlined, we process each elements that contains the data attribute and set the `t-if` attribute accordingly. If the domain stored isn't valid, the attribute is set to `false`. We prefer to not show elements that could be reserved to a subset of a recipients. If the domain is valid, then the attribute is set to `object.filtered_domain([data-filter-domain])`. This enables us to easily create QWeb conditions on the mailing that will be interpreted by the render mixin on each recipients. The resulting processed body is then returned to be fed to the rest of the sending process. task-4599334 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Payroll CSV payment reports now include payment lines for partners linked to company contribution rules. This helps ensure employer-side contributions are visible in payment files, reducing missed or incomplete contribution payments.
Original PR description
- For CSV payment reports, add lines for partners defined as company contributions in salary rule configurations. - Ensures that company-side contributions are properly reflected in generated payment reports. Task: 5114655
Sample data in web views is now shown with a subtle opacity blur instead of a ribbon label. This makes demo or placeholder information less distracting while still helping users recognize that the data is not real.
Original PR description
This commit removes the sample data ribbon introduced in #208864 and adds an opacity blur over sample data. task-5207352
The employee form no longer shows a separate extra hours checkbox because overtime behavior is already controlled through company settings. The extra hours field now appears only when an overtime ruleset is configured, reducing duplicate setup and making employee records clearer.
Original PR description
The extra hours checkbox in the employee form view was redundant, since overtime rules are already configured through the settings. This change removes the checkbox and makes the visibility of the extra hours field dependent on whether an overtime ruleset is defined. task-5082639
The point of sale integration with Glory cash machines now includes tools to reset the machine, download logs, and automatically verify inventory when issues are detected. It also fixes access, timeout, disconnect-message, and payment-cancellation problems, helping stores meet certification requirements and reduce checkout disruptions.
Original PR description
This commit contains several changes and bug fixes for the Glory cash machine implementation, needed to meet the certification criteria. - Added button to reset cash machine - Added button to download logs - Added verification check (a verification is automatically triggered if the machine reports an error with the inventory) - Fixed cashier role having manager access to cash machine - Fixed several issues relating to session timeouts - Fixed no message appearing when cash machine disconnects - Fixed traceback when cancelling a payment task-5064871 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Inventory users can now reset cached links between printers and reports directly from the Inventory app. This makes it easier to resolve printer-report connection issues without navigating to technical IoT settings.
Original PR description
In order to simplify resetting the link between printers and reports in cache, we added the "Reset Linked Printers" button to the Inventory app. Forward-Port-Of: odoo/enterprise#98364 Forward-Port-Of: odoo/enterprise#98028
Employee resume sections now use each contract's actual start and end dates instead of only relying on version start dates. This gives HR teams a more accurate timeline when there are gaps between contracts or later resume versions.
Original PR description
Previously, the resume section showed dates depending on the starting dates of version, neglecting the cases when a contract might end and the next version starting later in time. This PR fixes that by taking into account the contract dates of each version. Task-5102961 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The IoT Box can now receive and confirm restart requests through HTTP, WebRTC, and WebSocket connections. This makes remote maintenance more consistent and reliable, reducing the need for manual intervention when restarting Odoo on IoT devices.
Original PR description
In order to allow using the `iot_http` service to restart odoo, we updated the action route to accept messages targeting the IoT Box itself, the WebRTC to accept restart actions and the WebSocket to confirm that the restart action was received. odoo/enterprise#97525 Task: 5169648
The IoT Box restart button now uses the shared IoT connection service, making remote restarts more consistent and easier to manage. This helps reduce friction for teams maintaining IoT devices without changing the visible workflow for users.
Original PR description
In order to simplify restarting IoT Boxes remotely, we adapted the restart button to use the `iot_http` service. odoo/odoo#232133 Task: 5169648
This update makes internal follow-up report tests use the company's configured currency symbol instead of assuming a dollar sign. It helps ensure accounting tests remain reliable across countries where currency symbols may be customized, such as distinguishing USD from local currencies.
Original PR description
This PR makes the currency symbol in `test_followup_lines_branches` and `test_followup_report_with_entries` dynamic, avoiding a hardcoded $ string. Why this is needed: Some localizations, like Argentina, use the $ symbol for their own currency (ARS). To prevent confusion with USD, in some cases a complementary module can change the USD symbol to "USD". When this happens, the original test fails because it specifically expects $. This change prevents that failure by fetching the symbol directly from the company's currency, making the test more resilient to configuration changes.
3 changes
Enhancements to existing features
This update adds the stock movement identifier to Romanian EDI export data. It makes it easier for businesses to trace electronic delivery records back to the exact stock movements they represent.
Original PR description
Added `move_id` field in the export structure for EDI documents to include the stock move identifier. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: This enhances traceability and allows better linkage between stock moves and their corresponding EDI records. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The IoT hardware setup now uses a password generation method that works with Python 3.13 and later, avoiding reliance on a removed system library. Compatibility links were also added so system processes can still find moved setup files, reducing upgrade disruption.
Original PR description
To ensure compatibility with python 3.13+, we updated the method to generate the rpi's password to avoid using the removed `crypt` lib. We also ensure that files moved between `point_of_sale/tools/posbox/`, `addons/iot_box_image/` and `setup/iot_box_builder` can still be found by system processes using symlinks. Forward-Port-Of: odoo/odoo#233423
This update adds shared helper methods for accounting tests, making it easier for developers to create invoices, sales orders, reversals, and down payment scenarios consistently. It does not change customer-facing behavior, but it supports more reliable and maintainable accounting-related testing in future work.
Original PR description
This commit adds bunch of helper methods on AccountTestInvoicingCommon to make it easier to do generic accounting test actions, such as: - creating invoice - creating sale order - reversing invoice - skipping test if module isn't installed - creating down payment invoice ... and many more. We're aware that there are thousands of different helpers for creating invoice out there in different localizations. This commit serves as the first necessary step to create one standard that can be extended across all other test helpers. This is a simplified version of the merged commit in master. We are not refactoring/rewriting any other test to use these new helpers. Our goal is just to make it available for everyone to start using this helper on their accounting-related tests. task-4891206
3 changes
Enhancements to existing features
This update adds identifiers to two stock transfer status fields so they can be customized separately. It helps teams and implementers adjust stock workflows more precisely without changing the visible business process.
Original PR description
IDs were incorporated into the two state fields to facilitate the process of inheriting these distinct states individually. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves how an error is handled in the stock forecast report, making debugging more precise when an unexpected value is encountered. It helps support and development teams identify the cause faster, with minimal direct impact on day-to-day users.
Original PR description
Description of the issue/feature this PR addresses: Address the Exception precisely for debugging(Optional) Current behavior before PR: exception caused by calling field from Bool Desired behavior after PR is merged: Adresse issue when debugging --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Stock moves are now marked as picked only when every related move line has been picked. This prevents partially completed stock operations from appearing fully picked, improving inventory accuracy and operational clarity.
Original PR description
### Current behavior before PR: The stock move is marked as picked also if only one move line is picked ### Desired behavior after PR is merged: The stock move will be marked as picked only if all stock move lines are "picked" --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr