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.

704 lines
28 KiB

2 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. package in.gov.chennaicorporation.gccoffice.callcenter.service;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.sql.Date;
  5. import java.sql.PreparedStatement;
  6. import java.sql.Statement;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.LinkedHashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.Set;
  13. import java.util.stream.Collectors;
  14. import javax.sql.DataSource;
  15. import javax.transaction.Transactional;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Qualifier;
  18. import org.springframework.jdbc.core.JdbcTemplate;
  19. import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
  20. import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
  21. import org.springframework.jdbc.support.GeneratedKeyHolder;
  22. import org.springframework.jdbc.support.KeyHolder;
  23. import org.springframework.scheduling.annotation.Scheduled;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.web.multipart.MultipartFile;
  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. @Service
  29. public class CampaignService {
  30. private JdbcTemplate jdbcTemplate;
  31. @Autowired
  32. public void setDataSourcemysql(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
  33. this.jdbcTemplate = new JdbcTemplate(dataSource);
  34. }
  35. @Autowired
  36. public void setDataSource2(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
  37. this.jdbcTemplate = new JdbcTemplate(dataSource);
  38. }
  39. @Autowired
  40. private JdbcTemplate jdbcTemplate2;
  41. //Method to save file and return its URL
  42. public String saveFile(MultipartFile file) {
  43. String fileName = file.getOriginalFilename();
  44. String filePath = "/uploads/" + fileName; // Path to save the file
  45. try {
  46. File destinationFile = new File(filePath);
  47. file.transferTo(destinationFile); // Save the file locally
  48. } catch (IOException e) {
  49. throw new RuntimeException("Failed to store file " + fileName, e);
  50. }
  51. return filePath; // Return the file path (URL) for saving to the database
  52. }
  53. //Method to save campaign details into the database
  54. public void saveCampaignDetails(Map<String, Object> campaignDetails) {
  55. String sql = "UPDATE gcc_1913_campaign.campaign_request " +
  56. "SET start_date = :start_date, " +
  57. "end_date = :end_date, " +
  58. "calls_per_agent = :calls_per_agent, " +
  59. "description = :description " +
  60. "WHERE campaign_id = :campaign_id";
  61. // Using NamedParameterJdbcTemplate for mapping campaignDetails into query
  62. NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
  63. namedJdbcTemplate.update(sql, campaignDetails);
  64. }
  65. // Method to save campaign details into the database
  66. public String saveCampaignDetailsExcel(Map<String, Object> campaignDetailsExcel) {
  67. campaignDetailsExcel.putIfAbsent("campaign_status", "PENDING");
  68. String sql = "INSERT INTO gcc_1913_campaign.campaign_request (campaign_name, category_id, excel_url,campaign_status) " +
  69. "VALUES (:campaign_name, :category_id, :excel_url ,:campaign_status)";
  70. // Using NamedParameterJdbcTemplate for mapping campaignDetails into query
  71. NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
  72. namedJdbcTemplate.update(sql, campaignDetailsExcel);
  73. // Return the category to use in the next step
  74. return campaignDetailsExcel.get("category_id").toString();
  75. }
  76. // campaign_status change as ongoing in campaign_request table
  77. @Transactional
  78. public void updateCampaignStatus(int campaignId, int categoryId) {
  79. String checkSql = "SELECT COUNT(*) FROM gcc_1913_campaign.agent_assign "
  80. + "WHERE campaign_id = ? AND category_id = ? AND status = 'ASSIGNED'";
  81. int assignedCount = jdbcTemplate.queryForObject(checkSql, Integer.class, campaignId, categoryId);
  82. if (assignedCount > 0) {
  83. String updateSql = "UPDATE gcc_1913_campaign.campaign_request "
  84. + "SET campaign_status = 'ONGOING' WHERE campaign_id = ? AND category_id = ?";
  85. jdbcTemplate.update(updateSql, campaignId, categoryId);
  86. System.out.println("Campaign status updated to ONGOING for campaign ID: " + campaignId);
  87. } else {
  88. System.out.println("No agents assigned yet. Campaign status remains PENDING.");
  89. }
  90. }
  91. //Validated uploaded excel column count with field column in our DB
  92. public List<String> getUploadDataFieldColumns() {
  93. String query = "SELECT column_name FROM information_schema.columns "
  94. + "WHERE table_schema = 'gcc_1913_campaign' "
  95. + "AND table_name = 'upload_data' "
  96. + "AND column_name LIKE 'field_%'";
  97. return jdbcTemplate.queryForList(query, String.class);
  98. }
  99. public String saveQuestionsAnswers(List<Map<String, Object>> questionsData) {
  100. for (Map<String, Object> question : questionsData) {
  101. String questionText = (String) question.get("question");
  102. String answerType = (String) question.get("answerType");
  103. // Validate and parse categoryId and campaignId
  104. Integer categoryId = Integer.parseInt(question.get("categoryId").toString());
  105. Integer campaignId = Integer.parseInt(question.get("campaignId").toString());
  106. List<String> answers = (List<String>) question.get("answers");
  107. // Insert question and get generated question_id
  108. String questionInsertQuery = "INSERT INTO gcc_1913_campaign.campaign_questions (category_id, campaign_id, questions, answer_type_id) VALUES (?, ?, ?, ?)";
  109. KeyHolder keyHolder = new GeneratedKeyHolder();
  110. jdbcTemplate.update(connection -> {
  111. PreparedStatement ps = connection.prepareStatement(questionInsertQuery, Statement.RETURN_GENERATED_KEYS);
  112. ps.setInt(1, categoryId);
  113. ps.setInt(2, campaignId);
  114. ps.setString(3, questionText);
  115. ps.setString(4, answerType);
  116. return ps;
  117. }, keyHolder);
  118. Integer questionId = keyHolder.getKey().intValue();
  119. // Insert answers if available
  120. if (answers != null && !answers.isEmpty()) {
  121. String answerInsertQuery = "INSERT INTO gcc_1913_campaign.campaign_answers (category_id, campaign_id, question_id, campaign_answer) VALUES (?, ?, ?, ?)";
  122. for (String answer : answers) {
  123. jdbcTemplate.update(answerInsertQuery, categoryId, campaignId, questionId, answer);
  124. }
  125. }
  126. }
  127. return "Questions and Answers saved successfully!";
  128. }
  129. public void saveQuestionsAndAnswers(String category, String campaignId, String question, String answerType, List<String> answers) {
  130. // Convert category and answerType to integers once to avoid redundant parsing
  131. int categoryId = Integer.parseInt(category);
  132. int answerTypeId = Integer.parseInt(answerType);
  133. int campaignIdd = Integer.parseInt(campaignId);
  134. // Query to insert question into campaign_questions and retrieve generated question_id
  135. String query1 = "INSERT INTO gcc_1913_campaign.campaign_questions (category_id, campaign_id, questions, answer_type_id) VALUES (?, ?, ?, ?)";
  136. KeyHolder keyHolder = new GeneratedKeyHolder();
  137. jdbcTemplate.update(connection -> {
  138. PreparedStatement ps = connection.prepareStatement(query1, Statement.RETURN_GENERATED_KEYS);
  139. ps.setInt(1, categoryId);
  140. ps.setInt(2, campaignIdd);
  141. ps.setString(3, question);
  142. ps.setInt(4, answerTypeId);
  143. return ps;
  144. }, keyHolder);
  145. int questionId = keyHolder.getKey().intValue();
  146. // If answerType is NOT "Text" (ID = 1), save answers
  147. if (answerTypeId != 1 && answers != null && !answers.isEmpty()) {
  148. String query2 = "INSERT INTO gcc_1913_campaign.campaign_answers (category_id, campaign_id, question_id, campaign_answer) VALUES (?, ?, ?, ?)";
  149. for (String answer : answers) {
  150. jdbcTemplate.update(query2, categoryId, campaignId, questionId, answer);
  151. }
  152. }
  153. System.out.println("Inserted Question ID: " + questionId + " with Answers: " + (answers != null ? answers : "None"));
  154. }
  155. //
  156. // public Map<String, Object> getCampaignDetailsById(Long campaign_id) {
  157. // String sql = "SELECT * FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
  158. // return jdbcTemplate.queryForMap(sql, campaign_id);
  159. // }
  160. public void updateCampaign(Long campaign_id, String end_date) {
  161. String sql = "UPDATE gcc_1913_campaign.campaign_request SET end_date = ? WHERE campaign_id = ?";
  162. jdbcTemplate.update(sql, end_date,campaign_id);
  163. }
  164. public List<Map<String, Object>> getCampaignDetails() {
  165. String sql = "SELECT campaign_id, " +
  166. " campaign_name, " +
  167. " CONCAT(" +
  168. " DATE_FORMAT(start_date, '%d/%m/%Y'), " +
  169. " ' to ', " +
  170. " DATE_FORMAT(end_date, '%d/%m/%Y')" +
  171. " ) AS event_dates, " +
  172. " no_of_agents, " +
  173. " calls_per_agent, " +
  174. " (no_of_agents)*(calls_per_agent) as total_calls, " +
  175. " description " +
  176. "FROM gcc_1913_campaign.campaign_request;";
  177. List<Map<String, Object>> campaigns = jdbcTemplate.queryForList(sql);
  178. return campaigns;
  179. }
  180. public List<Map<String, Object>> getLastRow()
  181. {
  182. String sqlQuery ="SELECT campaign_id\r\n"
  183. + "FROM gcc_1913_campaign.campaign_request\r\n"
  184. + "ORDER BY campaign_id DESC\r\n"
  185. + "LIMIT 1";
  186. return jdbcTemplate.queryForList(sqlQuery);
  187. }
  188. public String getLastInsertedCategoryId() {
  189. String sqlQuery = "SELECT category_id " +
  190. "FROM gcc_1913_campaign.campaign_request " +
  191. "ORDER BY campaign_id DESC " +
  192. "LIMIT 1";
  193. return jdbcTemplate.queryForObject(sqlQuery, String.class);
  194. }
  195. public Integer getLastInsertedCampaignId()
  196. {
  197. String sqlQuery ="SELECT campaign_id\r\n"
  198. + "FROM gcc_1913_campaign.campaign_request\r\n"
  199. + "ORDER BY campaign_id DESC\r\n"
  200. + "LIMIT 1";
  201. return jdbcTemplate.queryForObject(sqlQuery,Integer.class);
  202. }
  203. public List<Map<String, Object>> getDetailsForStart()
  204. {
  205. String sqlQuery ="SELECT cr.campaign_id,cr.category_id,ca.category_name,cr.campaign_name,start_date\r\n"
  206. + "FROM gcc_1913_campaign.campaign_request cr \r\n"
  207. + "join gcc_1913_campaign.category ca ON cr.category_id = ca.category_id \r\n"
  208. + "where cr.campaign_status='ONGOING' AND cr.isactive='1' and cr.isdelete='0' \r\n"
  209. + "order by cr.campaign_id desc";
  210. return jdbcTemplate.queryForList(sqlQuery);
  211. }
  212. public List<Map<String, Object>> getDataforAgents(int campaign_id, int calls_per_agent)
  213. {
  214. List<Map<String, Object>> assignedAgent_list =getAssignedAgentId(campaign_id);
  215. List<Map<String, Object>> data_list =getDataId(campaign_id);
  216. List<Map<String, Object>> task = getTask(assignedAgent_list,data_list,calls_per_agent,campaign_id);
  217. // Perform the update query here
  218. if (task != null && !task.isEmpty()) {
  219. assignAgentIds(task);
  220. updateAgentStatus(campaign_id);
  221. }
  222. return task;
  223. }
  224. //Method to update agent_id for each data_id in upload_data table
  225. public void assignAgentIds(List<Map<String, Object>> taskList) {
  226. String updateQuery = "UPDATE gcc_1913_campaign.upload_data SET agent_id = ? WHERE data_id = ? AND campaign_id = ?";
  227. // Loop through each agent's task list
  228. for (Map<String, Object> task : taskList) {
  229. Integer agentId = (Integer) task.get("agent_id");
  230. Integer campaignId = (Integer) task.get("campaign_id");
  231. List<Integer> dataIds = (List<Integer>) task.get("data_ids");
  232. // Update each data_id with the respective agent_id
  233. for (Integer dataId : dataIds) {
  234. jdbcTemplate.update(updateQuery, agentId, dataId, campaignId);
  235. }
  236. }
  237. }
  238. //Example update method
  239. private void updateAgentStatus(int campaign_id) {
  240. String updateQuery = "UPDATE gcc_1913_campaign.campaign_request SET isactive = '0', isdelete='1' WHERE campaign_id = ?";
  241. jdbcTemplate.update(updateQuery, campaign_id);
  242. }
  243. private List<Map<String, Object>> getTask(List<Map<String, Object>> assignedAgent_list, List<Map<String, Object>> data_list,
  244. int calls_per_agent,int campaign_id) {
  245. List<Map<String, Object>> result = new ArrayList<>();
  246. int dataIndex = 0;
  247. // Loop through each assigned ID
  248. for (Map<String, Object> assigned : assignedAgent_list) {
  249. // Create a map to store the assigned_id and corresponding data_ids
  250. Map<String, Object> assignedTaskMap = new HashMap<>();
  251. List<Integer> assignedDataIds = new ArrayList<>();
  252. // Get assigned_id
  253. Integer agent_id = (Integer) assigned.get("agent_id");
  254. // Loop to assign the appropriate number of data IDs (calls_per_agent)
  255. for (int i = 0; i < calls_per_agent; i++) {
  256. if (dataIndex >= data_list.size()) {
  257. // Exit if we run out of data IDs
  258. break;
  259. }
  260. Map<String, Object> data = data_list.get(dataIndex);
  261. Integer data_id = (Integer) data.get("data_id");
  262. assignedDataIds.add(data_id);
  263. dataIndex++;
  264. }
  265. // Put the agent_id and the corresponding data_ids in the map
  266. assignedTaskMap.put("agent_id", agent_id);
  267. assignedTaskMap.put("data_ids", assignedDataIds);
  268. assignedTaskMap.put("campaign_id", campaign_id);
  269. // Add the map to the result list
  270. result.add(assignedTaskMap);
  271. }
  272. return result;
  273. }
  274. private List<Map<String, Object>> getDataId(int campaign_id) {
  275. String sqlQuery ="SELECT data_id\r\n"
  276. + "from gcc_1913_campaign.upload_data\r\n"
  277. + "where campaign_id=?";
  278. return jdbcTemplate.queryForList(sqlQuery, new Object[]{campaign_id});
  279. }
  280. private List<Map<String, Object>> getAssignedAgentId(int campaign_id) {
  281. String sqlQuery ="SELECT agent_id\r\n"
  282. + "FROM gcc_1913_campaign.agent_assign \r\n"
  283. + "where campaign_id=? and isactive='1'";
  284. return jdbcTemplate.queryForList(sqlQuery, new Object[]{campaign_id});
  285. }
  286. public List<Map<String, Object>> getActiveCampaigns()
  287. {
  288. String sqlQuery ="SELECT cr.campaign_id,cr.calls_per_agent,cr.category_id,cr.campaign_name,c.category_name,cr.start_date,cr.end_date,cr.description,cr.campaign_status\r\n"
  289. + "FROM gcc_1913_campaign.campaign_request cr\r\n"
  290. + "JOIN gcc_1913_campaign.category c ON cr.category_id=c.category_id\r\n"
  291. + "where cr.isactive='1' and cr.campaign_status IN ('ONGOING', 'CLOSED') Order by cr.campaign_id desc";
  292. return jdbcTemplate.queryForList(sqlQuery);
  293. }
  294. public List<Map<String, Object>> viewcampaignstatus(int campaign_id) {
  295. String sqlQuery ="SELECT \r\n"
  296. + "aa.campaign_id as campaign_id,\r\n"
  297. + " al.agent_id as agent_id,\r\n"
  298. + " al.agent_name as agent_name,\r\n"
  299. + " COUNT(up.agent_id) AS Assigned_count,\r\n"
  300. + " COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) AS Complete_count,\r\n"
  301. + " COUNT(CASE WHEN up.field_14 IS NULL THEN 1 END) AS Pending_count,\r\n"
  302. + " ROUND(\r\n"
  303. + " (COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) * 100) / \r\n"
  304. + " COUNT(up.agent_id)\r\n"
  305. + " ) as Percentage,\r\n"
  306. + " COUNT(CASE WHEN up.field_14 = 'INFORMATION_GIVEN' THEN 1 END) AS Information_Given_count,\r\n"
  307. + " COUNT(CASE WHEN up.field_14 = 'UNATTENDED' THEN 1 END) AS Unattended_count,\r\n"
  308. + " COUNT(CASE WHEN up.field_14 = 'CALL_BACK_LATER' THEN 1 END) AS Call_back_later_count,\r\n"
  309. + " COUNT(CASE WHEN up.field_14 = 'SWITCH_OFF' THEN 1 END) AS Switch_off_count,\r\n"
  310. + " COUNT(CASE WHEN up.field_14 = 'WRONG_NUMBER' THEN 1 END) AS Wrong_number_count\r\n"
  311. + "FROM gcc_1913_campaign.agent_assign aa\r\n"
  312. + "JOIN gcc_1913_qaqc.agents_list al ON al.agent_id = aa.agent_id\r\n"
  313. + "JOIN gcc_1913_campaign.upload_data up ON up.agent_id = al.agent_id AND up.campaign_id = ?\r\n"
  314. + "WHERE aa.campaign_id = ? AND aa.isactive = '1'\r\n"
  315. + "GROUP BY aa.campaign_id,al.agent_id, al.agent_name";
  316. return jdbcTemplate.queryForList(sqlQuery,campaign_id,campaign_id);
  317. }
  318. public List<Map<String, Object>> viewcompletedby(int campaign_id, int agent_id) {
  319. String sqlQuery ="SELECT \r\n"
  320. + "up.data_id as data_id,up.field_1 as id, up.field_2 as name, up.field_3 as address,field_5 as cellnumber, field_14 as call_status, \r\n"
  321. + "count(cl.data_id) as call_count,updated_date as updated_date,field_15 as remarks\r\n"
  322. + "FROM gcc_1913_campaign.agent_assign aa\r\n"
  323. + "JOIN gcc_1913_campaign.upload_data up ON up.agent_id = aa.agent_id AND up.campaign_id = ?\r\n"
  324. + "JOIN gcc_1913_campaign.call_logs cl ON cl.data_id=up.data_id\r\n"
  325. + "WHERE aa.campaign_id = ? AND aa.isactive = '1' AND aa.agent_id=? AND up.field_14 IS NOT NULL\r\n"
  326. + "group by up.data_id,up.field_1, up.field_2";
  327. return jdbcTemplate.queryForList(sqlQuery,campaign_id,campaign_id,agent_id);
  328. }
  329. public String getExcelUrlByCampaignId(int lastId) {
  330. String sqlQuery = "SELECT excel_url FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
  331. return jdbcTemplate.queryForObject(sqlQuery, String.class, lastId);
  332. }
  333. public void saveUploadData(String category, int campaignId, Map<String, Object> rowData, List<String> expectedHeaders) {
  334. int fieldCount = rowData.size();
  335. List<String> columnNames = new ArrayList<>();
  336. for (int i = 1; i <= fieldCount; i++) {
  337. columnNames.add("field_" + i);
  338. }
  339. String columnNamesString = String.join(", ", columnNames);
  340. String placeholders = columnNames.stream().map(col -> "?").collect(Collectors.joining(", "));
  341. String sql = "INSERT INTO gcc_1913_campaign.upload_data (category_id, campaign_id, " + columnNamesString + ") VALUES (?, ?, " + placeholders + ")";
  342. //System.out.println("SQL Query========= " + sql);
  343. List<Object> values = new ArrayList<>();
  344. values.add(category);
  345. values.add(campaignId);
  346. // Ensure rowData values are ordered based on expected headers
  347. for (String header : expectedHeaders) {
  348. values.add(rowData.getOrDefault(header, "")); // Ensures the correct mapping
  349. }
  350. final Logger logger = LoggerFactory.getLogger(CampaignService.class);
  351. try {
  352. jdbcTemplate.update(sql, values.toArray());
  353. } catch (Exception e) {
  354. logger.error("Error inserting upload data for campaign {}: {}", campaignId, e.getMessage());
  355. }
  356. }
  357. // public void saveUploadData(String category, int campaignId, Map<String, Object> rowData) {
  358. // // Get total number of fields in the row
  359. // int fieldCount = rowData.size();
  360. //
  361. // // Generate dynamic column names as field_1, field_2, ..., field_N
  362. // List<String> columnNames = new ArrayList<>();
  363. // for (int i = 1; i <= fieldCount; i++) {
  364. // columnNames.add("field_" + i);
  365. // }
  366. //
  367. // // Build dynamic SQL query
  368. // String columnNamesString = String.join(", ", columnNames);
  369. // String placeholders = columnNames.stream().map(col -> "?").collect(Collectors.joining(", "));
  370. //
  371. // String sql = "INSERT INTO upload_data (category_id, campaign_id, " + columnNamesString + ") VALUES (?, ?, " + placeholders + ")";
  372. //
  373. // System.out.println("SQL Query========= " + sql);
  374. //
  375. // // Prepare values list
  376. // List<Object> values = new ArrayList<>();
  377. // values.add(category);
  378. // values.add(campaignId);
  379. // values.addAll(rowData.values()); // Add row data values dynamically
  380. //
  381. //
  382. //
  383. // final Logger logger = LoggerFactory.getLogger(CampaignService.class);
  384. // try {
  385. // jdbcTemplate.update(sql, values.toArray());
  386. // } catch (Exception e) {
  387. // logger.error("Error inserting upload data for campaign {}: {}", campaignId, e.getMessage());
  388. // }
  389. // }
  390. //Agent List
  391. public List<Map<String, Object>> getAllAgents() {
  392. String sql = "SELECT agent_id, agent_name FROM gcc_1913_qaqc.agents_list WHERE calling_type = 'OUTBOUND' AND isactive = '1'";
  393. return jdbcTemplate.queryForList(sql);
  394. }
  395. //count based on total, completed and pending
  396. public Map<String, Object> getCampaignStatistics(int campaignId) {
  397. Map<String, Object> result = new HashMap<>();
  398. // Total Count
  399. String totalQuery = "SELECT COUNT(*) AS total FROM gcc_1913_campaign.upload_data WHERE campaign_id = ?";
  400. int totalCount = jdbcTemplate.queryForObject(totalQuery, Integer.class, campaignId);
  401. result.put("totalCount", totalCount);
  402. // Completed Count (agent_id is not null and call_status is null)
  403. String completedQuery = "SELECT COUNT(*) AS completed FROM gcc_1913_campaign.upload_data ud\r\n"
  404. + "JOIN gcc_1913_campaign.campaign_request cr ON ud.campaign_id = cr.campaign_id\r\n"
  405. + "WHERE ud.campaign_id = ? AND cr.campaign_status = 'ONGOING' AND ud.agent_id IS NOT NULL AND\r\n"
  406. + "( ud.call_status NOT IN ('CALL BACK LATER','UNATTENDED'))";
  407. int completedCount = jdbcTemplate.queryForObject(completedQuery, Integer.class, campaignId);
  408. result.put("completedCount", completedCount);
  409. // Pending Count (agent_id is not null and call_status is not null)
  410. String pendingQuery = "SELECT COUNT(*) AS pending FROM gcc_1913_campaign.upload_data ud\r\n"
  411. + "JOIN gcc_1913_campaign.campaign_request cr ON ud.campaign_id = cr.campaign_id\r\n"
  412. + "WHERE ud.campaign_id = ? AND ud.agent_id IS NOT NULL \r\n"
  413. + "AND (ud.call_status IS NULL OR ud.call_status IN ('CALL BACK LATER','UNATTENDED'))";
  414. int pendingCount = jdbcTemplate.queryForObject(pendingQuery, Integer.class, campaignId);
  415. result.put("pendingCount", pendingCount);
  416. return result;
  417. }
  418. public List<Map<String, Object>> getCampaignDetailsById(Long campaign_id) {
  419. String sql = "SELECT \r\n"
  420. + " cr.campaign_id, \r\n"
  421. + " cr.campaign_name, \r\n"
  422. + " cr.category_id, \r\n"
  423. + " cr.start_date, \r\n"
  424. + " cr.end_date, \r\n"
  425. + " cr.calls_per_agent, \r\n"
  426. + " cr.description, \r\n"
  427. + " cr.created_date, \r\n"
  428. + " cr.excel_url, \r\n"
  429. + " cr.isactive, \r\n"
  430. + " cr.isdelete, \r\n"
  431. + " cr.campaign_status, \r\n"
  432. + " cq.question_id, \r\n"
  433. + " cq.questions, \r\n"
  434. + " cq.answer_type_id, \r\n"
  435. + " at.type_name, \r\n"
  436. + " ca.id AS answer_id, \r\n"
  437. + " ca.campaign_answer\r\n"
  438. + "FROM gcc_1913_campaign.campaign_request cr\r\n"
  439. + "JOIN gcc_1913_campaign.campaign_questions cq \r\n"
  440. + " ON cr.campaign_id = cq.campaign_id\r\n"
  441. + "LEFT JOIN gcc_1913_campaign.answer_type at\r\n"
  442. + " ON cq.answer_type_id = at.answer_type_id \r\n"
  443. + "LEFT JOIN gcc_1913_campaign.campaign_answers ca\r\n"
  444. + " ON cq.question_id = ca.question_id\r\n"
  445. + "WHERE cr.campaign_id = ?";
  446. List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, campaign_id);
  447. // Group answers by question_id
  448. Map<Long, Map<String, Object>> groupedData = new LinkedHashMap();
  449. for (Map<String, Object> row : results) {
  450. Object questionIdObj = row.get("question_id");
  451. Long questionId = null;
  452. // Convert Integer to Long if needed
  453. if (questionIdObj instanceof Integer) {
  454. questionId = ((Integer) questionIdObj).longValue();
  455. } else if (questionIdObj instanceof Long) {
  456. questionId = (Long) questionIdObj;
  457. }
  458. if (questionId == null) continue;
  459. if (!groupedData.containsKey(questionId)) {
  460. // Ensure `campaign_answer` is initialized correctly
  461. List<String> answers = new ArrayList<>();
  462. if (row.get("campaign_answer") != null) {
  463. answers.add(row.get("campaign_answer").toString());
  464. }
  465. row.put("campaign_answer", answers);
  466. groupedData.put(questionId, row);
  467. } else {
  468. // Append the answer to the existing question
  469. List<String> answers = (List<String>) groupedData.get(questionId).get("campaign_answer");
  470. if (row.get("campaign_answer") != null) {
  471. answers.add(row.get("campaign_answer").toString());
  472. }
  473. }
  474. }
  475. return new ArrayList<>(groupedData.values());
  476. }
  477. //question and answers counts with percentage in report page method
  478. public List<Map<String, Object>> getQuestionAnswers(int campaignId) {
  479. String sql = "SELECT cq.question_id, cq.questions, ca.campaign_answer, " +
  480. "COUNT(qa.campaign_answer) AS answer_count, " +
  481. "FLOOR(IFNULL((COUNT(qa.campaign_answer) / " +
  482. "(SELECT COUNT(*) FROM gcc_1913_campaign.upload_data " +
  483. "WHERE campaign_id = cq.campaign_id AND call_status = 'INFORMATION GIVEN') * 100), 0)) AS answer_percentage " +
  484. "FROM campaign_questions cq " +
  485. "JOIN campaign_answers ca ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id " +
  486. "LEFT JOIN questions_answers qa ON cq.question_id = qa.question_id AND ca.campaign_answer = qa.campaign_answer AND cq.campaign_id = qa.campaign_id " +
  487. "WHERE cq.campaign_id = ? AND cq.isactive = 1 AND cq.isdelete = 0 " +
  488. "GROUP BY cq.question_id, cq.questions, ca.campaign_answer " +
  489. "ORDER BY cq.question_id;";
  490. List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, campaignId);
  491. Map<Integer, Map<String, Object>> responseMap = new LinkedHashMap<>();
  492. for (Map<String, Object> row : result) {
  493. int questionId = (int) row.get("question_id");
  494. if (!responseMap.containsKey(questionId)) {
  495. Map<String, Object> questionData = new HashMap<>();
  496. questionData.put("question_id", questionId);
  497. questionData.put("questions", row.get("questions"));
  498. questionData.put("answers", new ArrayList<>());
  499. responseMap.put(questionId, questionData);
  500. }
  501. Map<String, Object> answerData = new HashMap<>();
  502. answerData.put("campaign_answer", row.get("campaign_answer"));
  503. answerData.put("answer_count", row.get("answer_count"));
  504. answerData.put("answer_percentage", row.get("answer_percentage"));
  505. ((List<Map<String, Object>>) responseMap.get(questionId).get("answers")).add(answerData);
  506. }
  507. return new ArrayList<>(responseMap.values());
  508. }
  509. //////////////dizo//////////////
  510. public int closeCampaign(int campaignId) {
  511. String sql = "UPDATE gcc_1913_campaign.campaign_request SET campaign_status = 'CLOSED' WHERE campaign_id = ?";
  512. int rowsAffected = jdbcTemplate.update(sql, campaignId);
  513. if (rowsAffected == 0) {
  514. System.out.println("Failed to update. Check if campaignId exists: " + campaignId);
  515. } else {
  516. System.out.println("Campaign ID " + campaignId + " successfully updated to CLOSED.");
  517. }
  518. return rowsAffected;
  519. }
  520. public int autoCloseExpiredCampaigns() {
  521. String sql = "UPDATE gcc_1913_campaign.campaign_request " +
  522. "SET campaign_status = 'CLOSED' " +
  523. "WHERE campaign_status = 'ONGOING' AND end_date < CURRENT_DATE";
  524. int rowsAffected = jdbcTemplate.update(sql);
  525. if (rowsAffected == 0) {
  526. System.out.println("No expired campaigns found to close.");
  527. } else {
  528. System.out.println(rowsAffected + " campaigns successfully updated to CLOSED.");
  529. }
  530. return rowsAffected;
  531. }
  532. // Scheduled job to run daily at midnight
  533. /*
  534. * @Scheduled(cron = "0 0 0 * * ?") public void scheduledAutoClose() {
  535. * System.out.println("Running scheduled auto-close for expired campaigns...");
  536. * autoCloseExpiredCampaigns(); }
  537. */
  538. }