Browse Source

changes in toner management pages and api's , adjustment management pages and apis's

master
yoganandhank 3 weeks ago
parent
commit
8fab02e7c8
  1. 3
      src/main/java/com/gcc_manpower/config/WebConfig.java
  2. 3
      src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java
  3. 11
      src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java
  4. 278
      src/main/java/com/gcc_manpower/gcctonermanagement/controller/TonerController.java
  5. 994
      src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java
  6. 1253
      src/main/resources/templates/gccadjustmentmanagement/dashboard.html
  7. 799
      src/main/resources/templates/gccadjustmentmanagement/details.html
  8. 18
      src/main/resources/templates/gcctapaldetailsmanagement/dashboard.html
  9. 2706
      src/main/resources/templates/gcctonermanagement/upload.html
  10. 2
      src/main/resources/templates/home/login.html

3
src/main/java/com/gcc_manpower/config/WebConfig.java

@ -52,6 +52,9 @@ public class WebConfig implements WebMvcConfigurer {
// Map URL path /gcctonermanagementfiles/** to the configured toner folder // Map URL path /gcctonermanagementfiles/** to the configured toner folder
String tonerUploadPath = Paths.get(tonerUploadPathConfig).toAbsolutePath().toUri() String tonerUploadPath = Paths.get(tonerUploadPathConfig).toAbsolutePath().toUri()
.toString(); .toString();
if (!tonerUploadPath.endsWith("/")) {
tonerUploadPath += "/";
}
registry.addResourceHandler("/gcctonermanagementfiles/**") registry.addResourceHandler("/gcctonermanagementfiles/**")
.addResourceLocations(tonerUploadPath); .addResourceLocations(tonerUploadPath);

3
src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java

@ -388,6 +388,7 @@ public class AdjustmentController {
public Map<String, Object> updateEJV( public Map<String, Object> updateEJV(
@RequestParam("id") Integer id, @RequestParam("id") Integer id,
@RequestParam("ejv_num") String ejvNum, @RequestParam("ejv_num") String ejvNum,
@RequestParam(value = "ejv_date", required = false) String ejvDate,
@RequestParam(value = "ejvFile", required = false) MultipartFile ejvFile, @RequestParam(value = "ejvFile", required = false) MultipartFile ejvFile,
HttpSession session) { HttpSession session) {
@ -416,7 +417,7 @@ public class AdjustmentController {
String ejvPath = saveFile(ejvFile, "ejv", fileDataNum, uploadDir, String ejvPath = saveFile(ejvFile, "ejv", fileDataNum, uploadDir,
existing != null ? (String) existing.get("ejv_num_file_path") : null); existing != null ? (String) existing.get("ejv_num_file_path") : null);
boolean updated = adjustmentService.updateEJV(id, ejvNum, ejvPath, username);
boolean updated = adjustmentService.updateEJV(id, ejvNum, ejvPath, ejvDate, username);
if (updated) { if (updated) {
response.put("success", true); response.put("success", true);
response.put("message", "EJV details updated successfully."); response.put("message", "EJV details updated successfully.");

11
src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java

@ -342,11 +342,18 @@ public class AdjustmentService {
} }
public boolean updateEJV(int id, String ejvNum, String ejvFilePath, String username) { public boolean updateEJV(int id, String ejvNum, String ejvFilePath, String username) {
return updateEJV(id, ejvNum, ejvFilePath, null, username);
}
public boolean updateEJV(int id, String ejvNum, String ejvFilePath, String ejvDate, String username) {
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis()); java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
java.sql.Date today = new java.sql.Date(System.currentTimeMillis());
java.sql.Date dateToSave = parseDate(ejvDate);
if (dateToSave == null) {
dateToSave = new java.sql.Date(System.currentTimeMillis());
}
String sql = "UPDATE adjustment_file_details SET ejv_num = ?, ejv_num_file_path = ?, ejv_num_file_gen_date = ?, updated_date = ?, updated_by = ? WHERE id = ?"; String sql = "UPDATE adjustment_file_details SET ejv_num = ?, ejv_num_file_path = ?, ejv_num_file_gen_date = ?, updated_date = ?, updated_by = ? WHERE id = ?";
try { try {
int rows = jdbcTemplate.update(sql, ejvNum, ejvFilePath, today, now, username, id);
int rows = jdbcTemplate.update(sql, ejvNum, ejvFilePath, dateToSave, now, username, id);
return rows > 0; return rows > 0;
} catch (Exception e) { } catch (Exception e) {
System.err.println("Error updating EJV: " + e.getMessage()); System.err.println("Error updating EJV: " + e.getMessage());

278
src/main/java/com/gcc_manpower/gcctonermanagement/controller/TonerController.java

@ -234,7 +234,7 @@ public class TonerController {
public Map<String, Object> uploadRequest( public Map<String, Object> uploadRequest(
@RequestParam("itcellRefNo") String itcellRefNo, @RequestParam("itcellRefNo") String itcellRefNo,
@RequestParam("deptId") String deptId, @RequestParam("deptId") String deptId,
@RequestParam("zoneId") String zoneId,
@RequestParam(value = "zoneId", required = false) String zoneId,
@RequestParam("itemsJson") String itemsJson, @RequestParam("itemsJson") String itemsJson,
@RequestParam(value = "userRequestFile", required = false) MultipartFile userRequestFile, @RequestParam(value = "userRequestFile", required = false) MultipartFile userRequestFile,
HttpSession session) { HttpSession session) {
@ -282,8 +282,9 @@ public class TonerController {
String urPath = saveUploadedFile(userRequestFile, "user_request", uploadDir); String urPath = saveUploadedFile(userRequestFile, "user_request", uploadDir);
String safeZoneId = (zoneId != null && !zoneId.trim().isEmpty()) ? zoneId.trim() : null;
boolean saved = tonerService.saveUserRequest( boolean saved = tonerService.saveUserRequest(
itcellRefNo.trim(), deptId.trim(), zoneId.trim(), items, urPath, updatedBy);
itcellRefNo.trim(), deptId.trim(), safeZoneId, items, urPath, updatedBy);
if (saved) { if (saved) {
response.put("success", true); response.put("success", true);
@ -301,12 +302,96 @@ public class TonerController {
return response; return response;
} }
@PostMapping("/api/request/update")
@ResponseBody
public Map<String, Object> updateRequest(
@RequestParam("id") int id,
@RequestParam("itcellRefNo") String itcellRefNo,
@RequestParam("deptId") String deptId,
@RequestParam(value = "zoneId", required = false) String zoneId,
@RequestParam("pid") int pid,
@RequestParam("tid") int tid,
@RequestParam("qtyRequested") int qtyRequested,
@RequestParam(value = "userRequestFile", required = false) MultipartFile userRequestFile,
HttpSession session) {
Map<String, Object> response = new HashMap<>();
String username = (String) session.getAttribute("toner_usrName");
if (username == null) {
response.put("success", false);
response.put("error", "Unauthorized access. Please log in.");
return response;
}
String updatedBy = appUserService.getUserIdByName(username);
if (updatedBy == null)
updatedBy = username;
if (itcellRefNo == null || itcellRefNo.trim().isEmpty()) {
response.put("success", false);
response.put("error", "IT Cell Reference No. is required.");
return response;
}
if (deptId == null || deptId.trim().isEmpty()) {
response.put("success", false);
response.put("error", "Department is required.");
return response;
}
if (qtyRequested <= 0) {
response.put("success", false);
response.put("error", "Quantity requested must be greater than 0.");
return response;
}
if (userRequestFile != null && !userRequestFile.isEmpty() && !isPdfFile(userRequestFile)) {
response.put("success", false);
response.put("error", "User Request file must be a PDF.");
return response;
}
try {
File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile();
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
String urPath = null;
if (userRequestFile != null && !userRequestFile.isEmpty()) {
urPath = saveUploadedFile(userRequestFile, "user_request", uploadDir);
}
String safeZoneId = (zoneId != null && !zoneId.trim().isEmpty()) ? zoneId.trim() : null;
boolean updated = tonerService.updateUserRequest(
id, itcellRefNo.trim(), deptId.trim(), safeZoneId, pid, tid, qtyRequested, urPath, updatedBy);
if (updated) {
response.put("success", true);
response.put("message", "User request details updated successfully.");
} else {
if (urPath != null) {
deleteFileIfExists(urPath, uploadDir);
}
response.put("success", false);
response.put("error", "Failed to update user request details in database.");
}
} catch (Exception e) {
response.put("success", false);
response.put("error", "An error occurred: " + e.getMessage());
e.printStackTrace();
}
return response;
}
@PostMapping("/api/outward") @PostMapping("/api/outward")
@ResponseBody @ResponseBody
public Map<String, Object> uploadOutward( public Map<String, Object> uploadOutward(
@RequestParam("id") int id, @RequestParam("id") int id,
@RequestParam("qtyIssued") String qtyIssued, @RequestParam("qtyIssued") String qtyIssued,
@RequestParam(value = "finalDeliveredFile", required = false) MultipartFile finalDeliveredFile, @RequestParam(value = "finalDeliveredFile", required = false) MultipartFile finalDeliveredFile,
@RequestParam(value = "userPhotoFile", required = false) MultipartFile userPhotoFile,
@RequestParam(value = "userPhotoBase64", required = false) String userPhotoBase64,
HttpSession session) { HttpSession session) {
Map<String, Object> response = new HashMap<>(); Map<String, Object> response = new HashMap<>();
@ -321,12 +406,97 @@ public class TonerController {
if (updatedBy == null) if (updatedBy == null)
updatedBy = username; updatedBy = username;
if (finalDeliveredFile != null && !finalDeliveredFile.isEmpty() && !isPdfFile(finalDeliveredFile)) {
if (finalDeliveredFile != null && !finalDeliveredFile.isEmpty()) {
if (!isPdfFile(finalDeliveredFile)) {
response.put("success", false);
response.put("error", "Final Delivered file must be a PDF.");
return response;
}
boolean hasPhoto = (userPhotoFile != null && !userPhotoFile.isEmpty())
|| (userPhotoBase64 != null && !userPhotoBase64.trim().isEmpty());
if (!hasPhoto) {
response.put("success", false);
response.put("error", "Receiver / User photo is mandatory.");
return response;
}
}
if (userPhotoFile != null && !userPhotoFile.isEmpty() && !isImageFile(userPhotoFile)) {
response.put("success", false);
response.put("error", "User photo must be a valid image file (JPG, PNG, WEBP).");
return response;
}
Map<String, Object> req = tonerService.getUserRequestById(id);
if (req == null) {
response.put("success", false); response.put("success", false);
response.put("error", "Final Delivered file must be a PDF.");
response.put("error", "Invalid or non-existent request ID: " + id);
return response; return response;
} }
boolean isInitialDelivery = (finalDeliveredFile == null || finalDeliveredFile.isEmpty()) &&
(userPhotoFile == null || userPhotoFile.isEmpty()) &&
(userPhotoBase64 == null || userPhotoBase64.trim().isEmpty());
if (isInitialDelivery) {
int issueQty = 0;
try {
issueQty = Integer.parseInt(qtyIssued.trim());
} catch (Exception e) {
response.put("success", false);
response.put("error", "Invalid quantity issued value.");
return response;
}
if (issueQty <= 0) {
response.put("success", false);
response.put("error", "Quantity issued must be greater than zero.");
return response;
}
String pid = String.valueOf(req.get("pid"));
String tid = String.valueOf(req.get("tid"));
String modelName = req.get("model_name") != null ? String.valueOf(req.get("model_name")) : "Toner";
String printerName = req.get("printer_name") != null ? String.valueOf(req.get("printer_name")) : "Printer";
int availableStock = tonerService.getAvailableStockForModel(pid, tid);
if (availableStock <= 0) {
response.put("success", false);
response.put("error", "Cannot issue: No inward stock available for " + printerName + " - " + modelName
+ ". Please register inward stock before issuing outward delivery.");
return response;
}
if (issueQty > availableStock) {
response.put("success", false);
response.put("error",
"Cannot issue: Quantity to issue (" + issueQty + ") exceeds available inward stock ("
+ availableStock + ") for " + printerName + " - " + modelName + ".");
return response;
}
int requestedQty = 0;
int alreadyDelivered = 0;
try {
if (req.get("qty_requested") != null) {
requestedQty = Integer.parseInt(String.valueOf(req.get("qty_requested")));
}
if (req.get("qty_delivered") != null) {
alreadyDelivered = Integer.parseInt(String.valueOf(req.get("qty_delivered")));
}
} catch (Exception ignored) {
}
int remainingReq = Math.max(0, requestedQty - alreadyDelivered);
if (issueQty > remainingReq) {
response.put("success", false);
response.put("error", "Cannot issue: Quantity to issue (" + issueQty
+ ") exceeds remaining requested quantity (" + remainingReq + ").");
return response;
}
}
try { try {
File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile(); File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile();
if (!uploadDir.exists()) { if (!uploadDir.exists()) {
@ -334,15 +504,22 @@ public class TonerController {
} }
String fdPath = saveUploadedFile(finalDeliveredFile, "final_delivered", uploadDir); String fdPath = saveUploadedFile(finalDeliveredFile, "final_delivered", uploadDir);
String photoPath = null;
if (userPhotoFile != null && !userPhotoFile.isEmpty()) {
photoPath = saveUploadedFile(userPhotoFile, "receiver_photo", uploadDir);
} else if (userPhotoBase64 != null && !userPhotoBase64.trim().isEmpty()) {
photoPath = saveBase64Image(userPhotoBase64, "receiver_photo", uploadDir);
}
boolean saved = tonerService.saveOutwardRegister( boolean saved = tonerService.saveOutwardRegister(
id, qtyIssued.trim(), fdPath, updatedBy);
id, qtyIssued.trim(), fdPath, photoPath, updatedBy);
if (saved) { if (saved) {
response.put("success", true); response.put("success", true);
response.put("message", "Outward delivery recorded successfully."); response.put("message", "Outward delivery recorded successfully.");
} else { } else {
deleteFileIfExists(fdPath, uploadDir); deleteFileIfExists(fdPath, uploadDir);
deleteFileIfExists(photoPath, uploadDir);
response.put("success", false); response.put("success", false);
response.put("error", "Failed to update outward details in the database."); response.put("error", "Failed to update outward details in the database.");
} }
@ -493,12 +670,24 @@ public class TonerController {
return originalFilename.toLowerCase().endsWith(".pdf"); return originalFilename.toLowerCase().endsWith(".pdf");
} }
private boolean isImageFile(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
if (originalFilename == null)
return false;
String lower = originalFilename.toLowerCase();
return lower.endsWith(".jpg") || lower.endsWith(".jpeg") || lower.endsWith(".png") || lower.endsWith(".webp")
|| lower.endsWith(".gif");
}
private String saveUploadedFile(MultipartFile file, String prefix, File uploadDir) throws Exception { private String saveUploadedFile(MultipartFile file, String prefix, File uploadDir) throws Exception {
if (file == null || file.isEmpty()) { if (file == null || file.isEmpty()) {
return null; return null;
} }
String originalFilename = file.getOriginalFilename(); String originalFilename = file.getOriginalFilename();
String ext = ".pdf"; // Since we only allow PDFs
String ext = ".pdf";
if (originalFilename != null && originalFilename.lastIndexOf('.') > 0) {
ext = originalFilename.substring(originalFilename.lastIndexOf('.')).toLowerCase();
}
// Clean filename, make it unique // Clean filename, make it unique
String savedFilename = prefix + "_" + System.currentTimeMillis() + ext; String savedFilename = prefix + "_" + System.currentTimeMillis() + ext;
@ -508,6 +697,34 @@ public class TonerController {
return "gcctonermanagementfiles/" + savedFilename; return "gcctonermanagementfiles/" + savedFilename;
} }
private String saveBase64Image(String base64Data, String prefix, File uploadDir) throws Exception {
if (base64Data == null || base64Data.trim().isEmpty()) {
return null;
}
String cleanData = base64Data.trim();
String ext = ".jpg";
if (cleanData.contains("data:image/png;base64,")) {
ext = ".png";
cleanData = cleanData.replace("data:image/png;base64,", "");
} else if (cleanData.contains("data:image/jpeg;base64,")) {
ext = ".jpg";
cleanData = cleanData.replace("data:image/jpeg;base64,", "");
} else if (cleanData.contains("data:image/webp;base64,")) {
ext = ".webp";
cleanData = cleanData.replace("data:image/webp;base64,", "");
} else if (cleanData.startsWith("data:") && cleanData.contains(";base64,")) {
cleanData = cleanData.substring(cleanData.indexOf(";base64,") + 8);
}
byte[] decodedBytes = java.util.Base64.getDecoder().decode(cleanData);
String savedFilename = prefix + "_" + System.currentTimeMillis() + ext;
File destFile = new File(uploadDir, savedFilename).getAbsoluteFile();
try (java.io.FileOutputStream fos = new java.io.FileOutputStream(destFile)) {
fos.write(decodedBytes);
}
return "gcctonermanagementfiles/" + savedFilename;
}
private void deleteFileIfExists(String webPath, File uploadDir) { private void deleteFileIfExists(String webPath, File uploadDir) {
if (webPath == null || webPath.isEmpty()) if (webPath == null || webPath.isEmpty())
return; return;
@ -531,6 +748,26 @@ public class TonerController {
return tonerService.getActiveWorkorderRefNos(); return tonerService.getActiveWorkorderRefNos();
} }
@GetMapping("/api/workorders/items")
@ResponseBody
public List<Map<String, Object>> getWorkorderRegisteredItems(
@RequestParam("refNo") String refNo,
HttpSession session) {
if (session.getAttribute("toner_usrName") == null) {
return new ArrayList<>();
}
return tonerService.getWorkorderRegisteredItems(refNo);
}
@GetMapping("/api/workorder/history")
@ResponseBody
public List<Map<String, Object>> getWorkorderRegisterHistory(HttpSession session) {
if (session.getAttribute("toner_usrName") == null) {
return new ArrayList<>();
}
return tonerService.getWorkorderRegisterHistory();
}
@PostMapping("/api/workorder-request") @PostMapping("/api/workorder-request")
@ResponseBody @ResponseBody
public Map<String, Object> uploadWorkorderModelRequest( public Map<String, Object> uploadWorkorderModelRequest(
@ -582,18 +819,21 @@ public class TonerController {
uploadDir.mkdirs(); uploadDir.mkdirs();
} }
String ecPath = saveUploadedFile(emailCopyFile, "workorder_request_email", uploadDir);
String ecPath = saveUploadedFile(emailCopyFile, "workorder_request_email",
uploadDir);
boolean saved = tonerService.saveWorkorderModelRequest( boolean saved = tonerService.saveWorkorderModelRequest(
refNo.trim(), companyName.trim(), pid.trim(), items, ecPath, updatedBy); refNo.trim(), companyName.trim(), pid.trim(), items, ecPath, updatedBy);
if (saved) { if (saved) {
response.put("success", true); response.put("success", true);
response.put("message", "Workorder model request details saved successfully.");
response.put("message",
"Workorder model request details saved successfully.");
} else { } else {
deleteFileIfExists(ecPath, uploadDir); deleteFileIfExists(ecPath, uploadDir);
response.put("success", false); response.put("success", false);
response.put("error", "Failed to save workorder request details in the database.");
response.put("error",
"Failed to save workorder request details in the database.");
} }
} catch (Exception e) { } catch (Exception e) {
response.put("success", false); response.put("success", false);
@ -603,17 +843,6 @@ public class TonerController {
return response; return response;
} }
@GetMapping("/api/workorders/items")
@ResponseBody
public List<Map<String, Object>> getWorkorderRegisteredItems(
@RequestParam("refNo") String refNo,
HttpSession session) {
if (session.getAttribute("toner_usrName") == null) {
return new ArrayList<>();
}
return tonerService.getWorkorderRegisteredItems(refNo);
}
@GetMapping("/api/workorders/active-requests") @GetMapping("/api/workorders/active-requests")
@ResponseBody @ResponseBody
public List<String> getActiveWorkorderRequestRefNos(HttpSession session) { public List<String> getActiveWorkorderRequestRefNos(HttpSession session) {
@ -634,15 +863,6 @@ public class TonerController {
return tonerService.getWorkorderRequests(refNo); return tonerService.getWorkorderRequests(refNo);
} }
@GetMapping("/api/workorder/history")
@ResponseBody
public List<Map<String, Object>> getWorkorderRegisterHistory(HttpSession session) {
if (session.getAttribute("toner_usrName") == null) {
return new ArrayList<>();
}
return tonerService.getWorkorderRegisterHistory();
}
@GetMapping("/api/workorder-request/history") @GetMapping("/api/workorder-request/history")
@ResponseBody @ResponseBody
public List<Map<String, Object>> getWorkorderModelRequestHistory(HttpSession session) { public List<Map<String, Object>> getWorkorderModelRequestHistory(HttpSession session) {

994
src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java
File diff suppressed because it is too large
View File

1253
src/main/resources/templates/gccadjustmentmanagement/dashboard.html
File diff suppressed because it is too large
View File

799
src/main/resources/templates/gccadjustmentmanagement/details.html
File diff suppressed because it is too large
View File

18
src/main/resources/templates/gcctapaldetailsmanagement/dashboard.html

@ -346,6 +346,21 @@
background-color: #e2e8f0; background-color: #e2e8f0;
} }
/* Interactive Summary Cell Styles */
.cursor-pointer {
cursor: pointer;
transition: all 0.2s ease;
}
.cursor-pointer:hover {
background-color: #cbd5e1 !important;
transform: scale(1.08);
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.08);
z-index: 5;
position: relative;
}
/* Table card styling */ /* Table card styling */
.table-card { .table-card {
background: #fff; background: #fff;
@ -761,7 +776,8 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr class="fw-bold" style="font-size: 1rem; color: #1e293b;" id="summary-tbody-tr">
<tr class="cursor-pointer fw-bold" style="font-size: 1rem; color: #1e293b;"
id="summary-tbody-tr">
<td id="summary-total" class="cursor-pointer text-primary" <td id="summary-total" class="cursor-pointer text-primary"
style="background-color: #f8fafc;" style="background-color: #f8fafc;"
onclick="openModalForCount('total', null, 'Total Tapals')">0</td> onclick="openModalForCount('total', null, 'Total Tapals')">0</td>

2706
src/main/resources/templates/gcctonermanagement/upload.html
File diff suppressed because it is too large
View File

2
src/main/resources/templates/home/login.html

@ -68,7 +68,7 @@
let usrName = data.usrName && data.usrName.length > 0 ? data.usrName : null; let usrName = data.usrName && data.usrName.length > 0 ? data.usrName : null;
if (usrName) { if (usrName) {
sessionStorage.setItem("usrName", usrName); sessionStorage.setItem("usrName", usrName);
console.log("Redirecting to:", contextPath + 'redirect');
//console.log("Redirecting to:", contextPath + 'redirect');
alert("Login Success"); alert("Login Success");
window.location.href = contextPath + 'redirect'; window.location.href = contextPath + 'redirect';
} else { } else {

Loading…
Cancel
Save