From c45251e08fa868fdb24bd6289cc385d17d521d54 Mon Sep 17 00:00:00 2001 From: ArifHilmi Date: Fri, 14 Mar 2025 07:44:19 +0800 Subject: [PATCH] Update Item & Product --- .../InventoryMaster/ItemRequestMaster.cshtml | 142 +++++---- .../ItemMovement/ItemMovementUser.cshtml | 118 ++++++-- .../Views/ItemMovement/ItemRequest.cshtml | 280 ++++-------------- .../Views/ItemMovement/QrUser.cshtml | 17 -- 4 files changed, 215 insertions(+), 342 deletions(-) diff --git a/Areas/Inventory/Views/InventoryMaster/ItemRequestMaster.cshtml b/Areas/Inventory/Views/InventoryMaster/ItemRequestMaster.cshtml index f70bd7d..e154879 100644 --- a/Areas/Inventory/Views/InventoryMaster/ItemRequestMaster.cshtml +++ b/Areas/Inventory/Views/InventoryMaster/ItemRequestMaster.cshtml @@ -187,7 +187,69 @@ - @@ -284,7 +286,8 @@
-
+

{{ station }}

@@ -569,7 +572,8 @@ return acc; }, {}); - // Sort items from newest to oldest & filter them + let filteredGrouped = {}; + for (let itemId in grouped) { let movements = grouped[itemId].movements .sort((a, b) => b.id - a.id); // Newest to oldest @@ -578,14 +582,27 @@ m.toOther === 'Return' && m.movementComplete == 1 ); + let nextIndex = movements.findIndex(m => + m.latestStatus === 'Ready To Deploy' && m.movementComplete == 1 + ); + if (stopIndex !== -1) { movements = movements.slice(0, stopIndex); } - grouped[itemId].movements = movements; + if (nextIndex !== -1) { + movements = movements.slice(0, nextIndex); + } + + if (movements.length > 0) { + filteredGrouped[itemId] = { + uniqueID: grouped[itemId].uniqueID, + movements: movements, + }; + } } - return grouped; + return filteredGrouped; }, groupedByStation() { @@ -611,11 +628,18 @@ m.toOther === 'Return' && m.movementComplete == 1 ); - // Remove older movements + let nextIndex = movements.findIndex(m => + m.latestStatus === 'Ready To Deploy' && m.movementComplete == 1 + ); + if (stopIndex !== -1) { movements = movements.slice(0, stopIndex); } + if (nextIndex !== -1) { + movements = movements.slice(0, nextIndex); + } + if (movements.length > 0) { let latestMovement = movements[0]; let station = latestMovement.lastStationName || latestMovement.toStationName || "Self Assigned"; @@ -648,11 +672,17 @@ return this.processedGroupedItems; } const searchLower = this.searchQuery.toLowerCase(); - return Object.fromEntries( - Object.entries(this.processedGroupedItems).filter(([_, group]) => - group.uniqueID.toLowerCase().includes(searchLower) - ) - ); + let grouped = this.processedGroupedItems; + let filtered = {}; + + Object.keys(grouped).forEach(item => { + if (item.toLowerCase().includes(searchLower)) { + if (grouped[item] > 0) { + filtered[item] = grouped[item]; + } + } + }); + return filtered; }, filteredStation() { @@ -720,6 +750,10 @@ } }, + handleSorting() { + this.renderTables(); + }, + renderTables() { if (this.sortBy === "all") { this.initAllTables(); @@ -737,7 +771,7 @@ this.stationDatatable.destroy(); } - // Get latest movement per uniqueID + // Get latest movement per uniqueID after filtering function getLatestMovements(data) { let latestMovements = {}; data.forEach(movement => { @@ -749,17 +783,41 @@ return Object.values(latestMovements); } - // Distribute items based on priority + // Filter movements based on conditions + function filterMovements(movements) { + let stopIndex = movements.findIndex(m => + m.toOther === 'Return' && m.movementComplete == 1 + ); + + let nextIndex = movements.findIndex(m => + m.latestStatus === 'Ready To Deploy' && m.movementComplete == 1 + ); + + if (stopIndex !== -1) { + movements = movements.slice(0, stopIndex); + } + + if (nextIndex !== -1) { + movements = movements.slice(0, nextIndex); + } + + return movements; + } + let latestMovements = getLatestMovements(this.itemMovements); + let notCompleteData = []; let completeData = []; - let assignedData = []; latestMovements.forEach(movement => { - if (movement.movementComplete == 0) { - notCompleteData.push(movement); - } else if (movement.movementComplete == 1) { - completeData.push(movement); + let filteredMovements = filterMovements([movement]); + + if (filteredMovements.length > 0) { + if (movement.movementComplete == 0) { + notCompleteData.push(movement); + } else if (movement.movementComplete == 1) { + completeData.push(movement); + } } }); @@ -818,21 +876,22 @@ var isPdf = /\.pdf$/i.test(data); if (isImage) { return ` - Image - `; - } else if (isPdf) { - return ` - PDF Document -
View PDF -
`; + Image + `; + } else if (isPdf) { + return ` + PDF Document +
View PDF +
`; } else { return `Download File`; } } }, + toggleCategory(itemId) { this.categoryVisible[itemId] = !this.categoryVisible[itemId]; @@ -857,9 +916,6 @@ this.detailsVisible[movementId] = !this.detailsVisible[movementId]; }, - handleSorting() { - this.renderTables(); - }, }, }); diff --git a/Areas/Inventory/Views/ItemMovement/ItemRequest.cshtml b/Areas/Inventory/Views/ItemMovement/ItemRequest.cshtml index 680e829..f4ea3c2 100644 --- a/Areas/Inventory/Views/ItemMovement/ItemRequest.cshtml +++ b/Areas/Inventory/Views/ItemMovement/ItemRequest.cshtml @@ -439,242 +439,80 @@ }, - initiateTable() { - self = this; - this.requestDatatable = $('#requestDatatable').DataTable({ - "data": this.request.filter(request => request.status == "Requested"), - "columns": [ - { - "title": "Request ID", - "data": "requestID", - "createdCell": function (td, cellData, rowData, row, col) { - // Assign a unique ID to the element - $(td).attr('id', `qr${cellData}`); - }, - }, - { - "title": "Product Name", - "data": "productName", - "render": function (data, type, full, meta) { - if (!data) { - return "No Document"; - } + initiateTable() { + let self = this; - var imageSrc = full.productPicture; - // Check if the document is an image based on file extension - var isImage = /\.(jpeg|jpg|png|gif)$/i.test(imageSrc); - var isPdf = /\.pdf$/i.test(imageSrc); - // var imageSrc = full.productImage; Fallback to data if imgsrc is unavailable - console.log(full); + function renderDocument(data, full) { + if (!data) return "No Document"; - if (isImage) { - return `
${data}
- - Image - `; - } - else if (isPdf) { - return `
${data}
- - PDF Document -
View PDF -
`; - } - }, - }, - { - "title": "Product Category", - "data": "productCategory", - }, - { - "title": "Request Quantity", - "data": "requestQuantity", - }, - - { - "title": "Document / Picture", - "data": "document", - "render": function (data, type, full, meta) { - if (!data) { - return "No Document"; - } + let isImage = /\.(jpeg|jpg|png|gif)$/i.test(data); + let isPdf = /\.pdf$/i.test(data); - // Check if the document is an image based on file extension - var isImage = /\.(jpeg|jpg|png|gif)$/i.test(data); - var isPdf = /\.pdf$/i.test(data); - - if (isImage) { - return ` - Image - `; - } - else if (isPdf) { - return ` - PDF Document -
View PDF -
`; - } else { - return `Download File`; - } - }, - }, - { - "title": "Remark", - "data": "remarkUser", - }, - { - "title": "Station Deploy", - "data": "stationName", - "render": function (data, type, full, meta) { - return data ? data : "Self Assign"; - } - }, - { - "title": "Request Date", - "data": "requestDate", - }, - { - "title": "Status", - "data": "status", - }, - { - "title": "Delete", - "data": "requestID", - "render": function (data) { - var deleteButton = ``; - return deleteButton; - }, - "className": "align-middle", + if (isImage) { + return ` + Image + `; + } else if (isPdf) { + return ` + PDF Document +
View PDF +
`; + } else { + return `Download File`; } + } - ], - responsive: true, - }); - this.requestDatatable = $('#settledrequestDatatable').DataTable({ - "data": this.request.filter(request => request.status !== "Requested"), - "columns": [ - { - "title": "Request ID", - "data": "requestID", - "createdCell": function (td, cellData, rowData, row, col) { - // Assign a unique ID to the element - $(td).attr('id', `qr${cellData}`); - }, - }, - { - "title": "Status", - "data": "status", - }, - { - "title": "Product Name", - "data": "productName", - "render": function (data, type, full, meta) { - if (!data) { - return "No Document"; - } + function renderDeleteButton(data) { + return ``; + } - var imageSrc = full.productPicture; - // Check if the document is an image based on file extension - var isImage = /\.(jpeg|jpg|png|gif)$/i.test(imageSrc); - var isPdf = /\.pdf$/i.test(imageSrc); - // var imageSrc = full.productImage; Fallback to data if imgsrc is unavailable - console.log(full); + this.pendingRequestDatatable = $('#requestDatatable').DataTable({ + "data": this.request.filter(req => req.status === "Requested"), + "columns": [ + { "title": "Request ID", "data": "requestID", "createdCell": (td, cellData) => $(td).attr('id', `qr${cellData}`) }, + { "title": "Product Name", "data": "productName", "render": (data, type, full) => renderDocument(full.productPicture) }, + { "title": "Product Category", "data": "productCategory" }, + { "title": "Request Quantity", "data": "requestQuantity" }, + { "title": "Document / Picture", "data": "document", "render": (data, type, full) => renderDocument(data) }, + { "title": "Remark", "data": "remarkUser" }, + { "title": "Station Deploy", "data": "stationName", "render": (data) => data || "Self Assign" }, + { "title": "Request Date", "data": "requestDate" }, + { "title": "Status", "data": "status" }, + { "title": "Delete", "data": "requestID", "render": renderDeleteButton, "className": "align-middle" } + ], + responsive: true, + }); - if (isImage) { - return `
${data}
- - Image - `; - } - else if (isPdf) { - return `
${data}
- - PDF Document -
View PDF -
`; - } - }, - }, - { - "title": "Product Category", - "data": "productCategory", - }, - { - "title": "Request Quantity", - "data": "requestQuantity", - }, - { - "title": "Station Deploy", - "data": "stationName", - "render": function (data, type, full, meta) { - return data ? data : "Self Assign"; - } - }, - { - "title": "Document / Picture", - "data": "document", - "render": function (data, type, full, meta) { - if (!data) { - return "No Document"; - } + this.settledRequestDatatable = $('#settledrequestDatatable').DataTable({ + "data": this.request.filter(req => req.status !== "Requested"), + "columns": [ + { "title": "Request ID", "data": "requestID", "createdCell": (td, cellData) => $(td).attr('id', `qr${cellData}`) }, + { "title": "Status", "data": "status" }, + { "title": "Product Name", "data": "productName", "render": (data, type, full) => renderDocument(full.productPicture) }, + { "title": "Product Category", "data": "productCategory" }, + { "title": "Request Quantity", "data": "requestQuantity" }, + { "title": "Station Deploy", "data": "stationName", "render": (data) => data || "Self Assign" }, + { "title": "Document / Picture", "data": "document", "render": (data, type, full) => renderDocument(data) }, + { "title": "Remark", "data": "remarkUser" }, + { "title": "Remark (Master)", "data": "remarkMasterInv" }, + { "title": "Request Date", "data": "requestDate" }, + { "title": "Approval Date", "data": "approvalDate" } + ], + responsive: true, + }); - // Check if the document is an image based on file extension - var isImage = /\.(jpeg|jpg|png|gif)$/i.test(data); - var isPdf = /\.pdf$/i.test(data); - - if (isImage) { - return ` - Image - `; - } else if (isPdf) { - return ` - PDF Document -
View PDF -
`; - } else { - return `Download File`; - } - }, - }, - { - "title": "Remark", - "data": "remarkUser", - }, - { - "title": "Remark (Master)", - "data": "remarkMasterInv", - }, - { - "title": "Request Date", - "data": "requestDate", - }, - { - "title": "Approval Date", - "data": "approvalDate", - } - - ], - responsive: true, - }); - - $('#requestDatatable tbody').off('click', '.delete-btn'); + $('#requestDatatable tbody').off('click', '.delete-btn'); $('#requestDatatable tbody').on('click', '.delete-btn', function () { const requestID = $(this).data('id'); self.deleteRequestItem(requestID); }); + this.loading = false; + } - this.loading = false; - }, async fetchRequest() { try diff --git a/Areas/Inventory/Views/ItemMovement/QrUser.cshtml b/Areas/Inventory/Views/ItemMovement/QrUser.cshtml index f410385..72bd12d 100644 --- a/Areas/Inventory/Views/ItemMovement/QrUser.cshtml +++ b/Areas/Inventory/Views/ItemMovement/QrUser.cshtml @@ -145,14 +145,6 @@
- - - - - - - -
@@ -542,15 +534,6 @@ async returnItemMovement() { - // const requiredFields = ['remark', 'consignmentNote']; - - // for (let field of requiredFields) { - // if (!this[field]) { - // alert(`Request Error: Please fill in required field ${field}.`, 'warning'); - // return; - // } - // } - if (!confirm("Are you sure you want to return this item?")) { return false; }