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:
@@ -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 = {}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
Reference in New Issue
Block a user