package com.gcc_manpower.controller; import com.gcc_manpower.service.AppUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import jakarta.servlet.http.HttpSession; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.multipart.MultipartFile; import java.io.File; @Controller @RequestMapping("/") public class HomeController { @Autowired private AppUserService appUserService; @Value("${upload.path:gcc_manpower_uploads}") private String uploadPathConfig; private void addSummaryStats(Model model, List> vendorDetails) { int totalVendors = vendorDetails.size(); int totalTenderCount = appUserService.getOverallTenderCount(); int totalExistingCount = appUserService.getOverallActiveEmployeeCount(); int totalVacantCount = 0; for (Map vendor : vendorDetails) { List> designations = (List>) vendor.get("designationDetails"); if (designations != null) { for (Map des : designations) { Object vacantObj = des.get("vacant_count"); if (vacantObj != null) { try { double val = Double.parseDouble(String.valueOf(vacantObj).trim()); if (val > 0) { totalVacantCount += (int) val; } } catch (NumberFormatException ignored) { } } } } } model.addAttribute("totalVendors", totalVendors); model.addAttribute("totalTenderCount", totalTenderCount); model.addAttribute("totalExistingCount", totalExistingCount); model.addAttribute("totalVacantCount", totalVacantCount); } @GetMapping("/") public String home(Model model, HttpSession session) { String usrName = (String) session.getAttribute("usrName"); if (usrName == null) { return "redirect:/login"; } String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); List> vendorDetails = appUserService.getVendorDetailsWithCounts(); addSummaryStats(model, vendorDetails); model.addAttribute("curPage", "home"); model.addAttribute("isAdmin", isAdmin); model.addAttribute("urls", new ArrayList<>()); // default empty services model.addAttribute("vendorDetails", vendorDetails); model.addAttribute("locations", appUserService.getActiveLocations()); model.addAttribute("designations", appUserService.getActiveDesignations()); model.addAttribute("userTypes", appUserService.getActiveUserTypes()); return "home/home"; } @GetMapping("/login") public String login(HttpSession session) { // If already logged in, redirect to the home page if (session.getAttribute("usrName") != null) { return "redirect:/"; } return "home/login"; } @PostMapping("/api/val-app-usr-login") @ResponseBody public Map validateAppUserLogin( @RequestParam("usrName") String usrName, @RequestParam("usrPass") String usrPass, HttpSession session) { Map authResult = appUserService.authenticate(usrName, usrPass); Map response = new HashMap<>(); if (Boolean.TRUE.equals(authResult.get("success"))) { session.setAttribute("usrName", authResult.get("usrName")); session.setAttribute("usrRole", authResult.get("usrRole")); session.setMaxInactiveInterval(600); // 10 minutes session timeout response.put("result", true); response.put("usrName", authResult.get("usrName")); } else { response.put("result", false); response.put("error", authResult.get("error")); } return response; } @PostMapping("/api/get-role") @ResponseBody public Map getRole(HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); if (usrName == null) { response.put("authenticated", false); response.put("isAdmin", false); } else { response.put("authenticated", true); response.put("isAdmin", "ADMIN".equalsIgnoreCase(usrRole)); } return response; } @GetMapping("/redirect") public String redirect() { return "redirect:/"; } @GetMapping("/view-login-det") public String viewLoginDetails(Model model, HttpSession session) { String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); if (usrName == null) { return "redirect:/login"; } boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); // Fetch exact spreadsheet rows dynamically from MySQL using JdbcTemplate List> manpowerEntries = appUserService.getManpowerTenders(); List> vendorDetails = appUserService.getVendorDetailsWithCounts(); model.addAttribute("curPage", "view-login-det"); model.addAttribute("isAdmin", isAdmin); model.addAttribute("manpowerEntries", manpowerEntries); model.addAttribute("vendorDetails", vendorDetails); model.addAttribute("designations", appUserService.getActiveDesignations()); return "home/view-login-details"; } @GetMapping("/api/vendor-employees") @ResponseBody public List> getVendorEmployees( @RequestParam("vendorName") String vendorName) { return appUserService.getEmployeesByVendor(vendorName); } @GetMapping("/api/employee/history") @ResponseBody public List> getEmployeeHistory( @RequestParam("empCode") String empCode) { return appUserService.getEmployeeHistory(empCode); } @GetMapping("/api/all-employees") @ResponseBody public List> getAllEmployees() { return appUserService.getAllEmployees(); } @PostMapping("/api/save-manpower-stats") @ResponseBody public Map saveManpowerStats( @RequestBody List> payload, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); if (usrName == null) { response.put("success", false); response.put("error", "Unauthorized access! Please log in."); return response; } try { boolean overallSuccess = true; for (Map row : payload) { int id = ((Number) row.get("id")).intValue(); int availableCount = ((Number) row.get("availableCount")).intValue(); String vacantRemarks = (String) row.get("vacantRemarks"); boolean rowSuccess = appUserService.updateManpowerTender(id, availableCount, vacantRemarks); if (!rowSuccess) { overallSuccess = false; } } response.put("success", overallSuccess); } catch (Exception e) { response.put("success", false); response.put("error", "Failed to save statistics: " + e.getMessage()); } return response; } @GetMapping("/api/employee") @ResponseBody public Map getEmployeeByCode( @RequestParam("empCode") String empCode, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); if (usrName == null) { response.put("success", false); response.put("error", "Unauthorized access! Please log in."); return response; } Map emp = appUserService.getEmployeeByCode(empCode); if (emp != null) { response.put("success", true); response.put("employee", emp); } else { response.put("success", false); response.put("error", "Employee not found or inactive."); } return response; } @PostMapping("/api/employee/add") @ResponseBody public Map addEmployee( @RequestBody Map payload, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); if (usrName == null || !isAdmin) { response.put("success", false); response.put("error", "Unauthorized! Admin access required."); return response; } try { boolean success = appUserService.addEmployee(payload, usrName); if (success) { response.put("success", true); response.put("message", "Employee registered successfully!"); } else { response.put("success", false); response.put("error", "Failed to register employee. The employee code might already exist."); } } catch (Exception e) { response.put("success", false); response.put("error", "Error: " + e.getMessage()); } return response; } @PostMapping("/api/employee/update") @ResponseBody public Map updateEmployee( @RequestBody Map payload, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); if (usrName == null || !isAdmin) { response.put("success", false); response.put("error", "Unauthorized! Admin access required."); return response; } try { boolean success = appUserService.updateEmployee(payload, usrName); if (success) { response.put("success", true); response.put("message", "Employee updated successfully!"); } else { response.put("success", false); response.put("error", "Failed to update employee details. Record not found or inactive."); } } catch (Exception e) { response.put("success", false); response.put("error", "Error: " + e.getMessage()); } return response; } @PostMapping("/api/vendor/add-work-order") @ResponseBody public Map addVendorWorkOrder( @RequestParam("vendorType") String vendorType, @RequestParam(value = "vendorId", required = false) String vendorIdStr, @RequestParam(value = "vendorName", required = false) String vendorName, @RequestParam("description") String description, @RequestParam("contractorName") String contractorName, @RequestParam("fileNo") String fileNo, @RequestParam("subject") String subject, @RequestParam("issueDate") String issueDate, @RequestParam("endDate") String endDate, @RequestParam("totalEmployees") String totalEmployees, @RequestParam(value = "orderby", required = false) Integer orderby, @RequestParam(value = "file", required = false) MultipartFile file, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); if (usrName == null || !isAdmin) { response.put("success", false); response.put("error", "Unauthorized! Admin access required."); return response; } try { // Convert to uppercase for Contractor Name and File No if (contractorName != null) { contractorName = contractorName.toUpperCase(); } if (fileNo != null) { fileNo = fileNo.toUpperCase(); } long finalVendorId = 0; if ("new".equalsIgnoreCase(vendorType)) { // Check if vendor name already exists List> existingVendors = appUserService.getVendorDetailsWithCounts(); boolean vendorExists = false; for (Map v : existingVendors) { String vName = (String) v.get("vendor_name"); if (vName != null && vName.equalsIgnoreCase(vendorName)) { vendorExists = true; break; } } if (vendorExists) { response.put("success", false); response.put("error", "A vendor with this name already exists."); return response; } // Insert into vendor_details finalVendorId = appUserService.addVendor(vendorName, description, totalEmployees, orderby); if (finalVendorId == 0) { response.put("success", false); response.put("error", "Failed to create new vendor details."); return response; } } else { if (vendorIdStr == null || vendorIdStr.trim().isEmpty()) { response.put("success", false); response.put("error", "No existing vendor selected."); return response; } try { finalVendorId = Long.parseLong(vendorIdStr); } catch (NumberFormatException e) { response.put("success", false); response.put("error", "Invalid vendor ID formatting."); return response; } } // Save upload file (mandatory validation) if (file == null || file.isEmpty()) { response.put("success", false); response.put("error", "Work order PDF file is required."); return response; } File uploadDir = new File(uploadPathConfig).getAbsoluteFile(); if (!uploadDir.exists()) { uploadDir.mkdirs(); } String originalFilename = file.getOriginalFilename(); String nameWithoutExt = ""; String ext = ".pdf"; if (originalFilename != null && originalFilename.contains(".")) { int dotIdx = originalFilename.lastIndexOf("."); nameWithoutExt = originalFilename.substring(0, dotIdx); ext = originalFilename.substring(dotIdx); } else { nameWithoutExt = originalFilename != null ? originalFilename : "file"; } nameWithoutExt = nameWithoutExt.replaceAll("[^a-zA-Z0-9-_]", "_"); String savedFilename = nameWithoutExt + "_" + System.currentTimeMillis() + ext; File destFile = new File(uploadDir, savedFilename).getAbsoluteFile(); file.transferTo(destFile); String fileWebUrl = "/gcc_manpower_uploads/" + savedFilename; // Insert into vendor_details_work_order boolean success = appUserService.addVendorWorkOrder( String.valueOf(finalVendorId), description, contractorName, fileNo, subject, issueDate, endDate, totalEmployees, orderby, fileWebUrl, usrName); if (success) { // If it's an existing vendor, add total_employees to vendor_details if (!"new".equalsIgnoreCase(vendorType)) { int addedEmployees = 0; if (totalEmployees != null) { try { addedEmployees = Integer.parseInt(totalEmployees.trim()); } catch (NumberFormatException ignored) { } } if (addedEmployees > 0) { appUserService.updateVendorTotalEmployees(String.valueOf(finalVendorId), addedEmployees); } } response.put("success", true); response.put("message", "Vendor work order saved successfully!"); } else { response.put("success", false); response.put("error", "Failed to register vendor work order."); } } catch (Exception e) { response.put("success", false); response.put("error", "Error: " + e.getMessage()); } return response; } @PostMapping("/api/employee/delete") @ResponseBody public Map deleteEmployee( @RequestBody Map payload, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); if (usrName == null || !isAdmin) { response.put("success", false); response.put("error", "Unauthorized! Admin access required."); return response; } try { String empCode = (String) payload.get("empCode"); if (empCode == null || empCode.trim().isEmpty()) { response.put("success", false); response.put("error", "Employee code is required."); return response; } boolean success = appUserService.deleteEmployee(empCode, usrName); if (success) { response.put("success", true); response.put("message", "Employee deleted successfully!"); } else { response.put("success", false); response.put("error", "Failed to delete employee or record not found."); } } catch (Exception e) { response.put("success", false); response.put("error", "Error: " + e.getMessage()); } return response; } @PostMapping("/api/vendor/delete") @ResponseBody public Map deleteVendor( @RequestBody Map payload, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); if (usrName == null || !isAdmin) { response.put("success", false); response.put("error", "Unauthorized! Admin access required."); return response; } try { Object idObj = payload.get("id"); if (idObj == null) { response.put("success", false); response.put("error", "Vendor ID is required."); return response; } String idStr = String.valueOf(idObj); boolean success = appUserService.deleteVendor(idStr); if (success) { response.put("success", true); response.put("message", "Vendor and associated records deleted successfully!"); } else { response.put("success", false); response.put("error", "Failed to delete vendor or record not found."); } } catch (Exception e) { response.put("success", false); response.put("error", "Error: " + e.getMessage()); } return response; } @PostMapping("/api/vendor/delete-work-order") @ResponseBody public Map deleteWorkOrder( @RequestBody Map payload, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); if (usrName == null || !isAdmin) { response.put("success", false); response.put("error", "Unauthorized! Admin access required."); return response; } try { Object idObj = payload.get("workOrderId"); if (idObj == null) { response.put("success", false); response.put("error", "Work order ID is required."); return response; } String workOrderId = String.valueOf(idObj); boolean success = appUserService.deleteWorkOrder(workOrderId, usrName); if (success) { response.put("success", true); response.put("message", "Work order deleted successfully!"); } else { response.put("success", false); response.put("error", "Failed to delete work order or record not found."); } } catch (Exception e) { response.put("success", false); response.put("error", "Error: " + e.getMessage()); } return response; } @GetMapping("/api/vendor-employees-all") @ResponseBody public List> getVendorEmployeesAll( @RequestParam("vendorIdOrName") String vendorIdOrName) { return appUserService.getEmployeesByVendorAll(vendorIdOrName); } @PostMapping("/api/employee/restore") @ResponseBody public Map restoreEmployee( @RequestBody Map payload, HttpSession session) { Map response = new HashMap<>(); String usrName = (String) session.getAttribute("usrName"); String usrRole = (String) session.getAttribute("usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); if (usrName == null || !isAdmin) { response.put("success", false); response.put("error", "Unauthorized! Admin access required."); return response; } try { String empCode = (String) payload.get("empCode"); if (empCode == null || empCode.trim().isEmpty()) { response.put("success", false); response.put("error", "Employee code is required."); return response; } boolean success = appUserService.restoreEmployee(empCode, usrName); if (success) { response.put("success", true); response.put("message", "Employee restored successfully!"); } else { response.put("success", false); response.put("error", "Failed to restore employee or record not found."); } } catch (Exception e) { response.put("success", false); response.put("error", "Error: " + e.getMessage()); } return response; } @GetMapping("/api/all-employees-with-deleted") @ResponseBody public List> getAllEmployeesWithDeleted() { return appUserService.getAllEmployeesWithDeleted(); } @PostMapping("/usr-logout") public String logout(HttpSession session) { session.invalidate(); return "redirect:/login"; } }