@@ -548,6 +563,7 @@
return {
itemMovements: [],
itemMovementCompleteDatatable: null,
+ stationDatatable: null,
itemMovementNotCompleteDatatable: null,
searchQuery: "",
searchStation: "",
@@ -572,28 +588,63 @@
return acc;
}, {});
},
+
groupedByStation() {
let grouped = {};
this.itemMovements.forEach((movement) => {
- let station = movement.toStationName || movement.lastStationName || "Unassign Station";
- let itemId = movement.uniqueID;
- if (!grouped[station]) {
- grouped[station] = {};
+ if (movement.toStation !== null) {
+ let station = movement.toStationName;
+ let itemId = movement.uniqueID;
+
+ if (!grouped[station]) {
+ grouped[station] = {};
+ }
+
+ if (!grouped[station][itemId]) {
+ grouped[station][itemId] = { uniqueID: itemId, movements: [] };
+ }
+
+ grouped[station][itemId].movements.push(movement);
}
- if (!grouped[station][itemId]) {
- grouped[station][itemId] = { uniqueID: itemId, movements: [] };
- }
+ if (movement.lastStation !== null) {
+ let station = movement.lastStationName;
+ let itemId = movement.uniqueID;
- grouped[station][itemId].movements.push(movement);
+ if (!grouped[station]) {
+ grouped[station] = {};
+ }
+
+ if (!grouped[station][itemId]) {
+ grouped[station][itemId] = { uniqueID: itemId, movements: [] };
+ }
+
+ grouped[station][itemId].movements.push(movement);
+ }
+ else if (movement.lastStation == null || movement.toStation == null) {
+
+ let station = "Self";
+ let itemId = movement.uniqueID;
+
+ if (!grouped[station]) {
+ grouped[station] = {};
+ }
+
+ if (!grouped[station][itemId]) {
+ grouped[station][itemId] = { uniqueID: itemId, movements: [] };
+ }
+
+ grouped[station][itemId].movements.push(movement);
+ }
+
});
// Sort stations and move "Unassign Station" to the last position
let sortedKeys = Object.keys(grouped).sort((a, b) => {
- if (a === "Unassign Station") return 1; // Move Unassign Station to the end
+ if (a === "Unassign Station") return 1;
if (b === "Unassign Station") return -1;
- return a.localeCompare(b); // Normal sorting for other stations
+ return a.localeCompare(b);
});
let sortedGrouped = {};
@@ -603,6 +654,7 @@
return sortedGrouped;
},
+
filteredItems() {
if (!this.searchQuery.trim()) {
return this.groupedItems;
@@ -614,6 +666,7 @@
)
);
},
+
filteredStation() {
if (!this.searchStation) {
return this.groupedByStation;
@@ -684,6 +737,7 @@
this.initAllTables();
}
},
+
initAllTables() {
if (this.itemMovementNotCompleteDatatable) {
this.itemMovementNotCompleteDatatable.destroy();
@@ -691,20 +745,23 @@
if (this.itemMovementCompleteDatatable) {
this.itemMovementCompleteDatatable.destroy();
}
+ if(this.stationDatatable) {
+ this.stationDatatable.destroy();
+ }
this.itemMovementNotCompleteDatatable = $("#itemMovementNotCompleteDatatable").DataTable({
data: this.itemMovements.filter((m) => m.movementComplete == 0),
columns: [
{ title: "Unique Id", data: "id" },
{ title: "Product Code", data: "uniqueID" },
+ { title: "Action", data: "action" },
+ { title: "Send Date", data: "sendDate" },
{ title: "From User", data: "toUserName" },
{ title: "Last User", data: "lastUserName" },
{ title: "From Station", data: "toStationName" },
{ title: "From Store", data: "toStoreName" },
- { title: "Action", data: "action" },
{ title: "Start Status", data: "toOther" },
{ title: "Quantity", data: "quantity" },
- { title: "Send Date", data: "sendDate" },
{
title: "Note",
data: "consignmentNote",
@@ -740,22 +797,22 @@
});
this.itemMovementCompleteDatatable = $("#itemMovementCompleteDatatable").DataTable({
- data: this.itemMovements.filter((m) => m.movementComplete == 1),
+ data: this.itemMovements.filter((m) => m.movementComplete == 1 && m.action !== "Assign"),
columns: [
{ title: "Unique Id", data: "id" },
{ title: "Product Code", data: "uniqueID" },
+ { title: "Send Date", data: "sendDate" },
+ { title: "Receive Date", data: "receiveDate" },
+ { title: "Action", data: "action" },
{ title: "From User", data: "toUserName" },
{ title: "Last User", data: "lastUserName" },
{ title: "From Station", data: "toStationName" },
{ title: "Last Station", data: "lastStationName" },
{ title: "From Store", data: "toStoreName" },
{ title: "Last Store", data: "lastStoreName" },
- { title: "Action", data: "action" },
{ title: "Start Status", data: "toOther" },
{ title: "Latest Status", data: "latestStatus" },
{ title: "Qty", data: "quantity" },
- { title: "Send Date", data: "sendDate" },
- { title: "Receive Date", data: "receiveDate" },
{ title: "Note",
data: "consignmentNote",
render: function (data, type, full, meta) {
@@ -788,16 +845,64 @@
],
responsive: true,
});
+
+ this.stationDatatable = $("#stationDatatable").DataTable({
+ data: this.itemMovements.filter((m) => m.action === "Assign" ),
+ columns: [
+ { title: "Unique Id", data: "id" },
+ { title: "Product Code", data: "uniqueID" },
+ { title: "Assign Date", data: "sendDate" },
+ { title: "From User", data: "toUserName" },
+ { title: "From Station", data: "toStationName" },
+ { title: "Last Station", data: "lastStationName" },
+ { title: "Qty", data: "quantity" },
+ {
+ title: "Note",
+ data: "consignmentNote",
+ render: function (data, type, full, meta) {
+ if (!data) {
+ return "No Document";
+ }
+
+ // 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 `
+
+ `;
+ }
+ else if (isPdf) {
+ return `
+
+
View PDF
+ `;
+ } else {
+ return `
Download File`;
+ }
+ },
+ },
+ { title: "Remark", data: "remark" },
+ ],
+ responsive: true,
+ });
},
+
toggleCategory(itemId) {
this.categoryVisible[itemId] = !this.categoryVisible[itemId];
},
+
toggleHistory(itemId) {
this.historyVisible[itemId] = !this.historyVisible[itemId];
},
+
toggleDetails(movementId) {
this.detailsVisible[movementId] = !this.detailsVisible[movementId];
},
+
handleSorting() {
this.renderTables();
},
diff --git a/Areas/Inventory/Views/ItemMovement/QrUser.cshtml b/Areas/Inventory/Views/ItemMovement/QrUser.cshtml
index 6d96455..7417ad2 100644
--- a/Areas/Inventory/Views/ItemMovement/QrUser.cshtml
+++ b/Areas/Inventory/Views/ItemMovement/QrUser.cshtml
@@ -109,10 +109,18 @@
@@ -449,7 +470,7 @@
ConsignmentNote: this.consignmentNote,
Date: new Date(now.getTime() + 8 * 60 * 60 * 1000).toISOString(),
LastUser: this.currentUserId,
- LastStore: this.thisItem.currentStoreId,
+ LastStore: this.thisItem.toStore,
LastStation: this.selectedStation,
LatestStatus: "Delivered",
ReceiveDate: new Date(now.getTime() + 8 * 60 * 60 * 1000).toISOString(),
@@ -490,7 +511,8 @@
try {
const now = new Date();
const formData = {
- Id : this.thisItem.id,
+ Id: this.thisItem.id,
+ LastStore: this.thisItem.toStore,
LatestStatus: "Delivered",
ReceiveDate: new Date(now.getTime() + 8 * 60 * 60 * 1000).toISOString(),
MovementComplete: true,
diff --git a/Controllers/API/Inventory/InvMainAPI.cs b/Controllers/API/Inventory/InvMainAPI.cs
index 9e510d6..623f9f3 100644
--- a/Controllers/API/Inventory/InvMainAPI.cs
+++ b/Controllers/API/Inventory/InvMainAPI.cs
@@ -523,6 +523,7 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
item.Product!.ProductShortName,
item.Product!.ImageProduct,
CurrentUser = item.Movement?.FromUser?.UserName,
+ CurrentUserFullName = item.Movement?.FromUser?.FullName,
CurrentUserId = item.Movement?.FromUser?.Id,
CurrentStore = item.Movement?.FromStore?.StoreName,
CurrentStoreId = item.Movement?.FromStore?.Id,
@@ -1223,9 +1224,10 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
receiveItems.ItemStatus = 3;
_centralDbContext.Items.Update(receiveItems);
- await _centralDbContext.SaveChangesAsync(); // Simpan perubahan
}
+ await _centralDbContext.SaveChangesAsync();
+
return Json(updatedList);
}
catch (Exception ex)
@@ -1246,20 +1248,24 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
{
if (!string.IsNullOrEmpty(returnMovement.ConsignmentNote))
{
+ var findUniqueCode = _centralDbContext.Items.Include(i => i.Product).FirstOrDefault(r => r.ItemID == returnMovement.ItemId);
+ var findUniqueUser = _centralDbContext.Users.FirstOrDefault(r => r.Id == returnMovement.ToUser);
+
var bytes = Convert.FromBase64String(returnMovement.ConsignmentNote);
string filePath = "";
- string uniqueName = $"{returnMovement.Id}_{Guid.NewGuid()}";
+ var uniqueAbjad = new string(Enumerable.Range(0, 8).Select(_ => "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[new Random().Next(36)]).ToArray());
+
if (IsImage(bytes))
{
- filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/request", uniqueName + returnMovement.ItemId + "_Request.jpg");
- returnMovement.ConsignmentNote = "/media/inventory/request/" + uniqueName + returnMovement.ItemId + "_Request.jpg";
+ filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/itemmovement", findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "(" + uniqueAbjad + ") Return.jpg");
+ returnMovement.ConsignmentNote = "/media/inventory/itemmovement/" + findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "(" + uniqueAbjad + ") Return.jpg";
}
else if (IsPdf(bytes))
{
- filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/request", uniqueName + returnMovement.ItemId + "_Request.pdf");
- returnMovement.ConsignmentNote = "/media/inventory/request/" + uniqueName + returnMovement.ItemId + "_Request.pdf";
+ filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/itemmovement", findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "Return.pdf");
+ returnMovement.ConsignmentNote = "/media/inventory/itemmovement/" + findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "(" + uniqueAbjad + ") Return.pdf";
}
else
{
@@ -1268,16 +1274,13 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
await System.IO.File.WriteAllBytesAsync(filePath, bytes);
}
- // 1. Simpan returnMovement dalam database
+
_centralDbContext.ItemMovements.Add(returnMovement);
await _centralDbContext.SaveChangesAsync();
- // 2. Cari item movement yang ada ItemId & MovementComplete = false
var updateItemIdMovement = await _centralDbContext.ItemMovements
.FirstOrDefaultAsync(m => m.Id == returnMovement.Id && m.MovementComplete == false);
-
- // 3. Jika wujud, update MovementId
if (updateItemIdMovement != null)
{
var returnItems = await _centralDbContext.Items.FindAsync(updateItemIdMovement.ItemId);
@@ -1287,21 +1290,10 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
returnItems.MovementId = updateItemIdMovement.Id;
returnItems.ItemStatus = 2;
_centralDbContext.Items.Update(returnItems);
-
+ await _centralDbContext.SaveChangesAsync(); // Simpan perubahan
}
}
- //4. Update Assign Row (Untuk ToStore = Ada value , kepada , ToStore = null)
- var updateToStoreAssignStation = await _centralDbContext.ItemMovements.Where(i => i.Action == "Assign").ToListAsync();
-
- foreach (var item in updateToStoreAssignStation)
- {
- item.ToStore = null; // Set ToStore to null for each matching row
- _centralDbContext.ItemMovements.Update(item);
- }
-
- await _centralDbContext.SaveChangesAsync(); // Simpan perubahan
-
return Json(new
{
updateItemIdMovement.Id,
@@ -1324,7 +1316,6 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
updateItemIdMovement.MovementComplete
});
-
}
catch (Exception ex)
{
@@ -1344,20 +1335,24 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
{
if (!string.IsNullOrEmpty(stationMovement.ConsignmentNote))
{
+ var findUniqueCode = _centralDbContext.Items.Include(i => i.Product).FirstOrDefault(r => r.ItemID == stationMovement.ItemId);
+ var findUniqueUser = _centralDbContext.Users.FirstOrDefault(r => r.Id == stationMovement.ToUser);
+
var bytes = Convert.FromBase64String(stationMovement.ConsignmentNote);
string filePath = "";
- string uniqueName = $"{stationMovement.Id}_{Guid.NewGuid()}";
+ var uniqueAbjad = new string(Enumerable.Range(0, 8).Select(_ => "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[new Random().Next(36)]).ToArray());
+
if (IsImage(bytes))
{
- filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/request", uniqueName + stationMovement.ItemId + "_Request.jpg");
- stationMovement.ConsignmentNote = "/media/inventory/request/" + uniqueName + stationMovement.ItemId + "_Request.jpg";
+ filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/itemmovement", findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "(" + uniqueAbjad + ") Station.jpg");
+ stationMovement.ConsignmentNote = "/media/inventory/itemmovement/" + findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "(" + uniqueAbjad + ") Station.jpg";
}
else if (IsPdf(bytes))
{
- filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/request", uniqueName + stationMovement.ItemId + "_Request.pdf");
- stationMovement.ConsignmentNote = "/media/inventory/request/" + uniqueName + stationMovement.ItemId + "_Request.pdf";
+ filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/media/inventory/itemmovement", findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "Return.pdf");
+ stationMovement.ConsignmentNote = "/media/inventory/itemmovement/" + findUniqueUser.FullName + " " + findUniqueCode.Product?.ModelNo + "(" + uniqueAbjad + ") Station.pdf";
}
else
{
@@ -1366,16 +1361,14 @@ namespace PSTW_CentralSystem.Controllers.API.Inventory
await System.IO.File.WriteAllBytesAsync(filePath, bytes);
}
- // 1. Simpan returnMovement dalam database
+
_centralDbContext.ItemMovements.Add(stationMovement);
await _centralDbContext.SaveChangesAsync();
- // 2. Cari item movement yang ada ItemId & MovementComplete = false
var updateItemIdMovement = await _centralDbContext.ItemMovements.Include(i => i.Item)
.FirstOrDefaultAsync(m => m.Id == stationMovement.Id);
- // 3. Jika wujud, update MovementId
if (updateItemIdMovement != null)
{
var returnItems = await _centralDbContext.Items.FindAsync(updateItemIdMovement.ItemId);
diff --git a/wwwroot/Media/Inventory/itemmovement/hilmi.rezuan Latitude 7410(UN9DWPFT) Station.jpg b/wwwroot/Media/Inventory/itemmovement/hilmi.rezuan Latitude 7410(UN9DWPFT) Station.jpg
new file mode 100644
index 0000000..2e6c3a7
Binary files /dev/null and b/wwwroot/Media/Inventory/itemmovement/hilmi.rezuan Latitude 7410(UN9DWPFT) Station.jpg differ