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.
 
 
 
 

243 lines
12 KiB

package com.gcc_manpower.gcctonermanagement.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class TonerService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlTonerManagementDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@jakarta.annotation.PostConstruct
public void initTables() {
try {
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS stock_register_details (" +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"company_name VARCHAR(30), " +
"pid VARCHAR(20), " +
"tid VARCHAR(30), " +
"qty_registered VARCHAR(30), " +
"dc_upload VARCHAR(250), " +
"cdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " +
"updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
"order_by VARCHAR(45), " +
"is_active TINYINT DEFAULT 1, " +
"is_delete TINYINT DEFAULT 0" +
")");
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS department_requested_details (" +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"req_no VARCHAR(70), " +
"company_name VARCHAR(30), " +
"itcell_ref_no VARCHAR(45), " +
"dept_id VARCHAR(30), " +
"pid VARCHAR(20), " +
"tid VARCHAR(30), " +
"qty_registered VARCHAR(30), " +
"qty_requested VARCHAR(30), " +
"qty_delivered VARCHAR(30), " +
"dc_upload VARCHAR(250), " +
"user_request_upload VARCHAR(250), " +
"final_delivered_upload VARCHAR(250), " +
"cdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " +
"updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
"updated_by VARCHAR(45), " +
"order_by VARCHAR(45), " +
"is_active TINYINT DEFAULT 1, " +
"is_delete TINYINT DEFAULT 0" +
")");
} catch (Exception e) {
System.err.println("Error initializing tables: " + e.getMessage());
e.printStackTrace();
}
}
public List<Map<String, Object>> getActivePrinters() {
String sql = "SELECT id, printer_name FROM printer_model_list where is_active = 1 AND is_delete = 0 ";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
System.err.println("Error fetching printers list: " + e.getMessage());
return new ArrayList<>();
}
}
public List<Map<String, Object>> getActiveTonersByPrinter(int pid) {
String sql = "SELECT id, model_name FROM toner_model_list WHERE pid = ? AND is_active = 1 AND is_delete = 0 ";
try {
return jdbcTemplate.queryForList(sql, pid);
} catch (Exception e) {
System.err.println("Error fetching toners list: " + e.getMessage());
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) {
System.err.println("Error fetching toner model name for id " + tid + ": " + e.getMessage());
return "UNKNOWN";
}
}
public boolean saveInwardRegister(String companyName, int pid, int tid, String qty, String dcUpload, String username) {
String sql = "INSERT INTO stock_register_details " +
"(company_name, pid, tid, qty_registered, dc_upload, cdate, updated_date, order_by, is_active, is_delete) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, 0)";
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
try {
int rows = jdbcTemplate.update(sql, companyName, String.valueOf(pid), String.valueOf(tid), qty, dcUpload, now, now, username);
return rows > 0;
} catch (Exception e) {
System.err.println("Error saving inward register: " + e.getMessage());
e.printStackTrace();
return false;
}
}
public int getMaxRequestId() {
String sql = "SELECT COALESCE(MAX(id), 0) FROM department_requested_details";
try {
return jdbcTemplate.queryForObject(sql, Integer.class);
} catch (Exception e) {
System.err.println("Error fetching max id from department_requested_details: " + e.getMessage());
return 0;
}
}
public String saveUserRequest(String itCellRefNo, String deptId, int pid, int tid, String qtyRequested, String userRequestUpload, String username) {
String tonerModel = getTonerModelName(tid);
String cleanModel = tonerModel.trim().replaceAll("\\s+", "-").replaceAll("[^a-zA-Z0-9-]", "");
int maxId = getMaxRequestId();
int seqNum = 1000 + maxId + 1;
int year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
String reqNo = String.format("%s-%d-%04d", cleanModel, year, seqNum);
String sql = "INSERT INTO department_requested_details " +
"(req_no, itcell_ref_no, dept_id, pid, tid, qty_requested, qty_delivered, user_request_upload, cdate, updated_date, updated_by, is_active, is_delete) " +
"VALUES (?, ?, ?, ?, ?, ?, '0', ?, ?, ?, ?, 1, 0)";
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
try {
int rows = jdbcTemplate.update(sql, reqNo, itCellRefNo, deptId, String.valueOf(pid), String.valueOf(tid), qtyRequested, userRequestUpload, now, now, username);
return rows > 0 ? reqNo : null;
} catch (Exception e) {
System.err.println("Error saving user request: " + e.getMessage());
e.printStackTrace();
return null;
}
}
public List<Map<String, Object>> getPendingRequests() {
String sql = "SELECT r.id, r.req_no, r.dept_id, r.pid, r.tid, r.qty_requested, r.qty_delivered, " +
"p.printer_name, t.model_name " +
"FROM department_requested_details r " +
"LEFT JOIN printer_model_list p ON r.pid = p.id " +
"LEFT JOIN toner_model_list t ON r.tid = t.id " +
"WHERE r.is_active = 1 AND r.is_delete = 0 " +
"AND (r.qty_delivered IS NULL OR CAST(r.qty_delivered AS SIGNED) < CAST(r.qty_requested AS SIGNED)) " +
"ORDER BY r.id DESC";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
System.err.println("Error fetching pending requests: " + e.getMessage());
return new ArrayList<>();
}
}
public boolean saveOutwardRegister(int id, String qtyIssued, String finalDeliveredUpload, String username) {
String sql = "UPDATE department_requested_details " +
"SET qty_delivered = ?, final_delivered_upload = ?, updated_date = ?, updated_by = ? " +
"WHERE id = ?";
java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis());
try {
int rows = jdbcTemplate.update(sql, qtyIssued, finalDeliveredUpload, now, username, id);
return rows > 0;
} catch (Exception e) {
System.err.println("Error updating outward register: " + e.getMessage());
e.printStackTrace();
return false;
}
}
public Map<String, Object> getDashboardMetrics() {
Map<String, Object> metrics = new HashMap<>();
String sqlRaised = "SELECT COALESCE(SUM(CAST(qty_requested AS SIGNED)), 0) FROM department_requested_details WHERE is_active = 1 AND is_delete = 0";
String sqlDistributed = "SELECT COALESCE(SUM(CAST(qty_delivered AS SIGNED)), 0) FROM department_requested_details WHERE is_active = 1 AND is_delete = 0";
String sqlInward = "SELECT COALESCE(SUM(CAST(qty_registered AS SIGNED)), 0) FROM stock_register_details WHERE is_active = 1 AND 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 = inwardStock - totalDistributed;
metrics.put("totalRaised", totalRaised);
metrics.put("totalDistributed", totalDistributed);
metrics.put("availableStock", availableStock);
} catch (Exception e) {
System.err.println("Error computing dashboard metrics: " + e.getMessage());
metrics.put("totalRaised", 0);
metrics.put("totalDistributed", 0);
metrics.put("availableStock", 0);
}
return metrics;
}
public List<Map<String, Object>> getInventorySummary() {
String safeSql = "SELECT p.printer_name, t.model_name, " +
"COALESCE((SELECT SUM(CAST(sr.qty_registered AS SIGNED)) FROM stock_register_details sr WHERE CAST(sr.pid AS SIGNED) = t.pid AND CAST(sr.tid AS SIGNED) = t.id AND sr.is_active = 1 AND sr.is_delete = 0), 0) AS inward_qty, " +
"COALESCE((SELECT SUM(CAST(dr.qty_delivered AS SIGNED)) FROM department_requested_details dr WHERE CAST(dr.pid AS SIGNED) = t.pid AND CAST(dr.tid AS SIGNED) = t.id AND dr.is_active = 1 AND dr.is_delete = 0), 0) AS outward_qty " +
"FROM toner_model_list t " +
"JOIN printer_model_list p ON t.pid = p.id " +
"WHERE t.is_active = 1 AND t.is_delete = 0 " +
"ORDER BY p.printer_name, t.model_name";
try {
List<Map<String, Object>> list = jdbcTemplate.queryForList(safeSql);
for (Map<String, Object> map : list) {
Number inward = (Number) map.get("inward_qty");
Number outward = (Number) map.get("outward_qty");
long avail = (inward != null ? inward.longValue() : 0) - (outward != null ? outward.longValue() : 0);
map.put("available_qty", avail);
}
return list;
} catch (Exception e) {
System.err.println("Error fetching inventory summary: " + e.getMessage());
e.printStackTrace();
return new ArrayList<>();
}
}
public List<Map<String, Object>> getOutwardHistory() {
String sql = "SELECT r.id, r.req_no, r.itcell_ref_no, r.dept_id, r.qty_requested, r.qty_delivered, r.final_delivered_upload, r.updated_date, " +
"p.printer_name, t.model_name " +
"FROM department_requested_details r " +
"LEFT JOIN printer_model_list p ON r.pid = p.id " +
"LEFT JOIN toner_model_list t ON r.tid = t.id " +
"WHERE r.is_active = 1 AND r.is_delete = 0 " +
"AND r.qty_delivered IS NOT NULL AND CAST(r.qty_delivered AS SIGNED) > 0 " +
"ORDER BY r.updated_date DESC";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
System.err.println("Error fetching outward history: " + e.getMessage());
return new ArrayList<>();
}
}
}