From 6f4f6a7a69a74fbd5033fe2022bff652aa6b950d Mon Sep 17 00:00:00 2001 From: yoganandhan Date: Tue, 8 Apr 2025 13:26:10 +0530 Subject: [PATCH] first commit --- .../controller/AgentAssignAPIController.java | 112 + .../controller/AgentsAPIController.java | 320 +++ .../controller/AttendanceAPIController.java | 36 + .../controller/CampaignAPIController.java | 614 ++++++ .../CampaignDropdownApiController.java | 29 + .../CampaignReportAPIController.java | 100 + .../controller/CategoryAPIController.java | 281 +++ .../callcenter/controller/MainController.java | 219 ++ .../controller/WhatsappController.java | 26 + .../service/AddcategoryServices.java | 303 +++ .../service/AgentAssignService.java | 214 ++ backend/callcenter/service/AgentsService.java | 656 ++++++ .../callcenter/service/AttendanceService.java | 116 + .../service/CampaignDropdownApiService.java | 29 + .../service/CampaignReportService.java | 334 +++ .../callcenter/service/CampaignService.java | 704 ++++++ .../service/WhatsappMsgService.java | 40 + frontend/callcenter/addcategory.html | 974 ++++++++ frontend/callcenter/agentscampaign.html | 1807 +++++++++++++++ frontend/callcenter/attendancereport.html | 230 ++ frontend/callcenter/campaignlist.html | 1256 +++++++++++ frontend/callcenter/campaignreport.html | 954 ++++++++ frontend/callcenter/createcampaign.html | 1956 +++++++++++++++++ .../gcc_1913_campaign_agent_assign.sql | 56 + .../gcc_1913_campaign_answer_type.sql | 54 + .../gcc_1913_campaign_call_logs.sql | 55 + .../gcc_1913_campaign_calls_status.sql | 54 + .../gcc_1913_campaign_campaign_answers.sql | 56 + .../gcc_1913_campaign_campaign_questions.sql | 56 + .../gcc_1913_campaign_campaign_request.sql | 61 + .../gcc_1913_campaign_category.sql | 53 + .../gcc_1913_campaign_category_columns.sql | 54 + .../gcc_1913_campaign_questions_answers.sql | 55 + .../gcc_1913_campaign_upload_data.sql | 73 + 34 files changed, 11937 insertions(+) create mode 100644 backend/callcenter/controller/AgentAssignAPIController.java create mode 100644 backend/callcenter/controller/AgentsAPIController.java create mode 100644 backend/callcenter/controller/AttendanceAPIController.java create mode 100644 backend/callcenter/controller/CampaignAPIController.java create mode 100644 backend/callcenter/controller/CampaignDropdownApiController.java create mode 100644 backend/callcenter/controller/CampaignReportAPIController.java create mode 100644 backend/callcenter/controller/CategoryAPIController.java create mode 100644 backend/callcenter/controller/MainController.java create mode 100644 backend/callcenter/controller/WhatsappController.java create mode 100644 backend/callcenter/service/AddcategoryServices.java create mode 100644 backend/callcenter/service/AgentAssignService.java create mode 100644 backend/callcenter/service/AgentsService.java create mode 100644 backend/callcenter/service/AttendanceService.java create mode 100644 backend/callcenter/service/CampaignDropdownApiService.java create mode 100644 backend/callcenter/service/CampaignReportService.java create mode 100644 backend/callcenter/service/CampaignService.java create mode 100644 backend/callcenter/service/WhatsappMsgService.java create mode 100644 frontend/callcenter/addcategory.html create mode 100644 frontend/callcenter/agentscampaign.html create mode 100644 frontend/callcenter/attendancereport.html create mode 100644 frontend/callcenter/campaignlist.html create mode 100644 frontend/callcenter/campaignreport.html create mode 100644 frontend/callcenter/createcampaign.html create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_agent_assign.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_answer_type.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_call_logs.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_calls_status.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_campaign_answers.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_campaign_questions.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_campaign_request.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_category.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_category_columns.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_questions_answers.sql create mode 100644 gcc_campaign_empty_dump/gcc_1913_campaign_upload_data.sql diff --git a/backend/callcenter/controller/AgentAssignAPIController.java b/backend/callcenter/controller/AgentAssignAPIController.java new file mode 100644 index 0000000..9f3ade5 --- /dev/null +++ b/backend/callcenter/controller/AgentAssignAPIController.java @@ -0,0 +1,112 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentAssignService; + + +@RequestMapping("/gcc/api/callcenter/admin") +@RestController("callcentercontroller") +public class AgentAssignAPIController +{ + private AgentAssignService campaignmaster; + + @Autowired + public AgentAssignAPIController(AgentAssignService campaignmaster) { + this.campaignmaster = campaignmaster; + } + + @GetMapping("/getcategory") + public List> getcategory() + { + return campaignmaster.getcategory(); + } + + @GetMapping("/getcampaignbycategory") + public List> getcampaignbycategory(@RequestParam int id) + { + return campaignmaster.getcampaignbycategory(id); + } + +// @GetMapping("/getcampaignbyid") +// public List> getcampaignbyid(@RequestParam int id) +// { +// return campaignmaster.getcampaignbyid(id); +// } + + @GetMapping("/getagentsfortask") + public List> getagentsfortask(@RequestParam int id) + { + return campaignmaster.getagentsfortask(id); + } + + @PostMapping("/addagentsfortask") + public ResponseEntity>> addagentsfortask(@RequestBody List> requestList) { + //System.out.println("Received POST request with data: " + requestList); + + List> insertedAgents = new ArrayList<>(); // To store successfully inserted agents + + try { + for (Map request : requestList) { + int agentId = (int) request.get("agentId"); + int categoryId = (int) request.get("categoryId"); + int campaignId = (int) request.get("campaignId"); + + // Call the service method to insert the agent details + int rowsAffected = campaignmaster.addagentsfortask(agentId, categoryId, campaignId); + + if (rowsAffected > 0) { + // If the insert was successful, add the agent data to the response list + Map insertedAgent = new HashMap<>(); + insertedAgent.put("categoryId", categoryId); + insertedAgent.put("campaignId", campaignId); + insertedAgent.put("agentId", agentId); + + insertedAgents.add(insertedAgent); // Add the successfully inserted agent to the list + } else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonList(Collections.singletonMap("error", "Failed to add agent for campaignId: " + campaignId))); + } + } + + // Return the list of successfully inserted agents + return ResponseEntity.status(HttpStatus.CREATED).body(insertedAgents); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Collections.singletonList(Collections.singletonMap("error", "Invalid request data: " + e.getMessage()))); + } + } + + @GetMapping("/getassignedcampaign") + public List> checkcampaigninassignedtable(@RequestParam int id) + { + return campaignmaster.checkcampaigninassignedtable(id); + } + + @GetMapping("/deleteassignedbyid") + public int editagentsfortask(@RequestParam int id) + { + return campaignmaster.editagentsfortask(id); + } + + @GetMapping("/getcampaignbyid") + public List> getcampaignquestionbyid(@RequestParam int id){ + return campaignmaster.getcampaignquestionbyid(id); + } +} diff --git a/backend/callcenter/controller/AgentsAPIController.java b/backend/callcenter/controller/AgentsAPIController.java new file mode 100644 index 0000000..c6e5cff --- /dev/null +++ b/backend/callcenter/controller/AgentsAPIController.java @@ -0,0 +1,320 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentsService; + +@RequestMapping("/gcc/api/agents") +@RestController +public class AgentsAPIController { + + @Autowired + private AgentsService agentsService; + + @GetMapping("/excel") + public List> fetchDataFromExcel(@RequestParam int categoryId,@RequestParam Long campaignId) { + try { + return agentsService.fetchDataFromExcel(categoryId,campaignId); + } catch (IOException e) { + e.printStackTrace(); + return null; // Handle the exception as needed + } + } + + + @PostMapping("/saveExcelData") + public String saveExcelData( @RequestParam int categoryId,@RequestParam Long campaignId,@RequestParam String filePath) { + + try { + // Fetch data from Excel + List> excelData = agentsService.getExcelData(categoryId,campaignId, filePath); + // Save data into the database + agentsService.saveExcelData(excelData); + return "Data saved successfully"; + } catch (IOException e) { + e.printStackTrace(); + return "Failed to save data"; + } + } + + @GetMapping("/getdataByIds") + public List> getdataByIds(@RequestParam List ids) { + return agentsService.getdataByIds(ids); + } + + @GetMapping("/getPendingDataByIds") + public List> getPendingDataByIds(@RequestParam List ids) { + return agentsService.getPendingDataByIds(ids); + } + + + +// @PostMapping("/updatecall") +// public ResponseEntity updatecall(@RequestBody Map callData) +// { +// String call_status = (String) callData.get("call_status"); +// int data_id = (int) callData.get("data_id"); +// int agent_id=(int) callData.get("agent_id"); +// int campaign_id=(int) callData.get("campaign_id"); +// +// if (call_status == null || call_status.isEmpty()) { +// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Call status is required."); +// } +// +// agentsService.saveInLogsTable(campaign_id, agent_id, data_id,call_status); +// +// return ResponseEntity.ok("Data Inserted successfully."); +// } + + @GetMapping("/getAgentNames") + public List> getAgentsNameById(@RequestParam List agentIds){ + return agentsService.getAgentsNameById(agentIds); + } + + @GetMapping("/getDataFields") + public List> getDataDetailsById( + @RequestParam String originalDataIds) throws JsonProcessingException { + + // Parse originalDataIds from JSON string + ObjectMapper objectMapper = new ObjectMapper(); + List> originalDataIdsList = objectMapper.readValue(originalDataIds, new TypeReference>>() {}); + + // Prepare a list to hold the results for each sub-array + List> groupedResults = new ArrayList<>(); + + // Iterate through each sub-array of originalDataIds + for (List dataIds : originalDataIdsList) { + List> results = agentsService.getDataDetailsById(dataIds); + // Group results according to your business logic + Map combinedResult = new HashMap<>(); + for (Map result : results) { + combinedResult.putAll(result); + } + groupedResults.add(combinedResult); + } + + return groupedResults; + } + + + @GetMapping("/getCompletedDataFields") + public Map getCompletedDataDetailsById( + @RequestParam String originalCDataIds) throws JsonProcessingException { + + // Parse originalDataIds from JSON string + ObjectMapper objectMapper = new ObjectMapper(); + List originalCDataIdsList = objectMapper.readValue(originalCDataIds, new TypeReference>() {}); + + // Prepare a list to hold the results for each sub-array + //List> groupedCompletedResults = new ArrayList<>(); + List completedDataIds = new ArrayList<>(); // List to hold data_ids with Complete_count > 0 + + // Iterate through each sub-array of originalDataIds + + List> results = agentsService.getCompletedDataDetailsById(originalCDataIdsList); + // Group results according to your business logic + //Map CompletedcombinedResult = new HashMap<>(); + for (Map result : results) { + + if (result.get("Complete_count") != null && ((Number) result.get("Complete_count")).intValue() > 0) { + completedDataIds.add((Integer) result.get("data_id")); + } + //groupedCompletedResults.add(result); + } + + + + // Prepare the final response containing grouped results and completed dataIds + Map response = new HashMap<>(); + //response.put("groupedCompletedResults", groupedCompletedResults); + response.put("completedDataIds", completedDataIds); + return response; + } + + @GetMapping("/getCompletedDataById") + public List> getCompletedDataById(@RequestParam List completedDataIds){ + return agentsService.getCompletedDataById(completedDataIds); + } + + + @PostMapping("/furtherAssignedAgents") + public ResponseEntity> updateAgentAssigndata( + @RequestBody Map requestData) { + + String campaign_id = (String) requestData.get("campaign_id"); + String category_id = (String) requestData.get("category_id"); + String call_per_agent = (String) requestData.get("call_per_agent"); + + + + + + // Correct key name for selected agents + List selectedAgentsList = (List) requestData.get("selected_agents"); + + //System.out.println("campaign_id=" + campaign_id); + //System.out.println("category_id=" + category_id); + //System.out.println("call_per_agent=" + call_per_agent); + //System.out.println("selectedAgentsList=" + selectedAgentsList); + + int campaignId = Integer.parseInt(campaign_id); + int categoryId = Integer.parseInt(category_id); + int callperagent = Integer.parseInt(call_per_agent); + + agentsService.resetAgentAssignmentForNextDay(categoryId,campaignId); + + int calls_assign = callperagent * selectedAgentsList.size(); + //System.out.println("calls_assign== " + calls_assign); + + List DataIds=agentsService.getDataIdForFurtherAssign(categoryId, campaignId); + //System.out.println("dataids=== " + DataIds); + + if (!DataIds.isEmpty()) { + int dataIndex = 0; // Initialize data index pointer + + for (String agentId : selectedAgentsList) { + int selectedAgentId = Integer.parseInt(agentId); + + agentsService.addAgentsForCampaign(selectedAgentId, categoryId, campaignId); + + // Iterate for noOfCalls times and assign data IDs to the current agent + for (int i = 0; i < callperagent && dataIndex < DataIds.size(); i++, dataIndex++) { + int DataId = DataIds.get(dataIndex); + + agentsService.updateAgentForCampaign( + selectedAgentId, + categoryId, + campaignId, + DataId + ); + } + } + + } + else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Map.of("status", "error", "message", "No data available for Further assign.")); + } + + return ResponseEntity.ok(Map.of("status", "success", "message", "Campaign details saved successfully")); + } + + + + ////////////////////Ajith code////////////////////// + + @GetMapping("/Campaignview") + public ResponseEntity getCampaignview(@RequestParam int categoryId, @RequestParam int agentId, @RequestParam int dataId) { + try { + List> response = agentsService.getFilteredFields(categoryId, agentId, dataId); + + if (response.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No matching data found."); + } + + return ResponseEntity.ok(response); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + e.getMessage()); + } + } + + + + @GetMapping("/questions") + public List> getCampaignQuestions( + @RequestParam int categoryId, + @RequestParam int campaignId) { + + return agentsService.getCampaignQuestions(categoryId, campaignId); + } + + @GetMapping("/fetchAnswer") + public List> fetchAnswer( + @RequestParam int campaignId, + @RequestParam int agentId, + @RequestParam int questionId, + @RequestParam int dataId) { + + return agentsService.FetchAnswer(campaignId,agentId,questionId,dataId); + } + + + @PostMapping("/submitAnswers") + public ResponseEntity submitAnswers(@RequestBody Map>> requestData) { + List> answers = requestData.get("answers"); + + if (answers == null || answers.isEmpty()) { + return ResponseEntity.badRequest().body("No answers provided."); + } + + agentsService.saveAnswers(answers); + return ResponseEntity.ok("Answers submitted successfully"); + } + + + @GetMapping("/callstatus") + public List> getCallStatus() { + //System.out.println("dropdown"); + return agentsService.getCallStatus(); + } + + @GetMapping("/checkCounts") + public List> checkCounts( + @RequestParam int campaignId, + @RequestParam int dataId) { + + return agentsService.checkCounts(campaignId,dataId); + } + + @PostMapping("/savecall") + public ResponseEntity savecall(@RequestBody Map callData) { + String call_status = (String) callData.get("call_status"); + String remarks = (String) callData.get("remarks"); + int data_id = Integer.parseInt(callData.get("data_id").toString()); + int agent_id = Integer.parseInt(callData.get("agent_id").toString()); + int campaign_id = Integer.parseInt(callData.get("campaign_id").toString()); + + // System.out.println("controler"); + //System.out.println(call_status); + + // Add a debug statement to check the received values + // System.out.println("Received call_status: " + call_status); + + if (call_status == null || call_status.isEmpty()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Call status is required."); + } + + + agentsService.saveCallLogs(call_status, remarks,data_id,agent_id); + + agentsService.saveInLogsTable(campaign_id, agent_id, data_id,call_status,remarks); + + return ResponseEntity.ok("Data Inserted successfully."); + } + + + + +} diff --git a/backend/callcenter/controller/AttendanceAPIController.java b/backend/callcenter/controller/AttendanceAPIController.java new file mode 100644 index 0000000..a0d8bca --- /dev/null +++ b/backend/callcenter/controller/AttendanceAPIController.java @@ -0,0 +1,36 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import in.gov.chennaicorporation.gccoffice.configuration.AppConfig; + +@RequestMapping("/gcc/api/attendance") +@RestController +public class AttendanceAPIController { + + private AppConfig appConfig; + private final RestTemplate restTemplate; + + @Autowired + public AttendanceAPIController(RestTemplate restTemplate, AppConfig appConfig) { + this.restTemplate = restTemplate; + this.appConfig = appConfig; + } + + + + @GetMapping("/getAttendancedetails") + public String getAttendancedetails(@RequestParam String fromDate,@RequestParam String toDate){ + String apiUrl = appConfig.attendanceReport + "/callcenter/api/attendance/getattendancereport"+"?fromDate="+ fromDate + "&toDate="+ toDate; + ResponseEntity responseEntity = restTemplate.getForEntity(apiUrl, String.class); + return responseEntity.getBody(); + } + + +} \ No newline at end of file diff --git a/backend/callcenter/controller/CampaignAPIController.java b/backend/callcenter/controller/CampaignAPIController.java new file mode 100644 index 0000000..ece8ad7 --- /dev/null +++ b/backend/callcenter/controller/CampaignAPIController.java @@ -0,0 +1,614 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import org.apache.poi.ss.usermodel.*; + + +import org.springframework.web.multipart.MultipartFile; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import org.springframework.jdbc.core.JdbcTemplate; + +import org.springframework.web.bind.annotation.GetMapping; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.AddcategoryServices; +import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentAssignService; +import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignService; + +@RestController("callcenterapicontroller") +@RequestMapping("gcc/api/campaign") +public class CampaignAPIController { + + @Autowired + private CampaignService campaignService; + + @Autowired + private AddcategoryServices addCategoryServices; // Injecting the service + + @Autowired + private AgentAssignService agentsAssignService; + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + private Environment environment; + + @GetMapping("/getCampaignDetails") + public ResponseEntity> getCampaignDetails() { + Map response = new HashMap<>(); + List> data = campaignService.getCampaignDetails(); + + response.put("data", data); + return ResponseEntity.ok(response); + } + + + // Endpoint to get campaign details by ID + @GetMapping("/getCampaignDetailsById") + public @ResponseBody List> getCampaignDetailsById(@RequestParam("campaign_id") Long campaignId) { + return campaignService.getCampaignDetailsById(campaignId); + } + + + @PostMapping("/updateCampaign") + public ResponseEntity updateCampaign( + @RequestBody Map requestData) { + + Long campaign_id = ((Number) requestData.get("campaign_id")).longValue(); + String end_date = (String) requestData.get("end_date"); + List> questionsData = + (List>) requestData.get("questionsData"); + + if (campaign_id == null) { + return ResponseEntity.badRequest().body("Campaign ID is required."); + } + + try { + // Update campaign details + campaignService.updateCampaign(campaign_id, end_date); + + // Save questions and answers + for (Map questionMap : questionsData) { + String category = (String) questionMap.get("category"); + String question = (String) questionMap.get("question"); + String answerType = (String) questionMap.get("answerType"); + List answers = (List) questionMap.get("answers"); + + if (category != null && question != null && answerType != null) { + campaignService.saveQuestionsAndAnswers( + category, + String.valueOf(campaign_id), // Corrected data type + question, + answerType, + answers + ); + } + } + + return ResponseEntity.ok("Campaign updated successfully."); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Error updating campaign: " + e.getMessage()); + } + } + + + + //save question and ansewers for campaign + @PostMapping("/saveQuestionsAndAnswers") + public ResponseEntity saveQuestions(@RequestBody List> requestData) { + String response = campaignService.saveQuestionsAnswers(requestData); + return ResponseEntity.ok(response); + } + + //save file and get path + private String saveFile(MultipartFile file) throws IOException { + + String uploadDirectory = environment.getProperty("file.upload.directory"); + + String folderName = environment.getProperty("campaign.foldername"); + + String fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + "_" + file.getOriginalFilename(); + + String folderPath = uploadDirectory + "/" + folderName + "/excel/"; + + + Path dirPath = Paths.get(folderPath); + if (!Files.exists(dirPath)) { + Files.createDirectories(dirPath); + } + + Path filePath = dirPath.resolve(fileName); + + Files.write(filePath, file.getBytes()); + + return filePath.toAbsolutePath().toString(); + } + + + //read uploaded excel data and make condition for each category uploading same excel columns are other some other? + private List> readExcelData(InputStream inputStream, List categoryColumns) throws IOException { + List> dataList = new ArrayList<>(); + + try (Workbook workbook = new XSSFWorkbook(inputStream)) { + Sheet sheet = workbook.getSheetAt(0); + FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); + + // Read header row from Excel + Row headerRow = sheet.getRow(0); + List excelHeaders = new ArrayList<>(); + for (Cell cell : headerRow) { + excelHeaders.add(cell.getStringCellValue().trim()); + } + + // Compare Excel headers with category columns + if (!excelHeaders.containsAll(categoryColumns)) { + // throw new IllegalArgumentException("Excel data does not match the category columns."); + + } + + // Proceed with reading data only if headers match + for (Row row : sheet) { + if (row.getRowNum() == 0) continue; // Skip header row + + Map dataMap = new HashMap<>(); + for (Cell cell : row) { + String cellValue = ""; + switch (formulaEvaluator.evaluateInCell(cell).getCellType()) { + case STRING: + cellValue = cell.getStringCellValue(); + break; + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + cellValue = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue()); + } else { + // Check if value is an integer (whole number) + if (cell.getNumericCellValue() % 1 == 0) { + cellValue = String.valueOf((long) cell.getNumericCellValue()); // Format as integer + } else { + cellValue = String.valueOf(cell.getNumericCellValue()); // Keep decimal values as they are + } + } + break; + case BOOLEAN: + cellValue = String.valueOf(cell.getBooleanCellValue()); + break; + default: + cellValue = "Unknown"; + break; + } + // Map cell data to correct column name + dataMap.put(excelHeaders.get(cell.getColumnIndex()), cellValue); + } + + if (!dataMap.isEmpty()) { + dataList.add(dataMap); + } + } + } + + return dataList; + } + + + + + + + @GetMapping("/getExcelData") + public ResponseEntity>> getExcelData(@RequestParam("filePath") String filePath) { + try { + // Read data from the uploaded Excel file + List> excelData = readExcelData(new FileInputStream(filePath), null); + + // Return data as JSON + return ResponseEntity.ok(excelData); + + } catch (IOException e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + + + @GetMapping("/getlastCampaignid") + public List> getLastRow() + { + return campaignService.getLastRow(); + } + + @GetMapping("/startcampaign") + public List> getDataforAgents(@RequestParam int campaign_id,@RequestParam int calls_per_agent) + { + return campaignService.getDataforAgents(campaign_id, calls_per_agent); + } + + @GetMapping("/viewcampaignstatus") + public List> viewcampaignstatus(@RequestParam int campaign_id) + { + return campaignService.viewcampaignstatus(campaign_id); + } + + @GetMapping("/viewcompletedby") + public List> viewcompletedby(@RequestParam int campaign_id,@RequestParam int agent_id) + { + return campaignService.viewcompletedby(campaign_id,agent_id); + } + + + + + + @PostMapping(value = "/savecampaign", consumes = {"multipart/form-data"}) + public ResponseEntity> saveCampaign( + @RequestParam String campaignId, + @RequestParam String categoryId, + @RequestParam String eventStartDate, + @RequestParam String eventEndDate, + @RequestParam int noOfCalls, + @RequestParam String description, + @RequestParam(required = false) String questionsData, // JSON as String + @RequestParam(required = false) String selectedAgents // JSON string + ) { + + + // Convert JSON strings to List objects + List> questionsDataList = new ArrayList<>(); + List selectedAgentsList = new ArrayList<>(); + + try { + if (questionsData != null) { + questionsDataList = new ObjectMapper().readValue(questionsData, new TypeReference>>() {}); + } + + if (selectedAgents != null) { + selectedAgentsList = new ObjectMapper().readValue(selectedAgents, new TypeReference>() {}); + } + } catch (JsonProcessingException e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(Map.of("status", "error", "message", "Invalid JSON format in request data")); + } + + // Campaign Details Mapping + Map campaignDetails = new HashMap<>(); + campaignDetails.put("campaign_id", campaignId); + campaignDetails.put("category_id", categoryId); + campaignDetails.put("start_date", eventStartDate); + campaignDetails.put("end_date", eventEndDate); + campaignDetails.put("calls_per_agent", noOfCalls); + campaignDetails.put("description", description); + + try { + campaignService.saveCampaignDetails(campaignDetails); + + // Step 3: Assign Agents for the Campaign + if (!selectedAgentsList.isEmpty()) { + int parsedCampaignId = Integer.parseInt(campaignId); + int parsedCategoryId = Integer.parseInt(categoryId); + + System.out.println("selectedAgentsList====== " + selectedAgentsList); + + int calls_assign = noOfCalls * selectedAgentsList.size(); + System.out.println("calls_assign== " + calls_assign); + + List DataIds=agentsAssignService.getDataIdForInitialAssign(parsedCategoryId, parsedCampaignId); + + for (String agentId : selectedAgentsList) { + int selectedAgentId = Integer.parseInt(agentId); + + agentsAssignService.addAgentsForCampaign(selectedAgentId, parsedCategoryId, parsedCampaignId); + } + //System.out.println("dataids=== " + DataIds); + if (!DataIds.isEmpty()) { + int dataIndex = 0; // Initialize data index pointer + + for (String agentId : selectedAgentsList) { + int selectedAgentId = Integer.parseInt(agentId); + + // Iterate for noOfCalls times and assign data IDs to the current agent + for (int i = 0; i < noOfCalls && dataIndex < DataIds.size(); i++, dataIndex++) { + int DataId = DataIds.get(dataIndex); + + agentsAssignService.updateAgentForCampaign( + selectedAgentId, + parsedCategoryId, + parsedCampaignId, + DataId + ); + } + } + + // Update campaign status to 'ONGOING' after successful assignment + campaignService.updateCampaignStatus(parsedCampaignId, parsedCategoryId); + } + + else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(Map.of("status", "error", "message", "No data available for initial assignment.")); + } + + } + + // Step 4: Save Questions and Answers + if (!questionsDataList.isEmpty()) { + for (Map questionMap : questionsDataList) { + String question = (String) questionMap.get("question"); + String answerType = (String) questionMap.get("answerType"); + List answers = (List) questionMap.get("answers"); + + if (question != null && answerType != null) { + campaignService.saveQuestionsAndAnswers( + categoryId, + campaignId, + question, + answerType, + answers + ); + } else { + System.out.println("Skipping invalid question data: " + questionMap); + } + } + } + + } + + + catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Map.of("status", "error", "message", "Failed to save campaign details: " + e.getMessage())); + } + + return ResponseEntity.ok(Map.of("status", "success", "message", "Campaign details saved successfully")); + } + + + //save excel data separate method + + @PostMapping(value = "/saveexcelcampaign" ,consumes = {"multipart/form-data"}) + public Map saveExcelCampaign( + @RequestParam String name, + @RequestParam String category, + @RequestPart MultipartFile file) { + + //System.out.println("Received campaign data:"); + //System.out.println("Name: " + name); + //System.out.println("Category: " + category); + + //System.out.println("File Name: " + file.getOriginalFilename()); + + Map campaignDetails = new HashMap<>(); + campaignDetails.put("campaign_name", name); + campaignDetails.put("category_id", category); + + + try { + // Get category-specific columns + List> categoryColumns = addCategoryServices.getCategoryColumns(Integer.parseInt(category)); + + //System.out.println("categorycolmns: " + categoryColumns); + List expectedHeaders = categoryColumns.stream() + .map(column -> column.get("column_name").toString()) + .collect(Collectors.toList()); + + // System.out.println("expectedheaders: " + expectedHeaders); + + + // Fetch field_ columns from upload_data table + List fieldColumns = campaignService.getUploadDataFieldColumns(); + //System.out.println("fieldColumns: " + fieldColumns); + + + // Read uploaded Excel data and extract headers + List> excelData = readExcelData(file.getInputStream(), expectedHeaders); + + // System.out.println("excedata: " + excelData ); + List uploadedHeaders = new ArrayList<>(excelData.get(0).keySet()); // Extract headers from first row + + //System.out.println("uploadeddata : " + uploadedHeaders); + + // Check column count mismatch with field_ columns + if (uploadedHeaders.size() > fieldColumns.size()) { + Map response = new HashMap<>(); + response.put("status", "column_mismatch"); // Changed status to differentiate + response.put("message", "Extend the columns in Database, Inform Admin."); + return response; + } + + // Validate headers + if (!new HashSet<>(expectedHeaders).equals(new HashSet<>(uploadedHeaders))) { + Map response = new HashMap<>(); + response.put("status", "header_mismatch"); // Changed status to differentiate + response.put("message", "Excel data does not match the category columns."); + return response; + } + + + String fileUrl = saveFile(file); + campaignDetails.put("excel_url", fileUrl); + + //System.out.println("Campaign Details: " + campaignDetails); + //System.out.println("Excel Data: " + excelData); + + campaignService.saveCampaignDetailsExcel(campaignDetails); + int lastId = campaignService.getLastInsertedCampaignId(); + + String excelUrl = campaignService.getExcelUrlByCampaignId(lastId); + //List> excelDatas = readExcelDataupdated(new FileInputStream(excelUrl)); + List> excelDatas = readExcelData(new FileInputStream(excelUrl), uploadedHeaders); + //System.out.println("excelDatas:" + excelDatas); + + for (Map row : excelDatas) { + campaignService.saveUploadData(category, lastId, row,expectedHeaders); + //System.out.println("exceldatas:" + excelDatas); + } + + Map response = new HashMap<>(); + response.put("status", "success"); + response.put("message", "Campaign and Excel saved successfully"); + return response; + + } + catch (IOException e) { + e.printStackTrace(); + Map response = new HashMap<>(); + response.put("status", "error"); + response.put("message", "Failed to save campaign details: "+ e.getMessage()); + return response; + } + } + + + + + + @GetMapping("/availableAgents") + public ResponseEntity>> getAvailableAgents() { + // Query 1: Fetch OUTBOUND agents + String outboundAgentsQuery = "SELECT agent_name, agent_id, calling_type " + + "FROM gcc_1913_qaqc.agents_list " + + "WHERE calling_type='OUTBOUND'"; + + List> outboundAgents = jdbcTemplate.queryForList(outboundAgentsQuery); + + //System.out.println("outboundagents" + outboundAgents); + // Query 2: Fetch agents from ongoing campaigns + String ongoingCampaignAgentsQuery = "SELECT ca.agent_id " + + "FROM gcc_1913_campaign.campaign_request cr " + + "JOIN gcc_1913_campaign.agent_assign ca " + + "ON ca.campaign_id = cr.campaign_id " + + "WHERE cr.campaign_status = 'ONGOING'"; + + List> ongoingAgents = jdbcTemplate.queryForList(ongoingCampaignAgentsQuery); + + //System.out.println("ongoingAgents" + ongoingAgents); + // Extract agent IDs from both lists + Set ongoingAgentIds = ongoingAgents.stream() + .map(agent -> (Integer) agent.get("agent_id")) + .collect(Collectors.toSet()); + + // Filter OUTBOUND agents who are NOT in ongoing agents + List> availableAgents = outboundAgents.stream() + .filter(agent -> !ongoingAgentIds.contains(agent.get("agent_id"))) + .collect(Collectors.toList()); + + return ResponseEntity.ok(availableAgents); + } + + + + private Object getCellValue(Cell cell) { + switch (cell.getCellType()) { + case STRING: + return cell.getStringCellValue().trim(); + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + return cell.getDateCellValue(); // Return Date for date-formatted cells + } + double numericValue = cell.getNumericCellValue(); + + // ✅ Convert numeric values that are likely mobile numbers to string + if (String.valueOf((long) numericValue).length() >= 10) { // Assuming mobile numbers are at least 10 digits + return String.valueOf((long) numericValue); + } + + // ✅ Convert to int if no decimal part, else keep as double + return (numericValue % 1 == 0) ? (int) numericValue : numericValue; + case BOOLEAN: + return cell.getBooleanCellValue(); + case FORMULA: + return cell.getCellFormula(); // Return formula as string + case BLANK: + return ""; + default: + return ""; + } + } + + + + //question and answers report page api + @GetMapping("/question-answers") + public ResponseEntity getQuestionAnswers(@RequestParam int campaignId) { + List> response = campaignService.getQuestionAnswers(campaignId); + return ResponseEntity.ok(response); + } + + + //dizo campaignlist apicontroller + // Query Parameter Approach + @GetMapping("/statistics") + public ResponseEntity> getCampaignStatisticsByQuery(@RequestParam int campaignId) { + Map statistics = campaignService.getCampaignStatistics(campaignId); + return ResponseEntity.ok(statistics); + } + + @GetMapping("/assignagentid") + public ResponseEntity>> getAllAgents() { + List> assignAgentId = campaignService.getAllAgents(); + return ResponseEntity.ok(assignAgentId); + } + + @PostMapping("/close") + public ResponseEntity closeCampaign(@RequestParam("campaignId") int campaignId) { + if (campaignId <= 0) { + return ResponseEntity.badRequest().body("Invalid Campaign ID"); + } + + System.out.println("Received request to close campaign ID: " + campaignId); // Debugging log + + int rowsUpdated = campaignService.closeCampaign(campaignId); + if (rowsUpdated > 0) { + return ResponseEntity.ok("Campaign closed successfully"); + } else { + return ResponseEntity.status(400).body("Failed to close campaign. Campaign ID " + campaignId + " may not exist."); + } + } + + @PostMapping("/auto-close") + public ResponseEntity autoCloseExpiredCampaigns() { + + int rowsUpdated = campaignService.autoCloseExpiredCampaigns(); + + if (rowsUpdated > 0) { + return ResponseEntity.ok(rowsUpdated + " expired campaigns closed successfully."); + } else { + return ResponseEntity.ok("No expired campaigns found."); + } + } + + + +} diff --git a/backend/callcenter/controller/CampaignDropdownApiController.java b/backend/callcenter/controller/CampaignDropdownApiController.java new file mode 100644 index 0000000..ef06080 --- /dev/null +++ b/backend/callcenter/controller/CampaignDropdownApiController.java @@ -0,0 +1,29 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import java.util.List; +import java.util.Map; + + +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignDropdownApiService; + +@RequestMapping("gcc/api") +@RestController +public class CampaignDropdownApiController { + + + @Autowired + private CampaignDropdownApiService dropdownApiService; + + @GetMapping("/getAnswerTypes") + @ResponseBody + public List> getAnswerTypes() { + return dropdownApiService.getAnswerTypes(); + } +} diff --git a/backend/callcenter/controller/CampaignReportAPIController.java b/backend/callcenter/controller/CampaignReportAPIController.java new file mode 100644 index 0000000..3e0f01f --- /dev/null +++ b/backend/callcenter/controller/CampaignReportAPIController.java @@ -0,0 +1,100 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignReportService; + +@RestController +@RequestMapping("gcc/api/campaignreport") +public class CampaignReportAPIController { + + @Autowired + private CampaignReportService campaignReportService; + + @GetMapping("/getcampaignData") + public List> getCampaignData( + @RequestParam(required = false) String startDate, + @RequestParam(required = false) String endDate) { + + List> campaignData = campaignReportService.getCampaignData(startDate, endDate); + //System.out.println("Campaign Data: " + campaignData); // Debugging log + return campaignData; + } + + @GetMapping("/getagentdatacount") + public List> getAgentwiseData(@RequestParam String campaign_id) { + List> agentData = campaignReportService.getAgentwiseData(campaign_id); + //System.out.println("Agent Data: " + agentData); + return agentData; + } + + @GetMapping("/getReportCampaignid") + public ResponseEntity getAgentReportCampaignId(@RequestParam String campaign_id) { + + List> agentData = campaignReportService.getAgentReportCampaignId(campaign_id); + //System.out.println("Agent Data: " + agentData); + return ResponseEntity.ok(agentData); + } + + //question and answers report page api + @GetMapping("/question-answers") + public ResponseEntity getQuestionAnswers(@RequestParam int campaign_id) { + List> response = campaignReportService.getQuestionAnswers(campaign_id); + return ResponseEntity.ok(response); + } +// @GetMapping("/download-excel") +// public void downloadFilteredCSV( +// @RequestParam int categoryId, +// @RequestParam int campaignId, +// +// +// +// HttpServletResponse response) throws IOException { +// +// // Set response headers +// response.setContentType("text/csv"); +// response.setHeader("Content-Disposition", "attachment; filename=filtered_data.csv"); +// +// // Generate CSV and write to response +// PrintWriter writer = response.getWriter(); +// campaignReportService.generateCSV(categoryId, campaignId, writer); +// writer.flush(); +// writer.close(); +// } + + + @GetMapping("/download-excel") + public void downloadFilteredCSV( + @RequestParam int categoryId, + @RequestParam int campaignId, + HttpServletResponse response) throws IOException { + + String filename = campaignReportService.getCampaignName(campaignId); + // Format campaign name for file safety (remove spaces/special characters) + //String safeCampaignName = filename.replaceAll("[^a-zA-Z0-9]", "_"); + + // Set response headers + response.setContentType("text/csv"); + response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".csv"); + + // Generate CSV and write to response + PrintWriter writer = response.getWriter(); + campaignReportService.generateCSV(categoryId, campaignId, writer); + writer.flush(); + writer.close(); + } + + +} diff --git a/backend/callcenter/controller/CategoryAPIController.java b/backend/callcenter/controller/CategoryAPIController.java new file mode 100644 index 0000000..12a1704 --- /dev/null +++ b/backend/callcenter/controller/CategoryAPIController.java @@ -0,0 +1,281 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import java.util.HashMap; +import java.util.List; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.AddcategoryServices; + + +@RequestMapping("/gcc/api/category") +@RestController +public class CategoryAPIController { + + @Autowired + private AddcategoryServices addCategoryServices; // Injecting the service + + @PostMapping("/save") + public ResponseEntity saveCategoryDetails(@RequestBody Map payload) { + try { + addCategoryServices.saveCategoryDetails(payload); + return ResponseEntity.ok("Category and columns saved successfully."); + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body("Validation Error: " + e.getMessage()); + } catch (Exception e) { + return ResponseEntity.status(500).body("Internal Server Error: " + e.getMessage()); + } + } + + + // Endpoint to save category details +// @PostMapping("/save") +// public ResponseEntity saveCategoryDetails(@RequestBody Map payload) { +// try { +// addCategoryServices.saveCategoryDetails(payload); // Call the service method to save category details +// return ResponseEntity.ok("Category details saved successfully."); +// } catch (IllegalArgumentException e) { +// return ResponseEntity.badRequest().body("Error: " + e.getMessage()); +// } catch (Exception e) { +// return ResponseEntity.status(500).body("Error saving category details: " + e.getMessage()); +// } +// } + + // Endpoint to get all categories + @GetMapping("/list") + public List> getAllCategories() { + return addCategoryServices.getAllCategories(); + } + + @GetMapping("/showcategoryId") + public ResponseEntity getCategoryById(@RequestParam("category_id") int categoryId) { + Map category = addCategoryServices.showCategory(categoryId); + if (category.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found"); + } + return ResponseEntity.ok(category); + } + + @PostMapping("/deleteColumnById") + public ResponseEntity> deleteCategoryColumnById(@RequestParam("columnId") int columnId) { + boolean updated = addCategoryServices.removeColumnById(columnId); + + Map response = new HashMap<>(); + response.put("success", updated); + + return ResponseEntity.ok(response); + } + + @PostMapping("/updateCategoryColumns") + public ResponseEntity> updateCategoryColumnsById(@RequestBody Map requestData) { + try { + int categoryId = (int) requestData.get("categoryId"); + List> columns = (List>) requestData.get("columns"); + + + boolean allUpdated = true; + + for (Map column : columns) { + int columnId = (int) column.get("id"); + String columnName = (String) column.get("name"); + + + boolean updated = addCategoryServices.updateColumnById(categoryId,columnId, columnName); + + if (!updated) { + allUpdated = false; + } + } + + Map response = new HashMap<>(); + response.put("success", allUpdated); + return ResponseEntity.ok(response); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("error", "Invalid data format")); + } + } + + @PostMapping("/addNewColumns") + public ResponseEntity> addNewCategoryColumnsById(@RequestBody Map requestData) { + + try { + int categoryId = (int) requestData.get("categoryId"); + List> columns = (List>) requestData.get("columns"); + + + boolean allUpdated = true; + + for (Map column : columns) { + + String columnName = (String) column.get("name"); + + + boolean updated = addCategoryServices.addnewupdateColumn(categoryId, columnName); + + if (!updated) { + allUpdated = false; + } + } + + Map response = new HashMap<>(); + response.put("success", allUpdated); + return ResponseEntity.ok(response); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("error", "Invalid data format")); + } + } + + + + @PutMapping("/update/{categoryId}") + public ResponseEntity updateCategoryWithColumns( + @PathVariable("categoryId") int categoryId, + @RequestBody Map payload) { + + String categoryName = (String) payload.get("categoryName"); + List columns = (List) payload.get("columns"); + + try { + int rowsAffected = addCategoryServices.updateCategoryWithColumns(categoryId, categoryName, columns); + return rowsAffected > 0 + ? ResponseEntity.ok("Category and columns updated successfully") + : ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found or update failed"); + + } catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body("Validation Error: " + e.getMessage()); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Error updating category: " + e.getMessage()); + } + } + + +// // Endpoint to get a category by its ID +// @GetMapping("/showcategoryId") +// public ResponseEntity getCategoryById(@RequestParam("category_id") int categoryId) { +// Map category = addCategoryServices.showCategory(categoryId); +// +// if (category == null) { +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found"); +// } +// +// return ResponseEntity.ok(category); +// } +// +// @PutMapping("/update/{categoryId}") +// public ResponseEntity updateCategoryWithColumns( +// @PathVariable("categoryId") int categoryId, +// @RequestBody Map payload) { +// +// String categoryName = (String) payload.get("categoryName"); +// List columns = (List) payload.get("columns"); +// +// try { +// int rowsAffected = addCategoryServices.updateCategoryWithColumns(categoryId, categoryName, columns); +// if (rowsAffected > 0) { +// return ResponseEntity.ok("Category and columns updated successfully"); +// } else { +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found or update failed"); +// } +// } catch (IllegalArgumentException e) { +// return ResponseEntity.badRequest().body("Validation Error: " + e.getMessage()); +// } catch (Exception e) { +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body("Error updating category: " + e.getMessage()); +// } +// } + +// @GetMapping("/showcategoryId") +// public ResponseEntity showCategoryId(@RequestParam("category_id") int categoryId) { +// try { +// Map category = addCategoryServices.showCategory(categoryId); +// if (category != null && !category.isEmpty()) { +// return ResponseEntity.ok(category); +// } else { +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found"); +// } +// } catch (Exception e) { +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body("Error retrieving category: " + e.getMessage()); +// } +// } + +// @PutMapping("/update/{categoryId}") +// public ResponseEntity updateCategory( +// @PathVariable("categoryId") int categoryId, +// @RequestParam String categoryName) { +// +// // Validate input +// if (categoryName == null || categoryName.trim().isEmpty()) { +// return ResponseEntity.badRequest().body("Category name cannot be empty"); +// } +// +// try { +// // Call the service method to update the category +// int rowsAffected = addCategoryServices.updateCategory(categoryId, categoryName); +// if (rowsAffected > 0) { +// return ResponseEntity.ok("Category updated successfully"); +// } else { +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found or update failed"); +// } +// } catch (Exception e) { +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) +// .body("Error updating category: " + e.getMessage()); +// } +// } + + + // Endpoint to delete a category by its ID + @DeleteMapping("/delete/{categoryId}") + public ResponseEntity deleteCategory( + @PathVariable("categoryId") int categoryId) { + + try { + // Call the service method to delete the category + addCategoryServices.deleteCategory(categoryId); + return ResponseEntity.ok("Category deleted successfully"); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Error deleting category: " + e.getMessage()); + } + } + + +//hari category api populate + + @GetMapping("/getcategory") + public List> getcategory(){ + return addCategoryServices.getcategory(); + } + + // Get category-specific columns based on category_id + @GetMapping("/getCategoryColumns") + public List> getCategoryColumns(@RequestParam int category_id) { + return addCategoryServices.getCategoryColumns(category_id); + } + + + @GetMapping("/getcampaignbycategory") + public List> getcampaignbycategory(@RequestParam int id) + { + return addCategoryServices.getcampaignbycategory(id); + } + + + +} diff --git a/backend/callcenter/controller/MainController.java b/backend/callcenter/controller/MainController.java new file mode 100644 index 0000000..3e4be8d --- /dev/null +++ b/backend/callcenter/controller/MainController.java @@ -0,0 +1,219 @@ + package in.gov.chennaicorporation.gccoffice.callcenter.controller; + + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.AddcategoryServices; +import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentsService; +import in.gov.chennaicorporation.gccoffice.callcenter.service.AttendanceService; +import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentAssignService; +import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignService; +import in.gov.chennaicorporation.gccoffice.configuration.AppConfig; +import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo; + + +@RequestMapping("/gcc/callcenter") +@Controller("callCenterCampaignMainController") +public class MainController { + + + + @Autowired + private AgentAssignService campaignmaster; + + @Autowired + private CampaignService campaignService; + + @Autowired + private AddcategoryServices addCategoryServices; + + @Autowired + private AgentsService agentsService; + + @Autowired + private AttendanceService attendanceSerivce; + + private AppConfig appConfig; + private RestTemplate restTemplate; + + @Autowired + public MainController(AgentAssignService campaignmaster,AgentsService agentsService,CampaignService campaignService,AddcategoryServices addCategoryServices,RestTemplate restTemplate, AppConfig appConfig) + { + this.campaignmaster=campaignmaster; + this.campaignService=campaignService; + this.addCategoryServices=addCategoryServices; + this.agentsService=agentsService; + this.restTemplate = restTemplate; + this.appConfig = appConfig; + + } + + + @GetMapping("/admin/addcategory") + + public String addcategory(Model model) { + + String LoginUserId = LoginUserInfo.getLoginUserId(); + model.addAttribute("LoginUserId",LoginUserId); + + String UserRole = LoginUserInfo.getUserRole(); + model.addAttribute("UserRole", UserRole); + + List> categories = addCategoryServices.getAllCategories(); + + //System.out.println(categories); + + model.addAttribute("categories", categories); + + return "modules/callcenter/addcategory"; + + } + + @GetMapping("/admin/createcampaign") + + public String createcampaign(Model model) { + + String LoginUserId = LoginUserInfo.getLoginUserId(); + model.addAttribute("LoginUserId",LoginUserId); + + String UserRole = LoginUserInfo.getUserRole(); + model.addAttribute("UserRole", UserRole); + + /* + * List> campaigns = campaignService.getCampaignDetails(); + * + * + * System.out.println("campaignlist:"+campaigns); + * + * model.addAttribute("campaigns", campaigns); + */ + + return "modules/callcenter/createcampaign"; // Name of the Thymeleaf template (e.g., campaignList.html) + + } + + @GetMapping("/admin/campaignlist") + public String viewCampaignList(Model model) + { + String LoginUserId = LoginUserInfo.getLoginUserId(); + model.addAttribute("LoginUserId",LoginUserId); + + String UserRole = LoginUserInfo.getUserRole(); + model.addAttribute("UserRole", UserRole); + + List> campaigns = campaignService.getDetailsForStart(); + + model.addAttribute("campaigns", campaigns); + + List> activeCampaigns =campaignService.getActiveCampaigns(); + model.addAttribute("activeCampaigns", activeCampaigns); + + return "modules/callcenter/campaignlist"; + } + + + @GetMapping("/agentscampaign") + public String targetPage(Model model) + { + String LoginUserId = LoginUserInfo.getLoginUserId(); + int userId = Integer.parseInt(LoginUserId); + model.addAttribute("LoginUserId",LoginUserId); + + String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername(); + model.addAttribute("agent_name", agent_name); + + String UserRole = LoginUserInfo.getUserRole(); + model.addAttribute("UserRole", UserRole); + + List> agentsCampaigns=agentsService.getAgentsALLCampaigns(userId); + + List> agentsCampaignsList=agentsService.getAgentsALLCampaignsList(userId); + + List> agentsCampaignsList1=agentsService.getAgentsALLCampaignsList1(userId); + + //List> CampActions=agentsService.getCallCategories(); + //model.addAttribute("CampActions", CampActions); + + model.addAttribute("agentsCampaignsList", agentsCampaignsList); + model.addAttribute("agentsCampaigns", agentsCampaigns); + model.addAttribute("agentsCampaignsList1", agentsCampaignsList1); + //System.out.println("Agents Campaigns List: " + agentsCampaignsList); + //System.out.println("Agents Campaigns : " + agentsCampaigns); + + return "modules/callcenter/agentscampaign"; + } + + + @GetMapping("/admin/campaignreport") + public String campaignreport(Model model) + { + String LoginUserId = LoginUserInfo.getLoginUserId(); + model.addAttribute("LoginUserId",LoginUserId); + + String UserRole = LoginUserInfo.getUserRole(); + model.addAttribute("UserRole", UserRole); + + return "modules/callcenter/campaignreport"; + } + + @GetMapping("/attendancereport") + public String AttendanceList( + @RequestParam(required = false) String fromDate, + @RequestParam(required = false) String toDate, + Model model) { + List> attendanceData = Collections.emptyList(); + + if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) { + String apiUrl = appConfig.attendanceReport + "/callcenter/api/attendance/getattendancereport?fromDate=" + fromDate + "&toDate=" + toDate; + + try { + ResponseEntity responseEntity = restTemplate.getForEntity(apiUrl, String.class); + String responseBody = responseEntity.getBody(); + + if (responseBody != null && !responseBody.isEmpty()) { + ObjectMapper objectMapper = new ObjectMapper(); + if (responseBody.trim().startsWith("{")) { + // Single object response + Map singleData = objectMapper.readValue(responseBody, new TypeReference<>() {}); + attendanceData = List.of(singleData); + } else { + // Array response + attendanceData = objectMapper.readValue(responseBody, new TypeReference<>() {}); + } + } + } catch (Exception e) { + System.err.println("Error fetching attendance data: " + e.getMessage()); + } + } + + model.addAttribute("attendanceData", attendanceData); + model.addAttribute("fromDate", fromDate); + model.addAttribute("toDate", toDate); + model.addAttribute("LoginUserId", LoginUserInfo.getLoginUserId()); + model.addAttribute("UserRole", LoginUserInfo.getUserRole()); + + return "modules/callcenter/attendancereport"; + } + + +} diff --git a/backend/callcenter/controller/WhatsappController.java b/backend/callcenter/controller/WhatsappController.java new file mode 100644 index 0000000..c494485 --- /dev/null +++ b/backend/callcenter/controller/WhatsappController.java @@ -0,0 +1,26 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import in.gov.chennaicorporation.gccoffice.callcenter.service.WhatsappMsgService; + +@RestController +@RequestMapping("/gcc/api/whatsapp") +public class WhatsappController { + + @Autowired + private WhatsappMsgService whatsappMsgService; + + @PostMapping("/send-whatsapp-message") + public ResponseEntity sendWhatsAppMessage(@RequestParam String msgUrl) { + String response = whatsappMsgService.sendMsg(msgUrl); + return ResponseEntity.ok(response); + } + +} + diff --git a/backend/callcenter/service/AddcategoryServices.java b/backend/callcenter/service/AddcategoryServices.java new file mode 100644 index 0000000..3271869 --- /dev/null +++ b/backend/callcenter/service/AddcategoryServices.java @@ -0,0 +1,303 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.service; + +import java.sql.ResultSet; + +import java.sql.SQLException; +import java.util.Collections; +import java.util.List; +import java.util.Locale.Category; +import java.util.Map; + +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.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import java.sql.PreparedStatement; +import java.sql.Statement; + + +@Service +public class AddcategoryServices { + +private JdbcTemplate jdbcTemplate; + + @Autowired + public void setDataSource(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + +// public void saveCategoryDetails(Map categoryData) { +// String sql = "INSERT INTO category (category_name, isactive, isdelete, created_date) VALUES (?, 1, 0, CURRENT_TIMESTAMP)"; +// +// // Ensure that the key "categoryname" matches exactly what is being sent from the frontend +// String categoryName = (String) categoryData.get("categoryname"); +// +// // Check if categoryName is null or empty and handle it properly +// if (categoryName == null || categoryName.trim().isEmpty()) { +// throw new IllegalArgumentException("Category name cannot be null or empty"); +// } +// +// jdbcTemplate.update(sql, categoryName); +// } + + + @Transactional + public void saveCategoryDetails(Map categoryData) { + String categoryName = (String) categoryData.get("categoryname"); + List columns = (List) categoryData.get("columns"); + + if (categoryName == null || categoryName.trim().isEmpty()) { + throw new IllegalArgumentException("Category name cannot be null or empty"); + } + + if (columns == null || columns.isEmpty() || columns.contains("")) { + throw new IllegalArgumentException("At least one column name is required"); + } + + // Insert into category table and get the generated category_id + String categorySql = "INSERT INTO category (category_name, isactive, isdelete, created_date) VALUES (?, 1, 0, CURRENT_TIMESTAMP)"; + KeyHolder keyHolder = new GeneratedKeyHolder(); + + jdbcTemplate.update(connection -> { + PreparedStatement ps = connection.prepareStatement(categorySql, Statement.RETURN_GENERATED_KEYS); + ps.setString(1, categoryName); + return ps; + }, keyHolder); + + Integer categoryId = keyHolder.getKey().intValue(); // Extract generated category_id + + // Insert columns into category_columns table + String columnSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)"; + jdbcTemplate.batchUpdate(columnSql, columns, columns.size(), + (PreparedStatement ps, String column) -> { + ps.setInt(1, categoryId); + ps.setString(2, column); + }); + } + + + @Transactional + public List> getAllCategories() { + + String SqlQuery = "SELECT category_id,category_name FROM category where isactive=1 and isdelete=0"; + + List> result = jdbcTemplate.queryForList(SqlQuery); + return result; + } + + public Map showCategory(int categoryId) { + String categorySql = "SELECT category_id, category_name FROM category WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; + Map category; + try { + category = jdbcTemplate.queryForMap(categorySql, categoryId); + } catch (EmptyResultDataAccessException e) { + return Collections.emptyMap(); + } + + String columnsSql = "SELECT id,column_name FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; + List> columns = jdbcTemplate.queryForList(columnsSql,categoryId); + category.put("columns", columns); + return category; + } + + @Transactional + public int updateCategoryWithColumns(int categoryId, String categoryName, List columns) { + if (categoryName == null || categoryName.trim().isEmpty()) { + throw new IllegalArgumentException("Category name cannot be empty"); + } + if (columns == null || columns.size() < 2 || columns.contains("")) { + throw new IllegalArgumentException("At least two column names are required"); + } + + String updateCategorySql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; + int categoryUpdateCount = jdbcTemplate.update(updateCategorySql, categoryName, categoryId); + + if (categoryUpdateCount == 0) { + throw new IllegalArgumentException("Category not found or update failed."); + } + + String deleteColumnsSql = "DELETE FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; + jdbcTemplate.update(deleteColumnsSql, categoryId); + + String insertColumnsSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)"; + jdbcTemplate.batchUpdate(insertColumnsSql, columns, columns.size(), (PreparedStatement ps, String column) -> { + ps.setInt(1, categoryId); + ps.setString(2, column); + }); + + return categoryUpdateCount; + } + + +// @Transactional +// public int updateCategoryWithColumns(int categoryId, String categoryName, List columns) { +// if (categoryName == null || categoryName.trim().isEmpty()) { +// throw new IllegalArgumentException("Category name cannot be empty"); +// } +// if (columns == null || columns.isEmpty() || columns.contains("")) { +// throw new IllegalArgumentException("At least one column name is required"); +// } +// +// String updateCategorySql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; +// int categoryUpdateCount = jdbcTemplate.update(updateCategorySql, categoryName, categoryId); +// +// if (categoryUpdateCount == 0) { +// throw new IllegalArgumentException("Category not found or update failed."); +// } +// +// String deleteColumnsSql = "DELETE FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; +// jdbcTemplate.update(deleteColumnsSql, categoryId); +// +// String insertColumnsSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)"; +// jdbcTemplate.batchUpdate(insertColumnsSql, columns, columns.size(), (PreparedStatement ps, String column) -> { +// ps.setInt(1, categoryId); +// ps.setString(2, column); +// }); +// +// return categoryUpdateCount; +// } + + + + +// // Method to show a category by its ID +// public Map showCategory(int categoryId) { +// // Fetch category details +// String categorySql = "SELECT category_id, category_name FROM category WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; +// Map category; +// try { +// category = jdbcTemplate.queryForMap(categorySql, categoryId); +// } catch (EmptyResultDataAccessException e) { +// return null; // If no category found +// } +// +// // Fetch category columns +// String columnsSql = "SELECT column_name FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; +// List columns = jdbcTemplate.queryForList(columnsSql, String.class, categoryId); +// +// // Add columns to response +// category.put("columns", columns); +// return category; +// } +// +// + +// @Transactional +// public int updateCategoryWithColumns(int categoryId, String categoryName, List columns) { +// // Validate input +// if (categoryName == null || categoryName.trim().isEmpty()) { +// throw new IllegalArgumentException("Category name cannot be empty"); +// } +// if (columns == null || columns.isEmpty() || columns.contains("")) { +// throw new IllegalArgumentException("At least one column name is required"); +// } +// +// // Update category name +// String updateCategorySql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; +// int categoryUpdateCount = jdbcTemplate.update(updateCategorySql, categoryName, categoryId); +// +// if (categoryUpdateCount == 0) { +// throw new IllegalArgumentException("Category not found or update failed."); +// } +// +// // Remove existing category columns before inserting new ones +// String deleteColumnsSql = "DELETE FROM category_columns WHERE category_id = ?"; +// jdbcTemplate.update(deleteColumnsSql, categoryId); +// +// // Insert updated columns +// String insertColumnsSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)"; +// jdbcTemplate.batchUpdate(insertColumnsSql, columns, columns.size(), +// (PreparedStatement ps, String column) -> { +// ps.setInt(1, categoryId); +// ps.setString(2, column); +// }); +// +// return categoryUpdateCount; +// } + + +// // Method to update a category's name by its ID +// public int updateCategory(int categoryId, String categoryName) { +// String sql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0"; +// return jdbcTemplate.update(sql, categoryName, categoryId); +// } + + + + + // Method to delete a category by its name + public void deleteCategory(int categoryId) { + // String sql = "DELETE FROM category WHERE category_id = ?"; + + String sql = "UPDATE category SET isactive=0 , isdelete=1 WHERE category_id = ?"; + jdbcTemplate.update(sql, categoryId); + } + + + //hari populate category services + @Transactional + public List> getcategory() { + String sqlQuery = "SELECT category_id,category_name FROM category where isactive='1' and isdelete='0'"; + return jdbcTemplate.queryForList(sqlQuery); + } + + public List> getCategoryColumns(int categoryId) { + String sqlQuery = "SELECT column_name FROM category_columns WHERE category_id = ? AND isactive = 1"; + return jdbcTemplate.queryForList(sqlQuery, categoryId); + } + + // Fetch category with columns + public List> getCategoriesWithColumns() { + String sqlQuery = "SELECT c.category_id, c.category_name, cc.column " + + "FROM gcc_1913_campaign.category c " + + "INNER JOIN gcc_1913_campaign.category_columns cc ON c.category_id = cc.category_id " + + "WHERE c.isactive = 1 AND c.isdelete = 0 " + + "AND cc.isactive = 1 AND cc.isdelete = 0"; + return jdbcTemplate.queryForList(sqlQuery); + } + + @Transactional + + public List> getcampaignbycategory(int id) { + + String sqlQuery = "SELECT cr.campaign_id,cr.campaign_name FROM campaign_request cr JOIN category c ON cr.category_id=c.category_id where cr.category_id=? and cr.isactive='1'"; + + return jdbcTemplate.queryForList(sqlQuery,id); + + } + + + public boolean removeColumnById(int columnId) { + String sql = "UPDATE category_columns SET isactive = 0, isdelete = 1 WHERE id = ?"; + + int rowsAffected = jdbcTemplate.update(sql, columnId); + + return rowsAffected > 0; // Returns true if at least one row was updated, otherwise false + } + + public boolean updateColumnById(int categoryId,int columnId, String columnName) { + String sql = "UPDATE category_columns SET column_name = ? WHERE id = ? and category_id=?"; + int rowsAffected = jdbcTemplate.update(sql, columnName, columnId,categoryId); + return rowsAffected > 0; + } + + + public boolean addnewupdateColumn(int categoryId, String columnName) { + + //String sql = "UPDATE category_columns SET column_name = ? WHERE id = ? and category_id=?"; + String sql = "INSERT INTO category_columns (category_id, column_name) VALUES (?, ?)"; + + int rowsAffected = jdbcTemplate.update(sql, categoryId,columnName); + return rowsAffected > 0; + } + + +} diff --git a/backend/callcenter/service/AgentAssignService.java b/backend/callcenter/service/AgentAssignService.java new file mode 100644 index 0000000..10910af --- /dev/null +++ b/backend/callcenter/service/AgentAssignService.java @@ -0,0 +1,214 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.service; + +import java.util.ArrayList; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +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.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + + +@Service +public class AgentAssignService +{ + private JdbcTemplate jdbcTemplate; + + @Autowired + public void setDataSource(@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; + + + @Transactional + public List> getcategory() { + String sqlQuery = "SELECT category_id,category_name FROM gcc_1913_campaign.category where isactive='1' and isdelete='0'"; + return jdbcTemplate.queryForList(sqlQuery); + } + + @Transactional + public List> getcampaignbycategory(int id) { + String sqlQuery = "SELECT cr.campaign_id, cr.campaign_name " + + "FROM gcc_1913_campaign.campaign_request cr " + + "JOIN gcc_1913_campaign.category c ON cr.category_id = c.category_id " + + "WHERE cr.category_id = ? AND campaign_status='PENDING' " + + "AND cr.isactive = '1' "; + return jdbcTemplate.queryForList(sqlQuery,id); + } + + @Transactional + public List> getcampaignbyid(int id) { + String sqlQuery = "SELECT * FROM gcc_1913_campaign.campaign_request where isactive='1' and campaign_id=?"; + return jdbcTemplate.queryForList(sqlQuery,id); + } + + @Transactional + public List> getagentsfortask(int id) { + String sqlQuery = "SELECT al.agent_id,al.agent_name\r\n" + + "FROM gcc_1913_qaqc.agents_list al\r\n" + + "LEFT JOIN gcc_1913_campaign.agent_assign aa ON al.agent_id = aa.agent_id AND aa.isactive = '1' AND aa.campaign_id = ?\r\n" + + "WHERE aa.agent_id IS NULL AND al.calling_type='OUTBOUND'AND al.isactive='1' AND al.isdelete='0'"; + return jdbcTemplate.queryForList(sqlQuery,id); + } + + + @Transactional + public int addagentsfortask(int agent_id, int category_id, int campaign_id) { + String insertSql = "INSERT INTO gcc_1913_campaign.agent_assign (agent_id, category_id, campaign_id) VALUES (?, ?, ?)"; + int rowsInserted = jdbcTemplate.update(insertSql, agent_id, category_id, campaign_id); + + return rowsInserted; + } + + + @Transactional + public void addAgentsForCampaign(int selectedAgentId, int categoryId, int campaignId) { + String insertSql = "INSERT INTO gcc_1913_campaign.agent_assign (agent_id, category_id, campaign_id) VALUES (?, ?, ?)"; + + try { + + int rowsInserted = jdbcTemplate.update(insertSql, selectedAgentId, categoryId, campaignId); + + if (rowsInserted > 0) { + System.out.println("Successfully inserted agent ID in agent_assign== " + selectedAgentId + " into campaign ID " + campaignId); + } else { + System.out.println("No rows inserted for agent ID " + selectedAgentId); + } + + } catch (DataAccessException | NumberFormatException ex) { + System.err.println("Error inserting data: " + ex.getMessage()); + throw new RuntimeException("Failed to insert agents for campaign. Please try again.", ex); + } + } + + @Transactional + public void updateAgentForCampaign(int selectedAgentId, int categoryId, int campaignId,int DataId) { + String updateSql = "UPDATE gcc_1913_campaign.upload_data SET agent_id = ? WHERE campaign_id = ? AND category_id = ? AND data_id=?"; + + try { + + int rowsUpdated = jdbcTemplate.update(updateSql, selectedAgentId,campaignId,categoryId,DataId); + +/* if (rowsUpdated > 0) { + System.out.println("Successfully updated agent ID in upload_data== " + selectedAgentId + " for campaign ID " + campaignId); + } else { + System.out.println("No rows updated for agent ID " + selectedAgentId); + }*/ + + } catch (DataAccessException | NumberFormatException ex) { + System.err.println("Error updating data: " + ex.getMessage()); + throw new RuntimeException("Failed to update agents for campaign. Please try again.", ex); + } + } + + @Transactional + public List getDataIdForInitialAssign(int categoryId, int campaignId) { + + String sql = "SELECT data_id FROM gcc_1913_campaign.upload_data " + + "WHERE category_id = ? AND campaign_id = ? " + + "AND agent_id IS NULL AND is_processed = 0 ORDER BY data_id"; + + // Correctly specify the return type for jdbcTemplate.queryForList + return jdbcTemplate.queryForList(sql, Integer.class, categoryId, campaignId); + } + + + + + @Transactional + public List> checkcampaigninassignedtable(int id) + { + String sqlQuery = "SELECT al.agent_id,al.agent_name,aa.assigned_id\r\n" + + "FROM gcc_1913_qaqc.agents_list al\r\n" + + "JOIN gcc_1913_campaign.agent_assign aa ON al.agent_id = aa.agent_id\r\n" + + "JOIN gcc_1913_campaign.campaign_request c ON aa.campaign_id=c.campaign_id\r\n" + + "WHERE aa.campaign_id = ? AND aa.isactive = '1' AND al.calling_type='OUTBOUND'AND al.isactive='1' AND al.isdelete='0'"; + return jdbcTemplate.queryForList(sqlQuery,id); + } + + @Transactional + public int editagentsfortask(int assigned_id) { + String updateSql = "UPDATE gcc_1913_campaign.agent_assign SET isactive='0', isdelete='1',status='NOT_ASSIGNED' WHERE assigned_id=?"; + int rowsInserted = jdbcTemplate.update(updateSql,assigned_id); + + return rowsInserted; + } + + + + @Transactional + public List> getcampaignquestionbyid(int id) { + String sqlQuery = " SELECT " + + " cr.campaign_id, " + + " cr.campaign_name, " + + " cr.category_id, " + + " cr.start_date, " + + " cr.end_date, " + + " cr.no_of_agents, " + + " cr.calls_per_agent, " + + " cr.description, " + + " cr.created_date, " + + " cr.excel_url, " + + " cr.isactive, " + + " cr.campaign_status, " + + " cq.questions, " + + " cq.question_id, " + + " cq.answer_type_id, " + + " cat.type_name, " + + " ca.campaign_answer " + // Campaign Answer can be NULL + "FROM gcc_1913_campaign.campaign_request cr " + + "JOIN gcc_1913_campaign.campaign_questions cq " + + " ON cr.campaign_id = cq.campaign_id " + + "LEFT JOIN gcc_1913_campaign.campaign_answers ca " + // LEFT JOIN to include questions with no answers + " ON cq.question_id = ca.question_id " + + "JOIN gcc_1913_campaign.answer_type cat " + + " ON cat.answer_type_id = cq.answer_type_id " + + "WHERE cr.isactive = 1 AND cr.campaign_id = ?"; + + List> queryResult = jdbcTemplate.queryForList(sqlQuery, id); + + // Map to group answers by question_id + Map> groupedData = new LinkedHashMap(); + + for (Map row : queryResult) { + Integer questionId = (Integer) row.get("question_id"); + String campaignAnswer = (String) row.get("campaign_answer"); // Can be null + + // Check if this question_id already exists in the map + if (!groupedData.containsKey(questionId)) { + // Copy the row data (excluding campaign_answer) and initialize answers list + Map newRow = new LinkedHashMap<>(row); + newRow.remove("campaign_answer"); // Remove individual answer + newRow.put("campaign_answers", new ArrayList()); // Initialize answer list + + groupedData.put(questionId, newRow); + } + + // Only add answers if they are not null + if (campaignAnswer != null) { + ((List) groupedData.get(questionId).get("campaign_answers")).add(campaignAnswer); + } + } + + // Convert grouped data to a list + return new ArrayList<>(groupedData.values()); + } + + + +} diff --git a/backend/callcenter/service/AgentsService.java b/backend/callcenter/service/AgentsService.java new file mode 100644 index 0000000..a9a1a04 --- /dev/null +++ b/backend/callcenter/service/AgentsService.java @@ -0,0 +1,656 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.sql.DataSource; +import javax.transaction.Transactional; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class AgentsService { + + private JdbcTemplate jdbcTemplate; + + + @Autowired + public void setDataSource(@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; + + + // Utility method to get cell value based on type + private String getCellValue(Cell cell) { + if (cell == null) { + return ""; + } + switch (cell.getCellType()) { + case STRING: + return cell.getStringCellValue(); + case NUMERIC: + // Check if the numeric cell contains a date + if (DateUtil.isCellDateFormatted(cell)) { + return new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue()); + } + return String.valueOf((long) cell.getNumericCellValue()); // Cast to long to avoid scientific notation + case BOOLEAN: + return String.valueOf(cell.getBooleanCellValue()); + case FORMULA: + return cell.getCellFormula(); + default: + return ""; + } + } + + // Parse integer values (for ID) + private Integer parseInteger(String value) { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return null; // return null if parsing fails + } + } + + // Parse long values (for Mobile number) + private Long parseLong(String value) { + try { + return Long.parseLong(value); + } catch (NumberFormatException e) { + return null; // return null if parsing fails + } + } + + // Example fetch method + public List> fetchDataFromExcel(int categoryId,Long campaignId) throws IOException { + String excelUrl = getExcelUrlByCampaignId(campaignId); + List>data=getExcelData(categoryId,campaignId, excelUrl); + return saveExcelData(data); + } + + public String getExcelUrlByCampaignId(Long campaignId) { + String sql = "SELECT excel_url\r\n" + + "FROM gcc_1913_campaign.campaign_request\r\n" + + "WHERE campaign_id = ?"; + return jdbcTemplate.queryForObject(sql, String.class, campaignId); + } + + public List> getExcelData(int categoryId,Long campaignId,String filePath) throws IOException { + List> data = new ArrayList<>(); + File file = new File(filePath); + + try (FileInputStream fis = new FileInputStream(file); + Workbook workbook = new XSSFWorkbook(fis)) { + + Sheet sheet = workbook.getSheetAt(0); + for (Row row : sheet) { + if (row.getRowNum() == 0) continue; // skip header row + + Map rowData = new HashMap<>(); + + // Add the campaign_id and category_id to each row + + rowData.put("category_id", categoryId); + + rowData.put("campaign_id", campaignId); + + // Convert ID to Integer + rowData.put("ID", getCellValue(row.getCell(0))); + + // Name remains String + rowData.put("Name", getCellValue(row.getCell(1))); + + // Address remains String + rowData.put("Address", getCellValue(row.getCell(2))); + + // Dues remains String (you can convert if necessary) + rowData.put("Balance amount", parseLong(getCellValue(row.getCell(3)))); + + // Convert Mobile number to Long + rowData.put("Mobile number", parseLong(getCellValue(row.getCell(4)))); + + rowData.put("Tiny url", getCellValue(row.getCell(5))); + + data.add(rowData); + } + } + return data; + } + + public List> saveExcelData(List> data) { + + // Prepare SQL query for inserting the specified columns + String sql = "INSERT INTO gcc_1913_campaign.upload_data (category_id, campaign_id, field_1, field_2, field_3, field_4, field_5,field_6) " + + "VALUES (?, ?, ?, ?, ?, ?, ?,?)"; + + // Loop through the data list and insert each row into the database + for (Map row : data) { + jdbcTemplate.update(sql, + row.get("category_id"), // Category ID + row.get("campaign_id"), // Campaign ID + row.get("ID"), // ID (String) + row.get("Name"), // Name (String) + row.get("Address"), // Address (String) + row.get("Balance amount"), // Dues if any (String) + row.get("Mobile number"), // Mobile number (Long) + row.get("Tiny url") + ); + } + + // Return the inserted data (if needed) + return data; // Optionally return the inserted data or change the return type as per your use case + } + + + + //For Assigned tasks +// @Transactional +// public List> getAgentsALLCampaigns(int agent_id) { +// String SqlQuery = "SELECT \r\n" +// + " c.category_name,\r\n" +// + " cr.campaign_name,\r\n" +// + " cr.calls_per_agent,\r\n" +// + " aa.campaign_id,\r\n" +// + " aa.agent_id,\r\n" +// + " (SELECT COUNT(data_id) \r\n" +// + " FROM gcc_1913_campaign.upload_data up \r\n" +// + " WHERE up.agent_id = aa.agent_id \r\n" +// + " AND up.campaign_id = cr.campaign_id\r\n" +// + " ) AS calls_assigned,\r\n" +// + " (SELECT COUNT(CASE WHEN up.field_14 IS NULL THEN 1 END) \r\n" +// + " FROM gcc_1913_campaign.upload_data up \r\n" +// + " WHERE up.agent_id = aa.agent_id \r\n" +// + " AND up.campaign_id = cr.campaign_id\r\n" +// + " ) AS pending_count,\r\n" +// + " (SELECT COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) \r\n" +// + " FROM gcc_1913_campaign.upload_data up \r\n" +// + " WHERE up.agent_id = aa.agent_id \r\n" +// + " AND up.campaign_id = cr.campaign_id\r\n" +// + " ) AS complete_count,\r\n" +// + " (SELECT COUNT(CASE WHEN up.field_14 ='CALL_BACK_LATER' OR up.field_14 = 'UNATTENDED' THEN 1 END) \r\n" +// + " FROM gcc_1913_campaign.upload_data up \r\n" +// + " WHERE up.agent_id = aa.agent_id \r\n" +// + " AND up.campaign_id = cr.campaign_id\r\n" +// + " ) AS followup_count\r\n" +// + " \r\n" +// + "FROM \r\n" +// + " gcc_1913_campaign.agent_assign aa\r\n" +// + "JOIN \r\n" +// + " gcc_1913_qaqc.agents_list al ON aa.agent_id = al.agent_id\r\n" +// + "JOIN \r\n" +// + " gcc_1913_campaign.campaign_request cr ON cr.campaign_id = aa.campaign_id\r\n" +// + "JOIN \r\n" +// + " gcc_1913_campaign.category c ON cr.category_id = c.category_id\r\n" +// + "WHERE \r\n" +// + " aa.agent_id = ? \r\n" +// + " AND aa.isactive = '1'\r\n" +// + " AND cr.isactive = '0'"; +// +// return jdbcTemplate.queryForList(SqlQuery,agent_id); +// } + + + + + + @Transactional + public List> getdataByIds(List ids) { + // Construct the SQL query with placeholders for the number of IDs + String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); + String SqlQuery = "SELECT data_id, field_1 as id, field_2 as name, field_3 as address, field_4 as dues, field_5 as cellnumber,field_6 as viewdetails,field_14 as call_status,field_15 as remarks " + + "FROM gcc_1913_campaign.upload_data " + + "WHERE data_id IN (" + inSql + ")"; + + // Convert the list of ids to an Object array + return jdbcTemplate.queryForList(SqlQuery, ids.toArray()); + } + + @Transactional + public void saveCallLogs(String call_status,String remarks ,int data_id,int agent_id) + { + String SqlQuery = "UPDATE gcc_1913_campaign.upload_data SET call_status = ?, remarks=?, updated_date = NOW() ,updated_agent_id=?, is_processed=1 WHERE (data_id = ? )"; + + jdbcTemplate.update(SqlQuery,call_status, remarks,agent_id,data_id); + } + + @Transactional + public int saveInLogsTable(int campaignId, int agentId, int dataId, String call_status,String remarks) { + String sqlQuery = "INSERT INTO gcc_1913_campaign.call_logs (campaign_id,agent_id,data_id,call_status,remarks) VALUES (?, ?, ?,?,?)"; + int rowsAffected = 0; + try { + rowsAffected = jdbcTemplate.update(sqlQuery, campaignId, agentId, dataId,call_status,remarks); + //System.out.println("Inserted into call_logs successfully. Rows affected: " + rowsAffected); + } catch (Exception e) { + System.err.println("Error inserting into call_logs: " + e.getMessage()); + // Log the exception or rethrow it based on your error-handling strategy + } + return rowsAffected; + } + + @Transactional + public List> getPendingDataByIds(List ids) { + // Construct the SQL query with placeholders for the number of IDs + String inSql = String.join(",", Collections.nCopies(ids.size(), "?")); + String SqlQuery = "SELECT data_id, field_1 as id, field_2 as name, field_3 as address, field_4 as dues, field_5 as cellnumber,field_6 as viewdetails,field_14 as call_status,field_15 as remarks " + + "FROM gcc_1913_campaign.upload_data " + + "WHERE data_id IN (" + inSql + ") " + + "AND field_14 IN ('UNATTENDED', 'CALL_BACK_LATER')"; + + // Convert the list of ids to an Object array + return jdbcTemplate.queryForList(SqlQuery, ids.toArray()); + } + + @Transactional + public List> getAgentsNameById(List agentIds) + { + String inSql = String.join(",", Collections.nCopies(agentIds.size(), "?")); + String SqlQuery ="select agent_name,agent_id from gcc_1913_qaqc.agents_list where agent_id IN (" + inSql + ")"; + + return jdbcTemplate.queryForList(SqlQuery, agentIds.toArray()); + + } + //agents performance + @Transactional + public List> getDataDetailsById(List dataIds) + { + if (dataIds.isEmpty()) { + // Handle the case where dataIds is empty to avoid SQL syntax error. + throw new IllegalArgumentException("The dataIds list is empty, cannot execute query."); + } + + String inSql = String.join(",", Collections.nCopies(dataIds.size(), "?")); + String SqlQuery ="SELECT\r\n" + + " COUNT(*) AS Assigned_count,\r\n" + + " COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) AS Complete_count,\r\n" + + " COUNT(CASE WHEN field_14 IS NULL THEN 1 END) AS Pending_count ,\r\n" + + " COUNT(CASE WHEN field_14 = 'INFORMATION_GIVEN' THEN 1 END) AS Information_Given_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'UNATTENDED' THEN 1 END) AS Unattended_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'CALL_BACK_LATER' THEN 1 END) AS Call_back_later_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'SWITCH_OFF' THEN 1 END) AS Switch_off_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'WRONG_NUMBER' THEN 1 END) AS Wrong_number_count,\r\n" + + " CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) * 100.0 / COUNT(*)), 0)END AS Percentage\r\n" + + "FROM gcc_1913_campaign.upload_data\r\n" + + "WHERE data_id IN (" + inSql + ")"; + + + + List> results = jdbcTemplate.queryForList(SqlQuery, dataIds.toArray()); + return results; + } + + @Transactional + public List> getCompletedDataDetailsById(List CdataIds) + { + if (CdataIds.isEmpty()) { + // Handle the case where dataIds is empty to avoid SQL syntax error. + throw new IllegalArgumentException("The CdataIds list is empty, cannot execute query."); + } + + String inSql = String.join(",", Collections.nCopies(CdataIds.size(), "?")); + String SqlQuery ="SELECT\r\n" + + " data_id,\r\n" // Add data_id to the result + + " COUNT(*) AS Assigned_count,\r\n" + + " COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) AS Complete_count,\r\n" + + " COUNT(CASE WHEN field_14 IS NULL THEN 1 END) AS Pending_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'INFORMATION_GIVEN' THEN 1 END) AS Information_Given_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'UNATTENDED' THEN 1 END) AS Unattended_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'CALL_BACK_LATER' THEN 1 END) AS Call_back_later_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'SWITCH_OFF' THEN 1 END) AS Switch_off_count,\r\n" + + " COUNT(CASE WHEN field_14 = 'WRONG_NUMBER' THEN 1 END) AS Wrong_number_count,\r\n" + + " CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) * 100.0 / COUNT(*)), 0) END AS Percentage\r\n" + + "FROM gcc_1913_campaign.upload_data\r\n" + + "WHERE data_id IN (" + inSql + ")\r\n" + + "GROUP BY data_id"; // Group by data_id + + return jdbcTemplate.queryForList(SqlQuery, CdataIds.toArray()); + } + + @Transactional + public List> getCompletedDataById(List completedDataIds) + { + if (completedDataIds.isEmpty()) { + // Handle the case where dataIds is empty to avoid SQL syntax error. + throw new IllegalArgumentException("The completedDataIds list is empty, cannot execute query."); + } + + String inSql = String.join(",", Collections.nCopies(completedDataIds.size(), "?")); + String SqlQuery = "SELECT field_1 as id, field_2 as name, field_3 as address, " + + "field_5 as cellnumber, field_14 as call_status, updated_date as updated_date,field_15 as remarks, " + + "(SELECT COUNT(data_id) FROM call_logs WHERE data_id = upload_data.data_id) as call_count " + + "FROM gcc_1913_campaign.upload_data " + + "WHERE data_id IN (" + inSql + ")"; + + + return jdbcTemplate.queryForList(SqlQuery, completedDataIds.toArray()); + + } + + + @Transactional + public void addAgentsForCampaign(int selectedAgentId, int categoryId, int campaignId) { + String checkSql = "SELECT COUNT(*) FROM gcc_1913_campaign.agent_assign " + + "WHERE agent_id = ? AND category_id = ? AND campaign_id = ?"; + + String insertSql = "INSERT INTO gcc_1913_campaign.agent_assign (agent_id, category_id, campaign_id) VALUES (?, ?, ?)"; + + try { + // Check if the record already exists + int count = jdbcTemplate.queryForObject(checkSql, Integer.class, selectedAgentId, categoryId, campaignId); + + if (count == 0) { + // Insert only if no existing record found + int rowsInserted = jdbcTemplate.update(insertSql, selectedAgentId, categoryId, campaignId); + + if (rowsInserted > 0) { + System.out.println("Successfully inserted agent ID " + selectedAgentId + " into campaign ID " + campaignId); + } else { + System.out.println("No rows inserted for agent ID " + selectedAgentId); + } + } else { + System.out.println("Agent ID " + selectedAgentId + " is already assigned to campaign ID " + campaignId); + } + + } catch (DataAccessException | NumberFormatException ex) { + System.err.println("Error inserting data: " + ex.getMessage()); + throw new RuntimeException("Failed to insert agents for campaign. Please try again.", ex); + } + } + + + @Transactional + public void updateAgentForCampaign(int selectedAgentId, int categoryId, int campaignId,int DataId) { + String updateSql = "UPDATE gcc_1913_campaign.upload_data SET agent_id = ? WHERE campaign_id = ? AND category_id = ? AND data_id=?"; + + try { + + int rowsUpdated = jdbcTemplate.update(updateSql, selectedAgentId,campaignId,categoryId,DataId); + +/* if (rowsUpdated > 0) { + System.out.println("Successfully updated agent ID in upload_data== " + selectedAgentId + " for campaign ID " + campaignId); + } else { + System.out.println("No rows updated for agent ID " + selectedAgentId); + }*/ + + } catch (DataAccessException | NumberFormatException ex) { + System.err.println("Error updating data: " + ex.getMessage()); + throw new RuntimeException("Failed to update agents for campaign. Please try again.", ex); + } + } + + @Transactional + public List getDataIdForFurtherAssign(int categoryId, int campaignId) { + + String sql = "SELECT data_id FROM gcc_1913_campaign.upload_data " + + "WHERE category_id = ? " + + "AND campaign_id = ? " + + "AND is_processed = 0 " + + "ORDER BY data_id"; + + return jdbcTemplate.queryForList(sql, Integer.class, categoryId, campaignId); + } + + @Transactional + public void resetAgentAssignmentForNextDay(int categoryId, int campaignId) { + String sql = "UPDATE gcc_1913_campaign.upload_data " + + "SET agent_id = NULL, " + + " call_status = NULL, " + + " remarks = NULL, " + + " updated_agent_id = NULL, " + + " updated_date = NULL, " + + " is_processed = 0 " + + "WHERE category_id = ? " + + " AND campaign_id = ? " + + " AND call_status IN ('CALL BACK LATER', 'UNATTENDED')"; + + jdbcTemplate.update(sql, categoryId, campaignId); + + } + + + + //////////////////////Ajith code/////////////////// + + @Transactional + public List> getFilteredFields(int categoryId, int agentId, int dataId) { + List> resultList = new ArrayList<>(); + + // Fetch ordered field column names + String fetchColumnsSQL = "SELECT COLUMN_NAME " + + "FROM INFORMATION_SCHEMA.COLUMNS " + + "WHERE TABLE_SCHEMA = 'gcc_1913_campaign' " + + "AND TABLE_NAME = 'upload_data' " + + "AND COLUMN_NAME LIKE 'field_%' " + + "ORDER BY CAST(SUBSTRING(COLUMN_NAME, 7) AS UNSIGNED)"; + + List fieldColumns = jdbcTemplate.queryForList(fetchColumnsSQL, String.class); + + if (fieldColumns.isEmpty()) { + throw new RuntimeException("No matching columns found"); + } + + // Fetch ordered fields data + String query1 = "SELECT " + String.join(", ", fieldColumns) + " FROM gcc_1913_campaign.upload_data WHERE data_id = ?"; + List> orderedFieldsList = jdbcTemplate.queryForList(query1, dataId); + + if (orderedFieldsList.isEmpty()) { + throw new RuntimeException("No data found for data_id: " + dataId); + } + + Map orderedFields = orderedFieldsList.get(0); + + // Fetch category columns + String query2 = "SELECT column_name FROM gcc_1913_campaign.category_columns WHERE category_id = ? and isactive=1 "; + List categoryColumns = new ArrayList<>(jdbcTemplate.queryForList(query2, String.class, categoryId)); + //System.out.println("service===="+categoryColumns); + + if (categoryColumns.isEmpty()) { + throw new RuntimeException("No category columns found for category_id: " + categoryId); + } + + int categoryCount = categoryColumns.size(); + + // Collect first 'categoryCount' non-null values from orderedFields + List nonNullValues = new ArrayList<>(); + for (String field : fieldColumns) { + Object value = orderedFields.get(field); + if (value != null) { + nonNullValues.add(value); + if (nonNullValues.size() == categoryCount) { + break; // Stop after collecting required count + } + } + } + + if (nonNullValues.size() < categoryCount) { + throw new RuntimeException("Not enough non-null values to match category columns"); + } + + // Map category columns to non-null ordered field values + Map finalMapping = new HashMap<>(); + for (int i = 0; i < categoryCount; i++) { + finalMapping.put(categoryColumns.get(i), nonNullValues.get(i)); + } + + resultList.add(finalMapping); + return resultList; + } + + + @Transactional + public List> getCampaignQuestions(int categoryId, int campaignId) { + // Fetch questions along with answer type +// String questionQuery = "SELECT cq.*, at.type_name " + +// "FROM gcc_1913_campaign.campaign_questions cq " + +// "JOIN gcc_1913_campaign.answer_type at " + +// "ON cq.answer_type_id = at.answer_type_id " + +// +// "WHERE cq.category_id = ? AND cq.campaign_id = ? "; + + String questionQuery="SELECT cq.questions AS questions, \r\n" + + " MIN(cq.question_id) AS question_id, \r\n" + + " MIN(cq.category_id) AS category_id, \r\n" + + " MIN(cq.campaign_id) AS campaign_id, \r\n" + + " MIN(cq.answer_type_id) AS answer_type_id, \r\n" + + " MIN(cat.type_name) AS type_name \r\n" + + "FROM gcc_1913_campaign.campaign_questions cq \r\n" + + "JOIN gcc_1913_campaign.answer_type cat \r\n" + + " ON cq.answer_type_id = cat.answer_type_id \r\n" + + "WHERE cq.category_id = ? \r\n" + + "AND cq.campaign_id = ? \r\n" + + "AND cq.isactive = 1\r\n" + + "GROUP BY cq.questions\r\n" + + "ORDER BY MIN(cq.question_id)"; + + List> questions = jdbcTemplate.queryForList(questionQuery, categoryId, campaignId); + + // Iterate over each question and fetch answers + for (Map question : questions) { + int questionId = (int) question.get("question_id"); + +// String answerQuery = "SELECT campaign_answer FROM gcc_1913_campaign.campaign_answers " + +// "WHERE question_id = ?"; + + String answerQuery="SELECT distinct(question_id) as qid, campaign_answer, created_date FROM gcc_1913_campaign.campaign_answers\r\n" + + "WHERE question_id = ?"; + + List> answers = jdbcTemplate.queryForList(answerQuery, questionId); + + // Extract answer values and add to the question map + List answerList = answers.stream() + .map(a -> (String) a.get("campaign_answer")) + .collect(Collectors.toList()); + + question.put("answers", answerList); + } + + return questions; + } + + @Transactional + public List> FetchAnswer(int campaignId,int agentId,int questionId,int dataId) { + String sqlQuery = "SELECT distinct(campaign_answer) FROM gcc_1913_campaign.questions_answers where campaign_id=? and agent_id=? and question_id=? and data_id=?; "; + //System.out.println("dropdown l"); + return jdbcTemplate.queryForList(sqlQuery,campaignId,agentId,questionId,dataId); + } + + @Transactional + public void saveAnswers(List> answers) { + String sql = "INSERT INTO gcc_1913_campaign.questions_answers " + + "(campaign_id, data_id, agent_id, question_id, campaign_answer, created_date) " + + "VALUES (?, ?, ?, ?, ?, NOW())"; + + for (Map answer : answers) { + jdbcTemplate.update(sql, + answer.get("campaign_id"), + answer.get("data_id"), + answer.get("agent_id"), + answer.get("question_id"), + answer.get("campaign_answer") + ); + } + } + + @Transactional + public List> getCallStatus() { + String sqlQuery = "SELECT * FROM gcc_1913_campaign.calls_status "; + //System.out.println("dropdown l"); + return jdbcTemplate.queryForList(sqlQuery); + } + + @Transactional + public List> checkCounts(int campaignId, int dataId) { + // Query to get the count of answered questions for a given dataId + String answersCountQuery = "SELECT COUNT(distinct(question_id)) AS answersCount FROM gcc_1913_campaign.questions_answers WHERE data_id = ?"; + + // Query to get the count of required questions for a given campaignId + String questionsCountQuery = "SELECT COUNT(distinct(questions)) AS questionsCount FROM gcc_1913_campaign.campaign_questions WHERE campaign_id = ?"; + + // Execute queries + int answersCount = jdbcTemplate.queryForObject(answersCountQuery, Integer.class, dataId); + int questionsCount = jdbcTemplate.queryForObject(questionsCountQuery, Integer.class, campaignId); + + // Construct response as a list of maps + return List.of(Map.of( + "answersCount", answersCount, + "questionsCount", questionsCount + )); + } + + @Transactional + public List> getAgentsALLCampaignsList(int agent_id) { + String SqlQuery = "SELECT * FROM gcc_1913_campaign.upload_data ud inner join gcc_1913_campaign.campaign_request cr on ud.campaign_id=cr.campaign_id where cr.campaign_status='ONGOING'"+ + " and ud.agent_id = ? and ud.is_processed=0 "; + //System.out.println("text"); + return jdbcTemplate.queryForList(SqlQuery,agent_id); + } + + @Transactional + public List> getAgentsALLCampaignsList1(int agent_id) { + String SqlQuery = "SELECT * FROM gcc_1913_campaign.upload_data ud inner join gcc_1913_campaign.campaign_request cr on ud.campaign_id=cr.campaign_id where cr.campaign_status='ONGOING'"+ + " and ud.agent_id = ? and ud.is_processed=1"; + // System.out.println("text"); + return jdbcTemplate.queryForList(SqlQuery,agent_id); + } + + + + @Transactional + public List> getAgentsALLCampaigns(int agent_id) { + String SqlQuery = "SELECT c.category_name,cr.*,\r\n" + + "(SELECT COUNT(data_id)\r\n" + + "FROM gcc_1913_campaign.upload_data up\r\n" + + "WHERE up.agent_id = aa.agent_id \r\n" + + "AND up.campaign_id = cr.campaign_id\r\n" + + ") AS calls_assigned,\r\n" + + "(SELECT COUNT(CASE WHEN up.call_status IS NOT NULL THEN 1 END) \r\n" + + "FROM gcc_1913_campaign.upload_data up \r\n" + + "WHERE up.agent_id = aa.agent_id \r\n" + + "AND up.campaign_id = cr.campaign_id\r\n" + + ") AS complete_count,\r\n" + + "(SELECT COUNT(CASE WHEN up.call_status IS NULL THEN 1 END) \r\n" + + "FROM gcc_1913_campaign.upload_data up \r\n" + + "WHERE up.agent_id = aa.agent_id \r\n" + + "AND up.campaign_id = cr.campaign_id\r\n" + + ") AS pending_count\r\n" + + "FROM gcc_1913_campaign.agent_assign aa\r\n" + + "JOIN gcc_1913_campaign.campaign_request cr ON cr.campaign_id=aa.campaign_id\r\n" + + "JOIN gcc_1913_campaign.category c ON c.category_id=cr.category_id\r\n" + + "WHERE cr.campaign_status='ONGOING' AND aa.isactive=1 AND cr.isactive=1 AND aa.agent_id=?"; + + return jdbcTemplate.queryForList(SqlQuery,agent_id); + } + +// public List> getCallCategories() +// { +// String query = "SELECT id,call_status FROM gcc_1913_campaign.calls_status WHERE isactive=1 AND isdelete=0"; +// return jdbcTemplate.queryForList(query); +// } + + +} diff --git a/backend/callcenter/service/AttendanceService.java b/backend/callcenter/service/AttendanceService.java new file mode 100644 index 0000000..91de889 --- /dev/null +++ b/backend/callcenter/service/AttendanceService.java @@ -0,0 +1,116 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.service; + +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class AttendanceService { + + +// private JdbcTemplate jdbcTemplate; +// +// +// @Autowired +// public void setDataSource(@Qualifier("BiometricDataSource") DataSource dataSource) { +// this.jdbcTemplate = new JdbcTemplate(dataSource); +// } +// +// +// public List> getAttendanceReport(String fromDate, String toDate) { +// String reportQuery; +// +// if (fromDate != null && toDate != null) { +// // Query with date filter if dates are provided +// reportQuery = "SELECT d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " + +// "c.device_name, CAST(a.officepunch AS DATE) AS punch_date, MIN(a.OFFICEPUNCH) AS PUNCHIN, " + +// "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT " + +// "FROM machinerawpunch a, tbl_realtime_userinfo b, tbl_fkdevice_status c, zone_div_mast d, " + +// "tblemployee e, tbldepartment f " + +// "WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname " + +// "AND a.paycode = e.paycode AND e.departmentcode = f.departmentcode " + +// "AND CAST(a.officepunch AS DATE) BETWEEN ? AND ? " + +// "AND a.paycode LIKE '%19130%' " + +// "GROUP BY d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " + +// "c.device_name, CAST(a.officepunch AS DATE) " + +// "ORDER BY d.zone, d.division, b.user_id, CAST(a.officepunch AS DATE)"; +// +// // Execute query with date parameters +// return jdbcTemplate.queryForList(reportQuery, fromDate, toDate); +// +// } else { +// // Query without date filter +// reportQuery = "SELECT d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " + +// "c.device_name, CAST(a.officepunch AS DATE) AS punch_date, MIN(a.OFFICEPUNCH) AS PUNCHIN, " + +// "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT " + +// "FROM machinerawpunch a, tbl_realtime_userinfo b, tbl_fkdevice_status c, zone_div_mast d, " + +// "tblemployee e, tbldepartment f " + +// "WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname " + +// "AND a.paycode = e.paycode AND e.departmentcode = f.departmentcode " + +// "AND a.paycode LIKE '%19130%' " + +// "GROUP BY d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " + +// "c.device_name, CAST(a.officepunch AS DATE) " + +// "ORDER BY d.zone, d.division, b.user_id, CAST(a.officepunch AS DATE)"; +// +// // Execute query without date parameters +// return jdbcTemplate.queryForList(reportQuery); +// } +// } +// +// +// +//// public List> getAttendanceReport(String fromDate, String toDate) { +//// System.out.println("Service Layer: Generating attendance report"); +//// +//// String reportQuery = "SELECT d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, c.device_name, " + +//// "CAST(a.officepunch AS DATE) AS punch_date, MIN(a.OFFICEPUNCH) AS PUNCHIN, " + +//// "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT " + +//// "FROM machinerawpunch a, tbl_realtime_userinfo b, tbl_fkdevice_status c, zone_div_mast d, " + +//// "tblemployee e, tbldepartment f " + +//// "WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname " + +//// "AND a.paycode = e.paycode AND e.departmentcode = f.departmentcode "; +//// +//// // Dynamic date filter +//// if (fromDate != null && toDate != null) { +//// reportQuery += "AND CAST(a.officepunch AS DATE) BETWEEN ? AND ? "; +//// } else if (fromDate != null) { +//// reportQuery += "AND CAST(a.officepunch AS DATE) = ? "; +//// } else { +//// throw new IllegalArgumentException("fromDate or toDate must be provided"); +//// } +//// +//// reportQuery += "AND a.paycode LIKE '%19130%' " + +//// "GROUP BY d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, c.device_name, " + +//// "CAST(a.officepunch AS DATE) " + +//// "ORDER BY d.zone, d.division, b.user_id, CAST(a.officepunch AS DATE)"; +//// +//// // Execute query based on dates +//// if (fromDate != null && toDate != null) { +//// return jdbcTemplate.queryForList(reportQuery, fromDate, toDate); +//// } else { +//// return jdbcTemplate.queryForList(reportQuery, fromDate); +//// } +//// } +// +//// public List> getAttendanceReport() { +//// System.out.println("check 2"); +//// String reportQuery ="SELECT d.zone,d.division,b.user_id,b.user_name,f.departmentname,e.designation,c.device_name,CAST(a.officepunch AS DATE) as punch_date,MIN(a.OFFICEPUNCH) AS PUNCHIN,\r\n" +//// + "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT FROM machinerawpunch a,tbl_realtime_userinfo b,tbl_fkdevice_status c,\r\n" +//// + "zone_div_mast d,tblemployee e,tbldepartment f WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname AND a.paycode = e.paycode AND \r\n" +//// + "e.departmentcode = f.departmentcode AND CAST(officepunch AS DATE) BETWEEN '2024-10-01' AND '2024-10-10'\r\n" +//// + "AND a.paycode LIKE '%19130%' \r\n" +//// + "GROUP BY d.zone,d.division,b.user_id,b.user_name,f.departmentname,e.designation,c.device_name,CAST(a.officepunch AS DATE)\r\n" +//// + "ORDER BY d.zone,d.division,b.user_id,CAST(a.officepunch AS DATE)"; +//// System.out.println("check 3"); +//// List> reports = jdbcTemplate.queryForList(reportQuery); +//// System.out.println("check 4"); +//// return reports; +//// } + +} diff --git a/backend/callcenter/service/CampaignDropdownApiService.java b/backend/callcenter/service/CampaignDropdownApiService.java new file mode 100644 index 0000000..7b8c7b2 --- /dev/null +++ b/backend/callcenter/service/CampaignDropdownApiService.java @@ -0,0 +1,29 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.service; + +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class CampaignDropdownApiService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + public void setDataSource(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public List> getAnswerTypes(){ + String sql = "SELECT answer_type_id,type_name FROM answer_type"; + return jdbcTemplate.queryForList(sql); + + } +} diff --git a/backend/callcenter/service/CampaignReportService.java b/backend/callcenter/service/CampaignReportService.java new file mode 100644 index 0000000..391a163 --- /dev/null +++ b/backend/callcenter/service/CampaignReportService.java @@ -0,0 +1,334 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.service; + +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +@Service +public class CampaignReportService { + + + 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); + } + + + public List> getCampaignData(String startDate, String endDate) { + StringBuilder query = new StringBuilder( + "SELECT " + + " cr.campaign_id, " + + " cr.category_id, " + + " cr.campaign_name, " + + " cc.category_name, " + + " cr.start_date, " + + " cr.end_date, " + + " COUNT(ud.campaign_id) AS total_count, " + + " COUNT(ud.agent_id) AS assigned_count, " + + " COUNT(ud.campaign_id) - COUNT(ud.agent_id) AS not_assigned_count, " + + " COUNT(CASE WHEN ud.call_status = 'INFORMATION GIVEN' THEN 1 ELSE NULL END) AS informationgiven_count, " + + " COUNT(CASE WHEN ud.call_status = 'CALL BACK LATER' THEN 1 ELSE NULL END) AS callback_count, " + + " COUNT(CASE WHEN ud.call_status = 'UNATTENDED' THEN 1 ELSE NULL END) AS unattended_count, " + + " COUNT(CASE WHEN ud.call_status = 'SWITCH OFF' THEN 1 ELSE NULL END) AS switchoff_count, " + + " COUNT(CASE WHEN ud.call_status = 'WRONG NUMBER' THEN 1 ELSE NULL END) AS wrongnumber_count " + + "FROM gcc_1913_campaign.campaign_request cr " + + "JOIN gcc_1913_campaign.upload_data ud ON cr.campaign_id = ud.campaign_id " + + "JOIN gcc_1913_campaign.category cc ON cr.category_id = cc.category_id " + + "WHERE cr.campaign_status IN ('ONGOING', 'CLOSED') " + + "AND ud.agent_id IS NOT NULL " + ); + + // Apply date filter dynamically if dates are provided + if (startDate != null && endDate != null) { + query.append("AND DATE(cr.created_date) BETWEEN ? AND ? "); + } + + query.append("GROUP BY cr.campaign_id "); + query.append("ORDER BY cr.campaign_id DESC"); + + // Execute query with or without parameters + if (startDate != null && endDate != null) { + return jdbcTemplate.queryForList(query.toString(), startDate, endDate); + } else { + return jdbcTemplate.queryForList(query.toString()); + } + } + + public List> getAgentwiseData(String campaignId) { + String query = "SELECT aa.agent_id, al.agent_name, \r\n" + + " COUNT(ud.agent_id) AS assigned_count, \r\n" + + " COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) AS completed_count, \r\n" + + " COUNT(ud.agent_id) - COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) AS pending_count, \r\n" + + " COUNT(CASE WHEN ud.call_status = 'INFORMATION GIVEN' THEN 1 ELSE NULL END) AS informationgiven_count, \r\n" + + " COUNT(CASE WHEN ud.call_status = 'CALL BACK LATER' THEN 1 ELSE NULL END) AS callback_count, \r\n" + + " COUNT(CASE WHEN ud.call_status = 'UNATTENDED' THEN 1 ELSE NULL END) AS unattended_count, \r\n" + + " COUNT(CASE WHEN ud.call_status = 'SWITCH OFF' THEN 1 ELSE NULL END) AS switchoff_count, \r\n" + + " COUNT(CASE WHEN ud.call_status = 'WRONG NUMBER' THEN 1 ELSE NULL END) AS wrongnumber_count, \r\n" + + " CASE \r\n" + + " WHEN COUNT(ud.agent_id) = 0 THEN 0 \r\n" + + " ELSE FLOOR((COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) * 100) / COUNT(ud.agent_id))\r\n" + + " END AS completed_percentage\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 ud ON ud.agent_id = aa.agent_id AND ud.campaign_id = aa.campaign_id\r\n" + + "WHERE aa.campaign_id = ? AND aa.isactive = 1 AND aa.isdelete = 0 AND ud.agent_id IS NOT NULL \r\n" + + "GROUP BY aa.agent_id, al.agent_name \r\n" + + "ORDER BY aa.agent_id"; + + return jdbcTemplate.queryForList(query, campaignId); + } + + //report for campaign details + public List> getAgentReportCampaignId(String campaignId) { + String query = "SELECT cr.category_id,cr.campaign_id, cc.category_name, \r\n" + + " cr.start_date, cr.end_date, \r\n" + + " cr.description, date (cr.created_date) as created_date \r\n" + + " FROM gcc_1913_campaign.category cc \r\n" + + " join gcc_1913_campaign.campaign_request cr on cr.category_id = cc.category_id \r\n" + + " where cr.campaign_id = ?;"; + + return jdbcTemplate.queryForList(query, campaignId); + } + + + + //get campaignname + public String getCampaignName(int campaignId) { + String query = "SELECT campaign_name FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?"; + + return jdbcTemplate.queryForObject(query, String.class, campaignId); + } + + + + //question and answers counts with percentage in report page method + + public List> 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 gcc_1913_campaign.campaign_questions cq " + + "JOIN gcc_1913_campaign.campaign_answers ca ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id " + + "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 " + + "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"; + +// String sql = "SELECT cq.question_id, cq.questions, ca.campaign_answer, " + +// "COUNT(DISTINCT qa.id) AS answer_count, " + +// "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 " + +// "FROM gcc_1913_campaign.campaign_questions cq " + +// "JOIN gcc_1913_campaign.campaign_answers ca ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id " + +// "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 " + +// "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> result = jdbcTemplate.queryForList(sql, campaignId); + Map> responseMap = new LinkedHashMap<>(); + + for (Map row : result) { + int questionId = (int) row.get("question_id"); + if (!responseMap.containsKey(questionId)) { + Map questionData = new HashMap<>(); + questionData.put("question_id", questionId); + questionData.put("questions", row.get("questions")); + questionData.put("answers", new ArrayList<>()); + responseMap.put(questionId, questionData); + } + + Map 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>) responseMap.get(questionId).get("answers")).add(answerData); + } + + return new ArrayList<>(responseMap.values()); + } + + + + // Method to escape CSV values + private String escapeCsvValue(String value) { + if (value == null) return ""; + + // If the value contains commas, double quotes, or newlines, wrap it in quotes and escape inner quotes + if (value.contains(",") || value.contains("\"") || value.contains("\n")) { + value = "\"" + value.replace("\"", "\"\"") + "\""; + } + return value; + } + + public void generateCSV(int categoryId, int campaignId, PrintWriter writer) { + List> resultList = new ArrayList<>(); + + // Fetch ordered field column names + String fetchColumnsSQL = "SELECT COLUMN_NAME " + + "FROM INFORMATION_SCHEMA.COLUMNS " + + "WHERE TABLE_SCHEMA = 'gcc_1913_campaign' " + + "AND TABLE_NAME = 'upload_data' " + + "AND COLUMN_NAME LIKE 'field_%' " + + "ORDER BY CAST(SUBSTRING(COLUMN_NAME, 7) AS UNSIGNED)"; + + List fieldColumns = jdbcTemplate.queryForList(fetchColumnsSQL, String.class); + + if (fieldColumns.isEmpty()) { + writer.println("No matching columns found"); + return; + } + + // Fetch ordered fields data based on campaign_id, including data_id, agent_id, and call_status + String query1 = "SELECT data_id, " + String.join(", ", fieldColumns) + ", agent_id, call_status,remarks " + + "FROM gcc_1913_campaign.upload_data WHERE campaign_id = ?"; + + List> orderedFieldsList = jdbcTemplate.queryForList(query1, campaignId); + + if (orderedFieldsList.isEmpty()) { + writer.println("No data found for campaign_id: " + campaignId); + return; + } + + // Fetch category columns + String query2 = "SELECT column_name FROM gcc_1913_campaign.category_columns WHERE category_id = ? AND isactive=1"; + List categoryColumns = jdbcTemplate.queryForList(query2, String.class, categoryId); + + if (categoryColumns.isEmpty()) { + writer.println("No category columns found for category_id: " + categoryId); + return; + } + + int categoryCount = categoryColumns.size(); + + // Fetch Agent Names from agent_id + String fetchAgentSQL = "SELECT agent_id, agent_name FROM gcc_1913_qaqc.agents_list"; + Map agentMap = jdbcTemplate.query(fetchAgentSQL, rs -> { + Map map = new HashMap<>(); + while (rs.next()) { + map.put(rs.getInt("agent_id"), rs.getString("agent_name")); + } + return map; + }); + + // Fetch Questions for given campaign_id + String fetchQuestionsQuery = "SELECT question_id, questions FROM gcc_1913_campaign.campaign_questions WHERE campaign_id = ?"; + Map questionsMap = jdbcTemplate.query(fetchQuestionsQuery, rs -> { + Map map = new LinkedHashMap<>(); + while (rs.next()) { + map.put(rs.getInt("question_id"), rs.getString("questions")); + } + return map; + }, campaignId); + + // Fetch Answers mapped to questions and grouped by data_id + String fetchAnswersQuery = "SELECT data_id, question_id, campaign_answer FROM gcc_1913_campaign.questions_answers " + + "WHERE campaign_id = ?"; + Map> answersMap = jdbcTemplate.query(fetchAnswersQuery, rs -> { + Map> map = new HashMap<>(); + while (rs.next()) { + int dataId = rs.getInt("data_id"); + int questionId = rs.getInt("question_id"); + String answer = rs.getString("campaign_answer"); + + map.computeIfAbsent(dataId, k -> new HashMap<>()).put(questionId, answer); + } + return map; + }, campaignId); + + // Process each row and collect data + for (Map orderedFields : orderedFieldsList) { + List nonNullValues = new ArrayList<>(); + for (String field : fieldColumns) { + Object value = orderedFields.get(field); + if (value != null) { + nonNullValues.add(value); + if (nonNullValues.size() == categoryCount) { + break; // Stop after collecting required count + } + } + } + + if (nonNullValues.size() < categoryCount) { + continue; // Skip if not enough non-null values + } + + Integer dataId = orderedFields.get("data_id") != null ? ((Number) orderedFields.get("data_id")).intValue() : null; + + // Map category columns to non-null ordered field values + Map finalMapping = new LinkedHashMap<>(); + + // Add category columns + for (int i = 0; i < categoryCount; i++) { + finalMapping.put(categoryColumns.get(i), nonNullValues.get(i)); + } + + // Add Questions and Corresponding Answers for this specific data_id + Map currentAnswers = answersMap.getOrDefault(dataId, new HashMap<>()); + for (Map.Entry entry : questionsMap.entrySet()) { + Integer questionId = entry.getKey(); + String questionText = entry.getValue(); + String answer = currentAnswers.getOrDefault(questionId, "-"); // Default to "-" + + finalMapping.put(questionText, answer); + } + + Integer agentId = orderedFields.get("agent_id") != null ? ((Number) orderedFields.get("agent_id")).intValue() : null; + String agentName = agentMap.getOrDefault(agentId, "Not Assigned"); + finalMapping.put("Agent Name", agentName); + + String callstatus = orderedFields.get("call_status") != null ? orderedFields.get("call_status").toString() : "-"; + finalMapping.put("Call Status", callstatus); + + // Add Remarks + String remarks = orderedFields.get("remarks") != null ? orderedFields.get("remarks").toString() : "-"; + finalMapping.put("Remarks", remarks); + + resultList.add(finalMapping); + } + + // Write CSV data + if (resultList.isEmpty()) { + writer.println("No Data Available"); + return; + } + + // Extract headers from the first row and escape them + String headers = resultList.get(0).keySet().stream() + .map(this::escapeCsvValue) // Escape each header value + .collect(Collectors.joining(",")); + writer.println(headers); + + // Write data rows + for (Map rowData : resultList) { + List values = rowData.values().stream() + .map(value -> escapeCsvValue(value != null ? value.toString() : "")) + .collect(Collectors.toList()); + writer.println(String.join(",", values)); + } + } + + +} + + diff --git a/backend/callcenter/service/CampaignService.java b/backend/callcenter/service/CampaignService.java new file mode 100644 index 0000000..48ef3bf --- /dev/null +++ b/backend/callcenter/service/CampaignService.java @@ -0,0 +1,704 @@ +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 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 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 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> questionsData) { + for (Map 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 answers = (List) 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 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 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> 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> campaigns = jdbcTemplate.queryForList(sql); + + + return campaigns; + } + + public List> 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> 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> getDataforAgents(int campaign_id, int calls_per_agent) + { + List> assignedAgent_list =getAssignedAgentId(campaign_id); + List> data_list =getDataId(campaign_id); + + List> 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> 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 task : taskList) { + Integer agentId = (Integer) task.get("agent_id"); + Integer campaignId = (Integer) task.get("campaign_id"); + List dataIds = (List) 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> getTask(List> assignedAgent_list, List> data_list, + int calls_per_agent,int campaign_id) { + + List> result = new ArrayList<>(); + int dataIndex = 0; + + // Loop through each assigned ID + for (Map assigned : assignedAgent_list) { + // Create a map to store the assigned_id and corresponding data_ids + Map assignedTaskMap = new HashMap<>(); + List 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 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> 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> 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> 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> 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> 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 rowData, List expectedHeaders) { + int fieldCount = rowData.size(); + + List 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 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 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 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 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> 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 getCampaignStatistics(int campaignId) { + Map 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> 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> results = jdbcTemplate.queryForList(sql, campaign_id); + + // Group answers by question_id + Map> groupedData = new LinkedHashMap(); + + for (Map 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 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 answers = (List) 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> 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> result = jdbcTemplate.queryForList(sql, campaignId); + Map> responseMap = new LinkedHashMap<>(); + + for (Map row : result) { + int questionId = (int) row.get("question_id"); + if (!responseMap.containsKey(questionId)) { + Map questionData = new HashMap<>(); + questionData.put("question_id", questionId); + questionData.put("questions", row.get("questions")); + questionData.put("answers", new ArrayList<>()); + responseMap.put(questionId, questionData); + } + + Map 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>) 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(); } + */ + + + +} diff --git a/backend/callcenter/service/WhatsappMsgService.java b/backend/callcenter/service/WhatsappMsgService.java new file mode 100644 index 0000000..8daa3ec --- /dev/null +++ b/backend/callcenter/service/WhatsappMsgService.java @@ -0,0 +1,40 @@ +package in.gov.chennaicorporation.gccoffice.callcenter.service; + +import java.net.HttpURLConnection; +import java.net.URL; + +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +public class WhatsappMsgService { + + + public String sendMsg(String msgUrl) { + + String response =""; + try{ + HttpURLConnection connection =null; + + URL url = new URL(msgUrl); + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + + int responseCode = connection.getResponseCode(); + response=responseCode+""; + System.out.println("Response Code: " + responseCode); + + }catch (Exception e){ + e.printStackTrace(); + } + + return response; + } + + + public String sendSMS(String SMS_Url) { + RestTemplate restTemplate = new RestTemplate(); + String response =restTemplate.getForObject(SMS_Url,String.class); + return response; + } + } diff --git a/frontend/callcenter/addcategory.html b/frontend/callcenter/addcategory.html new file mode 100644 index 0000000..f2694ec --- /dev/null +++ b/frontend/callcenter/addcategory.html @@ -0,0 +1,974 @@ + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ +

+ Auot refresh in 00 seconds +

+ +
+
+
+ +
+
+
Category List

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
S.NoCategoryAction
+ + + + + + + +
S.NoCategoryAction
+
+
+
+
+
+ +
+
+ +
+
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/frontend/callcenter/agentscampaign.html b/frontend/callcenter/agentscampaign.html new file mode 100644 index 0000000..1964e62 --- /dev/null +++ b/frontend/callcenter/agentscampaign.html @@ -0,0 +1,1807 @@ + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ +

+ Auto refresh in 00 seconds +

+ +
+
+
+
+
+

+ ' s Campaign +

+
+
Campaign + List
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoCategoryCampaignNameCalls AssignedCalls CompletedCalls Pending
+
+
+
+
+ +
+
+
+ + + +
+ + +
+
+ + +
+
+ +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoNameMobileNumberViewDetailsCallstatusRemarksSubmit
+ + + +
+
+
+ + + +
+ +
+
+ + + + + + +
+ + +
+
+ +
+
+ + + + + + + + +
+ + + +
+ + + + + + + + + + + diff --git a/frontend/callcenter/attendancereport.html b/frontend/callcenter/attendancereport.html new file mode 100644 index 0000000..27265a1 --- /dev/null +++ b/frontend/callcenter/attendancereport.html @@ -0,0 +1,230 @@ + + + + + + +
+ +
+ +
+ +
+ +
+
+ + +
+ + + +
+
+
+ +
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+
+
Attendance Reports

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoEmployee IdEmployee NameDesignationDevice LocationPunch DatePunch InPunch OutTotal Working hours
+
+
+
+
+
+ +
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/callcenter/campaignlist.html b/frontend/callcenter/campaignlist.html new file mode 100644 index 0000000..2eb0432 --- /dev/null +++ b/frontend/callcenter/campaignlist.html @@ -0,0 +1,1256 @@ + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ +

+ Auot refresh in 00 seconds +

+ +
+ +
+
+ +
+
+
Campaigns List

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoCampaignCategoryDateAction
+ +
S.NoCampaignCategoryDateAction
+ + +
+
+
+ +
+
+ +
+
+
Campaign Status List

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoNameCategoryEvent DateDescriptionStatusAction
+ + + + + + Closed + + + + + + + + + + + + + + +
+
+
+
+
+ +
+ +
+
+ + + + +
+
+ + +
+ + + + + + + + + + + + + +
+ + + + + + + + + \ No newline at end of file diff --git a/frontend/callcenter/campaignreport.html b/frontend/callcenter/campaignreport.html new file mode 100644 index 0000000..056e1f5 --- /dev/null +++ b/frontend/callcenter/campaignreport.html @@ -0,0 +1,954 @@ + + + + + + + +
+ +
+ +
+ +
+ +
+
+ + +
+ +
+
+
+

Task Details

+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoCampaignPerformanceCall ResultsAction
Campaign NameDateCategoryTotal DataAssigned CallsNot Assigned CallsInformation GivenCall Back LaterUnattendedSwitch OffWrong Number
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/callcenter/createcampaign.html b/frontend/callcenter/createcampaign.html new file mode 100644 index 0000000..8c2e962 --- /dev/null +++ b/frontend/callcenter/createcampaign.html @@ -0,0 +1,1956 @@ + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ +

+ Auto refresh in 00 seconds +

+ +
+ +
+
+
+

Campaign uploading excel Form

+
+
+ +
+
+
+
+ + +
+ + + +
+ + + +
+ +
+
+ + +
+
+ +
+ + + +
+ +
+ + +
+
+ + +
+ +
+
+ + +
+
+
+

Campaign Details Form

+
+ +
+ +
+ +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ +
+
+ +
+
+ + +
+
+ + +
+
+
+ + + + +
+ + +
+ +
+
+

Add Questions and Answers

+
+
+
+ +
+ + +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ + +
+
+ + +
+ +
+
+ +
+ + +
+
+ +
+ +
+ +
+
+ + + + + + + + +
+ + +
+
+ + + + +
+
+ + + +
+ + + + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_agent_assign.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_agent_assign.sql new file mode 100644 index 0000000..7edd0f4 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_agent_assign.sql @@ -0,0 +1,56 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `agent_assign` +-- + +DROP TABLE IF EXISTS `agent_assign`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `agent_assign` ( + `assigned_id` int NOT NULL AUTO_INCREMENT, + `agent_id` int DEFAULT NULL, + `category_id` int DEFAULT NULL, + `campaign_id` int DEFAULT NULL, + `status` varchar(255) DEFAULT 'ASSIGNED', + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`assigned_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `agent_assign` +-- + +LOCK TABLES `agent_assign` WRITE; +/*!40000 ALTER TABLE `agent_assign` DISABLE KEYS */; +/*!40000 ALTER TABLE `agent_assign` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:40 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_answer_type.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_answer_type.sql new file mode 100644 index 0000000..7068e62 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_answer_type.sql @@ -0,0 +1,54 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `answer_type` +-- + +DROP TABLE IF EXISTS `answer_type`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `answer_type` ( + `answer_type_id` int NOT NULL AUTO_INCREMENT, + `type_name` text NOT NULL, + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`answer_type_id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `answer_type` +-- + +LOCK TABLES `answer_type` WRITE; +/*!40000 ALTER TABLE `answer_type` DISABLE KEYS */; +INSERT INTO `answer_type` VALUES (1,'Text',1,0,'2025-03-03 07:55:57'),(2,'Radio',1,0,'2025-03-03 07:55:57'),(3,'Dropdown',1,0,'2025-03-03 07:55:57'),(4,'Checkbox',1,0,'2025-03-03 09:16:39'); +/*!40000 ALTER TABLE `answer_type` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:38 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_call_logs.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_call_logs.sql new file mode 100644 index 0000000..85b81f8 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_call_logs.sql @@ -0,0 +1,55 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `call_logs` +-- + +DROP TABLE IF EXISTS `call_logs`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `call_logs` ( + `id` int NOT NULL AUTO_INCREMENT, + `data_id` int DEFAULT NULL, + `call_status` varchar(255) DEFAULT NULL, + `remarks` varchar(255) DEFAULT NULL, + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `agent_id` int DEFAULT NULL, + `campaign_id` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `call_logs` +-- + +LOCK TABLES `call_logs` WRITE; +/*!40000 ALTER TABLE `call_logs` DISABLE KEYS */; +/*!40000 ALTER TABLE `call_logs` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:38 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_calls_status.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_calls_status.sql new file mode 100644 index 0000000..56502ef --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_calls_status.sql @@ -0,0 +1,54 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `calls_status` +-- + +DROP TABLE IF EXISTS `calls_status`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `calls_status` ( + `id` int NOT NULL AUTO_INCREMENT, + `call_status` text NOT NULL, + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `calls_status` +-- + +LOCK TABLES `calls_status` WRITE; +/*!40000 ALTER TABLE `calls_status` DISABLE KEYS */; +INSERT INTO `calls_status` VALUES (1,'INFORMATION GIVEN',1,0,'2025-03-20 07:49:35'),(2,'UNATTENDED',1,0,'2025-03-20 07:49:35'),(3,'CALL BACK LATER',1,0,'2025-03-20 07:49:35'),(4,'SWITCH OFF',1,0,'2025-03-20 07:49:35'),(5,'WRONG NUMBER',1,0,'2025-03-20 07:49:35'); +/*!40000 ALTER TABLE `calls_status` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:39 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_answers.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_answers.sql new file mode 100644 index 0000000..8fe93b4 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_answers.sql @@ -0,0 +1,56 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `campaign_answers` +-- + +DROP TABLE IF EXISTS `campaign_answers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `campaign_answers` ( + `id` int NOT NULL AUTO_INCREMENT, + `category_id` int NOT NULL, + `campaign_id` int NOT NULL, + `question_id` int NOT NULL, + `campaign_answer` text NOT NULL, + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `campaign_answers` +-- + +LOCK TABLES `campaign_answers` WRITE; +/*!40000 ALTER TABLE `campaign_answers` DISABLE KEYS */; +/*!40000 ALTER TABLE `campaign_answers` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:38 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_questions.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_questions.sql new file mode 100644 index 0000000..fba76bc --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_questions.sql @@ -0,0 +1,56 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `campaign_questions` +-- + +DROP TABLE IF EXISTS `campaign_questions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `campaign_questions` ( + `question_id` int NOT NULL AUTO_INCREMENT, + `category_id` int NOT NULL, + `campaign_id` int NOT NULL, + `questions` text NOT NULL, + `answer_type_id` int NOT NULL, + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`question_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `campaign_questions` +-- + +LOCK TABLES `campaign_questions` WRITE; +/*!40000 ALTER TABLE `campaign_questions` DISABLE KEYS */; +/*!40000 ALTER TABLE `campaign_questions` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:39 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_request.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_request.sql new file mode 100644 index 0000000..c0a5a1a --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_campaign_request.sql @@ -0,0 +1,61 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `campaign_request` +-- + +DROP TABLE IF EXISTS `campaign_request`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `campaign_request` ( + `campaign_id` int NOT NULL AUTO_INCREMENT, + `campaign_name` varchar(255) DEFAULT NULL, + `category_id` int DEFAULT NULL, + `start_date` date DEFAULT NULL, + `end_date` date DEFAULT NULL, + `no_of_agents` int DEFAULT NULL, + `calls_per_agent` int DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `excel_url` varchar(255) DEFAULT NULL, + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `campaign_status` varchar(45) DEFAULT NULL, + PRIMARY KEY (`campaign_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `campaign_request` +-- + +LOCK TABLES `campaign_request` WRITE; +/*!40000 ALTER TABLE `campaign_request` DISABLE KEYS */; +/*!40000 ALTER TABLE `campaign_request` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:39 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_category.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_category.sql new file mode 100644 index 0000000..b599d67 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_category.sql @@ -0,0 +1,53 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `category` +-- + +DROP TABLE IF EXISTS `category`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `category` ( + `category_id` int NOT NULL AUTO_INCREMENT, + `category_name` varchar(255) NOT NULL, + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`category_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `category` +-- + +LOCK TABLES `category` WRITE; +/*!40000 ALTER TABLE `category` DISABLE KEYS */; +/*!40000 ALTER TABLE `category` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:38 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_category_columns.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_category_columns.sql new file mode 100644 index 0000000..ba898d1 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_category_columns.sql @@ -0,0 +1,54 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `category_columns` +-- + +DROP TABLE IF EXISTS `category_columns`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `category_columns` ( + `id` int NOT NULL AUTO_INCREMENT, + `category_id` int NOT NULL, + `column_name` text NOT NULL, + `isactive` tinyint(1) NOT NULL DEFAULT '1', + `isdelete` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `category_columns` +-- + +LOCK TABLES `category_columns` WRITE; +/*!40000 ALTER TABLE `category_columns` DISABLE KEYS */; +/*!40000 ALTER TABLE `category_columns` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:39 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_questions_answers.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_questions_answers.sql new file mode 100644 index 0000000..50649d7 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_questions_answers.sql @@ -0,0 +1,55 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `questions_answers` +-- + +DROP TABLE IF EXISTS `questions_answers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `questions_answers` ( + `id` int NOT NULL AUTO_INCREMENT, + `campaign_id` int DEFAULT NULL, + `data_id` int DEFAULT NULL, + `agent_id` int DEFAULT NULL, + `question_id` int NOT NULL, + `campaign_answer` text NOT NULL, + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `questions_answers` +-- + +LOCK TABLES `questions_answers` WRITE; +/*!40000 ALTER TABLE `questions_answers` DISABLE KEYS */; +/*!40000 ALTER TABLE `questions_answers` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:39 diff --git a/gcc_campaign_empty_dump/gcc_1913_campaign_upload_data.sql b/gcc_campaign_empty_dump/gcc_1913_campaign_upload_data.sql new file mode 100644 index 0000000..de22a96 --- /dev/null +++ b/gcc_campaign_empty_dump/gcc_1913_campaign_upload_data.sql @@ -0,0 +1,73 @@ +-- MySQL dump 10.13 Distrib 8.0.36, for Win64 (x86_64) +-- +-- Host: localhost Database: gcc_1913_campaign +-- ------------------------------------------------------ +-- Server version 8.0.36 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `upload_data` +-- + +DROP TABLE IF EXISTS `upload_data`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `upload_data` ( + `data_id` bigint NOT NULL AUTO_INCREMENT, + `category_id` int NOT NULL, + `campaign_id` int NOT NULL, + `field_1` varchar(255) DEFAULT NULL, + `field_2` varchar(255) DEFAULT NULL, + `field_3` varchar(255) DEFAULT NULL, + `field_4` varchar(255) DEFAULT NULL, + `field_5` varchar(255) DEFAULT NULL, + `field_6` varchar(255) DEFAULT NULL, + `field_7` varchar(255) DEFAULT NULL, + `field_8` varchar(255) DEFAULT NULL, + `field_9` varchar(255) DEFAULT NULL, + `field_10` varchar(255) DEFAULT NULL, + `field_11` varchar(255) DEFAULT NULL, + `field_12` varchar(255) DEFAULT NULL, + `field_13` varchar(255) DEFAULT NULL, + `field_14` varchar(255) DEFAULT NULL, + `field_15` varchar(255) DEFAULT NULL, + `agent_id` int DEFAULT NULL, + `call_status` varchar(255) DEFAULT NULL, + `remarks` text, + `updated_agent_id` int DEFAULT NULL, + `updated_date` varchar(255) DEFAULT NULL, + `is_processed` tinyint(1) NOT NULL DEFAULT '0', + `created_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `upload_data` +-- + +LOCK TABLES `upload_data` WRITE; +/*!40000 ALTER TABLE `upload_data` DISABLE KEYS */; +/*!40000 ALTER TABLE `upload_data` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-03-22 11:56:40