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

package in.gov.chennaicorporation.gccoffice.callcenter.service;
import java.io.File;
import java.io.IOException;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Service
public class CampaignService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSourcemysql(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
public void setDataSource2(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
private JdbcTemplate jdbcTemplate2;
//Method to save file and return its URL
public String saveFile(MultipartFile file) {
String fileName = file.getOriginalFilename();
String filePath = "/uploads/" + fileName; // Path to save the file
try {
File destinationFile = new File(filePath);
file.transferTo(destinationFile); // Save the file locally
} catch (IOException e) {
throw new RuntimeException("Failed to store file " + fileName, e);
}
return filePath; // Return the file path (URL) for saving to the database
}
//Method to save campaign details into the database
public void saveCampaignDetails(Map<String, Object> campaignDetails) {
String sql = "UPDATE gcc_1913_campaign.campaign_request " +
"SET start_date = :start_date, " +
"end_date = :end_date, " +
"calls_per_agent = :calls_per_agent, " +
"description = :description " +
"WHERE campaign_id = :campaign_id";
// Using NamedParameterJdbcTemplate for mapping campaignDetails into query
NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
namedJdbcTemplate.update(sql, campaignDetails);
}
// Method to save campaign details into the database
public String saveCampaignDetailsExcel(Map<String, Object> campaignDetailsExcel) {
campaignDetailsExcel.putIfAbsent("campaign_status", "PENDING");
String sql = "INSERT INTO gcc_1913_campaign.campaign_request (campaign_name, category_id, excel_url,campaign_status) " +
"VALUES (:campaign_name, :category_id, :excel_url ,:campaign_status)";
// Using NamedParameterJdbcTemplate for mapping campaignDetails into query
NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
namedJdbcTemplate.update(sql, campaignDetailsExcel);
// Return the category to use in the next step
return campaignDetailsExcel.get("category_id").toString();
}
// campaign_status change as ongoing in campaign_request table
@Transactional
public void updateCampaignStatus(int campaignId, int categoryId) {
String checkSql = "SELECT COUNT(*) FROM gcc_1913_campaign.agent_assign "
+ "WHERE campaign_id = ? AND category_id = ? AND status = 'ASSIGNED'";
int assignedCount = jdbcTemplate.queryForObject(checkSql, Integer.class, campaignId, categoryId);
if (assignedCount > 0) {
String updateSql = "UPDATE gcc_1913_campaign.campaign_request "
+ "SET campaign_status = 'ONGOING' WHERE campaign_id = ? AND category_id = ?";
jdbcTemplate.update(updateSql, campaignId, categoryId);
System.out.println("Campaign status updated to ONGOING for campaign ID: " + campaignId);
} else {
System.out.println("No agents assigned yet. Campaign status remains PENDING.");
}
}
//Validated uploaded excel column count with field column in our DB
public List<String> getUploadDataFieldColumns() {
String query = "SELECT column_name FROM information_schema.columns "
+ "WHERE table_schema = 'gcc_1913_campaign' "
+ "AND table_name = 'upload_data' "
+ "AND column_name LIKE 'field_%'";
return jdbcTemplate.queryForList(query, String.class);
}
public String saveQuestionsAnswers(List<Map<String, Object>> questionsData) {
for (Map<String, Object> question : questionsData) {
String questionText = (String) question.get("question");
String answerType = (String) question.get("answerType");
// Validate and parse categoryId and campaignId
Integer categoryId = Integer.parseInt(question.get("categoryId").toString());
Integer campaignId = Integer.parseInt(question.get("campaignId").toString());
List<String> answers = (List<String>) question.get("answers");
// Insert question and get generated question_id
String questionInsertQuery = "INSERT INTO gcc_1913_campaign.campaign_questions (category_id, campaign_id, questions, answer_type_id) VALUES (?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(questionInsertQuery, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, categoryId);
ps.setInt(2, campaignId);
ps.setString(3, questionText);
ps.setString(4, answerType);
return ps;
}, keyHolder);
Integer questionId = keyHolder.getKey().intValue();
// Insert answers if available
if (answers != null && !answers.isEmpty()) {
String answerInsertQuery = "INSERT INTO gcc_1913_campaign.campaign_answers (category_id, campaign_id, question_id, campaign_answer) VALUES (?, ?, ?, ?)";
for (String answer : answers) {
jdbcTemplate.update(answerInsertQuery, categoryId, campaignId, questionId, answer);
}
}
}
return "Questions and Answers saved successfully!";
}
public void saveQuestionsAndAnswers(String category, String campaignId, String question, String answerType, List<String> answers) {
// Convert category and answerType to integers once to avoid redundant parsing
int categoryId = Integer.parseInt(category);
int answerTypeId = Integer.parseInt(answerType);
int campaignIdd = Integer.parseInt(campaignId);
// Query to insert question into campaign_questions and retrieve generated question_id
String query1 = "INSERT INTO gcc_1913_campaign.campaign_questions (category_id, campaign_id, questions, answer_type_id) VALUES (?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(query1, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, categoryId);
ps.setInt(2, campaignIdd);
ps.setString(3, question);
ps.setInt(4, answerTypeId);
return ps;
}, keyHolder);
int questionId = keyHolder.getKey().intValue();
// If answerType is NOT "Text" (ID = 1), save answers
if (answerTypeId != 1 && answers != null && !answers.isEmpty()) {
String query2 = "INSERT INTO gcc_1913_campaign.campaign_answers (category_id, campaign_id, question_id, campaign_answer) VALUES (?, ?, ?, ?)";
for (String answer : answers) {
jdbcTemplate.update(query2, categoryId, campaignId, questionId, answer);
}
}
System.out.println("Inserted Question ID: " + questionId + " with Answers: " + (answers != null ? answers : "None"));
}
//
// public Map<String, Object> getCampaignDetailsById(Long campaign_id) {
// String sql = "SELECT * FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
// return jdbcTemplate.queryForMap(sql, campaign_id);
// }
public void updateCampaign(Long campaign_id, String end_date) {
String sql = "UPDATE gcc_1913_campaign.campaign_request SET end_date = ? WHERE campaign_id = ?";
jdbcTemplate.update(sql, end_date,campaign_id);
}
public List<Map<String, Object>> getCampaignDetails() {
String sql = "SELECT campaign_id, " +
" campaign_name, " +
" CONCAT(" +
" DATE_FORMAT(start_date, '%d/%m/%Y'), " +
" ' to ', " +
" DATE_FORMAT(end_date, '%d/%m/%Y')" +
" ) AS event_dates, " +
" no_of_agents, " +
" calls_per_agent, " +
" (no_of_agents)*(calls_per_agent) as total_calls, " +
" description " +
"FROM gcc_1913_campaign.campaign_request;";
List<Map<String, Object>> campaigns = jdbcTemplate.queryForList(sql);
return campaigns;
}
public List<Map<String, Object>> getLastRow()
{
String sqlQuery ="SELECT campaign_id\r\n"
+ "FROM gcc_1913_campaign.campaign_request\r\n"
+ "ORDER BY campaign_id DESC\r\n"
+ "LIMIT 1";
return jdbcTemplate.queryForList(sqlQuery);
}
public String getLastInsertedCategoryId() {
String sqlQuery = "SELECT category_id " +
"FROM gcc_1913_campaign.campaign_request " +
"ORDER BY campaign_id DESC " +
"LIMIT 1";
return jdbcTemplate.queryForObject(sqlQuery, String.class);
}
public Integer getLastInsertedCampaignId()
{
String sqlQuery ="SELECT campaign_id\r\n"
+ "FROM gcc_1913_campaign.campaign_request\r\n"
+ "ORDER BY campaign_id DESC\r\n"
+ "LIMIT 1";
return jdbcTemplate.queryForObject(sqlQuery,Integer.class);
}
public List<Map<String, Object>> getDetailsForStart()
{
String sqlQuery ="SELECT cr.campaign_id,cr.category_id,ca.category_name,cr.campaign_name,start_date\r\n"
+ "FROM gcc_1913_campaign.campaign_request cr \r\n"
+ "join gcc_1913_campaign.category ca ON cr.category_id = ca.category_id \r\n"
+ "where cr.campaign_status='ONGOING' AND cr.isactive='1' and cr.isdelete='0' \r\n"
+ "order by cr.campaign_id desc";
return jdbcTemplate.queryForList(sqlQuery);
}
public List<Map<String, Object>> getDataforAgents(int campaign_id, int calls_per_agent)
{
List<Map<String, Object>> assignedAgent_list =getAssignedAgentId(campaign_id);
List<Map<String, Object>> data_list =getDataId(campaign_id);
List<Map<String, Object>> task = getTask(assignedAgent_list,data_list,calls_per_agent,campaign_id);
// Perform the update query here
if (task != null && !task.isEmpty()) {
assignAgentIds(task);
updateAgentStatus(campaign_id);
}
return task;
}
//Method to update agent_id for each data_id in upload_data table
public void assignAgentIds(List<Map<String, Object>> taskList) {
String updateQuery = "UPDATE gcc_1913_campaign.upload_data SET agent_id = ? WHERE data_id = ? AND campaign_id = ?";
// Loop through each agent's task list
for (Map<String, Object> task : taskList) {
Integer agentId = (Integer) task.get("agent_id");
Integer campaignId = (Integer) task.get("campaign_id");
List<Integer> dataIds = (List<Integer>) task.get("data_ids");
// Update each data_id with the respective agent_id
for (Integer dataId : dataIds) {
jdbcTemplate.update(updateQuery, agentId, dataId, campaignId);
}
}
}
//Example update method
private void updateAgentStatus(int campaign_id) {
String updateQuery = "UPDATE gcc_1913_campaign.campaign_request SET isactive = '0', isdelete='1' WHERE campaign_id = ?";
jdbcTemplate.update(updateQuery, campaign_id);
}
private List<Map<String, Object>> getTask(List<Map<String, Object>> assignedAgent_list, List<Map<String, Object>> data_list,
int calls_per_agent,int campaign_id) {
List<Map<String, Object>> result = new ArrayList<>();
int dataIndex = 0;
// Loop through each assigned ID
for (Map<String, Object> assigned : assignedAgent_list) {
// Create a map to store the assigned_id and corresponding data_ids
Map<String, Object> assignedTaskMap = new HashMap<>();
List<Integer> assignedDataIds = new ArrayList<>();
// Get assigned_id
Integer agent_id = (Integer) assigned.get("agent_id");
// Loop to assign the appropriate number of data IDs (calls_per_agent)
for (int i = 0; i < calls_per_agent; i++) {
if (dataIndex >= data_list.size()) {
// Exit if we run out of data IDs
break;
}
Map<String, Object> data = data_list.get(dataIndex);
Integer data_id = (Integer) data.get("data_id");
assignedDataIds.add(data_id);
dataIndex++;
}
// Put the agent_id and the corresponding data_ids in the map
assignedTaskMap.put("agent_id", agent_id);
assignedTaskMap.put("data_ids", assignedDataIds);
assignedTaskMap.put("campaign_id", campaign_id);
// Add the map to the result list
result.add(assignedTaskMap);
}
return result;
}
private List<Map<String, Object>> getDataId(int campaign_id) {
String sqlQuery ="SELECT data_id\r\n"
+ "from gcc_1913_campaign.upload_data\r\n"
+ "where campaign_id=?";
return jdbcTemplate.queryForList(sqlQuery, new Object[]{campaign_id});
}
private List<Map<String, Object>> getAssignedAgentId(int campaign_id) {
String sqlQuery ="SELECT agent_id\r\n"
+ "FROM gcc_1913_campaign.agent_assign \r\n"
+ "where campaign_id=? and isactive='1'";
return jdbcTemplate.queryForList(sqlQuery, new Object[]{campaign_id});
}
public List<Map<String, Object>> getActiveCampaigns()
{
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"
+ "FROM gcc_1913_campaign.campaign_request cr\r\n"
+ "JOIN gcc_1913_campaign.category c ON cr.category_id=c.category_id\r\n"
+ "where cr.isactive='1' and cr.campaign_status IN ('ONGOING', 'CLOSED') Order by cr.campaign_id desc";
return jdbcTemplate.queryForList(sqlQuery);
}
public List<Map<String, Object>> viewcampaignstatus(int campaign_id) {
String sqlQuery ="SELECT \r\n"
+ "aa.campaign_id as campaign_id,\r\n"
+ " al.agent_id as agent_id,\r\n"
+ " al.agent_name as agent_name,\r\n"
+ " COUNT(up.agent_id) AS Assigned_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) AS Complete_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 IS NULL THEN 1 END) AS Pending_count,\r\n"
+ " ROUND(\r\n"
+ " (COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) * 100) / \r\n"
+ " COUNT(up.agent_id)\r\n"
+ " ) as Percentage,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'INFORMATION_GIVEN' THEN 1 END) AS Information_Given_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'UNATTENDED' THEN 1 END) AS Unattended_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'CALL_BACK_LATER' THEN 1 END) AS Call_back_later_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'SWITCH_OFF' THEN 1 END) AS Switch_off_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'WRONG_NUMBER' THEN 1 END) AS Wrong_number_count\r\n"
+ "FROM gcc_1913_campaign.agent_assign aa\r\n"
+ "JOIN gcc_1913_qaqc.agents_list al ON al.agent_id = aa.agent_id\r\n"
+ "JOIN gcc_1913_campaign.upload_data up ON up.agent_id = al.agent_id AND up.campaign_id = ?\r\n"
+ "WHERE aa.campaign_id = ? AND aa.isactive = '1'\r\n"
+ "GROUP BY aa.campaign_id,al.agent_id, al.agent_name";
return jdbcTemplate.queryForList(sqlQuery,campaign_id,campaign_id);
}
public List<Map<String, Object>> viewcompletedby(int campaign_id, int agent_id) {
String sqlQuery ="SELECT \r\n"
+ "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"
+ "count(cl.data_id) as call_count,updated_date as updated_date,field_15 as remarks\r\n"
+ "FROM gcc_1913_campaign.agent_assign aa\r\n"
+ "JOIN gcc_1913_campaign.upload_data up ON up.agent_id = aa.agent_id AND up.campaign_id = ?\r\n"
+ "JOIN gcc_1913_campaign.call_logs cl ON cl.data_id=up.data_id\r\n"
+ "WHERE aa.campaign_id = ? AND aa.isactive = '1' AND aa.agent_id=? AND up.field_14 IS NOT NULL\r\n"
+ "group by up.data_id,up.field_1, up.field_2";
return jdbcTemplate.queryForList(sqlQuery,campaign_id,campaign_id,agent_id);
}
public String getExcelUrlByCampaignId(int lastId) {
String sqlQuery = "SELECT excel_url FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
return jdbcTemplate.queryForObject(sqlQuery, String.class, lastId);
}
public void saveUploadData(String category, int campaignId, Map<String, Object> rowData, List<String> expectedHeaders) {
int fieldCount = rowData.size();
List<String> columnNames = new ArrayList<>();
for (int i = 1; i <= fieldCount; i++) {
columnNames.add("field_" + i);
}
String columnNamesString = String.join(", ", columnNames);
String placeholders = columnNames.stream().map(col -> "?").collect(Collectors.joining(", "));
String sql = "INSERT INTO gcc_1913_campaign.upload_data (category_id, campaign_id, " + columnNamesString + ") VALUES (?, ?, " + placeholders + ")";
//System.out.println("SQL Query========= " + sql);
List<Object> values = new ArrayList<>();
values.add(category);
values.add(campaignId);
// Ensure rowData values are ordered based on expected headers
for (String header : expectedHeaders) {
values.add(rowData.getOrDefault(header, "")); // Ensures the correct mapping
}
final Logger logger = LoggerFactory.getLogger(CampaignService.class);
try {
jdbcTemplate.update(sql, values.toArray());
} catch (Exception e) {
logger.error("Error inserting upload data for campaign {}: {}", campaignId, e.getMessage());
}
}
// public void saveUploadData(String category, int campaignId, Map<String, Object> rowData) {
// // Get total number of fields in the row
// int fieldCount = rowData.size();
//
// // Generate dynamic column names as field_1, field_2, ..., field_N
// List<String> columnNames = new ArrayList<>();
// for (int i = 1; i <= fieldCount; i++) {
// columnNames.add("field_" + i);
// }
//
// // Build dynamic SQL query
// String columnNamesString = String.join(", ", columnNames);
// String placeholders = columnNames.stream().map(col -> "?").collect(Collectors.joining(", "));
//
// String sql = "INSERT INTO upload_data (category_id, campaign_id, " + columnNamesString + ") VALUES (?, ?, " + placeholders + ")";
//
// System.out.println("SQL Query========= " + sql);
//
// // Prepare values list
// List<Object> values = new ArrayList<>();
// values.add(category);
// values.add(campaignId);
// values.addAll(rowData.values()); // Add row data values dynamically
//
//
//
// final Logger logger = LoggerFactory.getLogger(CampaignService.class);
// try {
// jdbcTemplate.update(sql, values.toArray());
// } catch (Exception e) {
// logger.error("Error inserting upload data for campaign {}: {}", campaignId, e.getMessage());
// }
// }
//Agent List
public List<Map<String, Object>> getAllAgents() {
String sql = "SELECT agent_id, agent_name FROM gcc_1913_qaqc.agents_list WHERE calling_type = 'OUTBOUND' AND isactive = '1'";
return jdbcTemplate.queryForList(sql);
}
//count based on total, completed and pending
public Map<String, Object> getCampaignStatistics(int campaignId) {
Map<String, Object> result = new HashMap<>();
// Total Count
String totalQuery = "SELECT COUNT(*) AS total FROM gcc_1913_campaign.upload_data WHERE campaign_id = ?";
int totalCount = jdbcTemplate.queryForObject(totalQuery, Integer.class, campaignId);
result.put("totalCount", totalCount);
// Completed Count (agent_id is not null and call_status is null)
String completedQuery = "SELECT COUNT(*) AS completed FROM gcc_1913_campaign.upload_data ud\r\n"
+ "JOIN gcc_1913_campaign.campaign_request cr ON ud.campaign_id = cr.campaign_id\r\n"
+ "WHERE ud.campaign_id = ? AND cr.campaign_status = 'ONGOING' AND ud.agent_id IS NOT NULL AND\r\n"
+ "( ud.call_status NOT IN ('CALL BACK LATER','UNATTENDED'))";
int completedCount = jdbcTemplate.queryForObject(completedQuery, Integer.class, campaignId);
result.put("completedCount", completedCount);
// Pending Count (agent_id is not null and call_status is not null)
String pendingQuery = "SELECT COUNT(*) AS pending FROM gcc_1913_campaign.upload_data ud\r\n"
+ "JOIN gcc_1913_campaign.campaign_request cr ON ud.campaign_id = cr.campaign_id\r\n"
+ "WHERE ud.campaign_id = ? AND ud.agent_id IS NOT NULL \r\n"
+ "AND (ud.call_status IS NULL OR ud.call_status IN ('CALL BACK LATER','UNATTENDED'))";
int pendingCount = jdbcTemplate.queryForObject(pendingQuery, Integer.class, campaignId);
result.put("pendingCount", pendingCount);
return result;
}
public List<Map<String, Object>> getCampaignDetailsById(Long campaign_id) {
String sql = "SELECT \r\n"
+ " cr.campaign_id, \r\n"
+ " cr.campaign_name, \r\n"
+ " cr.category_id, \r\n"
+ " cr.start_date, \r\n"
+ " cr.end_date, \r\n"
+ " cr.calls_per_agent, \r\n"
+ " cr.description, \r\n"
+ " cr.created_date, \r\n"
+ " cr.excel_url, \r\n"
+ " cr.isactive, \r\n"
+ " cr.isdelete, \r\n"
+ " cr.campaign_status, \r\n"
+ " cq.question_id, \r\n"
+ " cq.questions, \r\n"
+ " cq.answer_type_id, \r\n"
+ " at.type_name, \r\n"
+ " ca.id AS answer_id, \r\n"
+ " ca.campaign_answer\r\n"
+ "FROM gcc_1913_campaign.campaign_request cr\r\n"
+ "JOIN gcc_1913_campaign.campaign_questions cq \r\n"
+ " ON cr.campaign_id = cq.campaign_id\r\n"
+ "LEFT JOIN gcc_1913_campaign.answer_type at\r\n"
+ " ON cq.answer_type_id = at.answer_type_id \r\n"
+ "LEFT JOIN gcc_1913_campaign.campaign_answers ca\r\n"
+ " ON cq.question_id = ca.question_id\r\n"
+ "WHERE cr.campaign_id = ?";
List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, campaign_id);
// Group answers by question_id
Map<Long, Map<String, Object>> groupedData = new LinkedHashMap();
for (Map<String, Object> row : results) {
Object questionIdObj = row.get("question_id");
Long questionId = null;
// Convert Integer to Long if needed
if (questionIdObj instanceof Integer) {
questionId = ((Integer) questionIdObj).longValue();
} else if (questionIdObj instanceof Long) {
questionId = (Long) questionIdObj;
}
if (questionId == null) continue;
if (!groupedData.containsKey(questionId)) {
// Ensure `campaign_answer` is initialized correctly
List<String> answers = new ArrayList<>();
if (row.get("campaign_answer") != null) {
answers.add(row.get("campaign_answer").toString());
}
row.put("campaign_answer", answers);
groupedData.put(questionId, row);
} else {
// Append the answer to the existing question
List<String> answers = (List<String>) groupedData.get(questionId).get("campaign_answer");
if (row.get("campaign_answer") != null) {
answers.add(row.get("campaign_answer").toString());
}
}
}
return new ArrayList<>(groupedData.values());
}
//question and answers counts with percentage in report page method
public List<Map<String, Object>> getQuestionAnswers(int campaignId) {
String sql = "SELECT cq.question_id, cq.questions, ca.campaign_answer, " +
"COUNT(qa.campaign_answer) AS answer_count, " +
"FLOOR(IFNULL((COUNT(qa.campaign_answer) / " +
"(SELECT COUNT(*) FROM gcc_1913_campaign.upload_data " +
"WHERE campaign_id = cq.campaign_id AND call_status = 'INFORMATION GIVEN') * 100), 0)) AS answer_percentage " +
"FROM campaign_questions cq " +
"JOIN campaign_answers ca ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id " +
"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 " +
"WHERE cq.campaign_id = ? AND cq.isactive = 1 AND cq.isdelete = 0 " +
"GROUP BY cq.question_id, cq.questions, ca.campaign_answer " +
"ORDER BY cq.question_id;";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, campaignId);
Map<Integer, Map<String, Object>> responseMap = new LinkedHashMap<>();
for (Map<String, Object> row : result) {
int questionId = (int) row.get("question_id");
if (!responseMap.containsKey(questionId)) {
Map<String, Object> questionData = new HashMap<>();
questionData.put("question_id", questionId);
questionData.put("questions", row.get("questions"));
questionData.put("answers", new ArrayList<>());
responseMap.put(questionId, questionData);
}
Map<String, Object> answerData = new HashMap<>();
answerData.put("campaign_answer", row.get("campaign_answer"));
answerData.put("answer_count", row.get("answer_count"));
answerData.put("answer_percentage", row.get("answer_percentage"));
((List<Map<String, Object>>) responseMap.get(questionId).get("answers")).add(answerData);
}
return new ArrayList<>(responseMap.values());
}
//////////////dizo//////////////
public int closeCampaign(int campaignId) {
String sql = "UPDATE gcc_1913_campaign.campaign_request SET campaign_status = 'CLOSED' WHERE campaign_id = ?";
int rowsAffected = jdbcTemplate.update(sql, campaignId);
if (rowsAffected == 0) {
System.out.println("Failed to update. Check if campaignId exists: " + campaignId);
} else {
System.out.println("Campaign ID " + campaignId + " successfully updated to CLOSED.");
}
return rowsAffected;
}
public int autoCloseExpiredCampaigns() {
String sql = "UPDATE gcc_1913_campaign.campaign_request " +
"SET campaign_status = 'CLOSED' " +
"WHERE campaign_status = 'ONGOING' AND end_date < CURRENT_DATE";
int rowsAffected = jdbcTemplate.update(sql);
if (rowsAffected == 0) {
System.out.println("No expired campaigns found to close.");
} else {
System.out.println(rowsAffected + " campaigns successfully updated to CLOSED.");
}
return rowsAffected;
}
// Scheduled job to run daily at midnight
/*
* @Scheduled(cron = "0 0 0 * * ?") public void scheduledAutoClose() {
* System.out.println("Running scheduled auto-close for expired campaigns...");
* autoCloseExpiredCampaigns(); }
*/
}