From 138aa01d7e8eb0549d950e3505d594dd9aff5a80 Mon Sep 17 00:00:00 2001 From: Dean Date: Tue, 4 Feb 2025 01:13:52 +1300 Subject: [PATCH] Support for searching sales order shipments (#8992) Co-authored-by: Oliver --- docs/docs/settings/user.md | 1 + src/backend/InvenTree/InvenTree/api.py | 1 + src/backend/InvenTree/common/setting/user.py | 6 ++++ src/backend/InvenTree/order/api.py | 7 +++++ .../src/components/nav/SearchDrawer.tsx | 7 +++++ .../src/pages/Index/Settings/UserSettings.tsx | 1 + .../tests/pages/pui_sales_order.spec.ts | 28 +++++++++++++++++++ 7 files changed, 51 insertions(+) diff --git a/docs/docs/settings/user.md b/docs/docs/settings/user.md index fdb6cb0aca..dc69339d59 100644 --- a/docs/docs/settings/user.md +++ b/docs/docs/settings/user.md @@ -53,6 +53,7 @@ Customize settings for search results: {{ usersetting("SEARCH_PREVIEW_EXCLUDE_INACTIVE_PURCHASE_ORDERS") }} {{ usersetting("SEARCH_PREVIEW_SHOW_SALES_ORDERS") }} {{ usersetting("SEARCH_PREVIEW_EXCLUDE_INACTIVE_SALES_ORDERS") }} +{{ usersetting("SEARCH_PREVIEW_SHOW_SALES_ORDER_SHIPMENTS") }} {{ usersetting("SEARCH_PREVIEW_SHOW_RETURN_ORDERS") }} {{ usersetting("SEARCH_PREVIEW_EXCLUDE_INACTIVE_RETURN_ORDERS") }} diff --git a/src/backend/InvenTree/InvenTree/api.py b/src/backend/InvenTree/InvenTree/api.py index c3a851cd62..9a5740a196 100644 --- a/src/backend/InvenTree/InvenTree/api.py +++ b/src/backend/InvenTree/InvenTree/api.py @@ -511,6 +511,7 @@ class APISearchView(GenericAPIView): 'purchaseorder': order.api.PurchaseOrderList, 'returnorder': order.api.ReturnOrderList, 'salesorder': order.api.SalesOrderList, + 'salesordershipment': order.api.SalesOrderShipmentList, 'stockitem': stock.api.StockList, 'stocklocation': stock.api.StockLocationList, } diff --git a/src/backend/InvenTree/common/setting/user.py b/src/backend/InvenTree/common/setting/user.py index 3466eed252..a39ae48f95 100644 --- a/src/backend/InvenTree/common/setting/user.py +++ b/src/backend/InvenTree/common/setting/user.py @@ -127,6 +127,12 @@ USER_SETTINGS: dict[str, InvenTreeSettingsKeyType] = { 'validator': bool, 'default': True, }, + 'SEARCH_PREVIEW_SHOW_SALES_ORDER_SHIPMENTS': { + 'name': _('Search Sales Order Shipments'), + 'description': _('Display sales order shipments in search preview window'), + 'default': True, + 'validator': bool, + }, 'SEARCH_PREVIEW_SHOW_RETURN_ORDERS': { 'name': _('Search Return Orders'), 'description': _('Display return orders in search preview window'), diff --git a/src/backend/InvenTree/order/api.py b/src/backend/InvenTree/order/api.py index 80b31ec6c4..56803de57a 100644 --- a/src/backend/InvenTree/order/api.py +++ b/src/backend/InvenTree/order/api.py @@ -1270,6 +1270,13 @@ class SalesOrderShipmentList(SalesOrderShipmentMixin, ListCreateAPI): filter_backends = SEARCH_ORDER_FILTER_ALIAS ordering_fields = ['reference', 'delivery_date', 'shipment_date', 'allocated_items'] + search_fields = [ + 'order__reference', + 'reference', + 'tracking_number', + 'invoice_number', + ] + class SalesOrderShipmentDetail(SalesOrderShipmentMixin, RetrieveUpdateDestroyAPI): """API detail endpooint for SalesOrderShipment model.""" diff --git a/src/frontend/src/components/nav/SearchDrawer.tsx b/src/frontend/src/components/nav/SearchDrawer.tsx index c13a7c593c..60d4b33efb 100644 --- a/src/frontend/src/components/nav/SearchDrawer.tsx +++ b/src/frontend/src/components/nav/SearchDrawer.tsx @@ -247,6 +247,13 @@ export function SearchDrawer({ user.hasViewRole(UserRoles.sales_order) && userSettings.isSet('SEARCH_PREVIEW_SHOW_SALES_ORDERS') }, + { + model: ModelType.salesordershipment, + parameters: {}, + enabled: + user.hasViewRole(UserRoles.sales_order) && + userSettings.isSet('SEARCH_PREVIEW_SHOW_SALES_ORDER_SHIPMENTS') + }, { model: ModelType.returnorder, parameters: { diff --git a/src/frontend/src/pages/Index/Settings/UserSettings.tsx b/src/frontend/src/pages/Index/Settings/UserSettings.tsx index 0147e9b603..689a5dcdae 100644 --- a/src/frontend/src/pages/Index/Settings/UserSettings.tsx +++ b/src/frontend/src/pages/Index/Settings/UserSettings.tsx @@ -84,6 +84,7 @@ export default function UserSettings() { 'SEARCH_PREVIEW_EXCLUDE_INACTIVE_PURCHASE_ORDERS', 'SEARCH_PREVIEW_SHOW_SALES_ORDERS', 'SEARCH_PREVIEW_EXCLUDE_INACTIVE_SALES_ORDERS', + 'SEARCH_PREVIEW_SHOW_SALES_ORDER_SHIPMENTS', 'SEARCH_PREVIEW_SHOW_RETURN_ORDERS', 'SEARCH_PREVIEW_EXCLUDE_INACTIVE_RETURN_ORDERS' ]} diff --git a/src/frontend/tests/pages/pui_sales_order.spec.ts b/src/frontend/tests/pages/pui_sales_order.spec.ts index e8f1fd80fe..75754b36e4 100644 --- a/src/frontend/tests/pages/pui_sales_order.spec.ts +++ b/src/frontend/tests/pages/pui_sales_order.spec.ts @@ -180,4 +180,32 @@ test('Sales Orders - Shipments', async ({ page }) => { await page.getByLabel('related-field-stock_item').click(); await page.getByText('Quantity: 42').click(); await page.getByRole('button', { name: 'Cancel' }).click(); + + // Search for shipment by tracking number + await page.getByLabel('open-search').click(); + + await page.getByLabel('global-search-input').clear(); + + await page.waitForTimeout(250); + await page.getByLabel('global-search-input').fill('TRK-002'); + await page.waitForTimeout(250); + + await page + .getByText(/SO0009/) + .first() + .click(); + + // Search for shipment by invoice number + await page.getByLabel('open-search').click(); + + await page.getByLabel('global-search-input').clear(); + + await page.waitForTimeout(250); + await page.getByLabel('global-search-input').fill('INV-123'); + await page.waitForTimeout(250); + + await page + .getByText(/SO0025/) + .first() + .click(); });