diff --git a/docs/docs/settings/user.md b/docs/docs/settings/user.md index fdb6cb0acabe..dc69339d5932 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 04ecbad05b64..a5701077ffd2 100644 --- a/src/backend/InvenTree/InvenTree/api.py +++ b/src/backend/InvenTree/InvenTree/api.py @@ -495,6 +495,7 @@ def get_result_types(self): '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 3466eed252a0..a39ae48f954f 100644 --- a/src/backend/InvenTree/common/setting/user.py +++ b/src/backend/InvenTree/common/setting/user.py @@ -127,6 +127,12 @@ def label_printer_options(): '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 80b31ec6c46d..56803de57abd 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 c13a7c593c55..60d4b33efb45 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 0147e9b6034d..689a5dcdae70 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 da47f188d23a..1ae9949948c9 100644 --- a/src/frontend/tests/pages/pui_sales_order.spec.ts +++ b/src/frontend/tests/pages/pui_sales_order.spec.ts @@ -179,4 +179,33 @@ 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(); + });