Daily updates from Odoo
Monday, December 16, 2024
33 changes · 18.0
Enhancements to existing features
Accounting reports can now use read-only database replicas when a report does not need temporary write operations. This helps spread system load and can improve report responsiveness without changing the report content users see.
Original PR description
api.readonly allows running the queries of an rpc call in readonly mode, on a replicate of the database, in order to better spread the load. So far, accounting reports didn't use them because, in some cases, their computation requires the creation of a temporary table. We improve that by introducing a new option key telling whether the report can run in readonly mode or not, depending on the fact such temporary table is in use or not. The value of this option key then influences which end point is called to compute the report between the regular one, or an api.readonly version of it.
Resolved issues and error corrections
This fixes an error that could occur in the accounting currency logic after a recent change. It helps keep accounting workflows stable by preventing an unexpected system failure in affected cases.
Original PR description
Fix an UnboundLocalError introduced by c440bb52d19b8dcec8b708509973c4095a577b34
The emoji picker now uses the intended background color so it appears correctly when dark theme is enabled. This fixes a visual inconsistency from a previous backport and keeps the picker easier to read without changing functionality.
Original PR description
Follow-up of https://github.com/odoo/odoo/pull/190586 Backport mistakenly removed the `.bg-view` on EmojiPicker rather than replacing it to `.bg-100`. As a result, the style of emoji picker is off in dark theme. White theme color is slightly off but the difference is barely visible, so this is a non-issue in white theme. This commit makes the correct intended change: replace `.bg-view` by `.bg-100`. Also in master the component PickerContent is no more, but in 18.0 we have to take into account for the overall bg-color. This commit also makes this change. Before <img width="307" alt="Screenshot 2024-12-16 at 12 48 09" src="https://github.com/user-attachments/assets/f4bc0a49-9e63-43c6-acb5-1fb2c41bb0fb" /> After <img width="306" alt="Screenshot 2024-12-16 at 12 48 36" src="https://github.com/user-attachments/assets/2b2ff197-e0f3-48bd-9830-9715142fbebe" />
Portal users can now create API keys without encountering an error after the related setting is enabled. This restores the expected self-service flow for customers who need API access.
Original PR description
Reproduce --- - tick "Customers can generate API Keys" in settings - login as portal user - Connection & Security -> New API key -> give name -> Confirm ->BUG ``` TypeError: APIKeyDescription.create() missing 1 required positional argument: 'vals_list' ``` opw-4385632
This fixes an automated donation checkout test so it now confirms that the donation process has fully completed. The change helps prevent false test failures, improving confidence in website payment quality without changing the customer-facing donation flow.
Original PR description
In this commit, we fix the tour test_01_donation by adding a final step that attest the donation has successfully completed. By adding this final step, we avoid a "failed to fetch" type error. 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
Point of Sale refunds now calculate cash rounding consistently with normal sales. This prevents valid refunds from being blocked or left unpaid when cash rounding is applied, improving checkout reliability for stores using rounding rules.
Original PR description
The tax totals helper has been designed to manage business document expressed with positive lines. A refund in the pos is negative. So when dealing with cash rounding up and down, the computation wasn't the same for a refund than a regular sale. Then, the customer wasn't able to validate the refund because the cash rounding was consider as wrong and then, the refund wasn't paid even when making the same input as a sale pos order. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Payments in Invoicing-only setups now remain in process instead of being automatically marked as paid when no reconciliation is required. This prevents payments from being blocked from batch payments while still allowing them to be marked paid manually or when a batch is validated.
Original PR description
Currently, a payment without outstanding is set as paid as soon as the invoice is paid, most likely through the reconciliation widget. However, the decision was made to not require the reconciliation when using the enterprise Invoicing[^1]. These two facts are conflicting with batch payments since they can be used in Invoicing, but a payment cannot be added to a batch payment if it is already paid. The fix is to always keep a payment as "in process" if the full Accounting is not installed. They will still be marked if the user sets it manually, or through the batch payment when it is validated. [runbot-104545](https://runbot.odoo.com/web#id=104545&model=runbot.build.error) [^1]: odoo/enterprise@adfe6c2d5feb431043e78c423748ab87fae64084
This update fixes an internal automated test so it checks the intended device-detection path after route names changed. It helps ensure the test properly verifies that no tracking trace is created when the session flag disables it, reducing the risk of unnoticed regressions.
Original PR description
The `test_detection_no_trace_mechanism` test checks that no trace is created with the flag in the session. Commit 7aa53005688291a6c903ba759f76574cd35bff77 renamed the routes in `test_http`. This test does not fail, because even if the route does not exist, no trace is created. It is necessary to correct the route so that the test covers the use of the flag in the session.
Exporting all records from a grouped list now shows accurate group totals. Archived records are no longer counted unless they are actually included in the export, preventing misleading spreadsheet results.
Original PR description
Before this commit, exporting all records in a grouped list view generated wrong group counts in the sheet, because archived records where taken into account (even though they weren't exported). The issue comes from [1], which we kind of revert. [1] https://github.com/odoo/odoo/pull/166097 task~4375142 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
The Sign module now ensures its guided test tour can continue correctly after redirecting to the documents page. This prevents automated checks from timing out, improving reliability without changing normal user workflows.
Original PR description
When tour resume at redirect step, the route is /sign/documents/. For this route, tour js file is not in manifest. Then the tour abort and is not resumed. After this commit, the tour is not aborted and the error "Script timeout exceeded" is avoided.
Users on phones and other small screens can now start new comment threads in Knowledge articles. This fixes a mobile editing issue so feedback and collaboration work consistently across devices.
Original PR description
In small UI mode (designed for smartphones and mobile devices), new comment threads could not be added (through they could be replied to). Steps to reproduce: - Access a Knowledge article in mobile UI mode - Tap and hold on a word in an article body to create a selection - Scroll the toolbar at the bottom of the screen - Click on the Comment button This commit makes it so that users of mobile devices can now add new comment threads to a Knowledge article. task-4399014
Installing Website Product Barcode Lookup no longer fails when users have previously removed manufacturer or brand product attributes. This prevents setup interruptions and makes the module more reliable for databases with customized product attributes.
Original PR description
Currently an error occurs when a user deletes 'manufacturer' or 'brand' product attributes and tries to install `website_product_barcodelookup`. error: `Exception: Cannot update missing record 'product_barcodelookup.product_attribute_lookup_5'` This error is generated because at the time of installing above mentioned module, it tries to update the value of the above-deleted product attribute. This commit solves the above issue by using `forcecreate="False"` to bypass record creation if it violates checks. sentry-5771768396
The payroll payment report now uses the correct SEPA credit transfer format instead of the broader ISO 20022 format. This helps ensure payroll payment files match bank expectations and reduces the risk of rejected payment submissions.
Original PR description
The format of the payment report was iso20022 but it should be sepa_ct. Task: 4392276
The Re-Generate button now stays available when the online payment module is installed, so users can still regenerate SEPA payment files when needed. The button remains hidden for online payments, preventing it from appearing where it is not relevant.
Original PR description
This commit ensures the Re-Generate button remains accessible even when the account_online_payment module is installed. Previously, the button would disappear upon installation of the module. The updated logic ensures the button is available for SEPA payments while remaining hidden for online payments. task-4382642
SEPA Direct Debit payments now correctly find a customer's mandate when an invoice is issued to one of that customer's invoice addresses. This prevents valid direct debit payments from being blocked simply because the mandate and bank details are stored on the main customer record.
Original PR description
**Steps to reproduce:** - Install contacts, accountant and l10n_be - Switch to a Belgian company - In Accounting settings, activate "Customer Addresses" and "SEPA Direct Debit (SDD)" - Create a contact: * Country: Belgium * Bank Account: [a Belgian IBAN] - Add an invoice address to the created contact - Go to "Accounting / Customers / Direct Debit Mandates" - Create a mandate for the created contact - Create an invoice with the invoice address as customer - Confirm the invoice - Try to pay with "SEPA Direct Debit" **Issue:** No valid SEPA mandate is found for the customer. **Cause:** The mandate search is performed on the ID of the customer. As the customer is an invoice address, he is not associated to a bank account and a SEPA mandate. All these data are configured for his commercial partner. **Solution:** Search the mandates based on the ID of the commercial partner. opw-4276655
Fixes an issue where sign request emails could fail when linked to a record that does not have a name field. This improves reliability for custom or unusual records connected to signing workflows.
Original PR description
Before this commit the following traceback could be observed if a record did not had any name field and was linked to a sign request: `` 2024-12-16 08:41:09,063 27947 INFO…
Before this commit the following traceback could be observed if a record did not had any name field and was linked to a sign request:
``
2024-12-16 08:41:09,063 27947 INFO 18.0-sale_commission-next-sub-arj odoo.addons.mail.models.mail_render_mixin: Failed to render template: 683 Traceback (most recent call last):
File "<683>", line 44, in template_683
File "<683>", line 12, in template_683_content
AttributeError: 'x_toto' object has no attribute 'name'. Did you mean: '_name'?
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/arj/PycharmProjects/worktree/18.0/odoo/addons/mail/models/mail_render_mixin.py", line 415, in _render_template_qweb_view
render_result = self.env['ir.qweb']._render(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/arj/PycharmProjects/worktree/18.0/odoo/odoo/tools/profiler.py", line 306, in _tracked_method_render
return method_render(self, template, values, **options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/arj/PycharmProjects/worktree/18.0/odoo/odoo/addons/base/models/ir_qweb.py", line 601, in _render
result = ''.join(rendering)
^^^^^^^^^^^^^^^^^^
File "<683>", line 52, in template_683
odoo.addons.base.models.ir_qweb.QWebException: Error while render the template AttributeError: 'x_toto' object has no attribute 'name' Template: 683
Path: /t/p/t
Node: <t t-esc="request.reference_doc.name"/>
```
OPW-ticket: 4366583Resizing a Gantt chart item so its dates would become invalid is now safely cancelled. Users receive a clear warning instead of encountering an error, reducing disruption when adjusting schedules.
Original PR description
This commit fixes an issue with pill resizing: if the result of the resize would have the start date after the end date or the end date before the start date, it would result in an invalid operation error. After this commit, such an operation will only result in being cancelled with a warning notification to explain the problem. task-4320664
Batch payment checks were updated to ensure the feature continues to work even when the full Accounting app is not installed. This prevents related failures and supports smoother use for customers using a lighter accounting setup.
Original PR description
Make sure that the batch payments are working even if Accounting is not installed, related to a fix in community. [runbot-104545](https://runbot.odoo.com/web#id=104545&model=runbot.build.error)
Knowledge articles without a title now receive the expected name when users save changes with the save button. This prevents untitled articles from remaining unnamed and keeps article behavior consistent across save flows.
Original PR description
This commit fixes an issue with the knowledge controller when a record is saved without a name. Usually when an article has no name we ensure that it has the name when saving. One case where this issue wasn't covered is when you save the changes done via the save button. Before, the name of the article wasn't updated if it was not yet set and when they clicked on save. Now, the title is updated according to the logic applied everywhere. task-4398229
Fixed an error that occurred when users started a timer in Timesheets, selected a Helpdesk project, and then chose a task. This restores a missing background field so task selection works normally and reduces disruption for service teams tracking time.
Original PR description
Steps to reproduce: - In Timesheets app, go to kanban view. - Start the timer. - Select any Helpdesk project. - Try to select a task. Issue: - A traceback is thrown. Fix: - It is due to the fact that company_id field is removed from the kanban xml. - Thus not getting the value is throwing out a traceback. Solution: - Inject back the field into the kanban view. Issue from the PR: https://github.com/odoo/odoo/pull/172375 task-4382051
Code cleanup and technical improvements
Automated guided checks now wait 300ms instead of 400ms between default checks, helping test runs complete faster. This reduces runbot execution time without changing customer-facing business features.
Original PR description
By default, the checkdelay is 400ms when it is not stipulated in a tour. For performance reasons (runbot time), we reduce this delay to 300ms. 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
The Colombian e-invoicing checkout test automation was updated to use newer testing helpers instead of older jQuery-based code. This is an internal cleanup that helps keep tests easier to maintain without changing the customer checkout experience.
Original PR description
In this commit, we prefer to use tour helpers instead of jQuery.
Miscellaneous changes
In this commit we fix to two things: 1. For SEZ(intra state) with payment of `IGST`, the `IGST` on Intra used to be sent `False` for E-Invoice 2. For Overseas export, refund claimable is also used to be sent as `False` with same situation payable of `IGST` in case of export In this commit resolve the above issues 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
Original PR description
In this commit we fix to two things: 1. For SEZ(intra state) with payment of `IGST`, the `IGST` on Intra used to be sent `False` for E-Invoice 2. For Overseas export, refund claimable is also used to be sent as `False` with same situation payable of `IGST` in case of export In this commit resolve the above issues 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 Forward-Port-Of: odoo/odoo#190567 Forward-Port-Of: odoo/odoo#190151
To reproduce the issue: (Need more than one company) 1. Create a partner and link him to a specific company 2. In "Contacts & Addresses", add a new partner 3. Open this "child partner" Error: the child partner does not belong to the company defined at step 1 Commit [1] removed the field from the company, but this field is needed so we can define its value thanks to the onchange https://github.com/odoo/odoo/blob/988b47c0ca409a38c2f429a6db017eef17053c04/odoo/addons/base/models/res_par
Original PR description
To reproduce the issue: (Need more than one company) 1. Create a partner and link him to a specific company 2. In "Contacts & Addresses", add a new partner 3. Open this "child partner" Error: the child partner does not belong to the company defined at step 1 Commit [1] removed the field from the company, but this field is needed so we can define its value thanks to the onchange https://github.com/odoo/odoo/blob/988b47c0ca409a38c2f429a6db017eef17053c04/odoo/addons/base/models/res_partner.py#L529-L532 [1] https://github.com/odoo/odoo/commit/5639ed865c5a3b82bab25b0ecac28c68c02e9306 OPW-4247914 Forward-Port-Of: odoo/odoo#189324
Description of the issue/feature this PR addresses: - The last update on Mexican banks was five years ago. Since then, several new banks have emerged, while others have closed. Current behavior before PR: - 3 banks in our data no longer exist in real life. - 3 banks have outdated names. - 15 new banks aren't included, since they emerged after our bank data was updated. Desired behavior after PR is merged: - To align the bank list with those specified by the SAT (_Servicio de Administr
Original PR description
Description of the issue/feature this PR addresses: - The last update on Mexican banks was five years ago. Since then, several new banks have emerged, while others have closed. Current behavior before PR: - 3 banks in our data no longer exist in real life. - 3 banks have outdated names. - 15 new banks aren't included, since they emerged after our bank data was updated. Desired behavior after PR is merged: - To align the bank list with those specified by the SAT (_Servicio de Administración Tributaria_, Mexico's highest tax authority responsible for tax collection), you can refer to their [official documentation](http://omawww.sat.gob.mx/fichas_tematicas/buzon_tributario/Documents/catalogo_bancos.pdf). opw-[4327242](https://www.odoo.com/odoo/project.task/project.task/4327242) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#189387
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#190489
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#190489
When creating a supplier invoice for a provider of type "2nd category voucher issuer," the system incorrectly defaults the document type to 56 (Electronic Debit Note) instead of 71 (Electronic Fee Receipt). This results in additional manual corrections and risks errors if the document type is not updated before confirmation. This fix ensures the system automatically selects document type 71 for providers of this category, streamlining the process and reducing error potential. opw-4217228
Original PR description
When creating a supplier invoice for a provider of type "2nd category voucher issuer," the system incorrectly defaults the document type to 56 (Electronic Debit Note) instead of 71 (Electronic Fee Receipt). This results in additional manual corrections and risks errors if the document type is not updated before confirmation. This fix ensures the system automatically selects document type 71 for providers of this category, streamlining the process and reducing error potential. opw-4217228 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#188166
### Steps to reproduce: - Install "l10n_hu_edi" and switch to a Hungarian company - Create an invoice - Click "Send & Print", uncheck "NAV 3.0" and send it - Repeat step 3 - Error ### Cause: With l10n_hu_edi, Odoo is supposed to regenerate the invoices at each Send&Print. The way it was done is by overriding `_need_invoice_document` to not check anymore if `invoice.invoice_pdf_report_id` is empty. As the function `_prepare_invoice_pdf_report` from `account` is called when `_need_invoice
Original PR description
### Steps to reproduce: - Install "l10n_hu_edi" and switch to a Hungarian company - Create an invoice - Click "Send & Print", uncheck "NAV 3.0" and send it - Repeat step 3 - Error ### Cause: With…
### Steps to reproduce:
- Install "l10n_hu_edi" and switch to a Hungarian company
- Create an invoice
- Click "Send & Print", uncheck "NAV 3.0" and send it
- Repeat step 3
- Error
### Cause:
With l10n_hu_edi, Odoo is supposed to regenerate the invoices at each Send&Print. The way it was done is by overriding `_need_invoice_document` to not check anymore if `invoice.invoice_pdf_report_id` is empty. As the function `_prepare_invoice_pdf_report` from `account` is called when `_need_invoice_document` returns True, it is always called. But this function checks again if `invoice.invoice_pdf_report_id` is empty (https://github.com/odoo/odoo/blob/17.0/addons/account/wizard/account_move_send.py#L394-L395). So `invoice_data` doesn't have the key 'pdf_attachment_values' and it crashes at this line:
`pdf_values = invoice_data.get('pdf_attachment_values') or invoice_data['proforma_pdf_attachment_values']`
because it tries reading 'proforma_pdf_attachment_values' but the key is not there either.
### Solution:
Extend `_prepare_invoice_pdf_report` to remove `invoice.invoice_pdf_report_id`.
opw-4363559
Forward-Port-Of: odoo/odoo#190293
Forward-Port-Of: odoo/odoo#189442Steps to reproduce =================== - Open the barcode interface by selecting attendee from the barcode in the registration desk. - Click on any record it will open a dialog and the attendee is registered. - Now refresh the page again click on any record. - Form view will be opened this time instead of dialog. Technical ========== Context is added to the action from the js side when we click on the `select attendee` button and we loose that when we refresh the page. This commit r
Original PR description
Steps to reproduce =================== - Open the barcode interface by selecting attendee from the barcode in the registration desk. - Click on any record it will open a dialog and the attendee is registered. - Now refresh the page again click on any record. - Form view will be opened this time instead of dialog. Technical ========== Context is added to the action from the js side when we click on the `select attendee` button and we loose that when we refresh the page. This commit resolves the issue by adding the context directly in the action from XML side so when we refresh the page, the action will be loaded again and we will not lose the context. task-4273707 Forward-Port-Of: odoo/odoo#184472
Currently, an error occurs when trying to load onboarding 'Furnitures' without a product name 'Down Payment (POS). Step to produce: - Install the 'pos_sale' module. - Delete a product name 'Down Payment (POS)'. - Open a point of sale and archive all sessions, Click on the 'Furnitures' scenario card. Traceback On Sentry: ``` ValueError: No record found for unique ID pos_sale.default_downpayment_product. It may have been deleted. File "odoo/http.py", line 2373, in __call__ r
Original PR description
Currently, an error occurs when trying to load onboarding 'Furnitures' without a product name 'Down Payment (POS). Step to produce: - Install the 'pos_sale' module. - Delete a product name 'Down…
Currently, an error occurs when trying to load onboarding 'Furnitures' without a product name 'Down Payment (POS).
Step to produce:
- Install the 'pos_sale' module.
- Delete a product name 'Down Payment (POS)'.
- Open a point of sale and archive all sessions, Click on the 'Furnitures' scenario card.
Traceback On Sentry:
```
ValueError: No record found for unique ID pos_sale.default_downpayment_product. It may have been deleted.
File "odoo/http.py", line 2373, in __call__
response = request._serve_db()
File "odoo/http.py", line 1903, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1966, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1933, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2177, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 223, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 754, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/web/controllers/dataset.py", line 35, in call_kw
return call_kw(request.env[model], method, args, kwargs)
File "odoo/api.py", line 459, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "addons/pos_sale/models/pos_config.py", line 35, in load_onboarding_furniture_scenario
self._ensure_downpayment_product()
File "addons/pos_sale/models/pos_config.py", line 30, in _ensure_downpayment_product
pos_config.write({'down_payment_product_id': self.env.ref('pos_sale.default_downpayment_product').id})
File "odoo/api.py", line 593, in ref
raise ValueError('No record found for unique ID %s. It may have been deleted.' % (xml_id))
```
An error occurs when the system tries to retrieve an external ID of product 'Down Payment (POS)' at [1] When opening a 'Furnitures' scenario card in POS, but it is not available.
To handle this issue, add 'raise_if_not_found=False' so that if the external id of a product 'Down Payment (POS)' is not found, then it will return a None value instead of raising an error.
Sentry-5690826936
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#176272when creating a new spreadsheet in document, the user is prompted to either choose a blank spreadsheet or choose to create them from a template. The view didn't list the name of the template. This commit shows the name of the template Task: 4363974 Forward-Port-Of: odoo/enterprise#74694
Original PR description
when creating a new spreadsheet in document, the user is prompted to either choose a blank spreadsheet or choose to create them from a template. The view didn't list the name of the template. This commit shows the name of the template Task: 4363974 Forward-Port-Of: odoo/enterprise#74694
Currently when receiving incoming calls, it's possible that all opened tabs will play the ringtone. To reduce the chaos, we now only play the incoming ringtone on the master tab. Task-4402909 Forward-Port-Of: odoo/enterprise#75534
Original PR description
Currently when receiving incoming calls, it's possible that all opened tabs will play the ringtone. To reduce the chaos, we now only play the incoming ringtone on the master tab. Task-4402909 Forward-Port-Of: odoo/enterprise#75534
Version: - 17.0 Step to reproduce: - upload sign template - click on sign now button on template Issue: - two sign now buttons are visible to user Cause: - there is an issue in condition to make button invisible as it require both the condition to be true to make button invisible Solution: - change condition which will make button invisible when any one condition true. task-4234996 Forward-Port-Of: odoo/enterprise#75608 Forward-Port-Of: odoo/enterprise#71350
Original PR description
Version: - 17.0 Step to reproduce: - upload sign template - click on sign now button on template Issue: - two sign now buttons are visible to user Cause: - there is an issue in condition to make button invisible as it require both the condition to be true to make button invisible Solution: - change condition which will make button invisible when any one condition true. task-4234996 Forward-Port-Of: odoo/enterprise#75608 Forward-Port-Of: odoo/enterprise#71350