Daily updates from Odoo
Wednesday, July 9, 2025
56 changes · master
Security fixes and vulnerability patches
VoIP permissions were updated so users can only view and manage calls, providers, and related records appropriate to their role and company. New officer and administrator roles make access easier to manage while reducing the risk of users seeing or changing data outside their responsibility.
Original PR description
- Introduced new user groups for VoIP officers and administrators with specific access rights to calls and providers. - Updated access rules to restrict CRUD operations based on company affiliation. - Added demo data for testing user access rights. This commit improves the overall security and usability of the VoIP module, ensuring that users can only access relevant data based on their roles and company associations. Task-3695951
UK HMRC and CIS reporting records now store related files directly instead of linking through a shared attachment record. This reduces the risk of users gaining unintended access to other documents and improves data protection for tax-related files.
Original PR description
This is part of a general change for all the many2one ir.attachment fields to binary to avoid security issues, as many2one would allow access to all ir.attachment records. task-4771709
WhatsApp attachment deletion now uses a temporary, limited access token instead of a permanent one. This reduces security risk while making the deletion process simpler and easier to maintain.
Original PR description
This is a follow up to odoo/odoo#204830 to replace the permanent access token with a temporary one for deleting the attachment. Aside from the security benefit, this change makes the `mail_attachment_delete` route flow and associated helper methods simpler and more straightforward. Related to: odoo/odoo#208066 task-4746347
New functionality added to Odoo
Saudi payroll now includes a dedicated salary structure for managing employee salary advances and loans. This adds the related payroll rules, input types, reporting updates, and accounting test coverage so these deductions and payments can be handled more consistently.
Original PR description
- Add the new salary sturcutre for advamced salray and loan management. - add the needed new rules - add the new other input for the new struct - create new rule category for loans Task: 4480752
Payroll users can now access a dedicated report for other payslip inputs, similar to existing reports for payslip lines and worked days. This makes it easier to review and analyze additional payroll components in one place.
Original PR description
This commit adds a new payroll report for all other inputs, as it is already the case with payslip lines and worked day lines. task-4900762
Users can now attach documents directly from the Documents app when writing in Chatter, including from the full message composer. They can also paste shareable document links into Chatter, making it easier to reference and share business files in conversations.
Original PR description
- Introduced the ability to add documents as attachments directly within Chatter.  - Introduced the feature where the SHARABLE LINKS for the documents can be directly pasted on the chatter.  - Same menus can be accessed from the full composer as well. Same functionality from there as well.  Task-4237088
Enhancements to existing features
The IoT Box discovery dialog has been updated to make the setup flow easier for users to understand and complete. This should reduce confusion when connecting an IoT Box and improve the overall onboarding experience.
Original PR description
We updated the IoT Box found dialog in order to ease user experience. Task: 4922620 Forward-Port-Of: odoo/enterprise#89608
The IoT app device list now shows each device's connection status. This makes it easier for users to quickly identify whether devices are online or need attention without opening each device record.
Original PR description
This PR adds the connection status to the device list view in the iot app Forward-Port-Of: odoo/enterprise#89632
The Colombian localization now supports retrieving required customer name and email information directly from DIAN using the customer's identification type and number. This helps businesses comply with Colombian rules that limit what customer information they can request while keeping invoicing data complete.
Original PR description
The Colombian government restricts the information a company can ask from their customers to only their identification type and number. The other data (name and email) is required to be fetched from the DIAN service. task: 4796355 Forward-Port-Of: odoo/enterprise#86172
This update adds support for a mobile-style bottom sheet experience and adjusts related automated tests. It helps users access actions and options on smaller screens without leaving their current context.
Original PR description
A BottomSheet is a UI component in mobile apps that slides up from the bottom of the screen to display additional content or options. It can be partially or fully expanded and is commonly used for actions, menus, or forms. BottomSheets provide a non-intrusive way to show relevant information without leaving the current screen. This commit fixes JS tests task-4551522
A Web Studio automated test was adjusted to match recent changes in the available editor options. This helps keep quality checks stable and reduces the chance of false test failures after similar updates.
Original PR description
In https://github.com/odoo/odoo/pull/216638, the lists of operators available for selection in the tree editor have been changed for several field types. Here we adapt a studio test to that change and make it less likely to fail if similar changes would be brought. Task ID: 4894524
IoT devices are now shown with a cleaner name format in places that support formatted display, such as POS configuration dropdowns. This makes it easier for users to identify the device, its connection, and its IoT box at a glance.
Original PR description
Before this commit, IoT device names would dislplay in the format '[iotbox] Device Name'. After this commit, in environments with formatting enabled (such as the device dropdown when configuring in POS), we show the name with the following format: Device Name Connection IoT box Where Connection and IoT box are using muted text. task-4922608  Forward-Port-Of: odoo/enterprise#89703 Forward-Port-Of: odoo/enterprise#89664
Contract templates now show more of the information that was previously lost after HR and contract records were merged. The template form has been reorganized across payroll and localized payroll modules, making it easier for teams to configure contracts consistently.
Original PR description
Since the merge of hr and contract, we only have a form view for contracts for templates. Thus, during the merge, a lot of info has been lost on contract template form view. This commit, reintroduce fields that were present in saas-18.3 and re-organize them. task-4904024
The tree editor now supports building more complex rules with repeated AND and OR conditions. This makes it easier for users configuring views, spreadsheets, and filters to express advanced criteria without workarounds.
Signer names in the Sign app are now loaded once per request instead of repeatedly. This reduces unnecessary database work and makes templates with many roles open and respond more smoothly.
Original PR description
Currently, the application retrieves signer names multiple times from the database, leading to unnecessary overhead and delays. By modifying the logic to fetch signer names only once per request, we significantly reduce the number of database calls. This change will result in a smoother and faster user experience, especially when dealing with templates that contain many roles. task-4841694
The printer test button in IoT now works more like regular receipt or report printing, improving consistency for users. If the usual connection method fails, the system automatically falls back to another method, making printer testing more dependable.
Original PR description
The "test" button on printer devices should behave exactly as printing a receipt/report in other apps. We now use the IoT http service to handle longpolling call then websocket if longpolling fails. We also updated all other calls to use this service instead of simple longpolling service. Community PR: odoo/odoo#217932 Task: 4922613 Forward-Port-Of: odoo/enterprise#89638
AI tools can now be declared in a cleaner, more maintainable way, reducing setup complexity for future AI capabilities. The change also adds checks that tool definitions and inputs are valid, helping prevent misconfigured AI actions from running incorrectly.
Original PR description
*: ai_calendar,test_ai Remove the need for server action records when declaring AI tools. Tools are now defined by decorating methods with @register_ai_tool, making declarations cleaner and more…
*: ai_calendar,test_ai Remove the need for server action records when declaring AI tools. Tools are now defined by decorating methods with @register_ai_tool, making declarations cleaner and more maintainable. Schema validators are introduced to support basic parameters schema. These validators are used at app loading via _register_hook to ensure tool parameters are properly defined. More complicated schemas will be supported in the future if necessary. Input validation is also introduced. Whenever a tool is called, the input is tested against the schema declared for the called tool, raising a validation error if the input doesn't match the tool schema. Important note: It's not enough to decorate a method to register it as an AI tool. A corresponding `ai.tool` record has to be created. It has to be done this way to avoid auto-generation of `ai.tool` records. Moreover, `ai.tool` records have to be created for finer control since the tools are linked to the `ai.topic` records. task-4791949 Co-authored-by: Joseph (jcb) <jcb@odoo.com>
The Point of Sale IoT scale integration now applies the latest weighing behavior in Enterprise as well as Community. This helps avoid duplicate weighing actions at checkout, reducing operator mistakes and improving reliability when using connected scales.
Original PR description
The main changes are in the community PR odoo/odoo#213537. This commit simply adds a call in the `scale_service.js` override to ensure the new behaviour is also enabled in Enterprise. task-4859589 Forward-Port-Of: odoo/enterprise#89763 Forward-Port-Of: odoo/enterprise#87296
Resolved issues and error corrections
Credit notes in the Kenya eTIMS workflow can now only be submitted when they are linked to an invoice that was already successfully submitted. This helps prevent rejected or invalid credit note submissions and keeps tax reporting aligned with eTIMS requirements.
Original PR description
To ensure credit notes are only submitted for invoices that have been submitted to eTIMS, we now restrict credit note submission to cases where the related invoice has already been successfully submitted. Forward-Port-Of: odoo/enterprise#89464 Forward-Port-Of: odoo/enterprise#89385
This update prevents translation-related errors that could occur when sharing referral links or working with loan records. The change improves reliability by adjusting how translated text is prepared, without changing user-facing features.
Original PR description
Issue: Prior to this commit, a translation issue occurred due to the use of a list comprehension. The _get_translation_source function attempts to scan the local variables, but in the context of a list comprehension, only variables defined within the comprehension are accessible. As a result, variables like uuid and cursor were not available to the _get_lang function, ultimately leading to an error. Fix: Replaced the list comprehension with a standard for loop to ensure proper access to local variables. runbot-98198 Forward-Port-Of: odoo/enterprise#88632
The intercompany rules settings now use clearer wording for the option related to creating invoices. This reduces confusion for users configuring automated transactions between companies.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/4b57698670a7762bb206ccb24417d63c8edc1a46 change the ux of the intercompany rules, but the naming is confusing for users. task-4907810 Forward-Port-Of: odoo/enterprise#89368
The Time Off Type configuration form now displays localization and payroll-related options in a more consistent two-column layout. This makes the setup screen easier to scan and use, with the Payroll section placed more logically below Negative Cap settings.
Original PR description
* = l10n_in_hr_holidays, l10n_ae_hr_payroll, l10n_be_hr_payroll Steps: - Navigate to Time Off > Configuration > Time Off Types. - Open any time off type form with localization or payroll-related options. Issues: - Configuration fields (including localization modules) appeared misaligned. - The Payroll section was not utilizing space effectively in the layout. Fix: - Aligned all configuration fields in a consistent two-column layout, including localization and payroll-related options., - Repositioned the Payroll section below the Negative Cap section. Task - 4759116
Customer follow-up reports now ignore accounting entries that do not have a due date or payment terms. This prevents customers from being incorrectly flagged for follow-up or receiving statements that show a zero balance as overdue.
Original PR description
### Issue: It is possible to break the followup reports by directly creating entries in the past. ### Steps to reproduce: - Example on Belgian loca - Accounting Dashboard > Misc > new Entry with -…
### Issue: It is possible to break the followup reports by directly creating entries in the past. ### Steps to reproduce: - Example on Belgian loca - Accounting Dashboard > Misc > new Entry with - Date far in the past (ie 2024-01-01) - Account: "400000 Customers", Partner: "test partner", Debit: 500.0 - Account: "499000 Suspense Accounts", Credit: 500.0 - Post - In Customers > Follow-up reports, the partner is marked as "In need of action" even if no due date was specified - Accounting Dashboard > Bank > new with Amount: 500.0 - "Save & Close" then click on it - In the page "Manual Operations" change the partner to the one from the MISC entry - Change the Account to "400000 Customers" - Validate - The follow-up report is no longer "In need of action" - Create an invoice with a due date in the future - The follow-up report is back to "In need of action" with the amount of the invoice - When sending the follow-up, the Customer statement reads "your account shows an outstanding balance of 0.00€" ### Cause: The origin of this issue is that the MISC entry and the Bank payment are not reconciled. The MISC entry is used to calculate the state of the followup making it to "In need of action" but the bank entry is balancing the amount to 0.00€. The MISC entry should not be used to compute the followup state as it has no due date specified (it makes no sense, it is never linked to any invoice). But in the code when there are no `line.date_maturity` we fallback on `line.date`. ### Solution: The lines without due date or payment term should not be used to compute the state of the followup or calculate the total due. So we remove the fallbacks on `line.date` when `line.date_maturity` is False. Some tests needed to be adjusted as they were not using any payment terms or due date. They were working because of the fallback on `line.date`. opw-4784250 Forward-Port-Of: odoo/enterprise#89627 Forward-Port-Of: odoo/enterprise#87873
This fix ensures several enterprise apps consistently target real-time message updates to the correct recipients. It helps prevent missed or misrouted notifications in workflows such as approvals, knowledge articles, helpdesk live chat, VoIP, e-invoicing, and WhatsApp conversations.
Original PR description
\* = approvals, knowledge, l10n_mx_edi, voip, website_helpdesk_livechat, whatsapp Enterprise counter-part. https://github.com/odoo/odoo/pull/215869 Forward-Port-Of: odoo/enterprise#88531
Fixes an issue where tax reports could overstate the net taxable amount when invoice lines used the same tax but different analytic distributions. This helps businesses rely on accurate tax reporting while keeping the tax amount calculation unchanged.
Original PR description
### Issue: When having two lines on an invoice with the same tax and different analytic distribution, the base value is doubled on the tax report. ### Steps to reproduce: - Create a new tax on sales…
### Issue: When having two lines on an invoice with the same tax and different analytic distribution, the base value is doubled on the tax report. ### Steps to reproduce: - Create a new tax on sales (eg 10%) - Make sure the option "Analytic Accounting" is ticked in the settings - Create an invoice with two lines (eg both at $100), add the tax on both - Change the analytic distribution on both lines to different values - Confirm the invoice - Go to the tax report - Select the report "Group By: Account > Tax" - On the report the "Net" amount is doubled ($400), the tax amount is correct ($20) ### Cause: On the invoice we can see in "Journal Items" that two tax lines are created instead of one (one for each analytic distribution). The "Group By" reports are generated by [this query](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L92). At the [creation of the second subtable](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L164-L198) the move lines are linked together based among other things on the tax id. The [filter on analytic distribution](https://github.com/odoo/odoo/blob/51fcbd211d2b1abf4b93becedbcbb9e03002cdd6/addons/account/models/account_move_line_tax_details.py#L187-L191) does not apply here as `tax.analytic = False`. The result is that each tax line is linked with both base lines. The second subtable have 4 lines in this case, with each base line doubled. The result of the query have the base amount doubled. ### Solution: We cannot fix the query as there is no link to find the tax line origin amongst the base lines. The method `_read_generic_tax_report_amounts` in `account_reports` is made to fix the base values in report in case of duplicate. Until now it did not include the duplication caused by analytic distribution but duplication because of repartition lines for example. The fix is to use this method also for analytic distribution. So we add `tdr.analytic_distribution` in the `GROUP BY`. This value must be returned by the query in `account` so we add it. opw-4753676 Forward-Port-Of: odoo/enterprise#89569 Forward-Port-Of: odoo/enterprise#87404
The Contact map view now opens Google Maps using the contact's full address instead of potentially imprecise stored coordinates. This helps users get the correct destination when choosing to view a contact location in Google Maps, especially when OpenStreetMap geolocation is less accurate.
Original PR description
**Steps to reproduce:** - Install Contact app - Create a contact with a specific address - Go to the Map View of the Contact app - Filter to view the new contact - Position in the map might be…
**Steps to reproduce:** - Install Contact app - Create a contact with a specific address - Go to the Map View of the Contact app - Filter to view the new contact - Position in the map might be slightly different from given one (when using OpenStreeMap) - Click on the position marker > `Navigate To` the address is recomputed correctly - Click on `View in Google Maps` the address given is often wrong **Issue:** Previous solution was trying to build the url used by the `View in Google Maps` button by using `partner_latitude` and `partner_longitude`. These were previously computed using the default geolocalization method. If it was set on OpenStreetMap, the coordinates were not precise enough and impacted the Google Maps results. As described in the documentation : `OpenStreetMap might not always be accurate.` But this shouldn't impact Google Place API results. **Fix:** Adapted the computation of `googleMapUrl()` to use `contact_address_complete` to ensure the addresses are recomputed properly when sent to Google Maps. opw-4649910 Forward-Port-Of: odoo/enterprise#87430
This fix adjusts the payroll expense test setup so it no longer uses a default account that could cause duplicate accounting entries to be selected. It helps keep payroll expense reconciliation checks reliable after recent accounting logic changes.
Original PR description
This commit removes the default account set in the setup of test_payroll_expense. Because of 67b5fc47ca4aa1abb60f198a87d7784ef400f796 the filter in get_all_amls_to_be_reconciled would get multiples amls instead of only one. community pr: https://github.com/odoo/odoo/pull/211443 opw-4751270 Forward-Port-Of: odoo/enterprise#88862 Forward-Port-Of: odoo/enterprise#86987
Planning now calculates open shifts correctly when a copied weekly schedule includes a day where an employee is on leave. This prevents lunch breaks from being counted as extra allocated time, giving managers more accurate staffing hours.
Original PR description
**Issue:**
When a resource is on leave for a particular day, and an open shift is created for that day, the open shift includes lunch time, which causes the total allocated hours to be incorrect.
**Example:**
- Shift duration: 1 week (27th to 31st January)
- Resource on leave on 30th January
- Move to the next week and copy the previous week's shift
- New shift created:
- Monday to Wednesday and Friday assigned
- Open shift on Thursday (9 hours allocated)
However, 1 extra hour is added in the open shift.
**Steps to Reproduce:**
-Install the planning_holidays module.
- Create a shift for the week (27th to 31st January).
- Add leave for 6th February.
- Copy the previous week's shift.
- Check the allocated hours for 6th February.
task-4224781
Forward-Port-Of: odoo/enterprise#89542
Forward-Port-Of: odoo/enterprise#73478The update prevents an error when users run automatic reconciliation models without any bank statement lines available. Instead of failing with a database error, the process now exits cleanly, improving reliability for accounting workflows.
Original PR description
SQL syntax error occurs when trying to auto reconcile transactions via reconcile models,it is because there are no statement lines to reconcile. **Steps to reproduce:** * Install `accountant` module (No demo data needed) * Accounting Dashboard> Bank dropdown menu * Under reconciliation>Models>Internal Transfers>Run Now `syntax error at or near ')' LINE 57: WHERE st_line.id IN ()` **Solution:** * Return the function if there are no statement to reconcile. **Sentry-6610155279** Forward-Port-Of: odoo/enterprise#85937
This fix prevents an error when assigning scanner devices during Point of Sale IoT configuration. Businesses can complete scanner setup more reliably without manual troubleshooting.
Original PR description
The error occurs because `append()` is used on the Many2many field `iface_scanner_ids` in `pos_config`, which is not allowed. Traceback: `AttributeError: 'iot.device' object has no attribute 'append'` Many2many fields should be updated using `|=` to add records, as the Python list method `append` is not supported for relational fields. [1]- https://github.com/odoo/enterprise/blob/5bff585cfa24940626b14cdeaeae07b50a931e94/pos_iot/wizard/auto_config_pos_iot.py#L55 sentry-6719710908 Forward-Port-Of: odoo/enterprise#89123
Opening the filters panel while editing the subscription dashboard no longer causes an error. The fix ensures filter suggestions only use filters relevant to the current dashboard data, improving stability for users managing spreadsheet dashboards.
Original PR description
Steps to reproduce: 1. Edit the subscription dashboard 2. Open the filters side panel => Boom This is caused by the fact that the suggestions store was trying to match filters that are not matching the current model. Task: 4911733 Forward-Port-Of: odoo/enterprise#89606
The update corrects test reference files so they now verify XML namespace details for payment and electronic invoicing formats. This helps catch formatting issues earlier and improves confidence that country-specific electronic documents remain compliant.
Original PR description
Before, we weren't asserting XML namespaces when calling `assertXmlTreeEqual`. As a result, many expected XMLs in EDI tests had incorrect namespaces. Now that we change the test method to check namespaces, we also need to fix the expected XMLs. Community PR: https://github.com/odoo/odoo/pull/214764 task-none Forward-Port-Of: odoo/enterprise#89476 Forward-Port-Of: odoo/enterprise#87950
This fix ensures the Indian GSTR-1 report JSON always includes the expected document issue field, even when there are no entries. It prevents automated validation failures and helps keep tax report generation reliable.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705 Forward-Port-Of: odoo/enterprise#89711 Forward-Port-Of: odoo/enterprise#89635
Users can now upload files from the Documents app control panel as expected. This fixes a bug where choosing a file appeared to do nothing, helping teams add documents without switching workflows.
Original PR description
Reproduce: 1. In the Documents app's control panel, click on New 2. "Upload" 3. Choose a file and confirm -> nothing happens. Task-4926208
The VoIP softphone now uses a minus icon instead of an X for hiding the call window. This makes users less likely to worry that clicking the control will end their call, improving confidence during active calls.
Original PR description
The "cross icon" (X) is believed to be too "scary"; people don't dare to click it in the middle of a call out of fear of hanging up, even though the softphone window might be in their way. The "minus icon" (-) might deceive one's expectations by hiding the window rather than minimizing it, but we decided that it was still better this way. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89555
CSV imports for bank statement lines now preserve the statement reference already present in the imported file instead of creating a new bank statement every time. This prevents duplicated or incorrect bank statements when teams export and re-import reconciliation data.
Original PR description
…id during import In the override of execute_import of account_bank_statement_import_csv.py a new account.bank.statement was always created even if the import contained statement_id. Steps to reproduce: - Export an account.bank.statement.line in bank rec with the statement_id included. - Import it back. The statement_id of the imported lines is a new one. opw-4753864 Forward-Port-Of: odoo/enterprise#87885 Forward-Port-Of: odoo/enterprise#87165
Creating a new employee contract through the salary configurator now automatically ends the previous contract the day before the new one begins. This prevents overlapping contract periods and keeps employee contract records accurate without manual correction.
Original PR description
When you create a new contract through the salary configurator flow, it will create automatically a new version with the date encoded in the offer wizard. However, the 'contract_end_date' for the old version is not automatically updated. The logic has been adjusted to end old contract date the day before the new contract's start date. Forward-Port-Of: odoo/enterprise#88915
The Signed Contract button on salary offers now opens the correct employee contract version after all signatures are complete. This prevents confusion for HR users and ensures they review the right signed employee information.
Original PR description
- Fixed an issue where clicking the "Signed Contract" smartbutton after full signature opened an incorrect employee version. Task-4873800 Forward-Port-Of: odoo/enterprise#89051
This fixes an error that prevented Belgian companies from exporting the Social Balance Sheet report as PDF or XLSX. Payroll users can now generate the required report without interruption.
Original PR description
Since the introduction of versions, a traceback occurs due to an old function call Task: 4911701 Forward-Port-Of: odoo/enterprise#89149
This fix makes an internal quality check correctly detect missing database indexes in all test environments, preventing issues from being missed before release. It also adds the missing indexes found by the corrected check across accounting, ESG, payroll localization, and point-of-sale areas, improving consistency and reducing future performance risk.
Original PR description
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria…
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria used to ignore the field for indexing was if it belongs to a `test` model in some test module. The best-effort heuristic used for this is to see if there is some `ir.model. data` associated with the model in question and if all module's names associated with these data entries have `test`, then we can ignore the field for indexing. But due to the semantics of `all` for empty collections: ```py assert all([]) is True ``` models that had *no* `ir.model.data` associated at all, e.g. install `--without-demo` and no master data, the field would be ignored for indexing, leading to a passing test. But on nightly, where the CI is run with demo data also, the field isn't ignored anymore and is caught by the test's assertion for indexing suggestion as expected. This leads to errors that are never addressed by the developer that added the fields in question. This commits corrects the test and add the missing indexes that were raised from the CI's false-positive that were missed. Reference --------- runbot-227546 Forward-Port-Of: odoo/enterprise#89732 Forward-Port-Of: odoo/enterprise#88998
This fixes an error that could block Uruguay electronic invoice XML generation when a user manually removed a journal item description. The system now safely handles empty descriptions, helping invoices continue to be processed and sent to DGI.
Original PR description
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description…
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description automatically populates with the product name upon line creation. However, users can intentionally clear this field. If the description field becomes empty, its value is interpreted as `False`. This leads to an `AttributeError: 'bool' object has no attribute 'replace'` traceback when the `_l10n_uy_edi_get_line_nom_and_desc` method attempts to process this boolean value, as it expects a string. This issue specifically affects the generation of the "DscItem" tag in the XML file sent to DGI. ### Solution: To prevent this error, an additional validation has been implemented for the line description. This validation ensures that if the field's value is `False`, it is not processed by the `_l10n_uy_edi_get_line_nom_and_desc` method, thus avoiding the traceback. Forward-Port-Of: odoo/enterprise#89407
Fixed an issue where purchase order discount lines could create an extra budget report entry with the discount counted twice. Budget views now reflect invoiced purchase lines more accurately, helping teams avoid overstated budget impacts.
Original PR description
Steps to reproduce: - Create a new Budget with budget line having Project [TEST] - Create a purchase order with 2 lines: 1. Product A, analytic [TEST], price unit 100, qty 1 2. Product B, analytic [TEST], price unit -10, qty 1 - Confirm the PO, mark products as received - Create the bill and confirm - Go back in PO, click on Budget smart button, open list view Issue: The budget report will correctly show a line for each invoiced line, but an extra line with double discount amount is present Occurs because we use a SQL code to replicate the qty_invoiced field of a purchase order line, but we adjust the sign based on the aml balance instead of taking into account the move type opw-4775631 Forward-Port-Of: odoo/enterprise#89545
This fixes an internal issue in cash basis accounting reports where report filters could fail because the filtering rules were being modified incorrectly. The change helps reports run reliably and avoids runbot errors without changing business workflows.
Original PR description
Domains are immutable, append replaced by the and operator. runbot error 229710
The employee payroll tab has been corrected in several country-specific payroll setups. This helps HR teams access the right payroll information consistently when viewing employee records.
Original PR description
This fixes the payroll tab in the inherited view of employee for various loca. Task: 4885749 Forward-Port-Of: odoo/enterprise#88734
VoIP now removes parentheses when cleaning phone numbers, so numbers copied or entered with common formatting are processed more reliably. This helps avoid call issues caused by formatted phone numbers such as those containing brackets.
Original PR description
Add parentheses to the list of characters that are stripped from phone numbers. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89625 Forward-Port-Of: odoo/enterprise#89551
This fix improves how Odoo detects overlapping project tasks when filters use related information. It prevents valid overlaps from being missed and corrects a test so planned hours are properly considered.
Original PR description
The query that determines overlapping tasks is making two different Query objects: the first one for the main task and the second one for overlapping tasks. The second query is joined into the first one, injecting the second one's where clause as join condition, but that composition does not work if the second query has extra joins. Those extra joins come from related fields that may occur from the domain. The fix consists in recomposing the query with a join condition that does not depend on a dynamic domain, and injecting the domain in the where clause of the main query. With this strategy, the joins that appear because of the related fields in the domain are part of the main query, and are no longer lost by the composition. Note also that the test test_same_user_overlap_with_allocated_hours_less_than_workable_hours was actually broken, because the field allocated_hours wasn't flushed when doing the SQL query. The new query flushes the field, and the test has been fixed.
This fix ensures that refunds in Point of Sale correctly wait for all required steps before continuing. Businesses using both Spanish TicketBAI and Peruvian e-invoicing POS localizations will now see the required refund reason prompt as expected, reducing refund processing errors.
Original PR description
When both l10n_es_pos_tbai and l10n_pe_edi_pos are installed, the refund reason popup was not showing up because we were not awaiting the super method call in the l10n_pe_edi_pos override. runbot-227630 Forward-Port-Of: odoo/enterprise#89423 Forward-Port-Of: odoo/enterprise#88813
Code cleanup and technical improvements
This update reorganizes shared tour-testing utilities so they are easier to split into separate loading bundles later. It should not change day-to-day user behavior, but it supports future performance improvements by loading automatic tour code only when needed.
Original PR description
In this commit, we move step_utils to the root of web_tour/static/src. The goal is to move all the files that are in tour_service into web_tour/static/src and then split it into tour_automatic and tour_interactif in order to create 2 separate bundles and be able to lazy load what tour_automatic needs only when we launch an automatic tour.
This update reorganizes how Frontdesk page content is handled so formatting is applied closer to where the content originates. It should not change the visitor experience, but it makes the Frontdesk code easier to maintain and less prone to future display issues.
Original PR description
markup should be used as close as possible to the data source.
The barcode-related screens were updated to use safer, cleaner ways of building interface text and layout. This reduces internal security warning noise and helps keep warehouse barcode features easier to maintain without changing day-to-day user workflows.
Original PR description
Use markup template and html functions to make the code cleaner and safer while no longer triggering ci/security flag.
The social app’s post formatting code was reorganized to use safer, more consistent markup handling. This reduces internal security warning noise and helps protect how social content is displayed without changing the user experience.
Original PR description
Use markup template and html functions to make the code cleaner and safer while no longer triggering ci/security flag. Also markup should be used as close as possible to the data source. https://github.com/odoo/odoo/pull/216159
The VoIP keypad code was updated to use safer, cleaner markup handling. This reduces internal security scan noise and helps maintain the feature without changing how users interact with it.
Original PR description
Use markup template and html functions to make the code cleaner and safer while no longer triggering ci/security flag.
This update cleans up the live chat helpdesk code by reducing duplicated logic and removing unused pieces. It should make the feature easier to maintain without changing how users interact with live chat.
Original PR description
Comments applied from the previous PR. 1. Reduce duplicate code in im_livechat; 2. Remove unused code in im_livechat; follow up of https://github.com/odoo/enterprise/pull/89573 Forward-Port-Of: odoo/enterprise#89648
The website sale test suite was updated as part of an internal modernization of comparison and wishlist behavior. This helps keep these shop features aligned with newer frontend technology while preserving expected customer journeys.
Original PR description
task-4873403 Community PR: https://github.com/odoo/odoo/pull/214349 Upgrade PR: https://github.com/odoo/upgrade/pull/7975
This update simplifies how some Odoo web requests access system context behind the scenes. It helps keep the platform codebase cleaner and easier to maintain, with no expected change to day-to-day user workflows.
Original PR description
odoo/odoo#217761
Miscellaneous changes
- Create a sub company from the main company. - On only the sub-company create a new followup level. - While being in both the main company and the sub-company at the same time, try to access the newly created followup level in the followup report view. The following traceback appears: File "/home/odoo/src/odoo/addons/web/models/models.py", line 128, in web_read vals = many2one_data[values[field_name]] KeyError: 9 This commit hide the statusbar for the child company if there is followu
Original PR description
- Create a sub company from the main company. - On only the sub-company create a new followup level. - While being in both the main company and the sub-company at the same time, try to access the newly created followup level in the followup report view. The following traceback appears: File "/home/odoo/src/odoo/addons/web/models/models.py", line 128, in web_read vals = many2one_data[values[field_name]] KeyError: 9 This commit hide the statusbar for the child company if there is followup level in the parent as per the specification of https://github.com/odoo/enterprise/commit/bbcd54519706539d7e2e313118c956200ea70c91 and the implementation of https://github.com/odoo/enterprise/commit/f82ef250560957046be0590f8c2a08039bcc34ca#diff-c502b098cfa2c57bc70c144ae4f0e1fbe1c0116f392ed1a63743f12a51b82084 opw-4669397 Forward-Port-Of: odoo/enterprise#85977 Forward-Port-Of: odoo/enterprise#82324