2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-11-30 09:20:03 +00:00

[bug] Stock adjust (#10914)

* Extra checks on backend

* Bug fix for adjustment forms

- Set default quantity of zero

* Additional unit testing (to ensure no regression)
This commit is contained in:
Oliver
2025-11-26 22:32:57 +11:00
committed by GitHub
parent 16b600af88
commit 5713cff1cb
3 changed files with 37 additions and 3 deletions

View File

@@ -1678,6 +1678,10 @@ class StockAddSerializer(StockAdjustmentSerializer):
stock_item = item['pk'] stock_item = item['pk']
quantity = item['quantity'] quantity = item['quantity']
if quantity is None or quantity <= 0:
# Ignore in this case - no stock to add
continue
# Optional fields # Optional fields
extra = {} extra = {}
@@ -1703,6 +1707,10 @@ class StockRemoveSerializer(StockAdjustmentSerializer):
stock_item = item['pk'] stock_item = item['pk']
quantity = item['quantity'] quantity = item['quantity']
# Ignore in this case - no stock to remove
if quantity is None or quantity <= 0:
continue
# Optional fields # Optional fields
extra = {} extra = {}

View File

@@ -862,10 +862,17 @@ function stockRemoveFields(items: any[]): ApiFormFieldSet {
const records = Object.fromEntries(items.map((item) => [item.pk, item])); const records = Object.fromEntries(items.map((item) => [item.pk, item]));
const initialValue = mapAdjustmentItems(items).map((elem) => {
return {
...elem,
quantity: 0
};
});
const fields: ApiFormFieldSet = { const fields: ApiFormFieldSet = {
items: { items: {
field_type: 'table', field_type: 'table',
value: mapAdjustmentItems(items), value: initialValue,
modelRenderer: (row: TableFieldRowProps) => { modelRenderer: (row: TableFieldRowProps) => {
const record = records[row.item.pk]; 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 records = Object.fromEntries(items.map((item) => [item.pk, item]));
const initialValue = mapAdjustmentItems(items).map((elem) => {
return {
...elem,
quantity: 0
};
});
const fields: ApiFormFieldSet = { const fields: ApiFormFieldSet = {
items: { items: {
field_type: 'table', field_type: 'table',
value: mapAdjustmentItems(items), value: initialValue,
modelRenderer: (row: TableFieldRowProps) => { modelRenderer: (row: TableFieldRowProps) => {
const record = records[row.item.pk]; 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 records = Object.fromEntries(items.map((item) => [item.pk, item]));
const initialValue = mapAdjustmentItems(items);
const fields: ApiFormFieldSet = { const fields: ApiFormFieldSet = {
items: { items: {
field_type: 'table', field_type: 'table',
value: mapAdjustmentItems(items), value: initialValue,
modelRenderer: (row: TableFieldRowProps) => { modelRenderer: (row: TableFieldRowProps) => {
return ( return (
<StockOperationsRow <StockOperationsRow

View File

@@ -332,6 +332,11 @@ test('Stock - Stock Actions', async ({ browser }) => {
await page.getByRole('button', { name: 'Scan', exact: true }).click(); await page.getByRole('button', { name: 'Scan', exact: true }).click();
await page.getByText('Scanned stock item into location').waitFor(); 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 // Add stock, and change status
await launchStockAction('add'); await launchStockAction('add');
await page.getByLabel('number-field-quantity').fill('12'); 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('Unavailable').first().waitFor();
await page.getByText('135').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 // Remove stock, and change status
await launchStockAction('remove'); await launchStockAction('remove');
await page.getByLabel('number-field-quantity').fill('99'); await page.getByLabel('number-field-quantity').fill('99');