package com.gcc_manpower.gcctonermanagement.service; import java.sql.PreparedStatement; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.KeyHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class TonerService { private JdbcTemplate jdbcTemplate; @Autowired public void setDataSource(@Qualifier("mysqlItcellManagementDataSource") DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } // ================= FAST IN-MEMORY LOOKUP MAPS (Zero N+1 DB Calls) // ================= private Map getPrinterMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT id, printer_name FROM toner_printer_model_list WHERE is_active = 1 AND is_delete = 0"); for (Map row : list) { if (row.get("id") != null && row.get("printer_name") != null) { map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("printer_name")).trim()); } } } catch (Exception ignored) { } return map; } private Map getTonerMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT id, model_name FROM toner_model_list WHERE is_active = 1 AND is_delete = 0"); for (Map row : list) { if (row.get("id") != null && row.get("model_name") != null) { map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("model_name")).trim()); } } } catch (Exception ignored) { } return map; } private Map getTonerPartCodeMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT id, model_name, part_code FROM toner_model_list WHERE (is_delete IS NULL OR is_delete = 0)"); for (Map row : list) { String code = row.get("part_code") != null ? String.valueOf(row.get("part_code")).trim() : ""; if (!code.isEmpty() && !"null".equalsIgnoreCase(code) && !"n/a".equalsIgnoreCase(code)) { if (row.get("id") != null) { map.put(String.valueOf(row.get("id")).trim(), code); } if (row.get("model_name") != null) { map.put(String.valueOf(row.get("model_name")).trim().toLowerCase(), code); } } } } catch (Exception ignored) { } return map; } private Map getDepartmentMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT id, dept_name FROM toner_department_list WHERE is_active = 1 AND is_delete = 0"); for (Map row : list) { if (row.get("id") != null && row.get("dept_name") != null) { map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("dept_name")).trim()); } } } catch (Exception ignored) { } return map; } private Map getZoneMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT id, zone_name FROM toner_zone_list WHERE is_active = 1 AND is_delete = 0"); for (Map row : list) { if (row.get("id") != null && row.get("zone_name") != null) { map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("zone_name")).trim()); } } } catch (Exception ignored) { } return map; } private Map getUserMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList("SELECT usr_id, usr_name FROM app_user"); for (Map row : list) { if (row.get("usr_id") != null && row.get("usr_name") != null) { map.put(String.valueOf(row.get("usr_id")).trim(), String.valueOf(row.get("usr_name")).trim()); } } } catch (Exception ignored) { } return map; } private Map getVendorMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT id, vendor_name FROM payment_vendors_list WHERE is_active = 1 AND is_delete = 0"); for (Map row : list) { if (row.get("id") != null && row.get("vendor_name") != null) { map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("vendor_name")).trim()); } } } catch (Exception ignored) { } return map; } public List> getActiveVendors() { try { return jdbcTemplate.queryForList( "SELECT id, vendor_name FROM payment_vendors_list WHERE is_active = 1 AND is_delete = 0 ORDER BY vendor_name ASC"); } catch (Exception e) { return new ArrayList<>(); } } private Map getWorkorderFileNumberMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT ref_no, file_number FROM toner_workorder_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"); for (Map row : list) { if (row.get("ref_no") != null && row.get("file_number") != null) { map.put(String.valueOf(row.get("ref_no")).trim(), String.valueOf(row.get("file_number")).trim()); } } } catch (Exception ignored) { } return map; } private Map getWorkorderRegisteredQtyMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT ref_no, pid, tid, qty_registered FROM toner_workorder_printermodel_qty WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"); for (Map row : list) { if (row.get("ref_no") != null && row.get("pid") != null && row.get("tid") != null) { String refNo = String.valueOf(row.get("ref_no")).trim(); String pid = String.valueOf(row.get("pid")).trim(); String tid = String.valueOf(row.get("tid")).trim(); Integer qty = parseIntegerSafely(row.get("qty_registered")); map.put(refNo + "_" + pid + "_" + tid, qty != null ? qty : 0); } } } catch (Exception ignored) { } return map; } private Map getTotalWorkorderRegisteredMap() { Map map = new HashMap<>(); try { List> list = jdbcTemplate.queryForList( "SELECT pid, tid, SUM(CAST(qty_registered AS SIGNED)) AS total_qty FROM toner_workorder_printermodel_qty WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY pid, tid"); for (Map row : list) { if (row.get("pid") != null && row.get("tid") != null) { String pid = String.valueOf(row.get("pid")).trim(); String tid = String.valueOf(row.get("tid")).trim(); Integer qty = parseIntegerSafely(row.get("total_qty")); map.put(pid + "_" + tid, qty != null ? qty : 0); map.put(tid, map.getOrDefault(tid, 0) + (qty != null ? qty : 0)); } } } catch (Exception ignored) { } return map; } private Map getInwardStockMap() { Map map = new HashMap<>(); try { String sql = "SELECT ref_no, pid, tid, SUM(CAST(qty_registered AS SIGNED)) AS total_qty FROM toner_stock_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY ref_no, pid, tid"; List> list = jdbcTemplate.queryForList(sql); for (Map row : list) { String ref = row.get("ref_no") != null ? String.valueOf(row.get("ref_no")).trim() : ""; String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : ""; String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : ""; Integer qty = parseIntegerSafely(row.get("total_qty")); map.put(ref + "_" + pid + "_" + tid, qty != null ? qty : 0); } } catch (Exception ignored) { } return map; } private Map getInwardStockByRequestMap() { Map map = new HashMap<>(); try { String sql = "SELECT ref_no, pid, tid, request_id, SUM(CAST(qty_registered AS SIGNED)) AS total_qty FROM toner_stock_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY ref_no, pid, tid, request_id"; List> list = jdbcTemplate.queryForList(sql); for (Map row : list) { String ref = row.get("ref_no") != null ? String.valueOf(row.get("ref_no")).trim() : ""; String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : ""; String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : ""; String reqId = row.get("request_id") != null ? String.valueOf(row.get("request_id")).trim() : ""; Integer qty = parseIntegerSafely(row.get("total_qty")); map.put(ref + "_" + pid + "_" + tid + "_" + reqId, qty != null ? qty : 0); } } catch (Exception ignored) { } return map; } private Map getAvailableStockMap() { Map map = new HashMap<>(); try { Map inwardMap = new HashMap<>(); String inSql = "SELECT pid, tid, SUM(CAST(qty_registered AS SIGNED)) AS total_in FROM toner_stock_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY pid, tid"; List> inList = jdbcTemplate.queryForList(inSql); for (Map row : inList) { String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : ""; String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : ""; Integer q = parseIntegerSafely(row.get("total_in")); inwardMap.put(pid + "_" + tid, q != null ? q : 0); } Map outwardMap = new HashMap<>(); String outSql = "SELECT pid, tid, SUM(CAST(qty_delivered AS SIGNED)) AS total_out FROM toner_department_requested_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY pid, tid"; List> outList = jdbcTemplate.queryForList(outSql); for (Map row : outList) { String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : ""; String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : ""; Integer q = parseIntegerSafely(row.get("total_out")); outwardMap.put(pid + "_" + tid, q != null ? q : 0); } for (Map.Entry entry : inwardMap.entrySet()) { int inQ = entry.getValue(); int outQ = outwardMap.getOrDefault(entry.getKey(), 0); map.put(entry.getKey(), Math.max(0, inQ - outQ)); } } catch (Exception ignored) { } return map; } // ================ Adding department & toners & printers ================ public boolean savenewdepartment(String department) { if (department == null || department.trim().isEmpty()) return false; String cleanDept = department.trim(); try { String sql = "INSERT INTO toner_department_list (dept_name, is_active, is_delete) VALUES (?, 1, 0)"; jdbcTemplate.update(sql, cleanDept); return true; } catch (Exception e) { try { String sql2 = "INSERT INTO toner_department_list (department_name, is_active, is_delete) VALUES (?, 1, 0)"; jdbcTemplate.update(sql2, cleanDept); return true; } catch (Exception ex) { try { String sql3 = "INSERT INTO toner_department_list (dept_name) VALUES (?)"; jdbcTemplate.update(sql3, cleanDept); return true; } catch (Exception ex2) { ex2.printStackTrace(); return false; } } } } public boolean savetonermodel(int pid, String modelname, String partcode) { if (pid <= 0 || modelname == null || modelname.trim().isEmpty()) return false; String cleanModel = modelname.trim(); String cleanPart = (partcode != null && !partcode.trim().isEmpty()) ? partcode.trim() : null; try { String sql = "INSERT INTO toner_model_list (pid, model_name, part_code, is_active, is_delete) VALUES (?, ?, ?, 1, 0)"; jdbcTemplate.update(sql, pid, cleanModel, cleanPart); return true; } catch (Exception e) { try { String sql2 = "INSERT INTO toner_model_list (pid, model_name, part_code) VALUES (?, ?, ?)"; jdbcTemplate.update(sql2, pid, cleanModel, cleanPart); return true; } catch (Exception ex) { ex.printStackTrace(); return false; } } } public boolean saveprintermodel(String printermodel) { if (printermodel == null || printermodel.trim().isEmpty()) return false; String cleanPrinter = printermodel.trim(); try { String sql = "INSERT INTO toner_printer_model_list (printer_name, is_active, is_delete) VALUES (?, 1, 0)"; jdbcTemplate.update(sql, cleanPrinter); return true; } catch (Exception e) { try { String sql2 = "INSERT INTO toner_printer_model_list (printer_name) VALUES (?)"; jdbcTemplate.update(sql2, cleanPrinter); return true; } catch (Exception ex) { ex.printStackTrace(); return false; } } } public boolean updatePrinterModel(int id, String printermodel) { if (id <= 0 || printermodel == null || printermodel.trim().isEmpty()) return false; String cleanPrinter = printermodel.trim(); try { String sql = "UPDATE toner_printer_model_list SET printer_name = ? WHERE id = ?"; return jdbcTemplate.update(sql, cleanPrinter, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean updateTonerModel(int id, int pid, String modelname, String partcode) { if (id <= 0 || pid <= 0 || modelname == null || modelname.trim().isEmpty()) return false; String cleanModel = modelname.trim(); String cleanPart = (partcode != null && !partcode.trim().isEmpty()) ? partcode.trim() : null; try { String sql = "UPDATE toner_model_list SET pid = ?, model_name = ?, part_code = ? WHERE id = ?"; return jdbcTemplate.update(sql, pid, cleanModel, cleanPart, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean updateDepartment(int id, String department) { if (id <= 0 || department == null || department.trim().isEmpty()) return false; String cleanDept = department.trim(); try { String sql = "UPDATE toner_department_list SET dept_name = ? WHERE id = ?"; return jdbcTemplate.update(sql, cleanDept, id) > 0; } catch (Exception e) { try { String sql2 = "UPDATE toner_department_list SET department_name = ? WHERE id = ?"; return jdbcTemplate.update(sql2, cleanDept, id) > 0; } catch (Exception ex) { ex.printStackTrace(); return false; } } } public boolean deletePrinterModel(int id) { if (id <= 0) return false; try { String sql = "UPDATE toner_printer_model_list SET is_active = 0, is_delete = 1 WHERE id = ?"; return jdbcTemplate.update(sql, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean restorePrinterModel(int id) { if (id <= 0) return false; try { String sql = "UPDATE toner_printer_model_list SET is_active = 1, is_delete = 0 WHERE id = ?"; return jdbcTemplate.update(sql, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean deleteTonerModel(int id) { if (id <= 0) return false; try { String sql = "UPDATE toner_model_list SET is_active = 0, is_delete = 1 WHERE id = ?"; return jdbcTemplate.update(sql, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean restoreTonerModel(int id) { if (id <= 0) return false; try { String sql = "UPDATE toner_model_list SET is_active = 1, is_delete = 0 WHERE id = ?"; return jdbcTemplate.update(sql, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean deleteDepartment(int id) { if (id <= 0) return false; try { String sql = "UPDATE toner_department_list SET is_active = 0, is_delete = 1 WHERE id = ?"; return jdbcTemplate.update(sql, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean restoreDepartment(int id) { if (id <= 0) return false; try { String sql = "UPDATE toner_department_list SET is_active = 1, is_delete = 0 WHERE id = ?"; return jdbcTemplate.update(sql, id) > 0; } catch (Exception e) { e.printStackTrace(); return false; } } public List> getMasterPrinters(String status) { try { String sql; if ("deleted".equalsIgnoreCase(status)) { sql = "SELECT id, printer_name, is_active, is_delete FROM toner_printer_model_list WHERE (is_delete = 1 OR is_active = 0) ORDER BY id DESC"; } else if ("all".equalsIgnoreCase(status)) { sql = "SELECT id, printer_name, is_active, is_delete FROM toner_printer_model_list ORDER BY printer_name ASC"; } else { sql = "SELECT id, printer_name, is_active, is_delete FROM toner_printer_model_list WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY printer_name ASC"; } return jdbcTemplate.queryForList(sql); } catch (Exception e) { e.printStackTrace(); return new ArrayList<>(); } } public List> getMasterToners(String status) { try { String sql; if ("deleted".equalsIgnoreCase(status)) { sql = "SELECT t.id, t.pid, t.model_name, t.part_code, p.printer_name, t.is_active, t.is_delete FROM toner_model_list t " + "LEFT JOIN toner_printer_model_list p ON t.pid = p.id " + "WHERE (t.is_delete = 1 OR t.is_active = 0) ORDER BY t.id DESC"; } else if ("all".equalsIgnoreCase(status)) { sql = "SELECT t.id, t.pid, t.model_name, t.part_code, p.printer_name, t.is_active, t.is_delete FROM toner_model_list t " + "LEFT JOIN toner_printer_model_list p ON t.pid = p.id ORDER BY p.printer_name ASC, t.model_name ASC"; } else { sql = "SELECT t.id, t.pid, t.model_name, t.part_code, p.printer_name, t.is_active, t.is_delete FROM toner_model_list t " + "LEFT JOIN toner_printer_model_list p ON t.pid = p.id " + "WHERE (t.is_active IS NULL OR t.is_active = 1) AND (t.is_delete IS NULL OR t.is_delete = 0) " + "ORDER BY p.printer_name ASC, t.model_name ASC"; } return jdbcTemplate.queryForList(sql); } catch (Exception e) { e.printStackTrace(); return new ArrayList<>(); } } public List> getMasterDepartments(String status) { try { String sql; if ("deleted".equalsIgnoreCase(status)) { sql = "SELECT id, dept_name, is_active, is_delete FROM toner_department_list WHERE (is_delete = 1 OR is_active = 0) ORDER BY id DESC"; } else if ("all".equalsIgnoreCase(status)) { sql = "SELECT id, dept_name, is_active, is_delete FROM toner_department_list ORDER BY dept_name ASC"; } else { sql = "SELECT id, dept_name, is_active, is_delete FROM toner_department_list WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY dept_name ASC"; } return jdbcTemplate.queryForList(sql); } catch (Exception e) { try { String fallbackSql; if ("deleted".equalsIgnoreCase(status)) { fallbackSql = "SELECT id, department_name AS dept_name, is_active, is_delete FROM toner_department_list WHERE (is_delete = 1 OR is_active = 0) ORDER BY id DESC"; } else if ("all".equalsIgnoreCase(status)) { fallbackSql = "SELECT id, department_name AS dept_name, is_active, is_delete FROM toner_department_list ORDER BY department_name ASC"; } else { fallbackSql = "SELECT id, department_name AS dept_name, is_active, is_delete FROM toner_department_list WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY department_name ASC"; } return jdbcTemplate.queryForList(fallbackSql); } catch (Exception ex) { ex.printStackTrace(); return new ArrayList<>(); } } } public List> getAllActiveToners() { return getMasterToners("active"); } // ================= PRINTERS & TONERS ================= public List> getActivePrinters() { String sql = "SELECT id, printer_name FROM toner_printer_model_list WHERE is_active = 1 AND is_delete = 0"; try { return jdbcTemplate.queryForList(sql); } catch (Exception e) { return new ArrayList<>(); } } public List> getActiveTonersByPrinter(int pid) { try { String sql = "SELECT id, pid, model_name, part_code FROM toner_model_list WHERE pid = ? AND (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; List> list = jdbcTemplate.queryForList(sql, pid); Map availMap = getAvailableStockMap(); List> result = new ArrayList<>(); for (Map map : list) { Map row = new HashMap<>(map); String tidStr = String.valueOf(map.get("id")).trim(); String pidStr = String.valueOf(map.get("pid")).trim(); row.put("available_stock", availMap.getOrDefault(pidStr + "_" + tidStr, 0)); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } public String getTonerModelName(int tid) { String sql = "SELECT model_name FROM toner_model_list WHERE id = ?"; try { return jdbcTemplate.queryForObject(sql, String.class, tid); } catch (Exception e) { return "UNKNOWN"; } } public int getTonerAvailableStock(int tid) { try { String sql = "SELECT pid FROM toner_model_list WHERE id = ?"; Integer pid = jdbcTemplate.queryForObject(sql, Integer.class, tid); if (pid == null) return 0; return getAvailableStockForModel(String.valueOf(pid), String.valueOf(tid)); } catch (Exception e) { return 0; } } public int getAvailableStockForModel(String pid, String tid) { String sqlInward = "SELECT COALESCE(SUM(CAST(qty_registered AS SIGNED)), 0) FROM toner_stock_register_details WHERE TRIM(pid) = TRIM(?) AND TRIM(tid) = TRIM(?) AND (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; String sqlOutward = "SELECT COALESCE(SUM(CAST(qty_delivered AS SIGNED)), 0) FROM toner_department_requested_details WHERE TRIM(pid) = TRIM(?) AND TRIM(tid) = TRIM(?) AND (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; try { int inVal = jdbcTemplate.queryForObject(sqlInward, Integer.class, pid, tid); int outVal = jdbcTemplate.queryForObject(sqlOutward, Integer.class, pid, tid); return Math.max(0, inVal - outVal); } catch (Exception e) { return 0; } } // ================= INWARD STOCK REGISTER ================= @Transactional public boolean saveInwardRegister(String refNo, String companyName, List> items, String dcUpload, String dcNo, String dcDate, String username) { String sql = "INSERT INTO toner_stock_register_details " + "(ref_no, company_name, pid, tid, qty_registered, dc_upload, dc_no, dc_date, cdate, updated_date, updated_by, is_active, is_delete, request_id) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, ?)"; Timestamp now = new Timestamp(System.currentTimeMillis()); String finalDcNo = (dcNo != null && !dcNo.trim().isEmpty()) ? dcNo.trim() : null; String finalDcDate = (dcDate != null && !dcDate.trim().isEmpty()) ? dcDate.trim() : null; try { for (Map item : items) { Integer pidVal = parseIntegerSafely(item.get("pid")); Integer tidVal = parseIntegerSafely(item.get("tid")); if (pidVal == null || tidVal == null) { continue; } int pid = pidVal; int tid = tidVal; Integer qtyVal = parseIntegerSafely(item.get("qty")); if (qtyVal == null || qtyVal <= 0) continue; Integer requestId = parseIntegerSafely(item.get("requestId")); jdbcTemplate.update(sql, refNo, companyName, String.valueOf(pid), String.valueOf(tid), String.valueOf(qtyVal), dcUpload, finalDcNo, finalDcDate, now, now, username, requestId); } return true; } catch (Exception e) { throw new RuntimeException("Rollback saveInwardRegister due to: " + e.getMessage()); } } @Transactional public boolean saveInwardRegister(String refNo, String companyName, List> items, String dcUpload, String dcDate, String username) { return saveInwardRegister(refNo, companyName, items, dcUpload, null, dcDate, username); } @Transactional public boolean saveInwardRegister(String refNo, String companyName, List> items, String dcUpload, String username) { return saveInwardRegister(refNo, companyName, items, dcUpload, null, null, username); } @Transactional public boolean updateInwardDc(List ids, String dcNo, String dcDate, String newDcUpload, String updatedBy) { if (ids == null || ids.isEmpty()) { return false; } Timestamp now = new Timestamp(System.currentTimeMillis()); String inSql = ids.stream().map(i -> "?").collect(java.util.stream.Collectors.joining(",")); String finalDcNo = (dcNo != null && !dcNo.trim().isEmpty()) ? dcNo.trim() : null; String finalDcDate = (dcDate != null && !dcDate.trim().isEmpty()) ? dcDate.trim() : null; if (newDcUpload != null && !newDcUpload.trim().isEmpty()) { String sql = "UPDATE toner_stock_register_details SET dc_no = ?, dc_date = ?, dc_upload = ?, updated_date = ?, updated_by = ? WHERE id IN (" + inSql + ")"; List params = new ArrayList<>(); params.add(finalDcNo); params.add(finalDcDate); params.add(newDcUpload.trim()); params.add(now); params.add(updatedBy); params.addAll(ids); jdbcTemplate.update(sql, params.toArray()); } else { String sql = "UPDATE toner_stock_register_details SET dc_no = ?, dc_date = ?, updated_date = ?, updated_by = ? WHERE id IN (" + inSql + ")"; List params = new ArrayList<>(); params.add(finalDcNo); params.add(finalDcDate); params.add(now); params.add(updatedBy); params.addAll(ids); jdbcTemplate.update(sql, params.toArray()); } return true; } @Transactional public boolean deleteInwardDc(List ids, String updatedBy) { if (ids == null || ids.isEmpty()) { return false; } Timestamp now = new Timestamp(System.currentTimeMillis()); String inSql = ids.stream().map(i -> "?").collect(java.util.stream.Collectors.joining(",")); String sql = "UPDATE toner_stock_register_details SET is_active = 0, is_delete = 1, updated_date = ?, updated_by = ? WHERE id IN (" + inSql + ")"; List params = new ArrayList<>(); params.add(now); params.add(updatedBy); params.addAll(ids); jdbcTemplate.update(sql, params.toArray()); return true; } public List> getInwardHistory() { try { String sql = "SELECT * FROM toner_stock_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY id DESC"; List> list = jdbcTemplate.queryForList(sql); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map userMap = getUserMap(); Map vendorMap = getVendorMap(); Map fileNumberMap = getWorkorderFileNumberMap(); Map woQtyMap = getWorkorderRegisteredQtyMap(); List> result = new ArrayList<>(); for (Map raw : list) { String refNo = raw.get("ref_no") != null ? String.valueOf(raw.get("ref_no")).trim() : ""; String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; Integer qtyIn = parseIntegerSafely(raw.get("qty_registered")); int qty = qtyIn != null ? qtyIn : 0; String dc = raw.get("dc_upload") != null ? String.valueOf(raw.get("dc_upload")).trim() : ""; String dcNo = raw.get("dc_no") != null ? String.valueOf(raw.get("dc_no")).trim() : ""; String dcDate = raw.get("dc_date") != null ? String.valueOf(raw.get("dc_date")).trim() : ""; String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : ""; String companyName = raw.get("company_name") != null ? String.valueOf(raw.get("company_name")).trim() : ""; String tonerModelName = tonerMap.getOrDefault(tid, tid); String partCode = partCodeMap.get(tid); if (partCode == null || partCode.isEmpty()) { partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : ""); } Map row = new HashMap<>(raw); row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerModelName); row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-"); row.put("order_by", userMap.getOrDefault(updatedBy, updatedBy)); row.put("file_number", fileNumberMap.getOrDefault(refNo, "")); row.put("vendor_name", vendorMap.getOrDefault(companyName, companyName)); row.put("qty_registered", qty); row.put("inward_qty", qty); row.put("qty_workorder_registered", woQtyMap.getOrDefault(refNo + "_" + pid + "_" + tid, 0)); row.put("qty_workorder_requested", 0); row.put("dc_upload", dc); row.put("dc_uploads", dc); row.put("dc_no", dcNo); row.put("dc_date", dcDate); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } // ================= USER REQUESTS ================= public int getMaxRequestId() { String sql = "SELECT COALESCE(MAX(id), 0) FROM toner_department_requested_details"; try { return jdbcTemplate.queryForObject(sql, Integer.class); } catch (Exception e) { return 0; } } @Transactional public boolean saveUserRequest(String itCellRefNo, String deptId, String zoneId, List> items, String userRequestUpload, String requestDate, String username) { Timestamp now = new Timestamp(System.currentTimeMillis()); String finalRequestDate = (requestDate != null && !requestDate.trim().isEmpty()) ? requestDate.trim() : null; String sql = "INSERT INTO toner_department_requested_details " + "(req_no, itcell_ref_no, dept_id, zone_id, pid, tid, qty_requested, qty_delivered, user_request_upload, request_date, cdate, updated_date, updated_by, is_active, is_delete) " + "VALUES (?, ?, ?, ?, ?, ?, ?, '0', ?, ?, ?, ?, ?, 1, 0)"; try { int baseMaxId = getMaxRequestId(); int year = Calendar.getInstance().get(Calendar.YEAR); int seqCounter = 0; for (Map item : items) { Integer pidVal = parseIntegerSafely(item.get("pid")); Integer tidVal = parseIntegerSafely(item.get("tid")); if (pidVal == null || tidVal == null) { continue; } int pid = pidVal; int tid = tidVal; Integer qtyVal = parseIntegerSafely(item.get("qty")); int qtyRequested = (qtyVal != null && qtyVal > 0) ? qtyVal : 1; String tonerModel = getTonerModelName(tid); String cleanModel = (tonerModel != null && !tonerModel.trim().isEmpty()) ? tonerModel.trim().replaceAll("\\s+", "-").replaceAll("[^a-zA-Z0-9-]", "") : "REQ"; if (cleanModel.isEmpty()) { cleanModel = "REQ"; } seqCounter++; int seqNum = 1000 + baseMaxId + seqCounter; String reqNo = String.format("%s-%d-%04d", cleanModel, year, seqNum); jdbcTemplate.update(sql, reqNo, itCellRefNo, deptId, zoneId, String.valueOf(pid), String.valueOf(tid), String.valueOf(qtyRequested), userRequestUpload, finalRequestDate, now, now, username); } return true; } catch (Exception e) { throw new RuntimeException("Rollback saveUserRequest due to: " + e.getMessage()); } } @Transactional public boolean saveUserRequest(String itCellRefNo, String deptId, String zoneId, List> items, String userRequestUpload, String username) { return saveUserRequest(itCellRefNo, deptId, zoneId, items, userRequestUpload, null, username); } @Transactional public boolean updateUserRequest(int id, String itcellRefNo, String deptId, String zoneId, int pid, int tid, int qtyRequested, String newUploadPath, String requestDate, String username) { Timestamp now = new Timestamp(System.currentTimeMillis()); try { String safeZoneId = (zoneId != null && !zoneId.trim().isEmpty() && !"null".equalsIgnoreCase(zoneId)) ? zoneId.trim() : null; String finalRequestDate = (requestDate != null && !requestDate.trim().isEmpty()) ? requestDate.trim() : null; if (newUploadPath != null && !newUploadPath.trim().isEmpty()) { String sql = "UPDATE toner_department_requested_details SET " + "itcell_ref_no = ?, dept_id = ?, zone_id = ?, pid = ?, tid = ?, " + "qty_requested = ?, user_request_upload = ?, request_date = ?, updated_date = ?, updated_by = ? " + "WHERE id = ?"; int rows = jdbcTemplate.update(sql, itcellRefNo.trim(), deptId.trim(), safeZoneId, String.valueOf(pid), String.valueOf(tid), String.valueOf(qtyRequested), newUploadPath, finalRequestDate, now, username, id); return rows > 0; } else { String sql = "UPDATE toner_department_requested_details SET " + "itcell_ref_no = ?, dept_id = ?, zone_id = ?, pid = ?, tid = ?, " + "qty_requested = ?, request_date = ?, updated_date = ?, updated_by = ? " + "WHERE id = ?"; int rows = jdbcTemplate.update(sql, itcellRefNo.trim(), deptId.trim(), safeZoneId, String.valueOf(pid), String.valueOf(tid), String.valueOf(qtyRequested), finalRequestDate, now, username, id); return rows > 0; } } catch (Exception e) { e.printStackTrace(); return false; } } @Transactional public boolean updateUserRequest(int id, String itcellRefNo, String deptId, String zoneId, int pid, int tid, int qtyRequested, String newUploadPath, String username) { return updateUserRequest(id, itcellRefNo, deptId, zoneId, pid, tid, qtyRequested, newUploadPath, null, username); } @Transactional public boolean updateUserRequestGroup(String itcellRefNo, String newItcellRefNo, String deptId, String zoneId, String requestDate, String newUploadPath, List> items, String username) { Timestamp now = new Timestamp(System.currentTimeMillis()); try { String safeZoneId = (zoneId != null && !zoneId.trim().isEmpty() && !"null".equalsIgnoreCase(zoneId)) ? zoneId.trim() : null; String finalRequestDate = (requestDate != null && !requestDate.trim().isEmpty()) ? requestDate.trim() : null; String finalItcell = (newItcellRefNo != null && !newItcellRefNo.trim().isEmpty()) ? newItcellRefNo.trim() : itcellRefNo.trim(); if (newUploadPath != null && !newUploadPath.trim().isEmpty()) { String sql = "UPDATE toner_department_requested_details SET " + "itcell_ref_no = ?, dept_id = ?, zone_id = ?, request_date = ?, user_request_upload = ?, updated_date = ?, updated_by = ? " + "WHERE TRIM(itcell_ref_no) = TRIM(?)"; jdbcTemplate.update(sql, finalItcell, deptId.trim(), safeZoneId, finalRequestDate, newUploadPath, now, username, itcellRefNo.trim()); } else { String sql = "UPDATE toner_department_requested_details SET " + "itcell_ref_no = ?, dept_id = ?, zone_id = ?, request_date = ?, updated_date = ?, updated_by = ? " + "WHERE TRIM(itcell_ref_no) = TRIM(?)"; jdbcTemplate.update(sql, finalItcell, deptId.trim(), safeZoneId, finalRequestDate, now, username, itcellRefNo.trim()); } // Update individual item quantities if provided if (items != null && !items.isEmpty()) { String updateItemSql = "UPDATE toner_department_requested_details SET qty_requested = ?, updated_date = ?, updated_by = ? WHERE id = ?"; for (Map item : items) { Integer id = parseIntegerSafely(item.get("id")); Integer qty = parseIntegerSafely(item.get("qty")); if (id != null && qty != null && qty > 0) { jdbcTemplate.update(updateItemSql, String.valueOf(qty), now, username, id); } } } return true; } catch (Exception e) { e.printStackTrace(); return false; } } public List> getAllUserRequests() { try { String sql = "SELECT * FROM toner_department_requested_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY id DESC"; List> list = jdbcTemplate.queryForList(sql); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map deptMap = getDepartmentMap(); Map zoneMap = getZoneMap(); Map userMap = getUserMap(); List> result = new ArrayList<>(); for (Map raw : list) { Map row = new HashMap<>(raw); String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : ""; String zoneId = raw.get("zone_id") != null ? String.valueOf(raw.get("zone_id")).trim() : ""; String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : ""; String requestDate = raw.get("request_date") != null ? String.valueOf(raw.get("request_date")).trim() : ""; String tonerModelName = tonerMap.getOrDefault(tid, tid); String partCode = partCodeMap.get(tid); if (partCode == null || partCode.isEmpty()) { partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : ""); } row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerModelName); row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-"); row.put("dept_name", deptMap.getOrDefault(deptId, deptId)); row.put("zone_name", zoneMap.getOrDefault(zoneId, zoneId)); row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy)); row.put("request_date", requestDate); result.add(row); } // System.out.println("result:" + result); return result; } catch (Exception e) { return new ArrayList<>(); } } public Map getUserRequestById(int id) { try { String sql = "SELECT * FROM toner_department_requested_details WHERE id = ? AND (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; List> list = jdbcTemplate.queryForList(sql, id); if (list == null || list.isEmpty()) { return null; } Map raw = list.get(0); Map row = new HashMap<>(raw); String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : ""; row.put("printer_name", getPrinterMap().getOrDefault(pid, "")); row.put("model_name", getTonerMap().getOrDefault(tid, "")); row.put("dept_name", getDepartmentMap().getOrDefault(deptId, deptId)); return row; } catch (Exception e) { return null; } } public List> getPendingRequests() { try { String sql = "SELECT * FROM toner_department_requested_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY id DESC"; List> list = jdbcTemplate.queryForList(sql); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map deptMap = getDepartmentMap(); Map zoneMap = getZoneMap(); Map availStockMap = getAvailableStockMap(); Map totalWoMap = getTotalWorkorderRegisteredMap(); List> result = new ArrayList<>(); for (Map raw : list) { Integer reqQty = parseIntegerSafely(raw.get("qty_requested")); Integer delQty = parseIntegerSafely(raw.get("qty_delivered")); int requested = reqQty != null ? reqQty : 0; int delivered = delQty != null ? delQty : 0; if (delivered >= requested) { continue; // Already fulfilled } String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; int availStock = availStockMap.getOrDefault(pid + "_" + tid, 0); int woQty = totalWoMap.getOrDefault(pid + "_" + tid, totalWoMap.getOrDefault(tid, 0)); Map row = new HashMap<>(raw); String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : ""; String zoneId = raw.get("zone_id") != null ? String.valueOf(raw.get("zone_id")).trim() : ""; row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerMap.getOrDefault(tid, tid)); row.put("part_code", partCodeMap.getOrDefault(tid, "N/A")); row.put("dept_name", deptMap.getOrDefault(deptId, deptId)); row.put("zone_name", zoneMap.getOrDefault(zoneId, zoneId)); row.put("available_stock", availStock); row.put("qty_workorder_registered", woQty); row.put("workorder_qty", woQty); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } // ================= OUTWARD REGISTER ================= @Transactional public boolean saveOutwardRegisterBulk(List> items, String outwardDate, String username) { Timestamp now = new Timestamp(System.currentTimeMillis()); String finalOutDate = (outwardDate != null && !outwardDate.trim().isEmpty()) ? outwardDate.trim() : null; try { for (Map item : items) { Integer idVal = parseIntegerSafely(item.get("id")); Integer qtyVal = parseIntegerSafely(item.get("qtyIssued")); if (idVal == null) continue; int id = idVal; int qtyIssued = (qtyVal != null) ? qtyVal : 0; if (qtyIssued <= 0) continue; String sql = "UPDATE toner_department_requested_details SET " + "qty_delivered = CAST(COALESCE(qty_delivered, 0) AS SIGNED) + ?, " + "outward_date = COALESCE(?, outward_date), " + "updated_date = ?, updated_by = ? " + "WHERE id = ?"; jdbcTemplate.update(sql, qtyIssued, finalOutDate, now, username, id); } return true; } catch (Exception e) { throw new RuntimeException("Rollback saveOutwardRegisterBulk due to: " + e.getMessage()); } } @Transactional public boolean updateOutwardDeliveryFiles(List ids, String finalDeliveredUpload, String userPhotoUpload, String username) { Timestamp now = new Timestamp(System.currentTimeMillis()); try { for (int id : ids) { String sql = "UPDATE toner_department_requested_details SET " + "final_delivered_upload = CASE WHEN ? IS NULL OR ? = '' THEN final_delivered_upload " + " WHEN final_delivered_upload IS NULL OR final_delivered_upload = '' THEN ? " + " ELSE CONCAT(final_delivered_upload, ',', ?) END, " + "receiver_photo = CASE WHEN ? IS NULL OR ? = '' THEN receiver_photo " + " WHEN receiver_photo IS NULL OR receiver_photo = '' THEN ? " + " ELSE CONCAT(receiver_photo, ',', ?) END, " + "updated_date = ?, updated_by = ? " + "WHERE id = ?"; jdbcTemplate.update(sql, finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload, userPhotoUpload, userPhotoUpload, userPhotoUpload, userPhotoUpload, now, username, id); } return true; } catch (Exception e) { throw new RuntimeException("Rollback updateOutwardDeliveryFiles due to: " + e.getMessage()); } } public boolean saveOutwardRegister(int id, String qtyIssued, String finalDeliveredUpload, String userPhotoUpload, String username) { String sql; int rows; Timestamp now = new Timestamp(System.currentTimeMillis()); try { if (finalDeliveredUpload != null || userPhotoUpload != null) { sql = "UPDATE toner_department_requested_details SET " + "final_delivered_upload = CASE WHEN ? IS NULL OR ? = '' THEN final_delivered_upload " + " WHEN final_delivered_upload IS NULL OR final_delivered_upload = '' THEN ? " + " ELSE CONCAT(final_delivered_upload, ',', ?) END, " + "receiver_photo = CASE WHEN ? IS NULL OR ? = '' THEN receiver_photo " + " WHEN receiver_photo IS NULL OR receiver_photo = '' THEN ? " + " ELSE CONCAT(receiver_photo, ',', ?) END, " + "qty_delivered = CASE WHEN qty_delivered IS NULL OR CAST(qty_delivered AS SIGNED) = 0 THEN ? ELSE qty_delivered END, " + "updated_date = ?, updated_by = ? " + "WHERE id = ?"; rows = jdbcTemplate.update(sql, finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload, userPhotoUpload, userPhotoUpload, userPhotoUpload, userPhotoUpload, qtyIssued, now, username, id); } else { sql = "UPDATE toner_department_requested_details " + "SET qty_delivered = CAST(COALESCE(qty_delivered, 0) AS SIGNED) + CAST(? AS SIGNED), " + "updated_date = ?, updated_by = ? " + "WHERE id = ?"; rows = jdbcTemplate.update(sql, qtyIssued, now, username, id); } return rows > 0; } catch (Exception e) { throw new RuntimeException("Rollback saveOutwardRegister due to: " + e.getMessage()); } } public boolean saveOutwardRegister(int id, String qtyIssued, String finalDeliveredUpload, String username) { return saveOutwardRegister(id, qtyIssued, finalDeliveredUpload, null, username); } public List> getOutwardHistory() { try { String sql = "SELECT * FROM toner_department_requested_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) AND qty_delivered IS NOT NULL AND CAST(qty_delivered AS SIGNED) > 0 ORDER BY updated_date DESC, id DESC"; List> list = jdbcTemplate.queryForList(sql); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map deptMap = getDepartmentMap(); Map zoneMap = getZoneMap(); Map userMap = getUserMap(); List> result = new ArrayList<>(); for (Map raw : list) { Map row = new HashMap<>(raw); String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : ""; String zoneId = raw.get("zone_id") != null ? String.valueOf(raw.get("zone_id")).trim() : ""; String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : ""; row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerMap.getOrDefault(tid, tid)); row.put("part_code", partCodeMap.getOrDefault(tid, "N/A")); row.put("dept_name", deptMap.getOrDefault(deptId, deptId)); row.put("zone_name", zoneMap.getOrDefault(zoneId, zoneId)); row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy)); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } // ================= DASHBOARD & INVENTORY ================= public Map getDashboardMetrics() { Map metrics = new HashMap<>(); String sqlRaised = "SELECT COALESCE(SUM(CAST(qty_requested AS SIGNED)), 0) FROM toner_department_requested_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; String sqlDistributed = "SELECT COALESCE(SUM(CAST(qty_delivered AS SIGNED)), 0) FROM toner_department_requested_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; String sqlInward = "SELECT COALESCE(SUM(CAST(qty_registered AS SIGNED)), 0) FROM toner_stock_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; String sqlWorkorderRegistered = "SELECT COALESCE(SUM(CAST(qty_registered AS SIGNED)), 0) FROM toner_workorder_printermodel_qty WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR 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 = Math.max(0, inwardStock - totalDistributed); int workorderRegistered = jdbcTemplate.queryForObject(sqlWorkorderRegistered, Integer.class); metrics.put("totalRaised", totalRaised); metrics.put("totalDistributed", totalDistributed); metrics.put("inwardStock", inwardStock); metrics.put("availableStock", availableStock); metrics.put("workorderRegistered", workorderRegistered); metrics.put("workorderRequested", 0); } catch (Exception e) { metrics.put("totalRaised", 0); metrics.put("totalDistributed", 0); metrics.put("inwardStock", 0); metrics.put("availableStock", 0); metrics.put("workorderRegistered", 0); metrics.put("workorderRequested", 0); } return metrics; } public List> getInventorySummary() { try { String sql = "SELECT t.id AS tid, t.pid, t.model_name, p.printer_name FROM toner_model_list t " + "LEFT JOIN toner_printer_model_list p ON t.pid = p.id " + "WHERE (t.is_active IS NULL OR t.is_active = 1) AND (t.is_delete IS NULL OR t.is_delete = 0) " + "ORDER BY p.printer_name, t.model_name"; List> list = jdbcTemplate.queryForList(sql); Map inwardMap = new HashMap<>(); try { String inSql = "SELECT pid, tid, SUM(CAST(qty_registered AS SIGNED)) AS total_in FROM toner_stock_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY pid, tid"; for (Map r : jdbcTemplate.queryForList(inSql)) { String k = String.valueOf(r.get("pid")).trim() + "_" + String.valueOf(r.get("tid")).trim(); inwardMap.put(k, parseIntegerSafely(r.get("total_in")) != null ? parseIntegerSafely(r.get("total_in")) : 0); } } catch (Exception ignored) { } Map outwardMap = new HashMap<>(); try { String outSql = "SELECT pid, tid, SUM(CAST(qty_delivered AS SIGNED)) AS total_out FROM toner_department_requested_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY pid, tid"; for (Map r : jdbcTemplate.queryForList(outSql)) { String k = String.valueOf(r.get("pid")).trim() + "_" + String.valueOf(r.get("tid")).trim(); outwardMap.put(k, parseIntegerSafely(r.get("total_out")) != null ? parseIntegerSafely(r.get("total_out")) : 0); } } catch (Exception ignored) { } List> result = new ArrayList<>(); for (Map map : list) { Map row = new HashMap<>(map); String k = String.valueOf(map.get("pid")).trim() + "_" + String.valueOf(map.get("tid")).trim(); int inward = inwardMap.getOrDefault(k, 0); int outward = outwardMap.getOrDefault(k, 0); row.put("inward_qty", inward); row.put("outward_qty", outward); row.put("available_qty", Math.max(0, inward - outward)); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } // ================= WORKORDER REGISTRATION & REQUESTS ================= public boolean saveWorkorder(String refNo, String fileNumber, String vendorName, String startDate, String endDate, String dcUpload, String totalQty, List> items, String username) { Timestamp now = new Timestamp(System.currentTimeMillis()); String sqlMain = "INSERT INTO toner_workorder_register_details " + "(ref_no, file_number, vendor_name, workorder_start_date, workorder_end_date, pid, tid, total_qty_registered, dc_upload, cdate, updated_date, updated_by, is_active, is_delete) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0)"; String firstPid = null; String firstTid = null; if (items != null && !items.isEmpty()) { Map firstItem = items.get(0); if (firstItem.get("pid") != null) firstPid = String.valueOf(firstItem.get("pid")); if (firstItem.get("tid") != null) firstTid = String.valueOf(firstItem.get("tid")); } try { int mainRows = jdbcTemplate.update(sqlMain, refNo, fileNumber, vendorName, startDate, endDate, firstPid, firstTid, totalQty, dcUpload, now, now, username); if (mainRows <= 0) return false; String sqlSub = "INSERT INTO toner_workorder_printermodel_qty " + "(ref_no, pid, tid, qty_registered, cdate, updated_date, updated_by, is_active, is_delete) " + "VALUES (?, ?, ?, ?, ?, ?, ?, 1, 0)"; for (Map item : items) { String pid = String.valueOf(item.get("pid")); String tid = String.valueOf(item.get("tid")); String qty = String.valueOf(item.get("qty")); jdbcTemplate.update(sqlSub, refNo, pid, tid, qty, now, now, username); } return true; } catch (Exception e) { throw new RuntimeException("Rollback saveWorkorder due to: " + e.getMessage()); } } public List> getActiveWorkorders() { String sql = "SELECT id, ref_no, file_number, vendor_name FROM toner_workorder_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY id DESC"; try { List> list = jdbcTemplate.queryForList(sql); if (list == null || list.isEmpty()) return new ArrayList<>(); Map> seen = new HashMap<>(); List> distinct = new ArrayList<>(); for (Map row : list) { String refNo = row.get("ref_no") != null ? String.valueOf(row.get("ref_no")).trim() : ""; String fileNo = row.get("file_number") != null ? String.valueOf(row.get("file_number")).trim() : ""; String key = refNo + "_" + fileNo; if (!seen.containsKey(key)) { seen.put(key, row); distinct.add(row); } } return distinct; } catch (Exception e) { System.err.println("Error fetching active workorders: " + e.getMessage()); return new ArrayList<>(); } } public List getActiveWorkorderRefNos() { String sql = "SELECT ref_no FROM toner_workorder_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY id DESC"; try { return jdbcTemplate.queryForList(sql, String.class); } catch (Exception e) { return new ArrayList<>(); } } public List> getWorkorderRegisteredItems(String refNo) { try { String resolvedRef = refNo != null ? refNo.trim() : ""; try { String findSql = "SELECT ref_no FROM toner_workorder_register_details WHERE (TRIM(ref_no) = TRIM(?) OR TRIM(file_number) = TRIM(?)) AND (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) LIMIT 1"; List refs = jdbcTemplate.queryForList(findSql, String.class, refNo, refNo); if (refs != null && !refs.isEmpty() && refs.get(0) != null) { resolvedRef = refs.get(0).trim(); } } catch (Exception ignored) { } String sql = "SELECT * FROM toner_workorder_printermodel_qty WHERE (TRIM(ref_no) = TRIM(?) OR TRIM(ref_no) = TRIM(?)) AND (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; List> list = jdbcTemplate.queryForList(sql, refNo, resolvedRef); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map vendorMap = getVendorMap(); Map fileNumberMap = getWorkorderFileNumberMap(); Map inStockMap = getInwardStockMap(); String vendorId = ""; try { String vSql = "SELECT vendor_name FROM toner_workorder_register_details WHERE (TRIM(ref_no) = TRIM(?) OR TRIM(ref_no) = TRIM(?)) LIMIT 1"; vendorId = jdbcTemplate.queryForObject(vSql, String.class, refNo, resolvedRef); } catch (Exception ignored) { } List> result = new ArrayList<>(); for (Map raw : list) { Map row = new HashMap<>(raw); String cleanRef = resolvedRef; String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; String tonerModelName = tonerMap.getOrDefault(tid, tid); String partCode = partCodeMap.get(tid); if (partCode == null || partCode.isEmpty()) { partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : ""); } row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerModelName); row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-"); row.put("vendor_name", vendorMap.getOrDefault(vendorId, vendorId)); row.put("vendor_id", vendorId); row.put("file_number", fileNumberMap.getOrDefault(cleanRef, "")); row.put("qty_inward_received", inStockMap.getOrDefault(cleanRef + "_" + pid + "_" + tid, 0)); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } public List> getWorkorderRegisterHistory() { try { String sql = "SELECT * FROM toner_workorder_printermodel_qty WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY id DESC"; List> list = jdbcTemplate.queryForList(sql); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map userMap = getUserMap(); Map vendorMap = getVendorMap(); Map fileNumberMap = getWorkorderFileNumberMap(); Map> mainRegMap = new HashMap<>(); try { List> mains = jdbcTemplate.queryForList( "SELECT * FROM toner_workorder_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"); for (Map m : mains) { if (m.get("ref_no") != null) { mainRegMap.put(String.valueOf(m.get("ref_no")).trim(), m); } } } catch (Exception ignored) { } List> result = new ArrayList<>(); for (Map raw : list) { Map row = new HashMap<>(raw); String refNo = raw.get("ref_no") != null ? String.valueOf(raw.get("ref_no")).trim() : ""; String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : ""; Map mainRow = mainRegMap.get(refNo); String vendorStr = ""; if (mainRow != null) { vendorStr = mainRow.get("vendor_name") != null ? String.valueOf(mainRow.get("vendor_name")).trim() : ""; row.put("file_number", mainRow.get("file_number")); row.put("workorder_start_date", mainRow.get("workorder_start_date")); row.put("workorder_end_date", mainRow.get("workorder_end_date")); row.put("dc_upload", mainRow.get("dc_upload")); row.put("wo_cdate", mainRow.get("cdate")); } else { row.put("file_number", fileNumberMap.getOrDefault(refNo, "")); } String tonerModelName = tonerMap.getOrDefault(tid, tid); String partCode = partCodeMap.get(tid); if (partCode == null || partCode.isEmpty()) { partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : ""); } row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerModelName); row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-"); row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy)); row.put("vendor_name", vendorMap.getOrDefault(vendorStr, vendorStr)); row.put("total_qty_registered", raw.get("qty_registered")); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } @Transactional public boolean saveWorkorderModelRequest(String refNo, String companyName, String pid, List> items, String emailCopyUpload, String username) { if (items == null || items.isEmpty()) { return false; } int totalQtyRequested = 0; for (Map item : items) { Integer q = parseIntegerSafely(item.get("qty")); if (q != null) { totalQtyRequested += q; } } final int finalTotalQty = totalQtyRequested; String firstPid = (pid != null && !pid.trim().isEmpty()) ? pid : String.valueOf(items.get(0).get("pid")); String firstTid = String.valueOf(items.get(0).get("tid")); Timestamp now = new Timestamp(System.currentTimeMillis()); String sqlMain = "INSERT INTO toner_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)"; try { 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; String sqlSub = "INSERT INTO toner_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) { throw new RuntimeException("Rollback saveWorkorderModelRequest due to: " + e.getMessage()); } } public List getActiveWorkorderRequestRefNos() { String sql = "SELECT ref_no FROM toner_workorder_model_request_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) GROUP BY ref_no ORDER BY MAX(id) DESC"; try { return jdbcTemplate.queryForList(sql, String.class); } catch (Exception e) { return new ArrayList<>(); } } public List> getWorkorderRequests(String refNo) { try { String sql = "SELECT * FROM toner_workorder_model_multiple_request_qty WHERE TRIM(ref_no) = TRIM(?) AND (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; List> list = jdbcTemplate.queryForList(sql, refNo); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map userMap = getUserMap(); Map inByReqMap = getInwardStockByRequestMap(); List> result = new ArrayList<>(); for (Map raw : list) { Map row = new HashMap<>(raw); String cleanRef = refNo != null ? refNo.trim() : ""; String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : ""; String mrId = raw.get("id") != null ? String.valueOf(raw.get("id")).trim() : ""; String tonerModelName = tonerMap.getOrDefault(tid, tid); String partCode = partCodeMap.get(tid); if (partCode == null || partCode.isEmpty()) { partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : ""); } row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerModelName); row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-"); row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy)); row.put("qty_requested", raw.get("qty_registered")); row.put("qty_inward_received", inByReqMap.getOrDefault(cleanRef + "_" + pid + "_" + tid + "_" + mrId, 0)); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } public List> getWorkorderModelRequestHistory() { try { String sql = "SELECT * FROM toner_workorder_model_multiple_request_qty WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY id DESC"; List> list = jdbcTemplate.queryForList(sql); if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map printerMap = getPrinterMap(); Map tonerMap = getTonerMap(); Map partCodeMap = getTonerPartCodeMap(); Map userMap = getUserMap(); Map woRegisteredQtyMap = getWorkorderRegisteredQtyMap(); List> result = new ArrayList<>(); for (Map raw : list) { Map row = new HashMap<>(raw); String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : ""; String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : ""; String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : ""; String refNo = raw.get("ref_no") != null ? String.valueOf(raw.get("ref_no")).trim() : ""; String tonerModelName = tonerMap.getOrDefault(tid, tid); String partCode = partCodeMap.get(tid); if (partCode == null || partCode.isEmpty()) { partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : ""); } row.put("printer_name", printerMap.getOrDefault(pid, pid)); row.put("model_name", tonerModelName); row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-"); row.put("order_by", userMap.getOrDefault(updatedBy, updatedBy)); row.put("qty_requested", raw.get("qty_registered")); int woQty = woRegisteredQtyMap.getOrDefault(refNo + "_" + pid + "_" + tid, 0); row.put("qty_registered", woQty); result.add(row); } return result; } catch (Exception e) { return new ArrayList<>(); } } // ================= DEPARTMENTS & ZONES ================= public List> getActiveDepartments() { String sql = "SELECT id, dept_name FROM toner_department_list WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0) ORDER BY dept_name ASC"; try { return jdbcTemplate.queryForList(sql); } catch (Exception e) { return new ArrayList<>(); } } public List> getActiveZones() { String sql = "SELECT id, zone_name FROM toner_zone_list WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)"; try { return jdbcTemplate.queryForList(sql); } catch (Exception e) { return new ArrayList<>(); } } public JdbcTemplate getJdbcTemplate() { return this.jdbcTemplate; } private Integer parseIntegerSafely(Object val) { if (val == null) { return null; } String str = String.valueOf(val).trim(); if (str.isEmpty() || "null".equalsIgnoreCase(str) || "undefined".equalsIgnoreCase(str)) { return null; } try { return Integer.parseInt(str); } catch (NumberFormatException e) { return null; } } }