mirror of
https://github.com/frappe/books.git
synced 2026-08-24 10:04:45 -05:00
feat: partial return functionality for batched items
This commit is contained in:
+49
-66
@@ -269,10 +269,18 @@ export class BespokeQueries {
|
||||
};
|
||||
}
|
||||
|
||||
docItemsMap[item.item].batches![item.batch] = {
|
||||
quantity: item.quantity,
|
||||
serialNumbers,
|
||||
};
|
||||
if (!docItemsMap[item.item].batches![item.batch]) {
|
||||
docItemsMap[item.item].batches![item.batch] = {
|
||||
quantity: item.quantity,
|
||||
serialNumbers,
|
||||
};
|
||||
} else {
|
||||
docItemsMap[item.item].batches![item.batch] = {
|
||||
quantity: (docItemsMap[item.item].batches![item.batch].quantity +=
|
||||
item.quantity),
|
||||
serialNumbers,
|
||||
};
|
||||
}
|
||||
} else {
|
||||
docItemsMap[item.item].quantity += item.quantity;
|
||||
}
|
||||
@@ -331,22 +339,35 @@ export class BespokeQueries {
|
||||
|
||||
for (const row in docItemsMap) {
|
||||
const balanceSerialNumbersMap: string[] | undefined = [];
|
||||
const balanceQty = safeParseFloat(-docItemsMap[row].quantity);
|
||||
let balanceQty = safeParseFloat(-docItemsMap[row].quantity);
|
||||
const docItem = docItemsMap[row];
|
||||
const returnedDocItem = returnedItemsMap[row];
|
||||
const docItemHasBatch = !!Object.keys(docItem.batches ?? {}).length;
|
||||
|
||||
if (docItem.serialNumbers && docItem.serialNumbers) {
|
||||
for (const serialNumber of docItem.serialNumbers) {
|
||||
if (!docItem.serialNumbers.includes(serialNumber)) {
|
||||
balanceSerialNumbersMap.push(serialNumber);
|
||||
if (returnedItemsMap) {
|
||||
for (const item in returnedItemsMap) {
|
||||
if (docItemHasBatch && item !== row) {
|
||||
continue;
|
||||
}
|
||||
|
||||
balanceQty = -(
|
||||
Math.abs(balanceQty) + returnedItemsMap[item].quantity
|
||||
);
|
||||
|
||||
const returnedItem = returnedItemsMap[item];
|
||||
|
||||
if (docItem.serialNumbers && returnedItem.serialNumbers) {
|
||||
for (const serialNumber of docItem.serialNumbers) {
|
||||
if (!returnedItem.serialNumbers.includes(serialNumber)) {
|
||||
balanceSerialNumbersMap.push(serialNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (docItemHasBatch && docItem.batches) {
|
||||
for (const batch in docItem.batches) {
|
||||
const ItemQty = Math.abs(docItem.batches[batch].quantity);
|
||||
const balanceQty = safeParseFloat(-ItemQty);
|
||||
const docItemSerialNumbers = docItem.batches[batch].serialNumbers;
|
||||
const itemSerialNumbers = docItem.batches[batch].serialNumbers;
|
||||
let balanceSerialNumbers: string[] | undefined;
|
||||
@@ -358,54 +379,27 @@ export class BespokeQueries {
|
||||
);
|
||||
}
|
||||
|
||||
balanceBatchQtyMap[batch] = {
|
||||
quantity: balanceQty,
|
||||
serialNumbers: balanceSerialNumbers,
|
||||
};
|
||||
}
|
||||
}
|
||||
const ItemQty = Math.abs(docItem.batches[batch].quantity);
|
||||
let balanceQty = safeParseFloat(-ItemQty);
|
||||
|
||||
returnBalanceItems[row] = {
|
||||
quantity: balanceQty,
|
||||
batches: balanceBatchQtyMap,
|
||||
serialNumbers: balanceSerialNumbersMap,
|
||||
};
|
||||
}
|
||||
if (!returnedDocItem || !returnedDocItem?.batches) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const row in returnedItemsMap) {
|
||||
const balanceSerialNumbersMap: string[] | undefined = [];
|
||||
const returnedItem = returnedDocItem?.batches[batch];
|
||||
|
||||
if (!docItemsMap[row]) {
|
||||
continue;
|
||||
}
|
||||
if (!returnedItem) {
|
||||
balanceBatchQtyMap[batch] = {
|
||||
quantity: balanceQty,
|
||||
serialNumbers: balanceSerialNumbers,
|
||||
};
|
||||
continue;
|
||||
}
|
||||
|
||||
const returnedItem = returnedItemsMap[row];
|
||||
const docItem = docItemsMap[row];
|
||||
let balanceQty = 0;
|
||||
|
||||
const docItemHasBatch = !!Object.keys(docItem.batches ?? {}).length;
|
||||
const returnedItemHasBatch = !!Object.keys(returnedItem.batches ?? {})
|
||||
.length;
|
||||
|
||||
if (docItemHasBatch && returnedItemHasBatch && docItem.batches) {
|
||||
for (const batch in returnedItem.batches) {
|
||||
const returnedItemQty = Math.abs(
|
||||
returnedItem.batches[batch].quantity
|
||||
balanceQty = -(
|
||||
Math.abs(safeParseFloat(-ItemQty)) -
|
||||
Math.abs(returnedDocItem.batches[batch].quantity)
|
||||
);
|
||||
const docBatchItemQty = docItem.batches[batch].quantity;
|
||||
const balanceQty = returnedItemQty - docBatchItemQty;
|
||||
const docItemSerialNumbers = docItem.batches[batch].serialNumbers;
|
||||
const returnItemSerialNumbers =
|
||||
returnedItem.batches[batch].serialNumbers;
|
||||
|
||||
let balanceSerialNumbers: string[] | undefined;
|
||||
|
||||
if (docItemSerialNumbers && returnItemSerialNumbers) {
|
||||
balanceSerialNumbers = docItemSerialNumbers.filter(
|
||||
(serialNumber: string) =>
|
||||
returnItemSerialNumbers.indexOf(serialNumber) == -1
|
||||
);
|
||||
}
|
||||
|
||||
balanceBatchQtyMap[batch] = {
|
||||
quantity: balanceQty,
|
||||
@@ -414,24 +408,13 @@ export class BespokeQueries {
|
||||
}
|
||||
}
|
||||
|
||||
if (docItem.serialNumbers && returnedItem.serialNumbers) {
|
||||
for (const serialNumber of docItem.serialNumbers) {
|
||||
if (!returnedItem.serialNumbers.includes(serialNumber)) {
|
||||
balanceSerialNumbersMap.push(serialNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
balanceQty = safeParseFloat(
|
||||
Math.abs(returnedItem.quantity) - docItemsMap[row].quantity
|
||||
);
|
||||
|
||||
returnBalanceItems[row] = {
|
||||
quantity: balanceQty,
|
||||
batches: balanceBatchQtyMap,
|
||||
serialNumbers: balanceSerialNumbersMap,
|
||||
};
|
||||
}
|
||||
|
||||
return returnBalanceItems;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user