From 4ec8b3332830867035f785f71c420c184a0d1b1f Mon Sep 17 00:00:00 2001 From: yoganandhank Date: Tue, 4 Aug 2026 17:32:45 +0530 Subject: [PATCH] added new adjustment management api's service and controller , html pages and javascript and some UI changes in payment tracker and manpower --- .../gcc_manpower/config/DataSourceConfig.java | 9 + .../com/gcc_manpower/config/WebConfig.java | 3 +- .../controller/HomeController.java | 2 + .../controller/AdjustmentController.java | 9 + .../service/AdjustmentService.java | 18 + .../GccServicePaymentTrackerService.java | 27 + .../controller/TonerController.java | 68 +- .../service/TonerService.java | 222 ++-- .../gcc_manpower/service/AppUserService.java | 11 + .../resources/application-local.properties | 9 +- .../static/assets/css/home-styles.css | 4 + .../gccadjustmentmanagement/dashboard.html | 865 +++++++++++++- .../gccservicepaymenttracker/dashboard.html | 210 ++-- .../gccservicepaymenttracker/details.html | 158 ++- .../templates/gcctonermanagement/upload.html | 1036 +++++++++++------ src/main/resources/templates/home/home.html | 95 ++ 16 files changed, 2111 insertions(+), 635 deletions(-) diff --git a/src/main/java/com/gcc_manpower/config/DataSourceConfig.java b/src/main/java/com/gcc_manpower/config/DataSourceConfig.java index d4dfd9a..fa5d0b9 100644 --- a/src/main/java/com/gcc_manpower/config/DataSourceConfig.java +++ b/src/main/java/com/gcc_manpower/config/DataSourceConfig.java @@ -5,6 +5,9 @@ import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; @Configuration @EnableTransactionManagement @@ -67,4 +70,10 @@ public class DataSourceConfig { dataSource.setPassword(dbpassword); return dataSource; } + + @Bean(name = "transactionManager") + public PlatformTransactionManager transactionManager( + @Qualifier("mysqlTonerManagementDataSource") DataSource dataSource) { + return new DataSourceTransactionManager(dataSource); + } } diff --git a/src/main/java/com/gcc_manpower/config/WebConfig.java b/src/main/java/com/gcc_manpower/config/WebConfig.java index aec6f42..d587d49 100644 --- a/src/main/java/com/gcc_manpower/config/WebConfig.java +++ b/src/main/java/com/gcc_manpower/config/WebConfig.java @@ -52,7 +52,8 @@ public class WebConfig implements WebMvcConfigurer { registry.addResourceHandler("/gcctonermanagementfiles/**") .addResourceLocations(tonerUploadPath); - // Map URL path /gccadjustmentmanagementfiles/** to the configured adjustment folder + // Map URL path /gccadjustmentmanagementfiles/** to the configured adjustment + // folder String adjustmentUploadPath = Paths.get(adjustmentUploadPathConfig).toAbsolutePath().toUri() .toString(); registry.addResourceHandler("/gccadjustmentmanagementfiles/**") diff --git a/src/main/java/com/gcc_manpower/controller/HomeController.java b/src/main/java/com/gcc_manpower/controller/HomeController.java index fa22f40..ab70d7d 100644 --- a/src/main/java/com/gcc_manpower/controller/HomeController.java +++ b/src/main/java/com/gcc_manpower/controller/HomeController.java @@ -43,6 +43,7 @@ public class HomeController { int totalVendors = vendorDetails.size(); int totalTenderCount = appUserService.getOverallTenderCount(); int totalExistingCount = appUserService.getOverallActiveEmployeeCount(); + int totalStandbyCount = appUserService.getOverallStandbyEmployeeCount(); int totalVacantCount = 0; for (Map vendor : vendorDetails) { @@ -67,6 +68,7 @@ public class HomeController { model.addAttribute("totalTenderCount", totalTenderCount); model.addAttribute("totalExistingCount", totalExistingCount); model.addAttribute("totalVacantCount", totalVacantCount); + model.addAttribute("totalStandbyCount", totalStandbyCount); } @GetMapping("/") diff --git a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java index 756c22c..d91db3a 100644 --- a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java +++ b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java @@ -143,6 +143,15 @@ public class AdjustmentController { return adjustmentService.getAllFiles(); } + @GetMapping("/api/list-all") + @ResponseBody + public List> getFilesListIncludingDeleted(HttpSession session) { + if (session.getAttribute("adj_usrName") == null) { + return java.util.Collections.emptyList(); + } + return adjustmentService.getAllFilesIncludingDeleted(); + } + @PostMapping("/api/save") @ResponseBody public Map saveAdjustment( diff --git a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java index 4b337a4..05b94ae 100644 --- a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java +++ b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java @@ -61,6 +61,24 @@ public class AdjustmentService { } } + public List> getAllFilesIncludingDeleted() { + String sql = "SELECT a.*, " + + "adv.adv_type AS resolved_adv_type, " + + "f.fund_type AS resolved_fund_type, " + + "u.usr_name AS updated_by_name " + + "FROM adjustment_file_details a " + + "LEFT JOIN advance_type_list adv ON TRIM(a.adv_type_id) REGEXP '^[0-9]+$' AND adv.id = CAST(TRIM(a.adv_type_id) AS UNSIGNED) " + + "LEFT JOIN fund_type_list f ON TRIM(a.fund_type_id) REGEXP '^[0-9]+$' AND f.id = CAST(TRIM(a.fund_type_id) AS UNSIGNED) " + + "LEFT JOIN gcc_manpower.app_user u ON (a.updated_by = CAST(u.usr_id AS CHAR) OR a.updated_by = u.usr_name) " + + "ORDER BY a.updated_date DESC, a.id DESC"; + try { + return jdbcTemplate.queryForList(sql); + } catch (Exception e) { + System.err.println("Error fetching all adjustment files: " + e.getMessage()); + return new ArrayList<>(); + } + } + public Map getAdjustmentFileById(int id) { String sql = "SELECT * FROM adjustment_file_details WHERE id = ? AND is_active = 1 AND is_delete = 0"; try { diff --git a/src/main/java/com/gcc_manpower/gccservicepaymenttracker/service/GccServicePaymentTrackerService.java b/src/main/java/com/gcc_manpower/gccservicepaymenttracker/service/GccServicePaymentTrackerService.java index 9d8d826..395fc10 100644 --- a/src/main/java/com/gcc_manpower/gccservicepaymenttracker/service/GccServicePaymentTrackerService.java +++ b/src/main/java/com/gcc_manpower/gccservicepaymenttracker/service/GccServicePaymentTrackerService.java @@ -193,6 +193,33 @@ public class GccServicePaymentTrackerService { Object idObj = payload.get("id"); java.sql.Date receivedDate = parseDate(payload.get("received_date")); String vendorName = (String) payload.get("vendor_name"); + if (vendorName != null && !vendorName.trim().isEmpty() && !vendorName.trim().matches("^[0-9]+$")) { + String trimmedVendorName = vendorName.trim(); + String checkSql = "SELECT id FROM vendors_list WHERE TRIM(LOWER(vendor_name)) = ? AND is_active = 1 AND is_delete = 0 LIMIT 1"; + List existingIds = jdbcTemplate.query(checkSql, (rs, rowNum) -> rs.getInt("id"), + trimmedVendorName.toLowerCase()); + if (existingIds != null && !existingIds.isEmpty()) { + vendorName = String.valueOf(existingIds.get(0)); + } else { + try { + org.springframework.jdbc.support.GeneratedKeyHolder keyHolder = new org.springframework.jdbc.support.GeneratedKeyHolder(); + final String finalVendorName = trimmedVendorName; + jdbcTemplate.update(connection -> { + java.sql.PreparedStatement ps = connection.prepareStatement( + "INSERT INTO vendors_list (vendor_name, is_active, is_delete, order_by, cdate) VALUES (?, 1, 0, '0', NOW())", + java.sql.Statement.RETURN_GENERATED_KEYS); + ps.setString(1, finalVendorName); + return ps; + }, keyHolder); + Number key = keyHolder.getKey(); + if (key != null) { + vendorName = String.valueOf(key.intValue()); + } + } catch (Exception e) { + System.err.println("Error inserting custom vendor '" + trimmedVendorName + "': " + e.getMessage()); + } + } + } String subject = (String) payload.get("subject"); String amount = (String) payload.get("amount"); String invoiceNo = (String) payload.get("invoice_no"); diff --git a/src/main/java/com/gcc_manpower/gcctonermanagement/controller/TonerController.java b/src/main/java/com/gcc_manpower/gcctonermanagement/controller/TonerController.java index 87dabad..c8f7e9f 100644 --- a/src/main/java/com/gcc_manpower/gcctonermanagement/controller/TonerController.java +++ b/src/main/java/com/gcc_manpower/gcctonermanagement/controller/TonerController.java @@ -154,11 +154,8 @@ public class TonerController { public Map uploadInward( @RequestParam("refNo") String refNo, @RequestParam("companyName") String companyName, - @RequestParam("pid") int pid, - @RequestParam("tid") int tid, - @RequestParam("qty") String qty, + @RequestParam("itemsJson") String itemsJson, @RequestParam(value = "dcFile", required = false) MultipartFile dcFile, - @RequestParam(value = "requestId", required = false) Integer requestId, HttpSession session) { Map response = new HashMap<>(); @@ -186,6 +183,17 @@ public class TonerController { } 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(); @@ -194,7 +202,7 @@ public class TonerController { String dcPath = saveUploadedFile(dcFile, "dc", uploadDir); boolean saved = tonerService.saveInwardRegister( - refNo.trim(), companyName.trim(), pid, tid, qty.trim(), dcPath, updatedBy, requestId); + refNo.trim(), companyName.trim(), items, dcPath, updatedBy); if (saved) { response.put("success", true); @@ -217,9 +225,7 @@ public class TonerController { public Map uploadRequest( @RequestParam("itcellRefNo") String itcellRefNo, @RequestParam("deptId") String deptId, - @RequestParam("pid") int pid, - @RequestParam("tid") int tid, - @RequestParam("qtyRequested") String qtyRequested, + @RequestParam("itemsJson") String itemsJson, @RequestParam(value = "userRequestFile", required = false) MultipartFile userRequestFile, HttpSession session) { @@ -247,23 +253,18 @@ public class TonerController { return response; } - int qtyReq; try { - qtyReq = Integer.parseInt(qtyRequested.trim()); - } catch (NumberFormatException e) { - response.put("success", false); - response.put("error", "Quantity requested must be a valid number."); - return response; - } + ObjectMapper mapper = new ObjectMapper(); + List> items = mapper.readValue(itemsJson, + new TypeReference>>() { + }); - int availStock = tonerService.getTonerAvailableStock(tid); - if (qtyReq > availStock) { - response.put("success", false); - response.put("error", "Requested quantity (" + qtyReq + ") exceeds available stock (" + availStock + ")."); - return response; - } + if (items == null || items.isEmpty()) { + response.put("success", false); + response.put("error", "Please add at least one printer/toner model request entry."); + return response; + } - try { File uploadDir = new File(tonerUploadPathConfig).getAbsoluteFile(); if (!uploadDir.exists()) { uploadDir.mkdirs(); @@ -271,12 +272,11 @@ public class TonerController { String urPath = saveUploadedFile(userRequestFile, "user_request", uploadDir); - String reqNo = tonerService.saveUserRequest( - itcellRefNo.trim(), deptId.trim(), pid, tid, qtyRequested.trim(), urPath, updatedBy); + boolean saved = tonerService.saveUserRequest( + itcellRefNo.trim(), deptId.trim(), items, urPath, updatedBy); - if (reqNo != null) { + if (saved) { response.put("success", true); - response.put("reqNo", reqNo); response.put("message", "User request saved successfully."); } else { deleteFileIfExists(urPath, uploadDir); @@ -527,8 +527,7 @@ public class TonerController { @RequestParam("refNo") String refNo, @RequestParam("companyName") String companyName, @RequestParam("pid") String pid, - @RequestParam("tid") String tid, - @RequestParam("qtyRequested") String qtyRequested, + @RequestParam("itemsJson") String itemsJson, @RequestParam("emailCopyFile") MultipartFile emailCopyFile, HttpSession session) { @@ -557,6 +556,17 @@ public class TonerController { } 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(); @@ -565,7 +575,7 @@ public class TonerController { String ecPath = saveUploadedFile(emailCopyFile, "workorder_request_email", uploadDir); boolean saved = tonerService.saveWorkorderModelRequest( - refNo.trim(), companyName.trim(), pid.trim(), tid.trim(), qtyRequested.trim(), ecPath, updatedBy); + refNo.trim(), companyName.trim(), pid.trim(), items, ecPath, updatedBy); if (saved) { response.put("success", true); diff --git a/src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java b/src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java index ba10c58..9cf7fc4 100644 --- a/src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java +++ b/src/main/java/com/gcc_manpower/gcctonermanagement/service/TonerService.java @@ -13,6 +13,10 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import java.sql.PreparedStatement; +import java.sql.Statement; @Service public class TonerService { @@ -74,22 +78,40 @@ public class TonerService { } } - public boolean saveInwardRegister(String refNo, String companyName, int pid, int tid, String qty, String dcUpload, - String username, Integer requestId) { + @Transactional + public boolean saveInwardRegister(String refNo, String companyName, List> items, + String dcUpload, String username) { String sql = "INSERT INTO stock_register_details " + "(ref_no, company_name, pid, tid, qty_registered, dc_upload, cdate, updated_date, updated_by, is_active, is_delete, request_id) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, ?)"; java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis()); try { - int rows = jdbcTemplate.update(sql, refNo, companyName, String.valueOf(pid), String.valueOf(tid), qty, - dcUpload, - now, now, username, requestId); - return rows > 0; + for (Map item : items) { + int pid = Integer.parseInt(String.valueOf(item.get("pid"))); + int tid = Integer.parseInt(String.valueOf(item.get("tid"))); + String qty = String.valueOf(item.get("qty")); + Integer requestId = item.get("requestId") != null + ? Integer.parseInt(String.valueOf(item.get("requestId"))) + : null; + + int qtyInt = 0; + try { + qtyInt = Integer.parseInt(qty.trim()); + } catch (Exception ignored) { + } + if (qtyInt <= 0) + continue; + + jdbcTemplate.update(sql, refNo, companyName, String.valueOf(pid), String.valueOf(tid), + String.valueOf(qtyInt), + dcUpload, now, now, username, requestId); + } + return true; } catch (Exception e) { System.err.println("Error saving inward register: " + e.getMessage()); e.printStackTrace(); - return false; + throw new RuntimeException("Rollback saveInwardRegister due to: " + e.getMessage()); } } @@ -103,28 +125,35 @@ public class TonerService { } } - public String saveUserRequest(String itCellRefNo, String deptId, int pid, int tid, String qtyRequested, + @Transactional + public boolean saveUserRequest(String itCellRefNo, String deptId, List> items, String userRequestUpload, String username) { - String tonerModel = getTonerModelName(tid); - String cleanModel = tonerModel.trim().replaceAll("\\s+", "-").replaceAll("[^a-zA-Z0-9-]", ""); - int maxId = getMaxRequestId(); - int seqNum = 1000 + maxId + 1; - int year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); - String reqNo = String.format("%s-%d-%04d", cleanModel, year, seqNum); - + java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis()); String sql = "INSERT INTO department_requested_details " + "(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; + for (Map item : items) { + int pid = Integer.parseInt(String.valueOf(item.get("pid"))); + int tid = Integer.parseInt(String.valueOf(item.get("tid"))); + String qtyRequested = String.valueOf(item.get("qty")); + + String tonerModel = getTonerModelName(tid); + String cleanModel = tonerModel.trim().replaceAll("\\s+", "-").replaceAll("[^a-zA-Z0-9-]", ""); + int maxId = getMaxRequestId(); + int seqNum = 1000 + maxId + 1; + int year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); + String reqNo = String.format("%s-%d-%04d", cleanModel, year, seqNum); + + jdbcTemplate.update(sql, reqNo, itCellRefNo, deptId, String.valueOf(pid), String.valueOf(tid), + qtyRequested, userRequestUpload, now, now, username); + } + return true; } catch (Exception e) { - System.err.println("Error saving user request: " + e.getMessage()); + System.err.println("Error saving user requests: " + e.getMessage()); e.printStackTrace(); - return null; + throw new RuntimeException("Rollback saveUserRequest due to: " + e.getMessage()); } } @@ -241,7 +270,7 @@ public class TonerService { + "MAX(s.cdate) AS cdate, COALESCE(MAX(u.usr_name), MAX(s.updated_by)) AS order_by, " + "p.printer_name, t.model_name, " + "COALESCE((SELECT w.qty_registered FROM workorder_printermodel_qty w WHERE w.ref_no = s.ref_no AND w.pid = s.pid AND w.tid = s.tid AND w.is_active = 1 AND w.is_delete = 0 LIMIT 1), 0) AS qty_workorder_registered, " - + "COALESCE((SELECT SUM(CAST(mr.qty_requested AS SIGNED)) FROM workorder_model_request_details mr WHERE mr.ref_no = s.ref_no AND mr.pid = s.pid AND mr.tid = s.tid AND mr.is_active = 1 AND mr.is_delete = 0), 0) AS qty_workorder_requested " + + "COALESCE((SELECT SUM(CAST(mr.qty_registered AS SIGNED)) FROM workorder_model_multiple_request_qty mr INNER JOIN workorder_model_request_details r ON mr.ref_no = r.ref_no WHERE r.ref_no = s.ref_no AND mr.pid = s.pid AND mr.tid = s.tid AND mr.is_active = 1 AND mr.is_delete = 0 AND r.is_active = 1 AND r.is_delete = 0), 0) AS qty_workorder_requested " + "FROM stock_register_details s " + "LEFT JOIN printer_model_list p ON CAST(s.pid AS SIGNED) = p.id " + "LEFT JOIN toner_model_list t ON CAST(s.tid AS SIGNED) = t.id " @@ -343,31 +372,6 @@ public class TonerService { } } - @PostConstruct - public void initDatabase() { - try { - jdbcTemplate.execute("ALTER TABLE stock_register_details ADD COLUMN request_id INT DEFAULT NULL"); - } catch (Exception e) { - // Ignore - } - try { - jdbcTemplate.execute("ALTER TABLE workorder_register_details DROP COLUMN order_by"); - } catch (Exception e) { - // Ignore - } - try { - jdbcTemplate - .execute("ALTER TABLE workorder_printermodel_qty ADD COLUMN updated_by VARCHAR(255) DEFAULT NULL"); - } catch (Exception e) { - // Ignore - } - try { - jdbcTemplate.execute("ALTER TABLE workorder_printermodel_qty DROP COLUMN order_by"); - } catch (Exception e) { - // Ignore - } - } - public List getActiveWorkorderRefNos() { String sql = "SELECT ref_no FROM workorder_register_details WHERE is_active = 1 AND is_delete = 0 ORDER BY id DESC"; try { @@ -378,36 +382,88 @@ public class TonerService { } } - public boolean saveWorkorderModelRequest(String refNo, String companyName, String pid, String tid, - String qtyRequested, String emailCopyUpload, String username) { - String sql = "INSERT INTO workorder_model_request_details " + + @Transactional + public boolean saveWorkorderModelRequest(String refNo, String companyName, String pid, + List> items, String emailCopyUpload, String username) { + if (items == null || items.isEmpty()) { + return false; + } + + // Calculate sum of qty_requested + int totalQtyRequested = 0; + for (Map item : items) { + totalQtyRequested += Integer.parseInt(String.valueOf(item.get("qty"))); + } + final int finalTotalQty = totalQtyRequested; + + // Use first item's pid and tid for the summary row to maintain compatibility + String firstPid = (pid != null && !pid.trim().isEmpty()) ? pid : String.valueOf(items.get(0).get("pid")); + String firstTid = String.valueOf(items.get(0).get("tid")); + + java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis()); + + // Insert into workorder_model_request_details using KeyHolder to get the + // generated id + String sqlMain = "INSERT INTO workorder_model_request_details " + "(ref_no, company_name, pid, tid, qty_requested, email_copy_upload, cdate, updated_date, updated_by, is_active, is_delete) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0)"; - java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis()); + try { - int rows = jdbcTemplate.update(sql, refNo, companyName, pid, tid, qtyRequested, emailCopyUpload, now, now, - username); - return rows > 0; + KeyHolder keyHolder = new GeneratedKeyHolder(); + int mainRows = jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(sqlMain, Statement.RETURN_GENERATED_KEYS); + ps.setString(1, refNo); + ps.setString(2, companyName); + ps.setString(3, firstPid); + ps.setString(4, firstTid); + ps.setString(5, String.valueOf(finalTotalQty)); + ps.setString(6, emailCopyUpload); + ps.setTimestamp(7, now); + ps.setTimestamp(8, now); + ps.setString(9, username); + return ps; + }, keyHolder); + + if (mainRows <= 0) { + return false; + } + + Number key = keyHolder.getKey(); + int requestId = key != null ? key.intValue() : 0; + + // Insert into workorder_model_multiple_request_qty in loop + String sqlSub = "INSERT INTO workorder_model_multiple_request_qty " + + "(ref_no, pid, tid, qty_registered, cdate, updated_date, updated_by, is_active, is_delete) " + + + "VALUES (?, ?, ?, ?, ?, ?, ?, 1, 0)"; + + for (Map item : items) { + String itemPid = item.get("pid") != null ? String.valueOf(item.get("pid")) : firstPid; + String tid = String.valueOf(item.get("tid")); + String qty = String.valueOf(item.get("qty")); + + jdbcTemplate.update(sqlSub, refNo, itemPid, tid, qty, now, now, username); + } + + return true; } catch (Exception e) { - System.err.println("Error saving workorder model request: " + e.getMessage()); + System.err.println("Error saving workorder model multiple request: " + e.getMessage()); e.printStackTrace(); - return false; + throw new RuntimeException("Rollback saveWorkorderModelRequest due to: " + e.getMessage()); } } public List> getWorkorderRegisteredItems(String refNo) { String sql = "SELECT w.pid, w.tid, w.qty_registered, p.printer_name, t.model_name, t.part_code, COALESCE(vl.vendor_name, r.vendor_name) AS vendor_name, " - + - "COALESCE((SELECT SUM(CAST(mr.qty_requested AS SIGNED)) FROM workorder_model_request_details mr " + - "WHERE mr.ref_no = w.ref_no AND mr.pid = w.pid AND mr.tid = w.tid AND mr.is_active = 1 AND mr.is_delete = 0), 0) AS qty_already_requested " - + - "FROM workorder_printermodel_qty w " + - "LEFT JOIN workorder_register_details r ON w.ref_no = r.ref_no " + - "LEFT JOIN gccpayment_processing_tracker.vendors_list vl ON CAST(r.vendor_name AS SIGNED) = vl.id " + - "LEFT JOIN printer_model_list p ON CAST(w.pid AS SIGNED) = p.id " + - "LEFT JOIN toner_model_list t ON CAST(w.tid AS SIGNED) = t.id " + - "WHERE w.ref_no = ? AND w.is_active = 1 AND w.is_delete = 0"; + + "COALESCE((SELECT SUM(CAST(mr.qty_registered AS SIGNED)) FROM workorder_model_multiple_request_qty mr " + + "WHERE mr.ref_no = w.ref_no AND mr.pid = w.pid AND mr.tid = w.tid AND mr.is_active = 1 AND mr.is_delete = 0), 0) AS qty_already_requested " + + "FROM workorder_printermodel_qty w " + + "LEFT JOIN workorder_register_details r ON w.ref_no = r.ref_no " + + "LEFT JOIN gccpayment_processing_tracker.vendors_list vl ON CAST(r.vendor_name AS SIGNED) = vl.id " + + "LEFT JOIN printer_model_list p ON CAST(w.pid AS SIGNED) = p.id " + + "LEFT JOIN toner_model_list t ON CAST(w.tid AS SIGNED) = t.id " + + "WHERE w.ref_no = ? AND w.is_active = 1 AND w.is_delete = 0"; try { return jdbcTemplate.queryForList(sql, refNo); } catch (Exception e) { @@ -427,16 +483,16 @@ public class TonerService { } public List> getWorkorderRequests(String refNo) { - String sql = "SELECT r.id, r.pid, r.tid, r.qty_requested, r.company_name AS vendor_id, r.cdate, " + String sql = "SELECT mr.id, mr.pid, mr.tid, mr.qty_registered AS qty_requested, r.company_name AS vendor_id, r.cdate, " + "COALESCE(u.usr_name, r.updated_by) AS updated_by, r.email_copy_upload, p.printer_name, t.model_name, t.part_code, " - + "COALESCE((SELECT SUM(CAST(sr.qty_registered AS SIGNED)) FROM stock_register_details sr " + - "WHERE ((sr.request_id = r.id) OR (sr.request_id IS NULL AND sr.ref_no = r.ref_no AND sr.pid = r.pid AND sr.tid = r.tid)) " - + "AND sr.is_active = 1 AND sr.is_delete = 0), 0) AS qty_inward_received " - + "FROM workorder_model_request_details r " - + "LEFT JOIN printer_model_list p ON CAST(r.pid AS SIGNED) = p.id " - + "LEFT JOIN toner_model_list t ON CAST(r.tid AS SIGNED) = t.id " + + "COALESCE((SELECT SUM(CAST(sr.qty_registered AS SIGNED)) FROM stock_register_details sr " + + "WHERE sr.ref_no = r.ref_no AND sr.pid = mr.pid AND sr.tid = mr.tid AND sr.is_active = 1 AND sr.is_delete = 0), 0) AS qty_inward_received " + + "FROM workorder_model_multiple_request_qty mr " + + "LEFT JOIN workorder_model_request_details r ON mr.ref_no = r.ref_no " + + "LEFT JOIN printer_model_list p ON CAST(mr.pid AS SIGNED) = p.id " + + "LEFT JOIN toner_model_list t ON CAST(mr.tid AS SIGNED) = t.id " + "LEFT JOIN gcc_manpower.app_user u ON CAST(r.updated_by AS SIGNED) = u.usr_id " - + "WHERE r.ref_no = ? AND r.is_active = 1 AND r.is_delete = 0"; + + "WHERE r.ref_no = ? AND mr.is_active = 1 AND mr.is_delete = 0 AND r.is_active = 1 AND r.is_delete = 0"; try { return jdbcTemplate.queryForList(sql, refNo); } catch (Exception e) { @@ -468,17 +524,17 @@ public class TonerService { } public List> getWorkorderModelRequestHistory() { - String sql = "SELECT MAX(mr.id) AS id, mr.ref_no, mr.pid, mr.tid, mr.company_name AS vendor_id, " - + "SUM(CAST(mr.qty_requested AS SIGNED)) AS qty_requested, MAX(mr.email_copy_upload) AS email_copy_upload, " - + "MAX(mr.cdate) AS cdate, COALESCE(MAX(u.usr_name), MAX(mr.updated_by)) AS order_by, p.printer_name, t.model_name, " - + "COALESCE((SELECT w.qty_registered FROM workorder_printermodel_qty w WHERE w.ref_no = mr.ref_no AND w.pid = mr.pid AND w.tid = mr.tid AND w.is_active = 1 AND w.is_delete = 0 LIMIT 1), 0) AS qty_registered " - + "FROM workorder_model_request_details mr " + String sql = "SELECT mr.id, r.ref_no, mr.pid, mr.tid, r.company_name AS vendor_id, " + + "CAST(mr.qty_registered AS SIGNED) AS qty_requested, r.email_copy_upload, " + + "r.cdate, COALESCE(u.usr_name, r.updated_by) AS order_by, p.printer_name, t.model_name, " + + "COALESCE((SELECT w.qty_registered FROM workorder_printermodel_qty w WHERE w.ref_no = r.ref_no AND w.pid = mr.pid AND w.tid = mr.tid AND w.is_active = 1 AND w.is_delete = 0 LIMIT 1), 0) AS qty_registered " + + "FROM workorder_model_multiple_request_qty mr " + + "LEFT JOIN workorder_model_request_details r ON mr.ref_no = r.ref_no " + "LEFT JOIN printer_model_list p ON CAST(mr.pid AS SIGNED) = p.id " + "LEFT JOIN toner_model_list t ON CAST(mr.tid AS SIGNED) = t.id " - + "LEFT JOIN gcc_manpower.app_user u ON CAST(mr.updated_by AS SIGNED) = u.usr_id " - + "WHERE mr.is_active = 1 AND mr.is_delete = 0 " - + "GROUP BY mr.ref_no, mr.pid, mr.tid, mr.company_name, p.printer_name, t.model_name " - + "ORDER BY MAX(mr.id) DESC"; + + "LEFT JOIN gcc_manpower.app_user u ON CAST(r.updated_by AS SIGNED) = u.usr_id " + + "WHERE mr.is_active = 1 AND mr.is_delete = 0 AND r.is_active = 1 AND r.is_delete = 0 " + + "ORDER BY mr.id DESC"; try { return jdbcTemplate.queryForList(sql); } catch (Exception e) { diff --git a/src/main/java/com/gcc_manpower/service/AppUserService.java b/src/main/java/com/gcc_manpower/service/AppUserService.java index 9629b12..cbcaf06 100644 --- a/src/main/java/com/gcc_manpower/service/AppUserService.java +++ b/src/main/java/com/gcc_manpower/service/AppUserService.java @@ -180,6 +180,17 @@ public class AppUserService { } } + public int getOverallStandbyEmployeeCount() { + String sql = "SELECT COUNT(*) FROM employee_details e LEFT JOIN user_type_details ut ON (e.user_type = CAST(ut.id AS CHAR) OR e.user_type = ut.usertype) WHERE (e.user_type = '3' OR ut.usertype = 'Standby Employees') AND e.isactive = 1 AND e.isdelete = 0"; + try { + Integer count = jdbcManpowerTemplate.queryForObject(sql, Integer.class); + return count != null ? count : 0; + } catch (Exception e) { + System.err.println("Error fetching overall standby employee count: " + e.getMessage()); + return 0; + } + } + public List> getActiveLocations() { String sql = "SELECT id, location_name FROM employee_location_details WHERE isactive = 1 AND isdelete = 0 " + "ORDER BY " + diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 5c5cae6..aa7b40b 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -10,7 +10,7 @@ server.port=8084 # Local DB server spring.datasource.url=jdbc:mysql://localhost:3306/gcc_manpower spring.datasource.username=root -spring.datasource.password=root +spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver @@ -31,9 +31,10 @@ logging.level.org.hibernate.orm.jdbc.bind=TRACE # Spring JDBC / JdbcTemplate Logging # =============================== # Log queries executed by JdbcTemplate -logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG -# Log values bound as placeholders in JdbcTemplate queries -logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE +# logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG +# # Log values bound as placeholders in JdbcTemplate queries +# logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE +logging.level.org.springframework.jdbc.core=ERROR # Production context path server.servlet.context-path=/gcc_manpower diff --git a/src/main/resources/static/assets/css/home-styles.css b/src/main/resources/static/assets/css/home-styles.css index 89edef6..e6b9f7f 100644 --- a/src/main/resources/static/assets/css/home-styles.css +++ b/src/main/resources/static/assets/css/home-styles.css @@ -613,6 +613,10 @@ background: linear-gradient(135deg, #d35400, #e67e22); } +.bg-summary-standby { + background: linear-gradient(135deg, #8e44ad, #9b59b6); +} + /* Vendor Card Designation List Styles */ .vendor-desig-section { margin-top: 15px; diff --git a/src/main/resources/templates/gccadjustmentmanagement/dashboard.html b/src/main/resources/templates/gccadjustmentmanagement/dashboard.html index 2db3c1a..4d2f336 100644 --- a/src/main/resources/templates/gccadjustmentmanagement/dashboard.html +++ b/src/main/resources/templates/gccadjustmentmanagement/dashboard.html @@ -874,7 +874,18 @@

Adjustment File Management System

-
+
+ +
+ +
+ Latest Update: 0 File(s) on + - +
+
+ Guest @@ -942,30 +953,49 @@
- +

- Advance Split-up Report + id="dash-report-title-container" + style="font-family: 'Outfit', sans-serif; font-size: 1.2rem; display: flex; align-items: center; justify-content: center; gap: 8px;"> + + Existing Adjustment Files All Files

- +
+
+ + + + + +
+ +
- +
@@ -974,13 +1004,99 @@ style="font-size: 0.85rem;">Advance Type:
+
+ +
-
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
S.No + Fin Year + File NumAdvance TypeFile Available + Bal Amount + + PI Amount + + FI Amount + + Remarks + Created Date + + Last Updated + Updated ByActions
+
+ + +
+
+ Show + + entries +
+
+ Showing 0 to 0 of 0 entries +
+ +
+
+ + + @@ -1058,6 +1174,10 @@ class="fa-solid fa-sort text-muted opacity-50 ms-1"> EJV Number + + Created Date + Last Updated @@ -1553,6 +1673,52 @@ + + + @@ -1560,6 +1726,7 @@