From 01417437664b517cdad80635f665069dd5ccea62 Mon Sep 17 00:00:00 2001 From: AbleKSaju <126228406+AbleKSaju@users.noreply.github.com> Date: Fri, 24 Jan 2025 12:24:00 +0530 Subject: [PATCH] feat: partial return functionality for batched items --- backend/database/bespoke.ts | 115 +++++++++++++++--------------------- 1 file changed, 49 insertions(+), 66 deletions(-) diff --git a/backend/database/bespoke.ts b/backend/database/bespoke.ts index 113cf789..09629157 100644 --- a/backend/database/bespoke.ts +++ b/backend/database/bespoke.ts @@ -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; }