package com.gcc_manpower.gcctonermanagement.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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.ResponseBody; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.multipart.MultipartFile; import java.io.File; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; import com.gcc_manpower.gcctonermanagement.service.TonerService; import com.gcc_manpower.service.AppUserService; import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.context.HttpSessionSecurityContextRepository; @Controller @RequestMapping("/gcctonermanagement") public class TonerController { @Autowired private AppUserService appUserService; @Autowired private TonerService tonerService; @Autowired private AuthenticationManager authenticationManager; @Value("${toner.upload.path:gcctonermanagementfiles}") private String tonerUploadPathConfig; @GetMapping({ "", "/", "/upload" }) public String viewDashboard(Model model, HttpSession session) { String username = (String) session.getAttribute("toner_usrName"); if (username == null) { return "redirect:/gcctonermanagement/login"; } String usrRole = (String) session.getAttribute("toner_usrRole"); boolean isAdmin = "ADMIN".equalsIgnoreCase(usrRole); // List> vendorDetails = // appUserService.getVendorDetailsWithCounts(); model.addAttribute("isLoggedIn", true); model.addAttribute("isAdmin", isAdmin); model.addAttribute("usrName", username); model.addAttribute("curPage", "gcctonermanagement"); // model.addAttribute("vendorDetails", vendorDetails); return "gcctonermanagement/upload"; } @GetMapping("/login") public String login(HttpSession session) { return "gcctonermanagement/login"; } @PostMapping("/api/login") @ResponseBody public Map validateLogin( @RequestParam("usrName") String usrName, @RequestParam("usrPass") String usrPass, HttpSession session) { Map response = new HashMap<>(); try { UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(usrName, usrPass); Authentication authentication = authenticationManager.authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext()); String role = authentication.getAuthorities().stream() .map(auth -> auth.getAuthority().replace("ROLE_", "")) .findFirst() .orElse("USER"); session.setAttribute("toner_usrName", usrName); session.setAttribute("toner_usrRole", role); session.setMaxInactiveInterval(1800); // 30 minutes session timeout response.put("result", true); response.put("usrName", usrName); } catch (AuthenticationException e) { response.put("result", false); response.put("error", e.getMessage() != null ? e.getMessage() : "Invalid username or password!"); } return response; } @GetMapping("/logout") public String logoutGet(HttpSession session, HttpServletRequest request) { SecurityContextHolder.clearContext(); if (session != null) { session.removeAttribute("toner_usrName"); session.removeAttribute("toner_usrRole"); session.invalidate(); } request.getSession(true); return "redirect:/gcctonermanagement/login"; } @GetMapping("/api/printers") @ResponseBody public List> getPrinters(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getActivePrinters(); } @GetMapping("/api/toners") @ResponseBody public List> getToners(@RequestParam("pid") int pid, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getActiveTonersByPrinter(pid); } @GetMapping("/api/departments") @ResponseBody public List> getDepartments(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getActiveDepartments(); } @GetMapping("/api/zones") @ResponseBody public List> getZones(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getActiveZones(); } @PostMapping("/api/inward") @ResponseBody public Map uploadInward( @RequestParam("refNo") String refNo, @RequestParam("companyName") String companyName, @RequestParam("itemsJson") String itemsJson, @RequestParam(value = "dcFile", required = false) MultipartFile dcFile, HttpSession session) { Map 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 (dcFile == null || dcFile.isEmpty()) { response.put("success", false); response.put("error", "Delivery Challan (DC) PDF file is required."); return response; } if (!isPdfFile(dcFile)) { response.put("success", false); response.put("error", "Delivery Challan file must be a PDF."); return response; } try { ObjectMapper mapper = new ObjectMapper(); List> items = mapper.readValue(itemsJson, new TypeReference>>() { }); if (items == null || items.isEmpty()) { response.put("success", false); response.put("error", "Please enter quantity for at least one model."); return response; } File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile(); if (!uploadDir.exists()) { uploadDir.mkdirs(); } String dcPath = saveUploadedFile(dcFile, "dc", uploadDir); boolean saved = tonerService.saveInwardRegister( refNo.trim(), companyName.trim(), items, dcPath, updatedBy); 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 uploadRequest( @RequestParam("itcellRefNo") String itcellRefNo, @RequestParam("deptId") String deptId, @RequestParam(value = "zoneId", required = false) String zoneId, @RequestParam("itemsJson") String itemsJson, @RequestParam(value = "userRequestFile", required = false) MultipartFile userRequestFile, HttpSession session) { Map 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 (userRequestFile == null || userRequestFile.isEmpty()) { response.put("success", false); response.put("error", "User Request Letter PDF file is required."); return response; } if (!isPdfFile(userRequestFile)) { response.put("success", false); response.put("error", "User Request file must be a PDF."); return response; } try { ObjectMapper mapper = new ObjectMapper(); List> items = mapper.readValue(itemsJson, new TypeReference>>() { }); if (items == null || items.isEmpty()) { response.put("success", false); response.put("error", "Please add at least one printer/toner model request entry."); return response; } File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile(); if (!uploadDir.exists()) { uploadDir.mkdirs(); } String urPath = saveUploadedFile(userRequestFile, "user_request", uploadDir); String safeZoneId = (zoneId != null && !zoneId.trim().isEmpty()) ? zoneId.trim() : null; boolean saved = tonerService.saveUserRequest( itcellRefNo.trim(), deptId.trim(), safeZoneId, items, urPath, updatedBy); if (saved) { response.put("success", true); 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/request/update") @ResponseBody public Map 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 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") @ResponseBody public Map uploadOutward( @RequestParam("id") int id, @RequestParam("qtyIssued") String qtyIssued, @RequestParam(value = "finalDeliveredFile", required = false) MultipartFile finalDeliveredFile, @RequestParam(value = "userPhotoFile", required = false) MultipartFile userPhotoFile, @RequestParam(value = "userPhotoBase64", required = false) String userPhotoBase64, HttpSession session) { Map 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 (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 req = tonerService.getUserRequestById(id); if (req == null) { response.put("success", false); response.put("error", "Invalid or non-existent request ID: " + id); 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 { File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile(); if (!uploadDir.exists()) { uploadDir.mkdirs(); } 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( id, qtyIssued.trim(), fdPath, photoPath, updatedBy); if (saved) { response.put("success", true); response.put("message", "Outward delivery recorded successfully."); } else { deleteFileIfExists(fdPath, uploadDir); deleteFileIfExists(photoPath, uploadDir); response.put("success", false); response.put("error", "Failed to update outward 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/workorder") @ResponseBody public Map saveWorkorder( @RequestParam("fileNumber") String fileNumber, @RequestParam("vendorName") String vendorName, @RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate, @RequestParam("totalQty") String totalQty, @RequestParam("itemsJson") String itemsJson, @RequestParam("dcFile") MultipartFile dcFile, HttpSession session) { Map 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 (dcFile == null || dcFile.isEmpty()) { response.put("success", false); response.put("error", "Delivery Challan (DC) PDF upload file is required."); return response; } if (!isPdfFile(dcFile)) { response.put("success", false); response.put("error", "Delivery Challan file must be a PDF."); return response; } // Auto-generate refNo: ITCell-YYYY/MM/DD/XXXX java.time.LocalDate today = java.time.LocalDate.now(); int randomNum = (int) (Math.random() * 9000) + 1000; // 4-digit random number String refNo = String.format("ITCell-%d/%02d/%02d/%d", today.getYear(), today.getMonthValue(), today.getDayOfMonth(), randomNum); try { ObjectMapper mapper = new ObjectMapper(); List> items = mapper.readValue(itemsJson, new TypeReference>>() { }); if (items == null || items.isEmpty()) { response.put("success", false); response.put("error", "Please add at least one printer/toner model quantity entry."); return response; } File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile(); if (!uploadDir.exists()) { uploadDir.mkdirs(); } String dcPath = saveUploadedFile(dcFile, "workorder_dc", uploadDir); boolean saved = tonerService.saveWorkorder( refNo, fileNumber.trim(), vendorName.trim(), startDate, endDate, dcPath, totalQty.trim(), items, updatedBy); if (saved) { response.put("success", true); response.put("refNo", refNo); response.put("message", "Workorder registered successfully."); } else { deleteFileIfExists(dcPath, uploadDir); response.put("success", false); response.put("error", "Failed to save workorder details in the database."); } } catch (Exception e) { response.put("success", false); response.put("error", "An error occurred: " + e.getMessage()); e.printStackTrace(); } return response; } @GetMapping("/api/report") @ResponseBody public Map getReportData(HttpSession session) { Map 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> getPendingRequestsData(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getPendingRequests(); } @GetMapping("/api/inward/list") @ResponseBody public List> getInwardListData(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getInwardHistory(); } @GetMapping("/api/requests/list") @ResponseBody public List> getUserRequestsListData(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getAllUserRequests(); } @GetMapping("/api/outward/list") @ResponseBody public List> 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) return false; 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 { if (file == null || file.isEmpty()) { return null; } String originalFilename = file.getOriginalFilename(); String ext = ".pdf"; if (originalFilename != null && originalFilename.lastIndexOf('.') > 0) { ext = originalFilename.substring(originalFilename.lastIndexOf('.')).toLowerCase(); } // Clean filename, make it unique String savedFilename = prefix + "_" + System.currentTimeMillis() + ext; File destFile = new File(uploadDir, savedFilename).getAbsoluteFile(); file.transferTo(destFile); 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) { if (webPath == null || webPath.isEmpty()) return; try { String filename = webPath.substring(webPath.lastIndexOf('/') + 1); File file = new File(uploadDir, filename).getAbsoluteFile(); if (file.exists()) { file.delete(); } } catch (Exception e) { System.err.println("Error deleting file: " + e.getMessage()); } } @GetMapping("/api/workorders/active") @ResponseBody public List getActiveWorkorderRefNos(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return new ArrayList<>(); } return tonerService.getActiveWorkorderRefNos(); } @GetMapping("/api/workorders/items") @ResponseBody public List> 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> getWorkorderRegisterHistory(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return new ArrayList<>(); } return tonerService.getWorkorderRegisterHistory(); } @PostMapping("/api/workorder-request") @ResponseBody public Map uploadWorkorderModelRequest( @RequestParam("refNo") String refNo, @RequestParam("companyName") String companyName, @RequestParam("pid") String pid, @RequestParam("itemsJson") String itemsJson, @RequestParam("emailCopyFile") MultipartFile emailCopyFile, HttpSession session) { Map 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 (emailCopyFile == null || emailCopyFile.isEmpty()) { response.put("success", false); response.put("error", "Email copy PDF upload file is required."); return response; } if (!isPdfFile(emailCopyFile)) { response.put("success", false); response.put("error", "Email copy file must be a PDF."); return response; } try { ObjectMapper mapper = new ObjectMapper(); List> items = mapper.readValue(itemsJson, new TypeReference>>() { }); if (items == null || items.isEmpty()) { response.put("success", false); response.put("error", "Please add at least one toner model quantity entry."); return response; } File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile(); if (!uploadDir.exists()) { uploadDir.mkdirs(); } String ecPath = saveUploadedFile(emailCopyFile, "workorder_request_email", uploadDir); boolean saved = tonerService.saveWorkorderModelRequest( refNo.trim(), companyName.trim(), pid.trim(), items, ecPath, updatedBy); if (saved) { response.put("success", true); response.put("message", "Workorder model request details saved successfully."); } else { deleteFileIfExists(ecPath, uploadDir); response.put("success", false); response.put("error", "Failed to save workorder request details in the database."); } } catch (Exception e) { response.put("success", false); response.put("error", "An error occurred: " + e.getMessage()); e.printStackTrace(); } return response; } @GetMapping("/api/workorders/active-requests") @ResponseBody public List getActiveWorkorderRequestRefNos(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return new ArrayList<>(); } return tonerService.getActiveWorkorderRequestRefNos(); } @GetMapping("/api/workorders/requests") @ResponseBody public List> getWorkorderRequests( @RequestParam("refNo") String refNo, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return new ArrayList<>(); } return tonerService.getWorkorderRequests(refNo); } @GetMapping("/api/workorder-request/history") @ResponseBody public List> getWorkorderModelRequestHistory(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return new ArrayList<>(); } return tonerService.getWorkorderModelRequestHistory(); } // Save new department for workorder @PostMapping("/api/savedepartment") @ResponseBody public boolean saveNewDepartment( @RequestParam("department") String department, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.savenewdepartment(department); } @PostMapping("/api/savetonermodel") @ResponseBody public boolean saveNewTonerModel( @RequestParam("tonermodel") String tonermodel, @RequestParam("pid") int pid, @RequestParam(required = false) String partCode, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.savetonermodel(pid, tonermodel, partCode); } @PostMapping("/api/saveprintermodel") @ResponseBody public boolean saveNewPrinterModel( @RequestParam("printermodel") String printermodel, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.saveprintermodel(printermodel); } // ================= MASTER UPDATE ENDPOINTS ================= @PostMapping("/api/updateprintermodel") @ResponseBody public boolean updatePrinterModel( @RequestParam("id") int id, @RequestParam("printermodel") String printermodel, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.updatePrinterModel(id, printermodel); } @PostMapping("/api/updatetonermodel") @ResponseBody public boolean updateTonerModel( @RequestParam("id") int id, @RequestParam("pid") int pid, @RequestParam("tonermodel") String tonermodel, @RequestParam(value = "partCode", required = false) String partCode, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.updateTonerModel(id, pid, tonermodel, partCode); } @PostMapping("/api/updatedepartment") @ResponseBody public boolean updateDepartment( @RequestParam("id") int id, @RequestParam("department") String department, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.updateDepartment(id, department); } // ================= MASTER DELETE & RESTORE ENDPOINTS ================= @PostMapping("/api/deleteprintermodel") @ResponseBody public boolean deletePrinterModel(@RequestParam("id") int id, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.deletePrinterModel(id); } @PostMapping("/api/restoreprintermodel") @ResponseBody public boolean restorePrinterModel(@RequestParam("id") int id, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.restorePrinterModel(id); } @PostMapping("/api/deletetonermodel") @ResponseBody public boolean deleteTonerModel(@RequestParam("id") int id, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.deleteTonerModel(id); } @PostMapping("/api/restoretonermodel") @ResponseBody public boolean restoreTonerModel(@RequestParam("id") int id, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.restoreTonerModel(id); } @PostMapping("/api/deletedepartment") @ResponseBody public boolean deleteDepartment(@RequestParam("id") int id, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.deleteDepartment(id); } @PostMapping("/api/restoredepartment") @ResponseBody public boolean restoreDepartment(@RequestParam("id") int id, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return false; } return tonerService.restoreDepartment(id); } // ================= MASTER LISTING ENDPOINTS ================= @GetMapping("/api/master/printers") @ResponseBody public List> getMasterPrinters( @RequestParam(value = "status", defaultValue = "active") String status, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getMasterPrinters(status); } @GetMapping("/api/master/toners") @ResponseBody public List> getMasterToners( @RequestParam(value = "status", defaultValue = "active") String status, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getMasterToners(status); } @GetMapping("/api/master/departments") @ResponseBody public List> getMasterDepartments( @RequestParam(value = "status", defaultValue = "active") String status, HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getMasterDepartments(status); } @GetMapping("/api/toners/all") @ResponseBody public List> getAllToners(HttpSession session) { if (session.getAttribute("toner_usrName") == null) { return java.util.Collections.emptyList(); } return tonerService.getAllActiveToners(); } }