Browse Source

UI and apis changes in payment tracker and toner management project

master
yoganandhank 3 months ago
parent
commit
21e3fa1287
  1. 159
      src/main/java/com/gcc_manpower/gcctonermanagement/controller/TonerController.java
  2. 186
      src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java
  3. 749
      src/main/resources/templates/gccservicepaymenttracker/dashboard.html
  4. 1683
      src/main/resources/templates/gcctonermanagement/upload.html

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

@ -110,16 +110,14 @@ public class TonerController {
return tonerService.getActiveTonersByPrinter(pid);
}
@PostMapping("/api/upload")
@PostMapping("/api/inward")
@ResponseBody
public Map<String, Object> uploadToner(
public Map<String, Object> uploadInward(
@RequestParam("companyName") String companyName,
@RequestParam("pid") int pid,
@RequestParam("tid") int tid,
@RequestParam("qty") String qty,
@RequestParam(value = "dcFile", required = false) MultipartFile dcFile,
@RequestParam(value = "userRequestFile", required = false) MultipartFile userRequestFile,
@RequestParam(value = "finalDeliveredFile", required = false) MultipartFile finalDeliveredFile,
HttpSession session) {
Map<String, Object> response = new HashMap<>();
@ -130,17 +128,108 @@ public class TonerController {
return response;
}
// Validate PDF extension on non-empty files
if (dcFile != null && !dcFile.isEmpty() && !isPdfFile(dcFile)) {
response.put("success", false);
response.put("error", "Delivery Challan file must be a PDF.");
return response;
}
try {
File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile();
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
String dcPath = saveUploadedFile(dcFile, "dc", uploadDir);
boolean saved = tonerService.saveInwardRegister(
companyName.trim(), pid, tid, qty.trim(), dcPath, username);
if (saved) {
response.put("success", true);
response.put("message", "Inward stock registered successfully.");
} else {
deleteFileIfExists(dcPath, uploadDir);
response.put("success", false);
response.put("error", "Failed to save inward details in the database.");
}
} catch (Exception e) {
response.put("success", false);
response.put("error", "An error occurred: " + e.getMessage());
e.printStackTrace();
}
return response;
}
@PostMapping("/api/request")
@ResponseBody
public Map<String, Object> uploadRequest(
@RequestParam("itcellRefNo") String itcellRefNo,
@RequestParam("deptId") String deptId,
@RequestParam("pid") int pid,
@RequestParam("tid") int tid,
@RequestParam("qtyRequested") String 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;
}
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 = saveUploadedFile(userRequestFile, "user_request", uploadDir);
String reqNo = tonerService.saveUserRequest(
itcellRefNo.trim(), deptId.trim(), pid, tid, qtyRequested.trim(), urPath, username);
if (reqNo != null) {
response.put("success", true);
response.put("reqNo", reqNo);
response.put("message", "User request saved successfully.");
} else {
deleteFileIfExists(urPath, uploadDir);
response.put("success", false);
response.put("error", "Failed to save request details in the database.");
}
} catch (Exception e) {
response.put("success", false);
response.put("error", "An error occurred: " + e.getMessage());
e.printStackTrace();
}
return response;
}
@PostMapping("/api/outward")
@ResponseBody
public Map<String, Object> uploadOutward(
@RequestParam("id") int id,
@RequestParam("qtyIssued") String qtyIssued,
@RequestParam(value = "finalDeliveredFile", required = false) MultipartFile finalDeliveredFile,
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;
}
if (finalDeliveredFile != null && !finalDeliveredFile.isEmpty() && !isPdfFile(finalDeliveredFile)) {
response.put("success", false);
response.put("error", "Final Delivered file must be a PDF.");
@ -153,41 +242,59 @@ public class TonerController {
uploadDir.mkdirs();
}
// Save files
String dcPath = saveUploadedFile(dcFile, "dc", uploadDir);
String userRequestPath = saveUploadedFile(userRequestFile, "user_request", uploadDir);
String finalDeliveredPath = saveUploadedFile(finalDeliveredFile, "final_delivered", uploadDir);
boolean saved = tonerService.saveInventoryDetails(
companyName.trim(),
pid,
tid,
qty.trim(),
dcPath,
userRequestPath,
finalDeliveredPath,
username);
String fdPath = saveUploadedFile(finalDeliveredFile, "final_delivered", uploadDir);
boolean saved = tonerService.saveOutwardRegister(
id, qtyIssued.trim(), fdPath, username);
if (saved) {
response.put("success", true);
response.put("message", "Toner details saved successfully.");
response.put("message", "Outward delivery recorded successfully.");
} else {
// Delete newly saved files on DB insert failure
deleteFileIfExists(dcPath, uploadDir);
deleteFileIfExists(userRequestPath, uploadDir);
deleteFileIfExists(finalDeliveredPath, uploadDir);
deleteFileIfExists(fdPath, uploadDir);
response.put("success", false);
response.put("error", "Failed to save registration details in the database.");
response.put("error", "Failed to update outward details in the database.");
}
} catch (Exception e) {
response.put("success", false);
response.put("error", "An error occurred during saving: " + e.getMessage());
response.put("error", "An error occurred: " + e.getMessage());
e.printStackTrace();
}
return response;
}
@GetMapping("/api/report")
@ResponseBody
public Map<String, Object> getReportData(HttpSession session) {
Map<String, Object> response = new HashMap<>();
if (session.getAttribute("toner_usrName") == null) {
response.put("success", false);
return response;
}
response.put("success", true);
response.put("metrics", tonerService.getDashboardMetrics());
response.put("summary", tonerService.getInventorySummary());
return response;
}
@GetMapping("/api/requests/pending")
@ResponseBody
public List<Map<String, Object>> getPendingRequestsData(HttpSession session) {
if (session.getAttribute("toner_usrName") == null) {
return java.util.Collections.emptyList();
}
return tonerService.getPendingRequests();
}
@GetMapping("/api/outward/list")
@ResponseBody
public List<Map<String, Object>> getOutwardListData(HttpSession session) {
if (session.getAttribute("toner_usrName") == null) {
return java.util.Collections.emptyList();
}
return tonerService.getOutwardHistory();
}
private boolean isPdfFile(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
if (originalFilename == null)

186
src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java

@ -1,6 +1,7 @@
package com.gcc_manpower.gcctonermanagement.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -21,6 +22,50 @@ public class TonerService {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@jakarta.annotation.PostConstruct
public void initTables() {
try {
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS stock_register_details (" +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"company_name VARCHAR(30), " +
"pid VARCHAR(20), " +
"tid VARCHAR(30), " +
"qty_registered VARCHAR(30), " +
"dc_upload VARCHAR(250), " +
"cdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " +
"updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
"order_by VARCHAR(45), " +
"is_active TINYINT DEFAULT 1, " +
"is_delete TINYINT DEFAULT 0" +
")");
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS department_requested_details (" +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"req_no VARCHAR(70), " +
"company_name VARCHAR(30), " +
"itcell_ref_no VARCHAR(45), " +
"dept_id VARCHAR(30), " +
"pid VARCHAR(20), " +
"tid VARCHAR(30), " +
"qty_registered VARCHAR(30), " +
"qty_requested VARCHAR(30), " +
"qty_delivered VARCHAR(30), " +
"dc_upload VARCHAR(250), " +
"user_request_upload VARCHAR(250), " +
"final_delivered_upload VARCHAR(250), " +
"cdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " +
"updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
"updated_by VARCHAR(45), " +
"order_by VARCHAR(45), " +
"is_active TINYINT DEFAULT 1, " +
"is_delete TINYINT DEFAULT 0" +
")");
} catch (Exception e) {
System.err.println("Error initializing tables: " + e.getMessage());
e.printStackTrace();
}
}
public List<Map<String, Object>> getActivePrinters() {
String sql = "SELECT id, printer_name FROM printer_model_list where is_active = 1 AND is_delete = 0 ";
try {
@ -51,47 +96,148 @@ public class TonerService {
}
}
public int getMaxInventoryId() {
String sql = "SELECT COALESCE(MAX(id), 0) FROM inventory_registered_details";
public boolean saveInwardRegister(String companyName, int pid, int tid, String qty, String dcUpload, String username) {
String sql = "INSERT INTO stock_register_details " +
"(company_name, pid, tid, qty_registered, dc_upload, cdate, updated_date, order_by, is_active, is_delete) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, 0)";
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
try {
int rows = jdbcTemplate.update(sql, companyName, String.valueOf(pid), String.valueOf(tid), qty, dcUpload, now, now, username);
return rows > 0;
} catch (Exception e) {
System.err.println("Error saving inward register: " + e.getMessage());
e.printStackTrace();
return false;
}
}
public int getMaxRequestId() {
String sql = "SELECT COALESCE(MAX(id), 0) FROM department_requested_details";
try {
return jdbcTemplate.queryForObject(sql, Integer.class);
} catch (Exception e) {
System.err.println("Error fetching max id from inventory_registered_details: " + e.getMessage());
System.err.println("Error fetching max id from department_requested_details: " + e.getMessage());
return 0;
}
}
public boolean saveInventoryDetails(String companyName, int pid, int tid, String qty, String dcUpload,
String userRequestUpload, String finalDeliveredUpload, String username) {
// 1. Get toner model name
public String saveUserRequest(String itCellRefNo, String deptId, int pid, int tid, String qtyRequested, String userRequestUpload, String username) {
String tonerModel = getTonerModelName(tid);
String cleanModel = tonerModel.trim().replaceAll("\\s+", "-").replaceAll("[^a-zA-Z0-9-]", "");
// 2. Get next sequential number
int maxId = getMaxInventoryId();
int maxId = getMaxRequestId();
int seqNum = 1000 + maxId + 1;
// 3. Get current year
int year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
// 4. Construct request number
String reqNo = String.format("%s-%d-%04d", cleanModel, year, seqNum);
// 5. Insert row
String sql = "INSERT INTO department_requested_details " +
"(req_no, company_name, pid, tid, qty_registered, dc_upload, user_request_upload, final_delivered_upload, cdate, updated_date, updated_by, is_active, is_delete) "
+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0)";
"(req_no, itcell_ref_no, dept_id, pid, tid, qty_requested, qty_delivered, user_request_upload, cdate, updated_date, updated_by, is_active, is_delete) " +
"VALUES (?, ?, ?, ?, ?, ?, '0', ?, ?, ?, ?, 1, 0)";
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
try {
int rows = jdbcTemplate.update(sql, reqNo, itCellRefNo, deptId, String.valueOf(pid), String.valueOf(tid), qtyRequested, userRequestUpload, now, now, username);
return rows > 0 ? reqNo : null;
} catch (Exception e) {
System.err.println("Error saving user request: " + e.getMessage());
e.printStackTrace();
return null;
}
}
public List<Map<String, Object>> getPendingRequests() {
String sql = "SELECT r.id, r.req_no, r.dept_id, r.pid, r.tid, r.qty_requested, r.qty_delivered, " +
"p.printer_name, t.model_name " +
"FROM department_requested_details r " +
"LEFT JOIN printer_model_list p ON r.pid = p.id " +
"LEFT JOIN toner_model_list t ON r.tid = t.id " +
"WHERE r.is_active = 1 AND r.is_delete = 0 " +
"AND (r.qty_delivered IS NULL OR CAST(r.qty_delivered AS SIGNED) < CAST(r.qty_requested AS SIGNED)) " +
"ORDER BY r.id DESC";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
System.err.println("Error fetching pending requests: " + e.getMessage());
return new ArrayList<>();
}
}
public boolean saveOutwardRegister(int id, String qtyIssued, String finalDeliveredUpload, String username) {
String sql = "UPDATE department_requested_details " +
"SET qty_delivered = ?, final_delivered_upload = ?, updated_date = ?, updated_by = ? " +
"WHERE id = ?";
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
try {
int rows = jdbcTemplate.update(sql, reqNo, companyName, String.valueOf(pid), String.valueOf(tid), qty,
dcUpload, userRequestUpload, finalDeliveredUpload, now, now, username);
int rows = jdbcTemplate.update(sql, qtyIssued, finalDeliveredUpload, now, username, id);
return rows > 0;
} catch (Exception e) {
System.err.println("Error saving inventory details: " + e.getMessage());
System.err.println("Error updating outward register: " + e.getMessage());
e.printStackTrace();
return false;
}
}
public Map<String, Object> getDashboardMetrics() {
Map<String, Object> metrics = new HashMap<>();
String sqlRaised = "SELECT COALESCE(SUM(CAST(qty_requested AS SIGNED)), 0) FROM department_requested_details WHERE is_active = 1 AND is_delete = 0";
String sqlDistributed = "SELECT COALESCE(SUM(CAST(qty_delivered AS SIGNED)), 0) FROM department_requested_details WHERE is_active = 1 AND is_delete = 0";
String sqlInward = "SELECT COALESCE(SUM(CAST(qty_registered AS SIGNED)), 0) FROM stock_register_details WHERE is_active = 1 AND is_delete = 0";
try {
int totalRaised = jdbcTemplate.queryForObject(sqlRaised, Integer.class);
int totalDistributed = jdbcTemplate.queryForObject(sqlDistributed, Integer.class);
int inwardStock = jdbcTemplate.queryForObject(sqlInward, Integer.class);
int availableStock = inwardStock - totalDistributed;
metrics.put("totalRaised", totalRaised);
metrics.put("totalDistributed", totalDistributed);
metrics.put("availableStock", availableStock);
} catch (Exception e) {
System.err.println("Error computing dashboard metrics: " + e.getMessage());
metrics.put("totalRaised", 0);
metrics.put("totalDistributed", 0);
metrics.put("availableStock", 0);
}
return metrics;
}
public List<Map<String, Object>> getInventorySummary() {
String safeSql = "SELECT p.printer_name, t.model_name, " +
"COALESCE((SELECT SUM(CAST(sr.qty_registered AS SIGNED)) FROM stock_register_details sr WHERE CAST(sr.pid AS SIGNED) = t.pid AND CAST(sr.tid AS SIGNED) = t.id AND sr.is_active = 1 AND sr.is_delete = 0), 0) AS inward_qty, " +
"COALESCE((SELECT SUM(CAST(dr.qty_delivered AS SIGNED)) FROM department_requested_details dr WHERE CAST(dr.pid AS SIGNED) = t.pid AND CAST(dr.tid AS SIGNED) = t.id AND dr.is_active = 1 AND dr.is_delete = 0), 0) AS outward_qty " +
"FROM toner_model_list t " +
"JOIN printer_model_list p ON t.pid = p.id " +
"WHERE t.is_active = 1 AND t.is_delete = 0 " +
"ORDER BY p.printer_name, t.model_name";
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(safeSql);
for (Map<String, Object> map : list) {
Number inward = (Number) map.get("inward_qty");
Number outward = (Number) map.get("outward_qty");
long avail = (inward != null ? inward.longValue() : 0) - (outward != null ? outward.longValue() : 0);
map.put("available_qty", avail);
}
return list;
} catch (Exception e) {
System.err.println("Error fetching inventory summary: " + e.getMessage());
e.printStackTrace();
return new ArrayList<>();
}
}
public List<Map<String, Object>> getOutwardHistory() {
String sql = "SELECT r.id, r.req_no, r.itcell_ref_no, r.dept_id, r.qty_requested, r.qty_delivered, r.final_delivered_upload, r.updated_date, " +
"p.printer_name, t.model_name " +
"FROM department_requested_details r " +
"LEFT JOIN printer_model_list p ON r.pid = p.id " +
"LEFT JOIN toner_model_list t ON r.tid = t.id " +
"WHERE r.is_active = 1 AND r.is_delete = 0 " +
"AND r.qty_delivered IS NOT NULL AND CAST(r.qty_delivered AS SIGNED) > 0 " +
"ORDER BY r.updated_date DESC";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
System.err.println("Error fetching outward history: " + e.getMessage());
return new ArrayList<>();
}
}
}

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

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

Loading…
Cancel
Save