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

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. package com.gcc_manpower.gcctonermanagement.service;
  2. import java.sql.PreparedStatement;
  3. import java.sql.Statement;
  4. import java.sql.Timestamp;
  5. import java.util.ArrayList;
  6. import java.util.Calendar;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import javax.sql.DataSource;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import jakarta.annotation.PostConstruct;
  13. import org.springframework.beans.factory.annotation.Qualifier;
  14. import org.springframework.jdbc.core.JdbcTemplate;
  15. import org.springframework.jdbc.support.GeneratedKeyHolder;
  16. import org.springframework.jdbc.support.KeyHolder;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.transaction.annotation.Transactional;
  19. @Service
  20. public class TonerService {
  21. private JdbcTemplate jdbcTemplate;
  22. @Autowired
  23. public void setDataSource(@Qualifier("mysqlItcellManagementDataSource") DataSource dataSource) {
  24. this.jdbcTemplate = new JdbcTemplate(dataSource);
  25. }
  26. // ================= FAST IN-MEMORY LOOKUP MAPS (Zero N+1 DB Calls)
  27. // =================
  28. private Map<String, String> getPrinterMap() {
  29. Map<String, String> map = new HashMap<>();
  30. try {
  31. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  32. "SELECT id, printer_name FROM toner_printer_model_list WHERE is_active = 1 AND is_delete = 0");
  33. for (Map<String, Object> row : list) {
  34. if (row.get("id") != null && row.get("printer_name") != null) {
  35. map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("printer_name")).trim());
  36. }
  37. }
  38. } catch (Exception ignored) {
  39. }
  40. return map;
  41. }
  42. private Map<String, String> getTonerMap() {
  43. Map<String, String> map = new HashMap<>();
  44. try {
  45. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  46. "SELECT id, model_name FROM toner_model_list WHERE is_active = 1 AND is_delete = 0");
  47. for (Map<String, Object> row : list) {
  48. if (row.get("id") != null && row.get("model_name") != null) {
  49. map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("model_name")).trim());
  50. }
  51. }
  52. } catch (Exception ignored) {
  53. }
  54. return map;
  55. }
  56. private Map<String, String> getTonerPartCodeMap() {
  57. Map<String, String> map = new HashMap<>();
  58. try {
  59. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  60. "SELECT id, model_name, part_code FROM toner_model_list WHERE (is_delete IS NULL OR is_delete = 0)");
  61. for (Map<String, Object> row : list) {
  62. String code = row.get("part_code") != null ? String.valueOf(row.get("part_code")).trim() : "";
  63. if (!code.isEmpty() && !"null".equalsIgnoreCase(code) && !"n/a".equalsIgnoreCase(code)) {
  64. if (row.get("id") != null) {
  65. map.put(String.valueOf(row.get("id")).trim(), code);
  66. }
  67. if (row.get("model_name") != null) {
  68. map.put(String.valueOf(row.get("model_name")).trim().toLowerCase(), code);
  69. }
  70. }
  71. }
  72. } catch (Exception ignored) {
  73. }
  74. return map;
  75. }
  76. private Map<String, String> getDepartmentMap() {
  77. Map<String, String> map = new HashMap<>();
  78. try {
  79. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  80. "SELECT id, dept_name FROM toner_department_list WHERE is_active = 1 AND is_delete = 0");
  81. for (Map<String, Object> row : list) {
  82. if (row.get("id") != null && row.get("dept_name") != null) {
  83. map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("dept_name")).trim());
  84. }
  85. }
  86. } catch (Exception ignored) {
  87. }
  88. return map;
  89. }
  90. private Map<String, String> getZoneMap() {
  91. Map<String, String> map = new HashMap<>();
  92. try {
  93. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  94. "SELECT id, zone_name FROM toner_zone_list WHERE is_active = 1 AND is_delete = 0");
  95. for (Map<String, Object> row : list) {
  96. if (row.get("id") != null && row.get("zone_name") != null) {
  97. map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("zone_name")).trim());
  98. }
  99. }
  100. } catch (Exception ignored) {
  101. }
  102. return map;
  103. }
  104. private Map<String, String> getUserMap() {
  105. Map<String, String> map = new HashMap<>();
  106. try {
  107. List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT usr_id, usr_name FROM app_user");
  108. for (Map<String, Object> row : list) {
  109. if (row.get("usr_id") != null && row.get("usr_name") != null) {
  110. map.put(String.valueOf(row.get("usr_id")).trim(), String.valueOf(row.get("usr_name")).trim());
  111. }
  112. }
  113. } catch (Exception ignored) {
  114. }
  115. return map;
  116. }
  117. private Map<String, String> getVendorMap() {
  118. Map<String, String> map = new HashMap<>();
  119. try {
  120. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  121. "SELECT id, vendor_name FROM payment_vendors_list WHERE is_active = 1 AND is_delete = 0");
  122. for (Map<String, Object> row : list) {
  123. if (row.get("id") != null && row.get("vendor_name") != null) {
  124. map.put(String.valueOf(row.get("id")).trim(), String.valueOf(row.get("vendor_name")).trim());
  125. }
  126. }
  127. } catch (Exception ignored) {
  128. }
  129. return map;
  130. }
  131. public List<Map<String, Object>> getActiveVendors() {
  132. try {
  133. return jdbcTemplate.queryForList(
  134. "SELECT id, vendor_name FROM payment_vendors_list WHERE is_active = 1 AND is_delete = 0 ORDER BY vendor_name ASC");
  135. } catch (Exception e) {
  136. return new ArrayList<>();
  137. }
  138. }
  139. private Map<String, String> getWorkorderFileNumberMap() {
  140. Map<String, String> map = new HashMap<>();
  141. try {
  142. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  143. "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)");
  144. for (Map<String, Object> row : list) {
  145. if (row.get("ref_no") != null && row.get("file_number") != null) {
  146. map.put(String.valueOf(row.get("ref_no")).trim(), String.valueOf(row.get("file_number")).trim());
  147. }
  148. }
  149. } catch (Exception ignored) {
  150. }
  151. return map;
  152. }
  153. private Map<String, Integer> getWorkorderRegisteredQtyMap() {
  154. Map<String, Integer> map = new HashMap<>();
  155. try {
  156. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  157. "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)");
  158. for (Map<String, Object> row : list) {
  159. if (row.get("ref_no") != null && row.get("pid") != null && row.get("tid") != null) {
  160. String refNo = String.valueOf(row.get("ref_no")).trim();
  161. String pid = String.valueOf(row.get("pid")).trim();
  162. String tid = String.valueOf(row.get("tid")).trim();
  163. Integer qty = parseIntegerSafely(row.get("qty_registered"));
  164. map.put(refNo + "_" + pid + "_" + tid, qty != null ? qty : 0);
  165. }
  166. }
  167. } catch (Exception ignored) {
  168. }
  169. return map;
  170. }
  171. private Map<String, Integer> getTotalWorkorderRegisteredMap() {
  172. Map<String, Integer> map = new HashMap<>();
  173. try {
  174. List<Map<String, Object>> list = jdbcTemplate.queryForList(
  175. "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");
  176. for (Map<String, Object> row : list) {
  177. if (row.get("pid") != null && row.get("tid") != null) {
  178. String pid = String.valueOf(row.get("pid")).trim();
  179. String tid = String.valueOf(row.get("tid")).trim();
  180. Integer qty = parseIntegerSafely(row.get("total_qty"));
  181. map.put(pid + "_" + tid, qty != null ? qty : 0);
  182. map.put(tid, map.getOrDefault(tid, 0) + (qty != null ? qty : 0));
  183. }
  184. }
  185. } catch (Exception ignored) {
  186. }
  187. return map;
  188. }
  189. private Map<String, Integer> getInwardStockMap() {
  190. Map<String, Integer> map = new HashMap<>();
  191. try {
  192. 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";
  193. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  194. for (Map<String, Object> row : list) {
  195. String ref = row.get("ref_no") != null ? String.valueOf(row.get("ref_no")).trim() : "";
  196. String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : "";
  197. String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : "";
  198. Integer qty = parseIntegerSafely(row.get("total_qty"));
  199. map.put(ref + "_" + pid + "_" + tid, qty != null ? qty : 0);
  200. }
  201. } catch (Exception ignored) {
  202. }
  203. return map;
  204. }
  205. private Map<String, Integer> getInwardStockByRequestMap() {
  206. Map<String, Integer> map = new HashMap<>();
  207. try {
  208. 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";
  209. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  210. for (Map<String, Object> row : list) {
  211. String ref = row.get("ref_no") != null ? String.valueOf(row.get("ref_no")).trim() : "";
  212. String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : "";
  213. String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : "";
  214. String reqId = row.get("request_id") != null ? String.valueOf(row.get("request_id")).trim() : "";
  215. Integer qty = parseIntegerSafely(row.get("total_qty"));
  216. map.put(ref + "_" + pid + "_" + tid + "_" + reqId, qty != null ? qty : 0);
  217. }
  218. } catch (Exception ignored) {
  219. }
  220. return map;
  221. }
  222. private Map<String, Integer> getAvailableStockMap() {
  223. Map<String, Integer> map = new HashMap<>();
  224. try {
  225. Map<String, Integer> inwardMap = new HashMap<>();
  226. 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";
  227. List<Map<String, Object>> inList = jdbcTemplate.queryForList(inSql);
  228. for (Map<String, Object> row : inList) {
  229. String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : "";
  230. String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : "";
  231. Integer q = parseIntegerSafely(row.get("total_in"));
  232. inwardMap.put(pid + "_" + tid, q != null ? q : 0);
  233. }
  234. Map<String, Integer> outwardMap = new HashMap<>();
  235. 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";
  236. List<Map<String, Object>> outList = jdbcTemplate.queryForList(outSql);
  237. for (Map<String, Object> row : outList) {
  238. String pid = row.get("pid") != null ? String.valueOf(row.get("pid")).trim() : "";
  239. String tid = row.get("tid") != null ? String.valueOf(row.get("tid")).trim() : "";
  240. Integer q = parseIntegerSafely(row.get("total_out"));
  241. outwardMap.put(pid + "_" + tid, q != null ? q : 0);
  242. }
  243. for (Map.Entry<String, Integer> entry : inwardMap.entrySet()) {
  244. int inQ = entry.getValue();
  245. int outQ = outwardMap.getOrDefault(entry.getKey(), 0);
  246. map.put(entry.getKey(), Math.max(0, inQ - outQ));
  247. }
  248. } catch (Exception ignored) {
  249. }
  250. return map;
  251. }
  252. // ================ Adding department & toners & printers ================
  253. public boolean savenewdepartment(String department) {
  254. if (department == null || department.trim().isEmpty())
  255. return false;
  256. String cleanDept = department.trim();
  257. try {
  258. String sql = "INSERT INTO toner_department_list (dept_name, is_active, is_delete) VALUES (?, 1, 0)";
  259. jdbcTemplate.update(sql, cleanDept);
  260. return true;
  261. } catch (Exception e) {
  262. try {
  263. String sql2 = "INSERT INTO toner_department_list (department_name, is_active, is_delete) VALUES (?, 1, 0)";
  264. jdbcTemplate.update(sql2, cleanDept);
  265. return true;
  266. } catch (Exception ex) {
  267. try {
  268. String sql3 = "INSERT INTO toner_department_list (dept_name) VALUES (?)";
  269. jdbcTemplate.update(sql3, cleanDept);
  270. return true;
  271. } catch (Exception ex2) {
  272. ex2.printStackTrace();
  273. return false;
  274. }
  275. }
  276. }
  277. }
  278. public boolean savetonermodel(int pid, String modelname, String partcode) {
  279. if (pid <= 0 || modelname == null || modelname.trim().isEmpty())
  280. return false;
  281. String cleanModel = modelname.trim();
  282. String cleanPart = (partcode != null && !partcode.trim().isEmpty()) ? partcode.trim() : null;
  283. try {
  284. String sql = "INSERT INTO toner_model_list (pid, model_name, part_code, is_active, is_delete) VALUES (?, ?, ?, 1, 0)";
  285. jdbcTemplate.update(sql, pid, cleanModel, cleanPart);
  286. return true;
  287. } catch (Exception e) {
  288. try {
  289. String sql2 = "INSERT INTO toner_model_list (pid, model_name, part_code) VALUES (?, ?, ?)";
  290. jdbcTemplate.update(sql2, pid, cleanModel, cleanPart);
  291. return true;
  292. } catch (Exception ex) {
  293. ex.printStackTrace();
  294. return false;
  295. }
  296. }
  297. }
  298. public boolean saveprintermodel(String printermodel) {
  299. if (printermodel == null || printermodel.trim().isEmpty())
  300. return false;
  301. String cleanPrinter = printermodel.trim();
  302. try {
  303. String sql = "INSERT INTO toner_printer_model_list (printer_name, is_active, is_delete) VALUES (?, 1, 0)";
  304. jdbcTemplate.update(sql, cleanPrinter);
  305. return true;
  306. } catch (Exception e) {
  307. try {
  308. String sql2 = "INSERT INTO toner_printer_model_list (printer_name) VALUES (?)";
  309. jdbcTemplate.update(sql2, cleanPrinter);
  310. return true;
  311. } catch (Exception ex) {
  312. ex.printStackTrace();
  313. return false;
  314. }
  315. }
  316. }
  317. public boolean updatePrinterModel(int id, String printermodel) {
  318. if (id <= 0 || printermodel == null || printermodel.trim().isEmpty())
  319. return false;
  320. String cleanPrinter = printermodel.trim();
  321. try {
  322. String sql = "UPDATE toner_printer_model_list SET printer_name = ? WHERE id = ?";
  323. return jdbcTemplate.update(sql, cleanPrinter, id) > 0;
  324. } catch (Exception e) {
  325. e.printStackTrace();
  326. return false;
  327. }
  328. }
  329. public boolean updateTonerModel(int id, int pid, String modelname, String partcode) {
  330. if (id <= 0 || pid <= 0 || modelname == null || modelname.trim().isEmpty())
  331. return false;
  332. String cleanModel = modelname.trim();
  333. String cleanPart = (partcode != null && !partcode.trim().isEmpty()) ? partcode.trim() : null;
  334. try {
  335. String sql = "UPDATE toner_model_list SET pid = ?, model_name = ?, part_code = ? WHERE id = ?";
  336. return jdbcTemplate.update(sql, pid, cleanModel, cleanPart, id) > 0;
  337. } catch (Exception e) {
  338. e.printStackTrace();
  339. return false;
  340. }
  341. }
  342. public boolean updateDepartment(int id, String department) {
  343. if (id <= 0 || department == null || department.trim().isEmpty())
  344. return false;
  345. String cleanDept = department.trim();
  346. try {
  347. String sql = "UPDATE toner_department_list SET dept_name = ? WHERE id = ?";
  348. return jdbcTemplate.update(sql, cleanDept, id) > 0;
  349. } catch (Exception e) {
  350. try {
  351. String sql2 = "UPDATE toner_department_list SET department_name = ? WHERE id = ?";
  352. return jdbcTemplate.update(sql2, cleanDept, id) > 0;
  353. } catch (Exception ex) {
  354. ex.printStackTrace();
  355. return false;
  356. }
  357. }
  358. }
  359. public boolean deletePrinterModel(int id) {
  360. if (id <= 0)
  361. return false;
  362. try {
  363. String sql = "UPDATE toner_printer_model_list SET is_active = 0, is_delete = 1 WHERE id = ?";
  364. return jdbcTemplate.update(sql, id) > 0;
  365. } catch (Exception e) {
  366. e.printStackTrace();
  367. return false;
  368. }
  369. }
  370. public boolean restorePrinterModel(int id) {
  371. if (id <= 0)
  372. return false;
  373. try {
  374. String sql = "UPDATE toner_printer_model_list SET is_active = 1, is_delete = 0 WHERE id = ?";
  375. return jdbcTemplate.update(sql, id) > 0;
  376. } catch (Exception e) {
  377. e.printStackTrace();
  378. return false;
  379. }
  380. }
  381. public boolean deleteTonerModel(int id) {
  382. if (id <= 0)
  383. return false;
  384. try {
  385. String sql = "UPDATE toner_model_list SET is_active = 0, is_delete = 1 WHERE id = ?";
  386. return jdbcTemplate.update(sql, id) > 0;
  387. } catch (Exception e) {
  388. e.printStackTrace();
  389. return false;
  390. }
  391. }
  392. public boolean restoreTonerModel(int id) {
  393. if (id <= 0)
  394. return false;
  395. try {
  396. String sql = "UPDATE toner_model_list SET is_active = 1, is_delete = 0 WHERE id = ?";
  397. return jdbcTemplate.update(sql, id) > 0;
  398. } catch (Exception e) {
  399. e.printStackTrace();
  400. return false;
  401. }
  402. }
  403. public boolean deleteDepartment(int id) {
  404. if (id <= 0)
  405. return false;
  406. try {
  407. String sql = "UPDATE toner_department_list SET is_active = 0, is_delete = 1 WHERE id = ?";
  408. return jdbcTemplate.update(sql, id) > 0;
  409. } catch (Exception e) {
  410. e.printStackTrace();
  411. return false;
  412. }
  413. }
  414. public boolean restoreDepartment(int id) {
  415. if (id <= 0)
  416. return false;
  417. try {
  418. String sql = "UPDATE toner_department_list SET is_active = 1, is_delete = 0 WHERE id = ?";
  419. return jdbcTemplate.update(sql, id) > 0;
  420. } catch (Exception e) {
  421. e.printStackTrace();
  422. return false;
  423. }
  424. }
  425. public List<Map<String, Object>> getMasterPrinters(String status) {
  426. try {
  427. String sql;
  428. if ("deleted".equalsIgnoreCase(status)) {
  429. 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";
  430. } else if ("all".equalsIgnoreCase(status)) {
  431. sql = "SELECT id, printer_name, is_active, is_delete FROM toner_printer_model_list ORDER BY printer_name ASC";
  432. } else {
  433. 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";
  434. }
  435. return jdbcTemplate.queryForList(sql);
  436. } catch (Exception e) {
  437. e.printStackTrace();
  438. return new ArrayList<>();
  439. }
  440. }
  441. public List<Map<String, Object>> getMasterToners(String status) {
  442. try {
  443. String sql;
  444. if ("deleted".equalsIgnoreCase(status)) {
  445. 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 "
  446. +
  447. "LEFT JOIN toner_printer_model_list p ON t.pid = p.id " +
  448. "WHERE (t.is_delete = 1 OR t.is_active = 0) ORDER BY t.id DESC";
  449. } else if ("all".equalsIgnoreCase(status)) {
  450. 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 "
  451. +
  452. "LEFT JOIN toner_printer_model_list p ON t.pid = p.id ORDER BY p.printer_name ASC, t.model_name ASC";
  453. } else {
  454. 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 "
  455. +
  456. "LEFT JOIN toner_printer_model_list p ON t.pid = p.id " +
  457. "WHERE (t.is_active IS NULL OR t.is_active = 1) AND (t.is_delete IS NULL OR t.is_delete = 0) " +
  458. "ORDER BY p.printer_name ASC, t.model_name ASC";
  459. }
  460. return jdbcTemplate.queryForList(sql);
  461. } catch (Exception e) {
  462. e.printStackTrace();
  463. return new ArrayList<>();
  464. }
  465. }
  466. public List<Map<String, Object>> getMasterDepartments(String status) {
  467. try {
  468. String sql;
  469. if ("deleted".equalsIgnoreCase(status)) {
  470. 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";
  471. } else if ("all".equalsIgnoreCase(status)) {
  472. sql = "SELECT id, dept_name, is_active, is_delete FROM toner_department_list ORDER BY dept_name ASC";
  473. } else {
  474. 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";
  475. }
  476. return jdbcTemplate.queryForList(sql);
  477. } catch (Exception e) {
  478. try {
  479. String fallbackSql;
  480. if ("deleted".equalsIgnoreCase(status)) {
  481. 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";
  482. } else if ("all".equalsIgnoreCase(status)) {
  483. fallbackSql = "SELECT id, department_name AS dept_name, is_active, is_delete FROM toner_department_list ORDER BY department_name ASC";
  484. } else {
  485. 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";
  486. }
  487. return jdbcTemplate.queryForList(fallbackSql);
  488. } catch (Exception ex) {
  489. ex.printStackTrace();
  490. return new ArrayList<>();
  491. }
  492. }
  493. }
  494. public List<Map<String, Object>> getAllActiveToners() {
  495. return getMasterToners("active");
  496. }
  497. // ================= PRINTERS & TONERS =================
  498. public List<Map<String, Object>> getActivePrinters() {
  499. String sql = "SELECT id, printer_name FROM toner_printer_model_list WHERE is_active = 1 AND is_delete = 0";
  500. try {
  501. return jdbcTemplate.queryForList(sql);
  502. } catch (Exception e) {
  503. return new ArrayList<>();
  504. }
  505. }
  506. public List<Map<String, Object>> getActiveTonersByPrinter(int pid) {
  507. try {
  508. 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)";
  509. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, pid);
  510. Map<String, Integer> availMap = getAvailableStockMap();
  511. List<Map<String, Object>> result = new ArrayList<>();
  512. for (Map<String, Object> map : list) {
  513. Map<String, Object> row = new HashMap<>(map);
  514. String tidStr = String.valueOf(map.get("id")).trim();
  515. String pidStr = String.valueOf(map.get("pid")).trim();
  516. row.put("available_stock", availMap.getOrDefault(pidStr + "_" + tidStr, 0));
  517. result.add(row);
  518. }
  519. return result;
  520. } catch (Exception e) {
  521. return new ArrayList<>();
  522. }
  523. }
  524. public String getTonerModelName(int tid) {
  525. String sql = "SELECT model_name FROM toner_model_list WHERE id = ?";
  526. try {
  527. return jdbcTemplate.queryForObject(sql, String.class, tid);
  528. } catch (Exception e) {
  529. return "UNKNOWN";
  530. }
  531. }
  532. public int getTonerAvailableStock(int tid) {
  533. try {
  534. String sql = "SELECT pid FROM toner_model_list WHERE id = ?";
  535. Integer pid = jdbcTemplate.queryForObject(sql, Integer.class, tid);
  536. if (pid == null)
  537. return 0;
  538. return getAvailableStockForModel(String.valueOf(pid), String.valueOf(tid));
  539. } catch (Exception e) {
  540. return 0;
  541. }
  542. }
  543. public int getAvailableStockForModel(String pid, String tid) {
  544. 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)";
  545. 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)";
  546. try {
  547. int inVal = jdbcTemplate.queryForObject(sqlInward, Integer.class, pid, tid);
  548. int outVal = jdbcTemplate.queryForObject(sqlOutward, Integer.class, pid, tid);
  549. return Math.max(0, inVal - outVal);
  550. } catch (Exception e) {
  551. return 0;
  552. }
  553. }
  554. // ================= INWARD STOCK REGISTER =================
  555. @Transactional
  556. public boolean saveInwardRegister(String refNo, String companyName, List<Map<String, Object>> items,
  557. String dcUpload, String dcNo, String dcDate, String username) {
  558. String sql = "INSERT INTO toner_stock_register_details " +
  559. "(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) "
  560. +
  561. "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, ?)";
  562. Timestamp now = new Timestamp(System.currentTimeMillis());
  563. String finalDcNo = (dcNo != null && !dcNo.trim().isEmpty()) ? dcNo.trim() : null;
  564. String finalDcDate = (dcDate != null && !dcDate.trim().isEmpty()) ? dcDate.trim() : null;
  565. try {
  566. for (Map<String, Object> item : items) {
  567. Integer pidVal = parseIntegerSafely(item.get("pid"));
  568. Integer tidVal = parseIntegerSafely(item.get("tid"));
  569. if (pidVal == null || tidVal == null) {
  570. continue;
  571. }
  572. int pid = pidVal;
  573. int tid = tidVal;
  574. Integer qtyVal = parseIntegerSafely(item.get("qty"));
  575. if (qtyVal == null || qtyVal <= 0)
  576. continue;
  577. Integer requestId = parseIntegerSafely(item.get("requestId"));
  578. jdbcTemplate.update(sql, refNo, companyName, String.valueOf(pid), String.valueOf(tid),
  579. String.valueOf(qtyVal), dcUpload, finalDcNo, finalDcDate, now, now, username, requestId);
  580. }
  581. return true;
  582. } catch (Exception e) {
  583. throw new RuntimeException("Rollback saveInwardRegister due to: " + e.getMessage());
  584. }
  585. }
  586. @Transactional
  587. public boolean saveInwardRegister(String refNo, String companyName, List<Map<String, Object>> items,
  588. String dcUpload, String dcDate, String username) {
  589. return saveInwardRegister(refNo, companyName, items, dcUpload, null, dcDate, username);
  590. }
  591. @Transactional
  592. public boolean saveInwardRegister(String refNo, String companyName, List<Map<String, Object>> items,
  593. String dcUpload, String username) {
  594. return saveInwardRegister(refNo, companyName, items, dcUpload, null, null, username);
  595. }
  596. @Transactional
  597. public boolean updateInwardDc(List<Integer> ids, String dcNo, String dcDate, String newDcUpload, String updatedBy) {
  598. if (ids == null || ids.isEmpty()) {
  599. return false;
  600. }
  601. Timestamp now = new Timestamp(System.currentTimeMillis());
  602. String inSql = ids.stream().map(i -> "?").collect(java.util.stream.Collectors.joining(","));
  603. String finalDcNo = (dcNo != null && !dcNo.trim().isEmpty()) ? dcNo.trim() : null;
  604. String finalDcDate = (dcDate != null && !dcDate.trim().isEmpty()) ? dcDate.trim() : null;
  605. if (newDcUpload != null && !newDcUpload.trim().isEmpty()) {
  606. String sql = "UPDATE toner_stock_register_details SET dc_no = ?, dc_date = ?, dc_upload = ?, updated_date = ?, updated_by = ? WHERE id IN (" + inSql + ")";
  607. List<Object> params = new ArrayList<>();
  608. params.add(finalDcNo);
  609. params.add(finalDcDate);
  610. params.add(newDcUpload.trim());
  611. params.add(now);
  612. params.add(updatedBy);
  613. params.addAll(ids);
  614. jdbcTemplate.update(sql, params.toArray());
  615. } else {
  616. String sql = "UPDATE toner_stock_register_details SET dc_no = ?, dc_date = ?, updated_date = ?, updated_by = ? WHERE id IN (" + inSql + ")";
  617. List<Object> params = new ArrayList<>();
  618. params.add(finalDcNo);
  619. params.add(finalDcDate);
  620. params.add(now);
  621. params.add(updatedBy);
  622. params.addAll(ids);
  623. jdbcTemplate.update(sql, params.toArray());
  624. }
  625. return true;
  626. }
  627. @Transactional
  628. public boolean deleteInwardDc(List<Integer> ids, String updatedBy) {
  629. if (ids == null || ids.isEmpty()) {
  630. return false;
  631. }
  632. Timestamp now = new Timestamp(System.currentTimeMillis());
  633. String inSql = ids.stream().map(i -> "?").collect(java.util.stream.Collectors.joining(","));
  634. String sql = "UPDATE toner_stock_register_details SET is_active = 0, is_delete = 1, updated_date = ?, updated_by = ? WHERE id IN (" + inSql + ")";
  635. List<Object> params = new ArrayList<>();
  636. params.add(now);
  637. params.add(updatedBy);
  638. params.addAll(ids);
  639. jdbcTemplate.update(sql, params.toArray());
  640. return true;
  641. }
  642. public List<Map<String, Object>> getInwardHistory() {
  643. try {
  644. 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";
  645. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  646. if (list == null || list.isEmpty()) {
  647. return new ArrayList<>();
  648. }
  649. Map<String, String> printerMap = getPrinterMap();
  650. Map<String, String> tonerMap = getTonerMap();
  651. Map<String, String> partCodeMap = getTonerPartCodeMap();
  652. Map<String, String> userMap = getUserMap();
  653. Map<String, String> vendorMap = getVendorMap();
  654. Map<String, String> fileNumberMap = getWorkorderFileNumberMap();
  655. Map<String, Integer> woQtyMap = getWorkorderRegisteredQtyMap();
  656. List<Map<String, Object>> result = new ArrayList<>();
  657. for (Map<String, Object> raw : list) {
  658. String refNo = raw.get("ref_no") != null ? String.valueOf(raw.get("ref_no")).trim() : "";
  659. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  660. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  661. Integer qtyIn = parseIntegerSafely(raw.get("qty_registered"));
  662. int qty = qtyIn != null ? qtyIn : 0;
  663. String dc = raw.get("dc_upload") != null ? String.valueOf(raw.get("dc_upload")).trim() : "";
  664. String dcNo = raw.get("dc_no") != null ? String.valueOf(raw.get("dc_no")).trim() : "";
  665. String dcDate = raw.get("dc_date") != null ? String.valueOf(raw.get("dc_date")).trim() : "";
  666. String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : "";
  667. String companyName = raw.get("company_name") != null ? String.valueOf(raw.get("company_name")).trim()
  668. : "";
  669. String tonerModelName = tonerMap.getOrDefault(tid, tid);
  670. String partCode = partCodeMap.get(tid);
  671. if (partCode == null || partCode.isEmpty()) {
  672. partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : "");
  673. }
  674. Map<String, Object> row = new HashMap<>(raw);
  675. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  676. row.put("model_name", tonerModelName);
  677. row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-");
  678. row.put("order_by", userMap.getOrDefault(updatedBy, updatedBy));
  679. row.put("file_number", fileNumberMap.getOrDefault(refNo, ""));
  680. row.put("vendor_name", vendorMap.getOrDefault(companyName, companyName));
  681. row.put("qty_registered", qty);
  682. row.put("inward_qty", qty);
  683. row.put("qty_workorder_registered", woQtyMap.getOrDefault(refNo + "_" + pid + "_" + tid, 0));
  684. row.put("qty_workorder_requested", 0);
  685. row.put("dc_upload", dc);
  686. row.put("dc_uploads", dc);
  687. row.put("dc_no", dcNo);
  688. row.put("dc_date", dcDate);
  689. result.add(row);
  690. }
  691. return result;
  692. } catch (Exception e) {
  693. return new ArrayList<>();
  694. }
  695. }
  696. // ================= USER REQUESTS =================
  697. public int getMaxRequestId() {
  698. String sql = "SELECT COALESCE(MAX(id), 0) FROM toner_department_requested_details";
  699. try {
  700. return jdbcTemplate.queryForObject(sql, Integer.class);
  701. } catch (Exception e) {
  702. return 0;
  703. }
  704. }
  705. @Transactional
  706. public boolean saveUserRequest(String itCellRefNo, String deptId, String zoneId, List<Map<String, Object>> items,
  707. String userRequestUpload, String requestDate, String username) {
  708. Timestamp now = new Timestamp(System.currentTimeMillis());
  709. String finalRequestDate = (requestDate != null && !requestDate.trim().isEmpty()) ? requestDate.trim() : null;
  710. String sql = "INSERT INTO toner_department_requested_details " +
  711. "(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) "
  712. +
  713. "VALUES (?, ?, ?, ?, ?, ?, ?, '0', ?, ?, ?, ?, ?, 1, 0)";
  714. try {
  715. int baseMaxId = getMaxRequestId();
  716. int year = Calendar.getInstance().get(Calendar.YEAR);
  717. int seqCounter = 0;
  718. for (Map<String, Object> item : items) {
  719. Integer pidVal = parseIntegerSafely(item.get("pid"));
  720. Integer tidVal = parseIntegerSafely(item.get("tid"));
  721. if (pidVal == null || tidVal == null) {
  722. continue;
  723. }
  724. int pid = pidVal;
  725. int tid = tidVal;
  726. Integer qtyVal = parseIntegerSafely(item.get("qty"));
  727. int qtyRequested = (qtyVal != null && qtyVal > 0) ? qtyVal : 1;
  728. String tonerModel = getTonerModelName(tid);
  729. String cleanModel = (tonerModel != null && !tonerModel.trim().isEmpty())
  730. ? tonerModel.trim().replaceAll("\\s+", "-").replaceAll("[^a-zA-Z0-9-]", "")
  731. : "REQ";
  732. if (cleanModel.isEmpty()) {
  733. cleanModel = "REQ";
  734. }
  735. seqCounter++;
  736. int seqNum = 1000 + baseMaxId + seqCounter;
  737. String reqNo = String.format("%s-%d-%04d", cleanModel, year, seqNum);
  738. jdbcTemplate.update(sql, reqNo, itCellRefNo, deptId, zoneId, String.valueOf(pid), String.valueOf(tid),
  739. String.valueOf(qtyRequested), userRequestUpload, finalRequestDate, now, now, username);
  740. }
  741. return true;
  742. } catch (Exception e) {
  743. throw new RuntimeException("Rollback saveUserRequest due to: " + e.getMessage());
  744. }
  745. }
  746. @Transactional
  747. public boolean saveUserRequest(String itCellRefNo, String deptId, String zoneId, List<Map<String, Object>> items,
  748. String userRequestUpload, String username) {
  749. return saveUserRequest(itCellRefNo, deptId, zoneId, items, userRequestUpload, null, username);
  750. }
  751. @Transactional
  752. public boolean updateUserRequest(int id, String itcellRefNo, String deptId, String zoneId,
  753. int pid, int tid, int qtyRequested, String newUploadPath, String requestDate, String username) {
  754. Timestamp now = new Timestamp(System.currentTimeMillis());
  755. try {
  756. String safeZoneId = (zoneId != null && !zoneId.trim().isEmpty() && !"null".equalsIgnoreCase(zoneId))
  757. ? zoneId.trim()
  758. : null;
  759. String finalRequestDate = (requestDate != null && !requestDate.trim().isEmpty()) ? requestDate.trim()
  760. : null;
  761. if (newUploadPath != null && !newUploadPath.trim().isEmpty()) {
  762. String sql = "UPDATE toner_department_requested_details SET " +
  763. "itcell_ref_no = ?, dept_id = ?, zone_id = ?, pid = ?, tid = ?, " +
  764. "qty_requested = ?, user_request_upload = ?, request_date = ?, updated_date = ?, updated_by = ? "
  765. +
  766. "WHERE id = ?";
  767. int rows = jdbcTemplate.update(sql, itcellRefNo.trim(), deptId.trim(), safeZoneId,
  768. String.valueOf(pid), String.valueOf(tid), String.valueOf(qtyRequested),
  769. newUploadPath, finalRequestDate, now, username, id);
  770. return rows > 0;
  771. } else {
  772. String sql = "UPDATE toner_department_requested_details SET " +
  773. "itcell_ref_no = ?, dept_id = ?, zone_id = ?, pid = ?, tid = ?, " +
  774. "qty_requested = ?, request_date = ?, updated_date = ?, updated_by = ? " +
  775. "WHERE id = ?";
  776. int rows = jdbcTemplate.update(sql, itcellRefNo.trim(), deptId.trim(), safeZoneId,
  777. String.valueOf(pid), String.valueOf(tid), String.valueOf(qtyRequested),
  778. finalRequestDate, now, username, id);
  779. return rows > 0;
  780. }
  781. } catch (Exception e) {
  782. e.printStackTrace();
  783. return false;
  784. }
  785. }
  786. @Transactional
  787. public boolean updateUserRequest(int id, String itcellRefNo, String deptId, String zoneId,
  788. int pid, int tid, int qtyRequested, String newUploadPath, String username) {
  789. return updateUserRequest(id, itcellRefNo, deptId, zoneId, pid, tid, qtyRequested, newUploadPath, null,
  790. username);
  791. }
  792. @Transactional
  793. public boolean updateUserRequestGroup(String itcellRefNo, String newItcellRefNo, String deptId, String zoneId,
  794. String requestDate, String newUploadPath, List<Map<String, Object>> items, String username) {
  795. Timestamp now = new Timestamp(System.currentTimeMillis());
  796. try {
  797. String safeZoneId = (zoneId != null && !zoneId.trim().isEmpty() && !"null".equalsIgnoreCase(zoneId))
  798. ? zoneId.trim()
  799. : null;
  800. String finalRequestDate = (requestDate != null && !requestDate.trim().isEmpty()) ? requestDate.trim()
  801. : null;
  802. String finalItcell = (newItcellRefNo != null && !newItcellRefNo.trim().isEmpty())
  803. ? newItcellRefNo.trim()
  804. : itcellRefNo.trim();
  805. if (newUploadPath != null && !newUploadPath.trim().isEmpty()) {
  806. String sql = "UPDATE toner_department_requested_details SET " +
  807. "itcell_ref_no = ?, dept_id = ?, zone_id = ?, request_date = ?, user_request_upload = ?, updated_date = ?, updated_by = ? "
  808. +
  809. "WHERE TRIM(itcell_ref_no) = TRIM(?)";
  810. jdbcTemplate.update(sql, finalItcell, deptId.trim(), safeZoneId, finalRequestDate, newUploadPath, now,
  811. username, itcellRefNo.trim());
  812. } else {
  813. String sql = "UPDATE toner_department_requested_details SET " +
  814. "itcell_ref_no = ?, dept_id = ?, zone_id = ?, request_date = ?, updated_date = ?, updated_by = ? "
  815. +
  816. "WHERE TRIM(itcell_ref_no) = TRIM(?)";
  817. jdbcTemplate.update(sql, finalItcell, deptId.trim(), safeZoneId, finalRequestDate, now, username,
  818. itcellRefNo.trim());
  819. }
  820. // Update individual item quantities if provided
  821. if (items != null && !items.isEmpty()) {
  822. String updateItemSql = "UPDATE toner_department_requested_details SET qty_requested = ?, updated_date = ?, updated_by = ? WHERE id = ?";
  823. for (Map<String, Object> item : items) {
  824. Integer id = parseIntegerSafely(item.get("id"));
  825. Integer qty = parseIntegerSafely(item.get("qty"));
  826. if (id != null && qty != null && qty > 0) {
  827. jdbcTemplate.update(updateItemSql, String.valueOf(qty), now, username, id);
  828. }
  829. }
  830. }
  831. return true;
  832. } catch (Exception e) {
  833. e.printStackTrace();
  834. return false;
  835. }
  836. }
  837. public List<Map<String, Object>> getAllUserRequests() {
  838. try {
  839. 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";
  840. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  841. if (list == null || list.isEmpty()) {
  842. return new ArrayList<>();
  843. }
  844. Map<String, String> printerMap = getPrinterMap();
  845. Map<String, String> tonerMap = getTonerMap();
  846. Map<String, String> partCodeMap = getTonerPartCodeMap();
  847. Map<String, String> deptMap = getDepartmentMap();
  848. Map<String, String> zoneMap = getZoneMap();
  849. Map<String, String> userMap = getUserMap();
  850. List<Map<String, Object>> result = new ArrayList<>();
  851. for (Map<String, Object> raw : list) {
  852. Map<String, Object> row = new HashMap<>(raw);
  853. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  854. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  855. String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : "";
  856. String zoneId = raw.get("zone_id") != null ? String.valueOf(raw.get("zone_id")).trim() : "";
  857. String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : "";
  858. String requestDate = raw.get("request_date") != null ? String.valueOf(raw.get("request_date")).trim()
  859. : "";
  860. String tonerModelName = tonerMap.getOrDefault(tid, tid);
  861. String partCode = partCodeMap.get(tid);
  862. if (partCode == null || partCode.isEmpty()) {
  863. partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : "");
  864. }
  865. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  866. row.put("model_name", tonerModelName);
  867. row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-");
  868. row.put("dept_name", deptMap.getOrDefault(deptId, deptId));
  869. row.put("zone_name", zoneMap.getOrDefault(zoneId, zoneId));
  870. row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy));
  871. row.put("request_date", requestDate);
  872. result.add(row);
  873. }
  874. // System.out.println("result:" + result);
  875. return result;
  876. } catch (Exception e) {
  877. return new ArrayList<>();
  878. }
  879. }
  880. public Map<String, Object> getUserRequestById(int id) {
  881. try {
  882. 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)";
  883. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, id);
  884. if (list == null || list.isEmpty()) {
  885. return null;
  886. }
  887. Map<String, Object> raw = list.get(0);
  888. Map<String, Object> row = new HashMap<>(raw);
  889. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  890. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  891. String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : "";
  892. row.put("printer_name", getPrinterMap().getOrDefault(pid, ""));
  893. row.put("model_name", getTonerMap().getOrDefault(tid, ""));
  894. row.put("dept_name", getDepartmentMap().getOrDefault(deptId, deptId));
  895. return row;
  896. } catch (Exception e) {
  897. return null;
  898. }
  899. }
  900. public List<Map<String, Object>> getPendingRequests() {
  901. try {
  902. 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";
  903. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  904. if (list == null || list.isEmpty()) {
  905. return new ArrayList<>();
  906. }
  907. Map<String, String> printerMap = getPrinterMap();
  908. Map<String, String> tonerMap = getTonerMap();
  909. Map<String, String> partCodeMap = getTonerPartCodeMap();
  910. Map<String, String> deptMap = getDepartmentMap();
  911. Map<String, String> zoneMap = getZoneMap();
  912. Map<String, Integer> availStockMap = getAvailableStockMap();
  913. Map<String, Integer> totalWoMap = getTotalWorkorderRegisteredMap();
  914. List<Map<String, Object>> result = new ArrayList<>();
  915. for (Map<String, Object> raw : list) {
  916. Integer reqQty = parseIntegerSafely(raw.get("qty_requested"));
  917. Integer delQty = parseIntegerSafely(raw.get("qty_delivered"));
  918. int requested = reqQty != null ? reqQty : 0;
  919. int delivered = delQty != null ? delQty : 0;
  920. if (delivered >= requested) {
  921. continue; // Already fulfilled
  922. }
  923. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  924. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  925. int availStock = availStockMap.getOrDefault(pid + "_" + tid, 0);
  926. int woQty = totalWoMap.getOrDefault(pid + "_" + tid, totalWoMap.getOrDefault(tid, 0));
  927. Map<String, Object> row = new HashMap<>(raw);
  928. String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : "";
  929. String zoneId = raw.get("zone_id") != null ? String.valueOf(raw.get("zone_id")).trim() : "";
  930. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  931. row.put("model_name", tonerMap.getOrDefault(tid, tid));
  932. row.put("part_code", partCodeMap.getOrDefault(tid, "N/A"));
  933. row.put("dept_name", deptMap.getOrDefault(deptId, deptId));
  934. row.put("zone_name", zoneMap.getOrDefault(zoneId, zoneId));
  935. row.put("available_stock", availStock);
  936. row.put("qty_workorder_registered", woQty);
  937. row.put("workorder_qty", woQty);
  938. result.add(row);
  939. }
  940. return result;
  941. } catch (Exception e) {
  942. return new ArrayList<>();
  943. }
  944. }
  945. // ================= OUTWARD REGISTER =================
  946. @Transactional
  947. public boolean saveOutwardRegisterBulk(List<Map<String, Object>> items, String outwardDate, String username) {
  948. Timestamp now = new Timestamp(System.currentTimeMillis());
  949. String finalOutDate = (outwardDate != null && !outwardDate.trim().isEmpty()) ? outwardDate.trim() : null;
  950. try {
  951. for (Map<String, Object> item : items) {
  952. Integer idVal = parseIntegerSafely(item.get("id"));
  953. Integer qtyVal = parseIntegerSafely(item.get("qtyIssued"));
  954. if (idVal == null)
  955. continue;
  956. int id = idVal;
  957. int qtyIssued = (qtyVal != null) ? qtyVal : 0;
  958. if (qtyIssued <= 0)
  959. continue;
  960. String sql = "UPDATE toner_department_requested_details SET " +
  961. "qty_delivered = CAST(COALESCE(qty_delivered, 0) AS SIGNED) + ?, " +
  962. "outward_date = COALESCE(?, outward_date), " +
  963. "updated_date = ?, updated_by = ? " +
  964. "WHERE id = ?";
  965. jdbcTemplate.update(sql, qtyIssued, finalOutDate, now, username, id);
  966. }
  967. return true;
  968. } catch (Exception e) {
  969. throw new RuntimeException("Rollback saveOutwardRegisterBulk due to: " + e.getMessage());
  970. }
  971. }
  972. @Transactional
  973. public boolean updateOutwardDeliveryFiles(List<Integer> ids, String finalDeliveredUpload, String userPhotoUpload,
  974. String username) {
  975. Timestamp now = new Timestamp(System.currentTimeMillis());
  976. try {
  977. for (int id : ids) {
  978. String sql = "UPDATE toner_department_requested_details SET " +
  979. "final_delivered_upload = CASE WHEN ? IS NULL OR ? = '' THEN final_delivered_upload " +
  980. " WHEN final_delivered_upload IS NULL OR final_delivered_upload = '' THEN ? " +
  981. " ELSE CONCAT(final_delivered_upload, ',', ?) END, " +
  982. "receiver_photo = CASE WHEN ? IS NULL OR ? = '' THEN receiver_photo " +
  983. " WHEN receiver_photo IS NULL OR receiver_photo = '' THEN ? " +
  984. " ELSE CONCAT(receiver_photo, ',', ?) END, " +
  985. "updated_date = ?, updated_by = ? " +
  986. "WHERE id = ?";
  987. jdbcTemplate.update(sql,
  988. finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload,
  989. userPhotoUpload, userPhotoUpload, userPhotoUpload, userPhotoUpload,
  990. now, username, id);
  991. }
  992. return true;
  993. } catch (Exception e) {
  994. throw new RuntimeException("Rollback updateOutwardDeliveryFiles due to: " + e.getMessage());
  995. }
  996. }
  997. public boolean saveOutwardRegister(int id, String qtyIssued, String finalDeliveredUpload, String userPhotoUpload,
  998. String username) {
  999. String sql;
  1000. int rows;
  1001. Timestamp now = new Timestamp(System.currentTimeMillis());
  1002. try {
  1003. if (finalDeliveredUpload != null || userPhotoUpload != null) {
  1004. sql = "UPDATE toner_department_requested_details SET " +
  1005. "final_delivered_upload = CASE WHEN ? IS NULL OR ? = '' THEN final_delivered_upload " +
  1006. " WHEN final_delivered_upload IS NULL OR final_delivered_upload = '' THEN ? " +
  1007. " ELSE CONCAT(final_delivered_upload, ',', ?) END, " +
  1008. "receiver_photo = CASE WHEN ? IS NULL OR ? = '' THEN receiver_photo " +
  1009. " WHEN receiver_photo IS NULL OR receiver_photo = '' THEN ? " +
  1010. " ELSE CONCAT(receiver_photo, ',', ?) END, " +
  1011. "qty_delivered = CASE WHEN qty_delivered IS NULL OR CAST(qty_delivered AS SIGNED) = 0 THEN ? ELSE qty_delivered END, "
  1012. +
  1013. "updated_date = ?, updated_by = ? " +
  1014. "WHERE id = ?";
  1015. rows = jdbcTemplate.update(sql,
  1016. finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload, finalDeliveredUpload,
  1017. userPhotoUpload, userPhotoUpload, userPhotoUpload, userPhotoUpload,
  1018. qtyIssued, now, username, id);
  1019. } else {
  1020. sql = "UPDATE toner_department_requested_details " +
  1021. "SET qty_delivered = CAST(COALESCE(qty_delivered, 0) AS SIGNED) + CAST(? AS SIGNED), " +
  1022. "updated_date = ?, updated_by = ? " +
  1023. "WHERE id = ?";
  1024. rows = jdbcTemplate.update(sql, qtyIssued, now, username, id);
  1025. }
  1026. return rows > 0;
  1027. } catch (Exception e) {
  1028. throw new RuntimeException("Rollback saveOutwardRegister due to: " + e.getMessage());
  1029. }
  1030. }
  1031. public boolean saveOutwardRegister(int id, String qtyIssued, String finalDeliveredUpload, String username) {
  1032. return saveOutwardRegister(id, qtyIssued, finalDeliveredUpload, null, username);
  1033. }
  1034. public List<Map<String, Object>> getOutwardHistory() {
  1035. try {
  1036. 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";
  1037. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  1038. if (list == null || list.isEmpty()) {
  1039. return new ArrayList<>();
  1040. }
  1041. Map<String, String> printerMap = getPrinterMap();
  1042. Map<String, String> tonerMap = getTonerMap();
  1043. Map<String, String> partCodeMap = getTonerPartCodeMap();
  1044. Map<String, String> deptMap = getDepartmentMap();
  1045. Map<String, String> zoneMap = getZoneMap();
  1046. Map<String, String> userMap = getUserMap();
  1047. List<Map<String, Object>> result = new ArrayList<>();
  1048. for (Map<String, Object> raw : list) {
  1049. Map<String, Object> row = new HashMap<>(raw);
  1050. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  1051. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  1052. String deptId = raw.get("dept_id") != null ? String.valueOf(raw.get("dept_id")).trim() : "";
  1053. String zoneId = raw.get("zone_id") != null ? String.valueOf(raw.get("zone_id")).trim() : "";
  1054. String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : "";
  1055. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  1056. row.put("model_name", tonerMap.getOrDefault(tid, tid));
  1057. row.put("part_code", partCodeMap.getOrDefault(tid, "N/A"));
  1058. row.put("dept_name", deptMap.getOrDefault(deptId, deptId));
  1059. row.put("zone_name", zoneMap.getOrDefault(zoneId, zoneId));
  1060. row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy));
  1061. result.add(row);
  1062. }
  1063. return result;
  1064. } catch (Exception e) {
  1065. return new ArrayList<>();
  1066. }
  1067. }
  1068. // ================= DASHBOARD & INVENTORY =================
  1069. public Map<String, Object> getDashboardMetrics() {
  1070. Map<String, Object> metrics = new HashMap<>();
  1071. 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)";
  1072. 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)";
  1073. 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)";
  1074. 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)";
  1075. try {
  1076. int totalRaised = jdbcTemplate.queryForObject(sqlRaised, Integer.class);
  1077. int totalDistributed = jdbcTemplate.queryForObject(sqlDistributed, Integer.class);
  1078. int inwardStock = jdbcTemplate.queryForObject(sqlInward, Integer.class);
  1079. int availableStock = Math.max(0, inwardStock - totalDistributed);
  1080. int workorderRegistered = jdbcTemplate.queryForObject(sqlWorkorderRegistered, Integer.class);
  1081. metrics.put("totalRaised", totalRaised);
  1082. metrics.put("totalDistributed", totalDistributed);
  1083. metrics.put("inwardStock", inwardStock);
  1084. metrics.put("availableStock", availableStock);
  1085. metrics.put("workorderRegistered", workorderRegistered);
  1086. metrics.put("workorderRequested", 0);
  1087. } catch (Exception e) {
  1088. metrics.put("totalRaised", 0);
  1089. metrics.put("totalDistributed", 0);
  1090. metrics.put("inwardStock", 0);
  1091. metrics.put("availableStock", 0);
  1092. metrics.put("workorderRegistered", 0);
  1093. metrics.put("workorderRequested", 0);
  1094. }
  1095. return metrics;
  1096. }
  1097. public List<Map<String, Object>> getInventorySummary() {
  1098. try {
  1099. String sql = "SELECT t.id AS tid, t.pid, t.model_name, p.printer_name FROM toner_model_list t " +
  1100. "LEFT JOIN toner_printer_model_list p ON t.pid = p.id " +
  1101. "WHERE (t.is_active IS NULL OR t.is_active = 1) AND (t.is_delete IS NULL OR t.is_delete = 0) " +
  1102. "ORDER BY p.printer_name, t.model_name";
  1103. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  1104. Map<String, Integer> inwardMap = new HashMap<>();
  1105. try {
  1106. 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";
  1107. for (Map<String, Object> r : jdbcTemplate.queryForList(inSql)) {
  1108. String k = String.valueOf(r.get("pid")).trim() + "_" + String.valueOf(r.get("tid")).trim();
  1109. inwardMap.put(k,
  1110. parseIntegerSafely(r.get("total_in")) != null ? parseIntegerSafely(r.get("total_in")) : 0);
  1111. }
  1112. } catch (Exception ignored) {
  1113. }
  1114. Map<String, Integer> outwardMap = new HashMap<>();
  1115. try {
  1116. 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";
  1117. for (Map<String, Object> r : jdbcTemplate.queryForList(outSql)) {
  1118. String k = String.valueOf(r.get("pid")).trim() + "_" + String.valueOf(r.get("tid")).trim();
  1119. outwardMap.put(k,
  1120. parseIntegerSafely(r.get("total_out")) != null ? parseIntegerSafely(r.get("total_out"))
  1121. : 0);
  1122. }
  1123. } catch (Exception ignored) {
  1124. }
  1125. List<Map<String, Object>> result = new ArrayList<>();
  1126. for (Map<String, Object> map : list) {
  1127. Map<String, Object> row = new HashMap<>(map);
  1128. String k = String.valueOf(map.get("pid")).trim() + "_" + String.valueOf(map.get("tid")).trim();
  1129. int inward = inwardMap.getOrDefault(k, 0);
  1130. int outward = outwardMap.getOrDefault(k, 0);
  1131. row.put("inward_qty", inward);
  1132. row.put("outward_qty", outward);
  1133. row.put("available_qty", Math.max(0, inward - outward));
  1134. result.add(row);
  1135. }
  1136. return result;
  1137. } catch (Exception e) {
  1138. return new ArrayList<>();
  1139. }
  1140. }
  1141. // ================= WORKORDER REGISTRATION & REQUESTS =================
  1142. public boolean saveWorkorder(String refNo, String fileNumber, String vendorName,
  1143. String startDate, String endDate, String dcUpload,
  1144. String totalQty, List<Map<String, Object>> items, String username) {
  1145. Timestamp now = new Timestamp(System.currentTimeMillis());
  1146. String sqlMain = "INSERT INTO toner_workorder_register_details " +
  1147. "(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) "
  1148. +
  1149. "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0)";
  1150. String firstPid = null;
  1151. String firstTid = null;
  1152. if (items != null && !items.isEmpty()) {
  1153. Map<String, Object> firstItem = items.get(0);
  1154. if (firstItem.get("pid") != null)
  1155. firstPid = String.valueOf(firstItem.get("pid"));
  1156. if (firstItem.get("tid") != null)
  1157. firstTid = String.valueOf(firstItem.get("tid"));
  1158. }
  1159. try {
  1160. int mainRows = jdbcTemplate.update(sqlMain,
  1161. refNo, fileNumber, vendorName, startDate, endDate,
  1162. firstPid, firstTid, totalQty, dcUpload, now, now, username);
  1163. if (mainRows <= 0)
  1164. return false;
  1165. String sqlSub = "INSERT INTO toner_workorder_printermodel_qty " +
  1166. "(ref_no, pid, tid, qty_registered, cdate, updated_date, updated_by, is_active, is_delete) " +
  1167. "VALUES (?, ?, ?, ?, ?, ?, ?, 1, 0)";
  1168. for (Map<String, Object> item : items) {
  1169. String pid = String.valueOf(item.get("pid"));
  1170. String tid = String.valueOf(item.get("tid"));
  1171. String qty = String.valueOf(item.get("qty"));
  1172. jdbcTemplate.update(sqlSub, refNo, pid, tid, qty, now, now, username);
  1173. }
  1174. return true;
  1175. } catch (Exception e) {
  1176. throw new RuntimeException("Rollback saveWorkorder due to: " + e.getMessage());
  1177. }
  1178. }
  1179. public List<Map<String, Object>> getActiveWorkorders() {
  1180. 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";
  1181. try {
  1182. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  1183. if (list == null || list.isEmpty())
  1184. return new ArrayList<>();
  1185. Map<String, Map<String, Object>> seen = new HashMap<>();
  1186. List<Map<String, Object>> distinct = new ArrayList<>();
  1187. for (Map<String, Object> row : list) {
  1188. String refNo = row.get("ref_no") != null ? String.valueOf(row.get("ref_no")).trim() : "";
  1189. String fileNo = row.get("file_number") != null ? String.valueOf(row.get("file_number")).trim() : "";
  1190. String key = refNo + "_" + fileNo;
  1191. if (!seen.containsKey(key)) {
  1192. seen.put(key, row);
  1193. distinct.add(row);
  1194. }
  1195. }
  1196. return distinct;
  1197. } catch (Exception e) {
  1198. System.err.println("Error fetching active workorders: " + e.getMessage());
  1199. return new ArrayList<>();
  1200. }
  1201. }
  1202. public List<String> getActiveWorkorderRefNos() {
  1203. 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";
  1204. try {
  1205. return jdbcTemplate.queryForList(sql, String.class);
  1206. } catch (Exception e) {
  1207. return new ArrayList<>();
  1208. }
  1209. }
  1210. public List<Map<String, Object>> getWorkorderRegisteredItems(String refNo) {
  1211. try {
  1212. String resolvedRef = refNo != null ? refNo.trim() : "";
  1213. try {
  1214. 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";
  1215. List<String> refs = jdbcTemplate.queryForList(findSql, String.class, refNo, refNo);
  1216. if (refs != null && !refs.isEmpty() && refs.get(0) != null) {
  1217. resolvedRef = refs.get(0).trim();
  1218. }
  1219. } catch (Exception ignored) {
  1220. }
  1221. 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)";
  1222. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, refNo, resolvedRef);
  1223. if (list == null || list.isEmpty()) {
  1224. return new ArrayList<>();
  1225. }
  1226. Map<String, String> printerMap = getPrinterMap();
  1227. Map<String, String> tonerMap = getTonerMap();
  1228. Map<String, String> partCodeMap = getTonerPartCodeMap();
  1229. Map<String, String> vendorMap = getVendorMap();
  1230. Map<String, String> fileNumberMap = getWorkorderFileNumberMap();
  1231. Map<String, Integer> inStockMap = getInwardStockMap();
  1232. String vendorId = "";
  1233. try {
  1234. String vSql = "SELECT vendor_name FROM toner_workorder_register_details WHERE (TRIM(ref_no) = TRIM(?) OR TRIM(ref_no) = TRIM(?)) LIMIT 1";
  1235. vendorId = jdbcTemplate.queryForObject(vSql, String.class, refNo, resolvedRef);
  1236. } catch (Exception ignored) {
  1237. }
  1238. List<Map<String, Object>> result = new ArrayList<>();
  1239. for (Map<String, Object> raw : list) {
  1240. Map<String, Object> row = new HashMap<>(raw);
  1241. String cleanRef = resolvedRef;
  1242. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  1243. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  1244. String tonerModelName = tonerMap.getOrDefault(tid, tid);
  1245. String partCode = partCodeMap.get(tid);
  1246. if (partCode == null || partCode.isEmpty()) {
  1247. partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : "");
  1248. }
  1249. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  1250. row.put("model_name", tonerModelName);
  1251. row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-");
  1252. row.put("vendor_name", vendorMap.getOrDefault(vendorId, vendorId));
  1253. row.put("vendor_id", vendorId);
  1254. row.put("file_number", fileNumberMap.getOrDefault(cleanRef, ""));
  1255. row.put("qty_inward_received", inStockMap.getOrDefault(cleanRef + "_" + pid + "_" + tid, 0));
  1256. result.add(row);
  1257. }
  1258. return result;
  1259. } catch (Exception e) {
  1260. return new ArrayList<>();
  1261. }
  1262. }
  1263. public List<Map<String, Object>> getWorkorderRegisterHistory() {
  1264. try {
  1265. 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";
  1266. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  1267. if (list == null || list.isEmpty()) {
  1268. return new ArrayList<>();
  1269. }
  1270. Map<String, String> printerMap = getPrinterMap();
  1271. Map<String, String> tonerMap = getTonerMap();
  1272. Map<String, String> partCodeMap = getTonerPartCodeMap();
  1273. Map<String, String> userMap = getUserMap();
  1274. Map<String, String> vendorMap = getVendorMap();
  1275. Map<String, String> fileNumberMap = getWorkorderFileNumberMap();
  1276. Map<String, Map<String, Object>> mainRegMap = new HashMap<>();
  1277. try {
  1278. List<Map<String, Object>> mains = jdbcTemplate.queryForList(
  1279. "SELECT * FROM toner_workorder_register_details WHERE (is_active IS NULL OR is_active = 1) AND (is_delete IS NULL OR is_delete = 0)");
  1280. for (Map<String, Object> m : mains) {
  1281. if (m.get("ref_no") != null) {
  1282. mainRegMap.put(String.valueOf(m.get("ref_no")).trim(), m);
  1283. }
  1284. }
  1285. } catch (Exception ignored) {
  1286. }
  1287. List<Map<String, Object>> result = new ArrayList<>();
  1288. for (Map<String, Object> raw : list) {
  1289. Map<String, Object> row = new HashMap<>(raw);
  1290. String refNo = raw.get("ref_no") != null ? String.valueOf(raw.get("ref_no")).trim() : "";
  1291. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  1292. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  1293. String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : "";
  1294. Map<String, Object> mainRow = mainRegMap.get(refNo);
  1295. String vendorStr = "";
  1296. if (mainRow != null) {
  1297. vendorStr = mainRow.get("vendor_name") != null ? String.valueOf(mainRow.get("vendor_name")).trim()
  1298. : "";
  1299. row.put("file_number", mainRow.get("file_number"));
  1300. row.put("workorder_start_date", mainRow.get("workorder_start_date"));
  1301. row.put("workorder_end_date", mainRow.get("workorder_end_date"));
  1302. row.put("dc_upload", mainRow.get("dc_upload"));
  1303. row.put("wo_cdate", mainRow.get("cdate"));
  1304. } else {
  1305. row.put("file_number", fileNumberMap.getOrDefault(refNo, ""));
  1306. }
  1307. String tonerModelName = tonerMap.getOrDefault(tid, tid);
  1308. String partCode = partCodeMap.get(tid);
  1309. if (partCode == null || partCode.isEmpty()) {
  1310. partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : "");
  1311. }
  1312. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  1313. row.put("model_name", tonerModelName);
  1314. row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-");
  1315. row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy));
  1316. row.put("vendor_name", vendorMap.getOrDefault(vendorStr, vendorStr));
  1317. row.put("total_qty_registered", raw.get("qty_registered"));
  1318. result.add(row);
  1319. }
  1320. return result;
  1321. } catch (Exception e) {
  1322. return new ArrayList<>();
  1323. }
  1324. }
  1325. @Transactional
  1326. public boolean saveWorkorderModelRequest(String refNo, String companyName,
  1327. String pid,
  1328. List<Map<String, Object>> items, String emailCopyUpload, String username) {
  1329. if (items == null || items.isEmpty()) {
  1330. return false;
  1331. }
  1332. int totalQtyRequested = 0;
  1333. for (Map<String, Object> item : items) {
  1334. Integer q = parseIntegerSafely(item.get("qty"));
  1335. if (q != null) {
  1336. totalQtyRequested += q;
  1337. }
  1338. }
  1339. final int finalTotalQty = totalQtyRequested;
  1340. String firstPid = (pid != null && !pid.trim().isEmpty()) ? pid : String.valueOf(items.get(0).get("pid"));
  1341. String firstTid = String.valueOf(items.get(0).get("tid"));
  1342. Timestamp now = new Timestamp(System.currentTimeMillis());
  1343. String sqlMain = "INSERT INTO toner_workorder_model_request_details " +
  1344. "(ref_no, company_name, pid, tid, qty_requested, email_copy_upload, cdate, updated_date, updated_by, is_active, is_delete) "
  1345. +
  1346. "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0)";
  1347. try {
  1348. KeyHolder keyHolder = new GeneratedKeyHolder();
  1349. int mainRows = jdbcTemplate.update(connection -> {
  1350. PreparedStatement ps = connection.prepareStatement(sqlMain, Statement.RETURN_GENERATED_KEYS);
  1351. ps.setString(1, refNo);
  1352. ps.setString(2, companyName);
  1353. ps.setString(3, firstPid);
  1354. ps.setString(4, firstTid);
  1355. ps.setString(5, String.valueOf(finalTotalQty));
  1356. ps.setString(6, emailCopyUpload);
  1357. ps.setTimestamp(7, now);
  1358. ps.setTimestamp(8, now);
  1359. ps.setString(9, username);
  1360. return ps;
  1361. }, keyHolder);
  1362. if (mainRows <= 0)
  1363. return false;
  1364. String sqlSub = "INSERT INTO toner_workorder_model_multiple_request_qty " +
  1365. "(ref_no, pid, tid, qty_registered, cdate, updated_date, updated_by, is_active, is_delete) " +
  1366. "VALUES (?, ?, ?, ?, ?, ?, ?, 1, 0)";
  1367. for (Map<String, Object> item : items) {
  1368. String itemPid = item.get("pid") != null ? String.valueOf(item.get("pid")) : firstPid;
  1369. String tid = String.valueOf(item.get("tid"));
  1370. String qty = String.valueOf(item.get("qty"));
  1371. jdbcTemplate.update(sqlSub, refNo, itemPid, tid, qty, now, now, username);
  1372. }
  1373. return true;
  1374. } catch (Exception e) {
  1375. throw new RuntimeException("Rollback saveWorkorderModelRequest due to: " + e.getMessage());
  1376. }
  1377. }
  1378. public List<String> getActiveWorkorderRequestRefNos() {
  1379. 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";
  1380. try {
  1381. return jdbcTemplate.queryForList(sql, String.class);
  1382. } catch (Exception e) {
  1383. return new ArrayList<>();
  1384. }
  1385. }
  1386. public List<Map<String, Object>> getWorkorderRequests(String refNo) {
  1387. try {
  1388. 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)";
  1389. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, refNo);
  1390. if (list == null || list.isEmpty()) {
  1391. return new ArrayList<>();
  1392. }
  1393. Map<String, String> printerMap = getPrinterMap();
  1394. Map<String, String> tonerMap = getTonerMap();
  1395. Map<String, String> partCodeMap = getTonerPartCodeMap();
  1396. Map<String, String> userMap = getUserMap();
  1397. Map<String, Integer> inByReqMap = getInwardStockByRequestMap();
  1398. List<Map<String, Object>> result = new ArrayList<>();
  1399. for (Map<String, Object> raw : list) {
  1400. Map<String, Object> row = new HashMap<>(raw);
  1401. String cleanRef = refNo != null ? refNo.trim() : "";
  1402. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  1403. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  1404. String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : "";
  1405. String mrId = raw.get("id") != null ? String.valueOf(raw.get("id")).trim() : "";
  1406. String tonerModelName = tonerMap.getOrDefault(tid, tid);
  1407. String partCode = partCodeMap.get(tid);
  1408. if (partCode == null || partCode.isEmpty()) {
  1409. partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : "");
  1410. }
  1411. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  1412. row.put("model_name", tonerModelName);
  1413. row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-");
  1414. row.put("updated_by", userMap.getOrDefault(updatedBy, updatedBy));
  1415. row.put("qty_requested", raw.get("qty_registered"));
  1416. row.put("qty_inward_received",
  1417. inByReqMap.getOrDefault(cleanRef + "_" + pid + "_" + tid + "_" + mrId, 0));
  1418. result.add(row);
  1419. }
  1420. return result;
  1421. } catch (Exception e) {
  1422. return new ArrayList<>();
  1423. }
  1424. }
  1425. public List<Map<String, Object>> getWorkorderModelRequestHistory() {
  1426. try {
  1427. 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";
  1428. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  1429. if (list == null || list.isEmpty()) {
  1430. return new ArrayList<>();
  1431. }
  1432. Map<String, String> printerMap = getPrinterMap();
  1433. Map<String, String> tonerMap = getTonerMap();
  1434. Map<String, String> partCodeMap = getTonerPartCodeMap();
  1435. Map<String, String> userMap = getUserMap();
  1436. Map<String, Integer> woRegisteredQtyMap = getWorkorderRegisteredQtyMap();
  1437. List<Map<String, Object>> result = new ArrayList<>();
  1438. for (Map<String, Object> raw : list) {
  1439. Map<String, Object> row = new HashMap<>(raw);
  1440. String pid = raw.get("pid") != null ? String.valueOf(raw.get("pid")).trim() : "";
  1441. String tid = raw.get("tid") != null ? String.valueOf(raw.get("tid")).trim() : "";
  1442. String updatedBy = raw.get("updated_by") != null ? String.valueOf(raw.get("updated_by")).trim() : "";
  1443. String refNo = raw.get("ref_no") != null ? String.valueOf(raw.get("ref_no")).trim() : "";
  1444. String tonerModelName = tonerMap.getOrDefault(tid, tid);
  1445. String partCode = partCodeMap.get(tid);
  1446. if (partCode == null || partCode.isEmpty()) {
  1447. partCode = partCodeMap.get(tonerModelName != null ? tonerModelName.trim().toLowerCase() : "");
  1448. }
  1449. row.put("printer_name", printerMap.getOrDefault(pid, pid));
  1450. row.put("model_name", tonerModelName);
  1451. row.put("part_code", partCode != null && !partCode.isEmpty() ? partCode : "-");
  1452. row.put("order_by", userMap.getOrDefault(updatedBy, updatedBy));
  1453. row.put("qty_requested", raw.get("qty_registered"));
  1454. int woQty = woRegisteredQtyMap.getOrDefault(refNo + "_" + pid + "_" + tid, 0);
  1455. row.put("qty_registered", woQty);
  1456. result.add(row);
  1457. }
  1458. return result;
  1459. } catch (Exception e) {
  1460. return new ArrayList<>();
  1461. }
  1462. }
  1463. // ================= DEPARTMENTS & ZONES =================
  1464. public List<Map<String, Object>> getActiveDepartments() {
  1465. 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";
  1466. try {
  1467. return jdbcTemplate.queryForList(sql);
  1468. } catch (Exception e) {
  1469. return new ArrayList<>();
  1470. }
  1471. }
  1472. public List<Map<String, Object>> getActiveZones() {
  1473. 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)";
  1474. try {
  1475. return jdbcTemplate.queryForList(sql);
  1476. } catch (Exception e) {
  1477. return new ArrayList<>();
  1478. }
  1479. }
  1480. public JdbcTemplate getJdbcTemplate() {
  1481. return this.jdbcTemplate;
  1482. }
  1483. private Integer parseIntegerSafely(Object val) {
  1484. if (val == null) {
  1485. return null;
  1486. }
  1487. String str = String.valueOf(val).trim();
  1488. if (str.isEmpty() || "null".equalsIgnoreCase(str) || "undefined".equalsIgnoreCase(str)) {
  1489. return null;
  1490. }
  1491. try {
  1492. return Integer.parseInt(str);
  1493. } catch (NumberFormatException e) {
  1494. return null;
  1495. }
  1496. }
  1497. }