diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index 421d943cf2..490ee2dc87 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -1678,6 +1678,10 @@ class StockAddSerializer(StockAdjustmentSerializer): stock_item = item['pk'] quantity = item['quantity'] + if quantity is None or quantity <= 0: + # Ignore in this case - no stock to add + continue + # Optional fields extra = {} @@ -1703,6 +1707,10 @@ class StockRemoveSerializer(StockAdjustmentSerializer): stock_item = item['pk'] quantity = item['quantity'] + # Ignore in this case - no stock to remove + if quantity is None or quantity <= 0: + continue + # Optional fields extra = {} diff --git a/src/frontend/src/forms/StockForms.tsx b/src/frontend/src/forms/StockForms.tsx index 508d7415c3..70476d591e 100644 --- a/src/frontend/src/forms/StockForms.tsx +++ b/src/frontend/src/forms/StockForms.tsx @@ -862,10 +862,17 @@ function stockRemoveFields(items: any[]): ApiFormFieldSet { const records = Object.fromEntries(items.map((item) => [item.pk, item])); + const initialValue = mapAdjustmentItems(items).map((elem) => { + return { + ...elem, + quantity: 0 + }; + }); + const fields: ApiFormFieldSet = { items: { field_type: 'table', - value: mapAdjustmentItems(items), + value: initialValue, modelRenderer: (row: TableFieldRowProps) => { const record = records[row.item.pk]; @@ -902,10 +909,17 @@ function stockAddFields(items: any[]): ApiFormFieldSet { const records = Object.fromEntries(items.map((item) => [item.pk, item])); + const initialValue = mapAdjustmentItems(items).map((elem) => { + return { + ...elem, + quantity: 0 + }; + }); + const fields: ApiFormFieldSet = { items: { field_type: 'table', - value: mapAdjustmentItems(items), + value: initialValue, modelRenderer: (row: TableFieldRowProps) => { const record = records[row.item.pk]; @@ -941,10 +955,12 @@ function stockCountFields(items: any[]): ApiFormFieldSet { const records = Object.fromEntries(items.map((item) => [item.pk, item])); + const initialValue = mapAdjustmentItems(items); + const fields: ApiFormFieldSet = { items: { field_type: 'table', - value: mapAdjustmentItems(items), + value: initialValue, modelRenderer: (row: TableFieldRowProps) => { return ( { await page.getByRole('button', { name: 'Scan', exact: true }).click(); await page.getByText('Scanned stock item into location').waitFor(); + // Add "zero" stock - ensure the quantity stays the same + await launchStockAction('add'); + await page.getByRole('button', { name: 'Submit' }).click(); + await page.getByText('Quantity: 123').first().waitFor(); + // Add stock, and change status await launchStockAction('add'); await page.getByLabel('number-field-quantity').fill('12'); @@ -342,6 +347,11 @@ test('Stock - Stock Actions', async ({ browser }) => { await page.getByText('Unavailable').first().waitFor(); await page.getByText('135').first().waitFor(); + // Remove "zero" stock - ensure the quantity stays the same + await launchStockAction('remove'); + await page.getByRole('button', { name: 'Submit' }).click(); + await page.getByText('Quantity: 135').first().waitFor(); + // Remove stock, and change status await launchStockAction('remove'); await page.getByLabel('number-field-quantity').fill('99');