2
0
mirror of https://github.com/frappe/books.git synced 2024-12-22 19:09:01 +00:00

fix: use Delivered as unusable status

- fix and add status change tests
This commit is contained in:
18alantom 2023-05-05 11:55:09 +05:30
parent 6869ca9652
commit 41ed88742f
2 changed files with 111 additions and 16 deletions

View File

@ -163,7 +163,10 @@ export function getSerialNumbers(serialNumber: string): string[] {
return [];
}
return serialNumber.split('\n').map((s) => s.trim());
return serialNumber
.split('\n')
.map((s) => s.trim())
.filter(Boolean);
}
export function getSerialNumberFromDoc(doc: StockTransfer | StockMovement) {
@ -188,7 +191,7 @@ export async function createSerialNumbers(doc: Transfer) {
.map((item) => {
const serialNumbers = getSerialNumbers(item.serialNumber ?? '');
return serialNumbers.map((serialNumber) => ({
item: item.name ?? '',
item: item.item ?? '',
serialNumber,
isIncoming: isSerialNumberIncoming(item),
}));
@ -255,10 +258,8 @@ async function updateSerialNumberStatus(
fyo: Fyo
) {
for (const name of getSerialNumbers(serialNumber)) {
await fyo.db.update(ModelNameEnum.SerialNumber, {
name,
status,
});
const doc = await fyo.doc.getDoc(ModelNameEnum.SerialNumber, name);
await doc.setAndSync('status', status);
}
}
@ -288,7 +289,7 @@ function getSerialNumberStatusForStockMovement(
isCancel: boolean
): SerialNumberStatus {
if (doc.movementType === 'MaterialIssue') {
return isCancel ? 'Active' : 'Inactive';
return isCancel ? 'Active' : 'Delivered';
}
if (doc.movementType === 'MaterialReceipt') {
@ -301,7 +302,7 @@ function getSerialNumberStatusForStockMovement(
// MovementType is Manufacture
if (item.fromLocation) {
return isCancel ? 'Active' : 'Inactive';
return isCancel ? 'Active' : 'Delivered';
}
return isCancel ? 'Inactive' : 'Active';

View File

@ -1,9 +1,14 @@
import { assertThrows } from 'backend/database/tests/helpers';
import {
assertDoesNotThrow,
assertThrows,
} from 'backend/database/tests/helpers';
import { ModelNameEnum } from 'models/types';
import test from 'tape';
import { closeTestFyo, getTestFyo, setupTestFyo } from 'tests/helpers';
import { MovementTypeEnum } from '../types';
import { getItem, getStockMovement } from './helpers';
import { getSerialNumbers } from '../helpers';
import type { Doc } from 'fyo/model/doc';
const fyo = getTestFyo();
@ -155,14 +160,23 @@ test('serialNumber enabled item, create stock movement, material receipt', async
null,
'non transacted item has no quantity'
);
const statusOne = await fyo.getValue(
ModelNameEnum.SerialNumber,
serialNumberMap.serialOne.name,
'status'
);
t.equal(statusOne, 'Active', `serialNumber one is Active`);
const statusTwo = await fyo.getValue(
ModelNameEnum.SerialNumber,
serialNumberMap.serialOne.name,
'status'
);
t.equal(statusTwo, 'Active', 'serialNumber two is Active');
});
/**
// FIXME: fix this failing test
// Test serial number state change
// Test below fails cause serial number is inactive, it should be active
test('serialNumber enabled item, create stock movement, material issue', async (t) => {
const { rate } = itemMap.Pen;
const quantity = 1;
@ -315,6 +329,86 @@ test('serialNumber enabled item, create invalid stock movements', async (t) => {
);
t.equal(await fyo.db.getStockQuantity(name), 1, 'item still has quantity');
});
*/
test('Material Receipt, auto creation of Serial Number', async (t) => {
const serialNumber = `001\n002\n003`;
const serialNumbers = getSerialNumbers(serialNumber);
for (const sn of serialNumbers) {
t.equal(
await fyo.db.exists(ModelNameEnum.SerialNumber, sn),
false,
`Serial Number${sn} does not exist`
);
}
const doc = await getStockMovement(
MovementTypeEnum.MaterialReceipt,
new Date('2022-11-04T09:59:04.528'),
[
{
item: itemMap.Pen.name,
to: locationMap.LocationOne,
quantity: 3,
rate: 100,
serialNumber,
},
],
fyo
);
await (await doc.sync()).submit();
for (const sn of serialNumbers) {
await assertDoesNotThrow(async () => {
const sndoc = await fyo.doc.getDoc(ModelNameEnum.SerialNumber, sn);
t.equal(sndoc.status, 'Active', `Serial Number ${sn} updated to Active`);
}, `SerialNumber ${sn} exists`);
}
t.equal(
await fyo.db.getStockQuantity(
itemMap.Pen.name,
locationMap.LocationOne,
undefined,
undefined,
undefined,
serialNumbers
),
3,
'location one has quantity 3 of incoming serialNumbers'
);
});
test('Material Issue, status change of Serial Number', async (t) => {
const serialNumber = `001\n002\n003`;
const serialNumbers = getSerialNumbers(serialNumber);
for (const sn of serialNumbers) {
t.equal(
await fyo.db.exists(ModelNameEnum.SerialNumber, sn),
true,
`Serial Number${sn} exists`
);
}
const doc = await getStockMovement(
MovementTypeEnum.MaterialIssue,
new Date('2022-11-05T09:59:04.528'),
[
{
item: itemMap.Pen.name,
from: locationMap.LocationOne,
quantity: 3,
rate: 100,
serialNumber,
},
],
fyo
);
await (await doc.sync()).submit();
for (const sn of serialNumbers) {
const status = await fyo.getValue(ModelNameEnum.SerialNumber, sn, 'status');
t.equal(status, 'Delivered', `Serial Number ${sn} updated to Delivered`);
}
});
closeTestFyo(fyo, __filename);