All GCC vendors and employee details for IT department management
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1668 lines
82 KiB

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<String, String> getPrinterMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(
"SELECT id, printer_name FROM toner_printer_model_list WHERE is_active = 1 AND is_delete = 0");
for (Map<String, Object> 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<String, String> getTonerMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(
"SELECT id, model_name FROM toner_model_list WHERE is_active = 1 AND is_delete = 0");
for (Map<String, Object> 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<String, String> getTonerPartCodeMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(
"SELECT id, model_name, part_code FROM toner_model_list WHERE (is_delete IS NULL OR is_delete = 0)");
for (Map<String, Object> 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<String, String> getDepartmentMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(
"SELECT id, dept_name FROM toner_department_list WHERE is_active = 1 AND is_delete = 0");
for (Map<String, Object> 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<String, String> getZoneMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(
"SELECT id, zone_name FROM toner_zone_list WHERE is_active = 1 AND is_delete = 0");
for (Map<String, Object> 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<String, String> getUserMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT usr_id, usr_name FROM app_user");
for (Map<String, Object> 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<String, String> getVendorMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(
"SELECT id, vendor_name FROM payment_vendors_list WHERE is_active = 1 AND is_delete = 0");
for (Map<String, Object> 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<Map<String, Object>> 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<String, String> getWorkorderFileNumberMap() {
Map<String, String> map = new HashMap<>();
try {
List<Map<String, Object>> 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<String, Object> 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<String, Integer> getWorkorderRegisteredQtyMap() {
Map<String, Integer> map = new HashMap<>();
try {
List<Map<String, Object>> 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<String, Object> 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<String, Integer> getTotalWorkorderRegisteredMap() {
Map<String, Integer> map = new HashMap<>();
try {
List<Map<String, Object>> 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<String, Object> 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<String, Integer> getInwardStockMap() {
Map<String, Integer> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
for (Map<String, Object> 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<String, Integer> getInwardStockByRequestMap() {
Map<String, Integer> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
for (Map<String, Object> 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<String, Integer> getAvailableStockMap() {
Map<String, Integer> map = new HashMap<>();
try {
Map<String, Integer> 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<Map<String, Object>> inList = jdbcTemplate.queryForList(inSql);
for (Map<String, Object> 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<String, Integer> 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<Map<String, Object>> outList = jdbcTemplate.queryForList(outSql);
for (Map<String, Object> 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<String, Integer> 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<Map<String, Object>> 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<Map<String, Object>> 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<Map<String, Object>> 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<Map<String, Object>> getAllActiveToners() {
return getMasterToners("active");
}
// ================= PRINTERS & TONERS =================
public List<Map<String, Object>> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql, pid);
Map<String, Integer> availMap = getAvailableStockMap();
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> map : list) {
Map<String, Object> 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<Map<String, Object>> 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<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> items,
String dcUpload, String username) {
return saveInwardRegister(refNo, companyName, items, dcUpload, null, null, username);
}
@Transactional
public boolean updateInwardDc(List<Integer> 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<Object> 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<Object> 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<Integer> 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<Object> params = new ArrayList<>();
params.add(now);
params.add(updatedBy);
params.addAll(ids);
jdbcTemplate.update(sql, params.toArray());
return true;
}
public List<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> userMap = getUserMap();
Map<String, String> vendorMap = getVendorMap();
Map<String, String> fileNumberMap = getWorkorderFileNumberMap();
Map<String, Integer> woQtyMap = getWorkorderRegisteredQtyMap();
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> 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<String, Object> 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<Map<String, Object>> 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<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> 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<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> deptMap = getDepartmentMap();
Map<String, String> zoneMap = getZoneMap();
Map<String, String> userMap = getUserMap();
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> raw : list) {
Map<String, Object> 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<String, Object> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql, id);
if (list == null || list.isEmpty()) {
return null;
}
Map<String, Object> raw = list.get(0);
Map<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> deptMap = getDepartmentMap();
Map<String, String> zoneMap = getZoneMap();
Map<String, Integer> availStockMap = getAvailableStockMap();
Map<String, Integer> totalWoMap = getTotalWorkorderRegisteredMap();
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> 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<String, Object> 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<Map<String, Object>> items, String outwardDate, String username) {
Timestamp now = new Timestamp(System.currentTimeMillis());
String finalOutDate = (outwardDate != null && !outwardDate.trim().isEmpty()) ? outwardDate.trim() : null;
try {
for (Map<String, Object> 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<Integer> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> deptMap = getDepartmentMap();
Map<String, String> zoneMap = getZoneMap();
Map<String, String> userMap = getUserMap();
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> raw : list) {
Map<String, Object> 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<String, Object> getDashboardMetrics() {
Map<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
Map<String, Integer> 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<String, Object> 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<String, Integer> 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<String, Object> 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<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> map : list) {
Map<String, Object> 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<Map<String, Object>> 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<String, Object> 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<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (list == null || list.isEmpty())
return new ArrayList<>();
Map<String, Map<String, Object>> seen = new HashMap<>();
List<Map<String, Object>> distinct = new ArrayList<>();
for (Map<String, Object> 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<String> 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<Map<String, Object>> 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<String> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql, refNo, resolvedRef);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> vendorMap = getVendorMap();
Map<String, String> fileNumberMap = getWorkorderFileNumberMap();
Map<String, Integer> 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<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> raw : list) {
Map<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> userMap = getUserMap();
Map<String, String> vendorMap = getVendorMap();
Map<String, String> fileNumberMap = getWorkorderFileNumberMap();
Map<String, Map<String, Object>> mainRegMap = new HashMap<>();
try {
List<Map<String, Object>> 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<String, Object> m : mains) {
if (m.get("ref_no") != null) {
mainRegMap.put(String.valueOf(m.get("ref_no")).trim(), m);
}
}
} catch (Exception ignored) {
}
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> raw : list) {
Map<String, Object> 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<String, Object> 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<Map<String, Object>> items, String emailCopyUpload, String username) {
if (items == null || items.isEmpty()) {
return false;
}
int totalQtyRequested = 0;
for (Map<String, Object> 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<String, Object> 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<String> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql, refNo);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> userMap = getUserMap();
Map<String, Integer> inByReqMap = getInwardStockByRequestMap();
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> raw : list) {
Map<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
if (list == null || list.isEmpty()) {
return new ArrayList<>();
}
Map<String, String> printerMap = getPrinterMap();
Map<String, String> tonerMap = getTonerMap();
Map<String, String> partCodeMap = getTonerPartCodeMap();
Map<String, String> userMap = getUserMap();
Map<String, Integer> woRegisteredQtyMap = getWorkorderRegisteredQtyMap();
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> raw : list) {
Map<String, Object> 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<Map<String, Object>> 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<Map<String, Object>> 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;
}
}
}