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.

334 lines
16 KiB

2 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. package in.gov.chennaicorporation.gccoffice.callcenter.service;
  2. import java.io.PrintWriter;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.LinkedHashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.stream.Collectors;
  9. import javax.sql.DataSource;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.beans.factory.annotation.Qualifier;
  12. import org.springframework.jdbc.core.JdbcTemplate;
  13. import org.springframework.stereotype.Service;
  14. @Service
  15. public class CampaignReportService {
  16. private JdbcTemplate jdbcTemplate;
  17. @Autowired
  18. public void setDataSourcemysql(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
  19. this.jdbcTemplate = new JdbcTemplate(dataSource);
  20. }
  21. @Autowired
  22. public void setDataSource2(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
  23. this.jdbcTemplate = new JdbcTemplate(dataSource);
  24. }
  25. public List<Map<String, Object>> getCampaignData(String startDate, String endDate) {
  26. StringBuilder query = new StringBuilder(
  27. "SELECT " +
  28. " cr.campaign_id, " +
  29. " cr.category_id, " +
  30. " cr.campaign_name, " +
  31. " cc.category_name, " +
  32. " cr.start_date, " +
  33. " cr.end_date, " +
  34. " COUNT(ud.campaign_id) AS total_count, " +
  35. " COUNT(ud.agent_id) AS assigned_count, " +
  36. " COUNT(ud.campaign_id) - COUNT(ud.agent_id) AS not_assigned_count, " +
  37. " COUNT(CASE WHEN ud.call_status = 'INFORMATION GIVEN' THEN 1 ELSE NULL END) AS informationgiven_count, " +
  38. " COUNT(CASE WHEN ud.call_status = 'CALL BACK LATER' THEN 1 ELSE NULL END) AS callback_count, " +
  39. " COUNT(CASE WHEN ud.call_status = 'UNATTENDED' THEN 1 ELSE NULL END) AS unattended_count, " +
  40. " COUNT(CASE WHEN ud.call_status = 'SWITCH OFF' THEN 1 ELSE NULL END) AS switchoff_count, " +
  41. " COUNT(CASE WHEN ud.call_status = 'WRONG NUMBER' THEN 1 ELSE NULL END) AS wrongnumber_count " +
  42. "FROM gcc_1913_campaign.campaign_request cr " +
  43. "JOIN gcc_1913_campaign.upload_data ud ON cr.campaign_id = ud.campaign_id " +
  44. "JOIN gcc_1913_campaign.category cc ON cr.category_id = cc.category_id " +
  45. "WHERE cr.campaign_status IN ('ONGOING', 'CLOSED') " +
  46. "AND ud.agent_id IS NOT NULL "
  47. );
  48. // Apply date filter dynamically if dates are provided
  49. if (startDate != null && endDate != null) {
  50. query.append("AND DATE(cr.created_date) BETWEEN ? AND ? ");
  51. }
  52. query.append("GROUP BY cr.campaign_id ");
  53. query.append("ORDER BY cr.campaign_id DESC");
  54. // Execute query with or without parameters
  55. if (startDate != null && endDate != null) {
  56. return jdbcTemplate.queryForList(query.toString(), startDate, endDate);
  57. } else {
  58. return jdbcTemplate.queryForList(query.toString());
  59. }
  60. }
  61. public List<Map<String, Object>> getAgentwiseData(String campaignId) {
  62. String query = "SELECT aa.agent_id, al.agent_name, \r\n"
  63. + " COUNT(ud.agent_id) AS assigned_count, \r\n"
  64. + " COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) AS completed_count, \r\n"
  65. + " COUNT(ud.agent_id) - COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) AS pending_count, \r\n"
  66. + " COUNT(CASE WHEN ud.call_status = 'INFORMATION GIVEN' THEN 1 ELSE NULL END) AS informationgiven_count, \r\n"
  67. + " COUNT(CASE WHEN ud.call_status = 'CALL BACK LATER' THEN 1 ELSE NULL END) AS callback_count, \r\n"
  68. + " COUNT(CASE WHEN ud.call_status = 'UNATTENDED' THEN 1 ELSE NULL END) AS unattended_count, \r\n"
  69. + " COUNT(CASE WHEN ud.call_status = 'SWITCH OFF' THEN 1 ELSE NULL END) AS switchoff_count, \r\n"
  70. + " COUNT(CASE WHEN ud.call_status = 'WRONG NUMBER' THEN 1 ELSE NULL END) AS wrongnumber_count, \r\n"
  71. + " CASE \r\n"
  72. + " WHEN COUNT(ud.agent_id) = 0 THEN 0 \r\n"
  73. + " ELSE FLOOR((COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) * 100) / COUNT(ud.agent_id))\r\n"
  74. + " END AS completed_percentage\r\n"
  75. + "FROM gcc_1913_campaign.agent_assign aa \r\n"
  76. + "JOIN gcc_1913_qaqc.agents_list al ON al.agent_id = aa.agent_id \r\n"
  77. + "JOIN gcc_1913_campaign.upload_data ud ON ud.agent_id = aa.agent_id AND ud.campaign_id = aa.campaign_id\r\n"
  78. + "WHERE aa.campaign_id = ? AND aa.isactive = 1 AND aa.isdelete = 0 AND ud.agent_id IS NOT NULL \r\n"
  79. + "GROUP BY aa.agent_id, al.agent_name \r\n"
  80. + "ORDER BY aa.agent_id";
  81. return jdbcTemplate.queryForList(query, campaignId);
  82. }
  83. //report for campaign details
  84. public List<Map<String, Object>> getAgentReportCampaignId(String campaignId) {
  85. String query = "SELECT cr.category_id,cr.campaign_id, cc.category_name, \r\n"
  86. + " cr.start_date, cr.end_date, \r\n"
  87. + " cr.description, date (cr.created_date) as created_date \r\n"
  88. + " FROM gcc_1913_campaign.category cc \r\n"
  89. + " join gcc_1913_campaign.campaign_request cr on cr.category_id = cc.category_id \r\n"
  90. + " where cr.campaign_id = ?;";
  91. return jdbcTemplate.queryForList(query, campaignId);
  92. }
  93. //get campaignname
  94. public String getCampaignName(int campaignId) {
  95. String query = "SELECT campaign_name FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
  96. return jdbcTemplate.queryForObject(query, String.class, campaignId);
  97. }
  98. //question and answers counts with percentage in report page method
  99. public List<Map<String, Object>> getQuestionAnswers(int campaignId) {
  100. String sql = "SELECT cq.question_id, cq.questions, ca.campaign_answer, " +
  101. "COUNT(qa.campaign_answer) AS answer_count, " +
  102. "FLOOR(IFNULL((COUNT(qa.campaign_answer) / " +
  103. "(SELECT COUNT(*) FROM gcc_1913_campaign.upload_data " +
  104. "WHERE campaign_id = cq.campaign_id AND call_status = 'INFORMATION GIVEN') * 100), 0)) AS answer_percentage " +
  105. "FROM gcc_1913_campaign.campaign_questions cq " +
  106. "JOIN gcc_1913_campaign.campaign_answers ca ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id " +
  107. "LEFT JOIN gcc_1913_campaign.questions_answers qa ON cq.question_id = qa.question_id AND ca.campaign_answer = qa.campaign_answer AND cq.campaign_id = qa.campaign_id " +
  108. "WHERE cq.campaign_id = ? AND cq.isactive = 1 AND cq.isdelete = 0 " +
  109. "GROUP BY cq.question_id, cq.questions, ca.campaign_answer " +
  110. "ORDER BY cq.question_id";
  111. // String sql = "SELECT cq.question_id, cq.questions, ca.campaign_answer, " +
  112. // "COUNT(DISTINCT qa.id) AS answer_count, " +
  113. // "FLOOR(IFNULL( (COUNT(DISTINCT qa.id) * 100) / (SELECT COUNT(DISTINCT data_id) FROM gcc_1913_campaign.upload_data WHERE campaign_id = cq.campaign_id AND call_status = 'INFORMATION GIVEN'),0)) AS answer_percentage " +
  114. // "FROM gcc_1913_campaign.campaign_questions cq " +
  115. // "JOIN gcc_1913_campaign.campaign_answers ca ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id " +
  116. // "LEFT JOIN gcc_1913_campaign.questions_answers qa ON cq.question_id = qa.question_id AND ca.campaign_answer = qa.campaign_answer AND cq.campaign_id = qa.campaign_id " +
  117. // "WHERE cq.campaign_id = ? AND cq.isactive = 1 AND cq.isdelete = 0 " +
  118. // "GROUP BY cq.question_id, cq.questions, ca.campaign_answer " +
  119. // "ORDER BY cq.question_id";
  120. List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, campaignId);
  121. Map<Integer, Map<String, Object>> responseMap = new LinkedHashMap<>();
  122. for (Map<String, Object> row : result) {
  123. int questionId = (int) row.get("question_id");
  124. if (!responseMap.containsKey(questionId)) {
  125. Map<String, Object> questionData = new HashMap<>();
  126. questionData.put("question_id", questionId);
  127. questionData.put("questions", row.get("questions"));
  128. questionData.put("answers", new ArrayList<>());
  129. responseMap.put(questionId, questionData);
  130. }
  131. Map<String, Object> answerData = new HashMap<>();
  132. answerData.put("campaign_answer", row.get("campaign_answer"));
  133. answerData.put("answer_count", row.get("answer_count"));
  134. answerData.put("answer_percentage", row.get("answer_percentage"));
  135. ((List<Map<String, Object>>) responseMap.get(questionId).get("answers")).add(answerData);
  136. }
  137. return new ArrayList<>(responseMap.values());
  138. }
  139. // Method to escape CSV values
  140. private String escapeCsvValue(String value) {
  141. if (value == null) return "";
  142. // If the value contains commas, double quotes, or newlines, wrap it in quotes and escape inner quotes
  143. if (value.contains(",") || value.contains("\"") || value.contains("\n")) {
  144. value = "\"" + value.replace("\"", "\"\"") + "\"";
  145. }
  146. return value;
  147. }
  148. public void generateCSV(int categoryId, int campaignId, PrintWriter writer) {
  149. List<Map<String, Object>> resultList = new ArrayList<>();
  150. // Fetch ordered field column names
  151. String fetchColumnsSQL = "SELECT COLUMN_NAME " +
  152. "FROM INFORMATION_SCHEMA.COLUMNS " +
  153. "WHERE TABLE_SCHEMA = 'gcc_1913_campaign' " +
  154. "AND TABLE_NAME = 'upload_data' " +
  155. "AND COLUMN_NAME LIKE 'field_%' " +
  156. "ORDER BY CAST(SUBSTRING(COLUMN_NAME, 7) AS UNSIGNED)";
  157. List<String> fieldColumns = jdbcTemplate.queryForList(fetchColumnsSQL, String.class);
  158. if (fieldColumns.isEmpty()) {
  159. writer.println("No matching columns found");
  160. return;
  161. }
  162. // Fetch ordered fields data based on campaign_id, including data_id, agent_id, and call_status
  163. String query1 = "SELECT data_id, " + String.join(", ", fieldColumns) + ", agent_id, call_status,remarks " +
  164. "FROM gcc_1913_campaign.upload_data WHERE campaign_id = ?";
  165. List<Map<String, Object>> orderedFieldsList = jdbcTemplate.queryForList(query1, campaignId);
  166. if (orderedFieldsList.isEmpty()) {
  167. writer.println("No data found for campaign_id: " + campaignId);
  168. return;
  169. }
  170. // Fetch category columns
  171. String query2 = "SELECT column_name FROM gcc_1913_campaign.category_columns WHERE category_id = ? AND isactive=1";
  172. List<String> categoryColumns = jdbcTemplate.queryForList(query2, String.class, categoryId);
  173. if (categoryColumns.isEmpty()) {
  174. writer.println("No category columns found for category_id: " + categoryId);
  175. return;
  176. }
  177. int categoryCount = categoryColumns.size();
  178. // Fetch Agent Names from agent_id
  179. String fetchAgentSQL = "SELECT agent_id, agent_name FROM gcc_1913_qaqc.agents_list";
  180. Map<Integer, String> agentMap = jdbcTemplate.query(fetchAgentSQL, rs -> {
  181. Map<Integer, String> map = new HashMap<>();
  182. while (rs.next()) {
  183. map.put(rs.getInt("agent_id"), rs.getString("agent_name"));
  184. }
  185. return map;
  186. });
  187. // Fetch Questions for given campaign_id
  188. String fetchQuestionsQuery = "SELECT question_id, questions FROM gcc_1913_campaign.campaign_questions WHERE campaign_id = ?";
  189. Map<Integer, String> questionsMap = jdbcTemplate.query(fetchQuestionsQuery, rs -> {
  190. Map<Integer, String> map = new LinkedHashMap<>();
  191. while (rs.next()) {
  192. map.put(rs.getInt("question_id"), rs.getString("questions"));
  193. }
  194. return map;
  195. }, campaignId);
  196. // Fetch Answers mapped to questions and grouped by data_id
  197. String fetchAnswersQuery = "SELECT data_id, question_id, campaign_answer FROM gcc_1913_campaign.questions_answers " +
  198. "WHERE campaign_id = ?";
  199. Map<Integer, Map<Integer, String>> answersMap = jdbcTemplate.query(fetchAnswersQuery, rs -> {
  200. Map<Integer, Map<Integer, String>> map = new HashMap<>();
  201. while (rs.next()) {
  202. int dataId = rs.getInt("data_id");
  203. int questionId = rs.getInt("question_id");
  204. String answer = rs.getString("campaign_answer");
  205. map.computeIfAbsent(dataId, k -> new HashMap<>()).put(questionId, answer);
  206. }
  207. return map;
  208. }, campaignId);
  209. // Process each row and collect data
  210. for (Map<String, Object> orderedFields : orderedFieldsList) {
  211. List<Object> nonNullValues = new ArrayList<>();
  212. for (String field : fieldColumns) {
  213. Object value = orderedFields.get(field);
  214. if (value != null) {
  215. nonNullValues.add(value);
  216. if (nonNullValues.size() == categoryCount) {
  217. break; // Stop after collecting required count
  218. }
  219. }
  220. }
  221. if (nonNullValues.size() < categoryCount) {
  222. continue; // Skip if not enough non-null values
  223. }
  224. Integer dataId = orderedFields.get("data_id") != null ? ((Number) orderedFields.get("data_id")).intValue() : null;
  225. // Map category columns to non-null ordered field values
  226. Map<String, Object> finalMapping = new LinkedHashMap<>();
  227. // Add category columns
  228. for (int i = 0; i < categoryCount; i++) {
  229. finalMapping.put(categoryColumns.get(i), nonNullValues.get(i));
  230. }
  231. // Add Questions and Corresponding Answers for this specific data_id
  232. Map<Integer, String> currentAnswers = answersMap.getOrDefault(dataId, new HashMap<>());
  233. for (Map.Entry<Integer, String> entry : questionsMap.entrySet()) {
  234. Integer questionId = entry.getKey();
  235. String questionText = entry.getValue();
  236. String answer = currentAnswers.getOrDefault(questionId, "-"); // Default to "-"
  237. finalMapping.put(questionText, answer);
  238. }
  239. Integer agentId = orderedFields.get("agent_id") != null ? ((Number) orderedFields.get("agent_id")).intValue() : null;
  240. String agentName = agentMap.getOrDefault(agentId, "Not Assigned");
  241. finalMapping.put("Agent Name", agentName);
  242. String callstatus = orderedFields.get("call_status") != null ? orderedFields.get("call_status").toString() : "-";
  243. finalMapping.put("Call Status", callstatus);
  244. // Add Remarks
  245. String remarks = orderedFields.get("remarks") != null ? orderedFields.get("remarks").toString() : "-";
  246. finalMapping.put("Remarks", remarks);
  247. resultList.add(finalMapping);
  248. }
  249. // Write CSV data
  250. if (resultList.isEmpty()) {
  251. writer.println("No Data Available");
  252. return;
  253. }
  254. // Extract headers from the first row and escape them
  255. String headers = resultList.get(0).keySet().stream()
  256. .map(this::escapeCsvValue) // Escape each header value
  257. .collect(Collectors.joining(","));
  258. writer.println(headers);
  259. // Write data rows
  260. for (Map<String, Object> rowData : resultList) {
  261. List<String> values = rowData.values().stream()
  262. .map(value -> escapeCsvValue(value != null ? value.toString() : ""))
  263. .collect(Collectors.toList());
  264. writer.println(String.join(",", values));
  265. }
  266. }
  267. }