diff --git a/src/main/java/org/upsmf/grievance/constants/Constants.java b/src/main/java/org/upsmf/grievance/constants/Constants.java index 86f54633e2b0d5e8a3db99b432d35b2d5967b063..8816f6a5d23747fd86c40eda3e6cbd09f6827c06 100644 --- a/src/main/java/org/upsmf/grievance/constants/Constants.java +++ b/src/main/java/org/upsmf/grievance/constants/Constants.java @@ -3,4 +3,30 @@ package org.upsmf.grievance.constants; public class Constants { public static final String TIME_ZONE = "Asia/Kolkata"; + public static final Long PENDING_21_DAYS = 21l; + public static final Long PENDING_15_DAYS = 15l; + public static final Long AFFILIATION = 1l; + public static final Long EXAM = 2l; + public static final Long ADMISSION = 3l; + public static final Long REGISTRATION = 4l; + public static final Long ASSESSMENT = 5l; + public static final String TOTAL_TICKETS = "total"; + public static final String IS_OPEN = "isOpen"; + public static final String IS_CLOSED = "isClosed"; + public static final String IS_JUNK = "isJunk"; + public static final String IS_ESCALATED = "isEscalated"; + public static final String UNASSIGNED = "unassigned"; + public static final String ASSESSMENT_MATRIX = "assignmentMatrix"; + public static final String RESOLUTION_MATRIX = "resolutionMatrix"; + public static final String AFFILIATION_NAME = "AFFILIATION"; + public static final String ASSESSMENT_DEPARTMENT = "ASSESSMENT"; + public static final String REGISTRATION_NAME = "REGISTRATION"; + public static final String ADMISSION_NAME = "ADMISSION"; + public static final String EXAM_NAME = "EXAM"; + public static final String OPEN_TICKET_GTE15 = "openTicketGte15"; + public static final String OPEN_TICKET_GTE21 = "openTicketGte21"; + public static final String PERFORMANCE_INDICATORS = "performanceIndicators"; + public static final String TURN_AROUND_TIME = "turnAroundTime"; + public static final String ESCLATION_PERCENTAGE = "escalationPercentage"; + public static final String NUDGE_TICKET_PERCENTAGE = "nudgeTicketPercentage"; } diff --git a/src/main/java/org/upsmf/grievance/dto/SearchRequest.java b/src/main/java/org/upsmf/grievance/dto/SearchRequest.java index 38d999c93440545fb8c5110b2f1582bdc7f1ee18..22a66fff964a8213c2483066f81497717f84298b 100644 --- a/src/main/java/org/upsmf/grievance/dto/SearchRequest.java +++ b/src/main/java/org/upsmf/grievance/dto/SearchRequest.java @@ -22,6 +22,8 @@ public class SearchRequest { private Long cc; + private List<Integer> ccList; + private SearchDateRange date; private Boolean isJunk; diff --git a/src/main/java/org/upsmf/grievance/scheduler/BiWeeklyJobScheduler.java b/src/main/java/org/upsmf/grievance/scheduler/BiWeeklyJobScheduler.java index 37ce9b58f78c274a804037fc47276dc896409017..4b36f3c6c67cfdd3d9473c0f3c8017f29f02ecf1 100644 --- a/src/main/java/org/upsmf/grievance/scheduler/BiWeeklyJobScheduler.java +++ b/src/main/java/org/upsmf/grievance/scheduler/BiWeeklyJobScheduler.java @@ -1,23 +1,61 @@ package org.upsmf.grievance.scheduler; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import org.upsmf.grievance.controller.SearchTicketController; +import org.upsmf.grievance.constants.Constants; +import org.upsmf.grievance.dto.SearchDateRange; import org.upsmf.grievance.dto.SearchRequest; -import org.upsmf.grievance.model.reponse.Response; -import org.upsmf.grievance.model.reponse.TicketResponse; +import org.upsmf.grievance.model.EmailDetails; +import org.upsmf.grievance.service.EmailService; +import org.upsmf.grievance.service.SearchService; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Calendar; +import java.util.List; +import java.util.Map; @Component +@Slf4j public class BiWeeklyJobScheduler { @Autowired - private SearchTicketController searchTicketController; - @Scheduled(cron = "0 0 0 */14 * ?") + private SearchService searchService; + + @Autowired + private EmailService emailService; + + @Value("${email.ids}") + private List<String> emailIds; + + @Value("${subject.bi.weekly.report}") + private String subject; + + @Scheduled(cron = "0 1 0 */14 * ?") public void runBiWeeklyJob(){ + log.info("Starting the Bi Weekly job"); SearchRequest searchRequest = new SearchRequest(); - ResponseEntity<Response> ticketResponse = searchTicketController.search(searchRequest); + searchRequest.setDate(SearchDateRange.builder().to(Calendar.getInstance().getTimeInMillis()) + .from(LocalDateTime.now().minusDays(14).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()).build()); + Map<String, Object> response = searchService.dashboardReport(searchRequest); + log.info("Response "+response); + + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.valueToTree(response); + JsonNode assessmentMatrix = jsonNode.get(Constants.ASSESSMENT_MATRIX); + log.info("Json node "+assessmentMatrix.toString()); + EmailDetails emailDetails = new EmailDetails(); + for (int i=0;i<emailIds.size();i++){ + emailDetails.builder().recipient(emailIds.get(i)).msgBody(assessmentMatrix.toString()) + .subject(subject); + log.info("Details "+emailIds.get(i) + " "+response.get(Constants.ASSESSMENT_MATRIX)+ " "+ subject); + emailService.sendSimpleMail(emailDetails); + } } } diff --git a/src/main/java/org/upsmf/grievance/scheduler/NightlyJobScheduler.java b/src/main/java/org/upsmf/grievance/scheduler/NightlyJobScheduler.java index 15a42895829b875e839df2b1a661eb137bd52a13..e4a30d62d6410e0531817a542bf07d411baf4cdf 100644 --- a/src/main/java/org/upsmf/grievance/scheduler/NightlyJobScheduler.java +++ b/src/main/java/org/upsmf/grievance/scheduler/NightlyJobScheduler.java @@ -1,13 +1,60 @@ package org.upsmf.grievance.scheduler; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.upsmf.grievance.constants.Constants; +import org.upsmf.grievance.dto.SearchDateRange; +import org.upsmf.grievance.dto.SearchRequest; +import org.upsmf.grievance.model.EmailDetails; +import org.upsmf.grievance.service.EmailService; +import org.upsmf.grievance.service.SearchService; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Calendar; +import java.util.List; +import java.util.Map; @Component +@Slf4j public class NightlyJobScheduler { - @Scheduled(cron = "0 0 0 * * ?") + @Autowired + private SearchService searchService; + + @Autowired + private EmailService emailService; + + @Value("${email.ids}") + private List<String> emailIds; + + @Value("${subject.daily.report}") + private String subject; + + @Scheduled(cron = "0 1 0 * * ?") public void runNightlyJob(){ + log.info("Starting the Nightly job"); + SearchRequest searchRequest = new SearchRequest(); + searchRequest.setDate(SearchDateRange.builder().to(Calendar.getInstance().getTimeInMillis()) + .from(LocalDateTime.now().minusDays(1).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()).build()); + Map<String, Object> response = searchService.dashboardReport(searchRequest); + log.info("Response "+response); + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode = objectMapper.valueToTree(response); + JsonNode assessmentMatrix = jsonNode.get(Constants.ASSESSMENT_MATRIX); + log.info("Json node "+assessmentMatrix.toString()); + EmailDetails emailDetails = new EmailDetails(); + for (int i=0;i<emailIds.size();i++){ + emailDetails.builder().recipient(emailIds.get(i)).msgBody(assessmentMatrix.toString()) + .subject(subject); + log.info("Details "+emailIds.get(i) + " "+response.get(Constants.ASSESSMENT_MATRIX)+ " "+ subject); + emailService.sendSimpleMail(emailDetails); + } } } diff --git a/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java b/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java index 9f2894db679457bcf20f7bdde40530d83ec1d6ff..8e1b901dcc819a269fea739d3eee46349905eaaf 100644 --- a/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java +++ b/src/main/java/org/upsmf/grievance/service/impl/SearchServiceImpl.java @@ -3,10 +3,7 @@ package org.upsmf.grievance.service.impl; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.MatchQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.RangeQueryBuilder; +import org.elasticsearch.index.query.*; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; @@ -19,6 +16,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.upsmf.grievance.config.EsConfig; +import org.upsmf.grievance.constants.Constants; import org.upsmf.grievance.dto.SearchRequest; import org.upsmf.grievance.enums.RequesterType; import org.upsmf.grievance.enums.TicketPriority; @@ -29,16 +27,36 @@ import org.upsmf.grievance.repository.es.TicketRepository; import org.upsmf.grievance.service.SearchService; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.*; @Service public class SearchServiceImpl implements SearchService { @Value("${es.default.page.size}") private int defaultPageSize; + + @Value("${pending.21.days}") + private long PENDING_21_DAYS; + + @Value("${pending.15.days}") + private long PENDING_15_DAYS; + + private Map<String, Object> departmentNameResponse = new HashMap<>(); + private Map<String, Object> performanceIndicatorsResponse = new HashMap<>(); + private Map<String, Object> finalResponse = new HashMap<>(); + private Boolean allDepartment = false; + private Boolean totalFinalResponse = false; + private Boolean multiSelectResponse = false; + private long totalIsJunk = 0; + private long totalOpenStatus = 0; + private long totalcloseStatus = 0; + private long totalIsEscalated = 0; + private long totalUnassigned = 0; + private long totalNudgeTickets = 0; + private long totalOpenTicketGte15 = 0; + private long totalOpenTicketGte21 = 0; @Autowired private TicketRepository esTicketRepository; @Autowired @@ -56,22 +74,147 @@ public class SearchServiceImpl implements SearchService { @Override public Map<String, Object> dashboardReport(SearchRequest searchRequest) { //Create query for search by keyword - SearchResponse searchJunkResponse = getDashboardSearchResponse(searchRequest, "isJunk"); - SearchResponse searchOpenStatusResponse = getDashboardSearchResponse(searchRequest, "openStatus"); - SearchResponse searchClosedStatusResponse = getDashboardSearchResponse(searchRequest, "closedStatus"); - SearchResponse searchIsEsclatedResponse = getDashboardSearchResponse(searchRequest, "isEscalated"); + departmentNameResponse = new HashMap<>(); + performanceIndicatorsResponse = new HashMap<>(); + finalResponse = new HashMap<>(); + totalIsJunk = 0; + totalOpenStatus = 0; + totalcloseStatus = 0; + totalIsEscalated = 0; + totalUnassigned = 0; + totalOpenTicketGte21 = 0; + totalOpenTicketGte15 = 0; + totalNudgeTickets = 0; + allDepartment = false; + totalFinalResponse = false; + multiSelectResponse = false; + if (searchRequest.getFilter() != null) { + List<Integer> ccList = (List<Integer>) searchRequest.getFilter().get("ccList"); + if (ccList != null && ccList.size() > 0) { + for (int i = 1; i <= ccList.size(); i++) { + if (ccList.size() == i) { + multiSelectResponse = true; + } + Long cc = Long.valueOf(ccList.get(i - 1)); + if (cc != null && cc.equals(Constants.AFFILIATION)) { + getfinalResponse(searchRequest, Constants.AFFILIATION); + } else if (cc != null && cc.equals(Constants.EXAM)) { + getfinalResponse(searchRequest, Constants.EXAM); + } else if (cc != null && cc.equals(Constants.ADMISSION)) { + getfinalResponse(searchRequest, Constants.ADMISSION); + } else if (cc != null && cc.equals(Constants.REGISTRATION)) { + getfinalResponse(searchRequest, Constants.REGISTRATION); + } else if (cc != null && cc.equals(Constants.ASSESSMENT)) { + getfinalResponse(searchRequest, Constants.ASSESSMENT); + } else { + allDepartment = true; + getfinalResponse(searchRequest, Constants.AFFILIATION); + getfinalResponse(searchRequest, Constants.EXAM); + getfinalResponse(searchRequest, Constants.ADMISSION); + getfinalResponse(searchRequest, Constants.REGISTRATION); + totalFinalResponse = true;// This flag should be there before last getfinalResponse + getfinalResponse(searchRequest, Constants.ASSESSMENT); + } + } + } + } else { + allDepartment = true; + getfinalResponse(searchRequest, Constants.AFFILIATION); + getfinalResponse(searchRequest, Constants.EXAM); + getfinalResponse(searchRequest, Constants.ADMISSION); + getfinalResponse(searchRequest, Constants.REGISTRATION); + totalFinalResponse = true;// This flag should be there before last getfinalResponse + getfinalResponse(searchRequest, Constants.ASSESSMENT); + } + return finalResponse; + } + + private void getfinalResponse(SearchRequest searchRequest, Long cc) { + SearchResponse searchJunkResponse = getDashboardSearchResponse(searchRequest, "isJunk", cc, null); + SearchResponse searchOpenStatusResponse = getDashboardSearchResponse(searchRequest, "openStatus", cc, null); + SearchResponse searchClosedStatusResponse = getDashboardSearchResponse(searchRequest, "closedStatus", cc, null); + SearchResponse searchTurnAroundStatusResponse = getDashboardSearchResponse(searchRequest, "closedStatus", cc, null); + SearchResponse searchIsEsclatedResponse = getDashboardSearchResponse(searchRequest, "isEscalated", cc, null); + SearchResponse searchUnassignedResponse = getDashboardSearchResponse(searchRequest, "openStatus", -1l, null); + SearchResponse searchOpenTicketsGte21Response = getDashboardSearchResponse(searchRequest, "openStatus", cc, "isGte21"); + SearchResponse searchOpenTicketsGte15Response = getDashboardSearchResponse(searchRequest, "openStatus", cc, "isGte15"); + SearchResponse searchPriorityResponse = getDashboardSearchResponse(searchRequest, "highPriority", cc, null); + Map<String, Object> response = new HashMap<>(); - response.put("isJunk", searchJunkResponse.getHits().getTotalHits().value); - response.put("isOpen", searchOpenStatusResponse.getHits().getTotalHits().value); - response.put("isClosed", searchClosedStatusResponse.getHits().getTotalHits().value); - response.put("isEscalated", searchIsEsclatedResponse.getHits().getTotalHits().value); - return response; + totalIsJunk = totalIsJunk + searchJunkResponse.getHits().getTotalHits().value; + totalOpenStatus = totalOpenStatus + searchOpenStatusResponse.getHits().getTotalHits().value; + totalcloseStatus = totalcloseStatus + searchClosedStatusResponse.getHits().getTotalHits().value; + totalIsEscalated = totalIsEscalated + searchIsEsclatedResponse.getHits().getTotalHits().value; + totalUnassigned = totalUnassigned + searchUnassignedResponse.getHits().getTotalHits().value; + totalNudgeTickets = totalNudgeTickets + searchPriorityResponse.getHits().getTotalHits().value; + totalOpenTicketGte21 = totalOpenTicketGte21 + searchOpenTicketsGte21Response.getHits().getTotalHits().value; + long totalTicketsCount = searchJunkResponse.getHits().getTotalHits().value + searchOpenStatusResponse.getHits().getTotalHits().value + + searchClosedStatusResponse.getHits().getTotalHits().value + searchIsEsclatedResponse.getHits().getTotalHits().value + + searchOpenTicketsGte15Response.getHits().getTotalHits().value + searchUnassignedResponse.getHits().getTotalHits().value; + response.put(Constants.TOTAL_TICKETS, totalTicketsCount); + response.put(Constants.IS_JUNK, searchJunkResponse.getHits().getTotalHits().value); + response.put(Constants.IS_OPEN, searchOpenStatusResponse.getHits().getTotalHits().value); + response.put(Constants.IS_CLOSED, searchClosedStatusResponse.getHits().getTotalHits().value); + response.put(Constants.IS_ESCALATED, searchIsEsclatedResponse.getHits().getTotalHits().value); + response.put(Constants.UNASSIGNED, searchUnassignedResponse.getHits().getTotalHits().value); + response.put(Constants.OPEN_TICKET_GTE15, searchOpenTicketsGte15Response.getHits().getTotalHits().value); + + if (cc.equals(Constants.ASSESSMENT)) { + departmentNameResponse.put(Constants.ASSESSMENT_DEPARTMENT, response); + } else if (cc.equals(Constants.AFFILIATION)) { + departmentNameResponse.put(Constants.AFFILIATION_NAME, response); + } else if (cc.equals(Constants.EXAM)) { + departmentNameResponse.put(Constants.EXAM_NAME, response); + } else if (cc.equals(Constants.REGISTRATION)) { + departmentNameResponse.put(Constants.REGISTRATION_NAME, response); + } else if (cc.equals(Constants.ADMISSION)) { + departmentNameResponse.put(Constants.ADMISSION_NAME, response); + } + if (totalFinalResponse) { + getResponse(); + } + if (multiSelectResponse) { + getResponse(); + } + finalResponse.put(Constants.RESOLUTION_MATRIX, departmentNameResponse); + } + + private void getResponse() { + Map<String, Object> response = new HashMap<>(); + long totalTicketsCount = totalIsJunk + totalIsEscalated + totalOpenStatus + totalcloseStatus + totalUnassigned; + response.put(Constants.TOTAL_TICKETS, totalTicketsCount); + response.put(Constants.IS_JUNK, totalIsJunk); + response.put(Constants.IS_OPEN, totalOpenStatus); + response.put(Constants.IS_CLOSED, totalcloseStatus); + response.put(Constants.IS_ESCALATED, totalIsEscalated); + response.put(Constants.UNASSIGNED, totalUnassigned); + finalResponse.put(Constants.ASSESSMENT_MATRIX, response); + + performanceIndicatorsResponse = new HashMap<>(); + performanceIndicatorsResponse.put(Constants.TURN_AROUND_TIME, 0 + " days"); + int esclationPercentage = 0; + int nudgePercentage = 0; + if(totalTicketsCount != 0){ + esclationPercentage = (int) Math.round((double) (totalIsEscalated / totalTicketsCount) * 100); + nudgePercentage = (int) Math.round((double) (totalNudgeTickets) / totalTicketsCount * 100); + } + performanceIndicatorsResponse.put(Constants.ESCLATION_PERCENTAGE, esclationPercentage + "%"); + performanceIndicatorsResponse.put(Constants.NUDGE_TICKET_PERCENTAGE, nudgePercentage + "%"); + performanceIndicatorsResponse.put(Constants.OPEN_TICKET_GTE21, totalOpenTicketGte21); + finalResponse.put(Constants.PERFORMANCE_INDICATORS, performanceIndicatorsResponse); } - private SearchResponse getDashboardSearchResponse(SearchRequest searchRequest, String reportType) { + private SearchResponse getDashboardSearchResponse(SearchRequest searchRequest, String reportType, Long cc, String flag) { SearchResponse searchResponse; BoolQueryBuilder finalQuery = QueryBuilders.boolQuery(); - finalQuery = getDateRangeQuery(searchRequest, finalQuery); + if (flag != null && flag.equals("isGte21")) { + finalQuery = getGte21DaysQuery(searchRequest, finalQuery); + } else if (flag != null && flag.equals("isGte15")) { + finalQuery = getGte15DaysQuery(searchRequest, finalQuery); + } else { + finalQuery = getDateRangeQuery(searchRequest, finalQuery); + } + finalQuery = getCCRangeQuery(cc, finalQuery); if (reportType.equals("isJunk")) { finalQuery = getJunkQuery(true, finalQuery); } else if (reportType.equals("openStatus")) { @@ -82,8 +225,11 @@ public class SearchServiceImpl implements SearchService { List<String> list = new ArrayList<>(); list.add("CLOSED"); finalQuery = getStatusQuery(list, finalQuery); + finalQuery = getJunkQuery(false, finalQuery); } else if (reportType.equals("isEscalated")) { finalQuery = getEsclatedTicketsQuery(true, finalQuery); + } else if (reportType.equals("highPriority")) { + finalQuery = getPriority("HIGH", finalQuery); } SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder() .query(finalQuery); @@ -114,11 +260,12 @@ public class SearchServiceImpl implements SearchService { private SearchResponse getSearchResponse(SearchRequest searchRequest) { SearchResponse searchResponse; String keyValue = searchRequest.getSort().keySet().iterator().next(); + keyValue = getKeyValue(keyValue); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder() .query(createTicketSearchQuery(searchRequest)) .from(searchRequest.getPage()) .size(searchRequest.getSize()) - .sort(keyValue, SortOrder.valueOf(searchRequest.getSort().get(keyValue).toUpperCase())); + .sort(keyValue, SortOrder.valueOf(searchRequest.getSort().get(searchRequest.getSort().keySet().iterator().next()).toUpperCase())); org.elasticsearch.action.search.SearchRequest search = new org.elasticsearch.action.search.SearchRequest("ticket"); search.searchType(SearchType.QUERY_THEN_FETCH); @@ -131,148 +278,237 @@ public class SearchServiceImpl implements SearchService { return searchResponse; } - private static List<Object> getDocumentsFromSearchResult(SearchResponse result) { + private String getKeyValue(String keyValue) { + switch (keyValue) { + case "ticketId": + keyValue = "ticket_id"; + break; + case "firstName": + keyValue = "requester_first_name"; + break; + case "lastName": + keyValue = "requester_last_name"; + break; + case "phone": + keyValue = "requester_phone"; + break; + case "email": + keyValue = "requester_email"; + break; + case "requesterType": + keyValue = "requester_type"; + break; + case "assignedToId": + keyValue = "assigned_to_id"; + break; + case "assignedToName": + keyValue = "assigned_to_name"; + break; + case "description": + keyValue = "description"; + break; + case "junk": + keyValue = "is_junk"; + break; + case "createdDate": + keyValue = "created_date"; + break; + case "updatedDate": + keyValue = "updated_date"; + break; + case "createdDateTS": + keyValue = "created_date_ts"; + break; + case "updatedDateTS": + keyValue = "updated_date_ts"; + break; + case "lastUpdatedBy": + keyValue = "last_updated_by"; + break; + case "escalated": + keyValue = "is_escalated"; + break; + case "escalatedDate": + keyValue = "escalated_date"; + break; + case "escalatedDateTS": + keyValue = "escalated_date_ts"; + break; + case "escalatedTo": + keyValue = "escalated_to"; + break; + case "status": + keyValue = "status"; + break; + case "requestType": + keyValue = "request_type"; + break; + case "priority": + keyValue = "priority"; + break; + case "escalatedBy": + keyValue = "escalated_by"; + break; + } + return keyValue; + } + + private List<Object> getDocumentsFromSearchResult(SearchResponse result) { SearchHits hits = result.getHits(); return getDocumentsFromHits(hits); } - private static List<Object> getDocumentsFromHits(SearchHits hits) { + private List<Object> getDocumentsFromHits(SearchHits hits) { List<Object> documents = new ArrayList<Object>(); for (SearchHit hit : hits) { Ticket esTicket = new Ticket(); for (Map.Entry entry : hit.getSourceAsMap().entrySet()) { String key = (String) entry.getKey(); - switch (key) { - case "ticket_id": - Long longValue = ((Number) entry.getValue()).longValue(); - esTicket.setTicketId(longValue); - break; - case "requester_first_name": - esTicket.setFirstName((String) entry.getValue()); - break; - case "requester_last_name": - esTicket.setLastName((String) entry.getValue()); - break; - case "requester_phone": - esTicket.setPhone((String) entry.getValue()); - break; - case "requester_email": - esTicket.setEmail((String) entry.getValue()); - break; - case "requester_type": - for (RequesterType enumValue : RequesterType.values()) { - if (enumValue.name().equals(entry.getValue().toString())) { - esTicket.setRequesterType(enumValue); - break; - } - } - break; - case "assigned_to_id": - longValue = ((Number) entry.getValue()).longValue(); - esTicket.setAssignedToId(longValue); - break; - case "assigned_to_name": - esTicket.setAssignedToName((String) entry.getValue()); - break; - case "description": - esTicket.setDescription((String) entry.getValue()); - break; - case "is_junk": - esTicket.setJunk((Boolean) entry.getValue()); - break; - case "created_date": - esTicket.setCreatedDate((String) entry.getValue()); - break; - case "updated_date": - esTicket.setUpdatedDate((String) entry.getValue()); - break; - case "created_date_ts": - longValue = ((Number) entry.getValue()).longValue(); - esTicket.setCreatedDateTS(longValue); - break; - case "updated_date_ts": - longValue = ((Number) entry.getValue()).longValue(); - esTicket.setUpdatedDateTS(longValue); - break; - case "last_updated_by": - longValue = ((Number) entry.getValue()).longValue(); - esTicket.setLastUpdatedBy(longValue); - break; - case "is_escalated": - esTicket.setEscalated((Boolean) entry.getValue()); - break; - case "escalated_date": - esTicket.setEscalatedDate((String) entry.getValue()); - break; - case "escalated_date_ts": - longValue = ((Number) entry.getValue()).longValue(); - esTicket.setEscalatedDateTS(longValue); - break; - case "escalated_to": - longValue = ((Number) entry.getValue()).longValue(); - esTicket.setEscalatedTo(longValue); - break; - case "status": - for (TicketStatus enumValue : TicketStatus.values()) { - if (enumValue.name().equals(entry.getValue().toString())) { - esTicket.setStatus(enumValue); - break; - } - } - break; - case "request_type": - esTicket.setRequestType((String) entry.getValue()); + mapEsTicketDtoToTicketDto(entry, key, esTicket); + } + documents.add(esTicket); + } + return documents; + } + + private void mapEsTicketDtoToTicketDto(Map.Entry entry, String key, Ticket esTicket) { + switch (key) { + case "ticket_id": + Long longValue = ((Number) entry.getValue()).longValue(); + esTicket.setTicketId(longValue); + break; + case "requester_first_name": + esTicket.setFirstName((String) entry.getValue()); + break; + case "requester_last_name": + esTicket.setLastName((String) entry.getValue()); + break; + case "requester_phone": + esTicket.setPhone((String) entry.getValue()); + break; + case "requester_email": + esTicket.setEmail((String) entry.getValue()); + break; + case "requester_type": + for (RequesterType enumValue : RequesterType.values()) { + if (enumValue.name().equals(entry.getValue().toString())) { + esTicket.setRequesterType(enumValue); break; - case "priority": - for (TicketPriority enumValue : TicketPriority.values()) { - if (enumValue.name().equals(entry.getValue().toString())) { - esTicket.setPriority(enumValue); - break; - } - } + } + } + break; + case "assigned_to_id": + longValue = ((Number) entry.getValue()).longValue(); + esTicket.setAssignedToId(longValue); + break; + case "assigned_to_name": + esTicket.setAssignedToName((String) entry.getValue()); + break; + case "description": + esTicket.setDescription((String) entry.getValue()); + break; + case "is_junk": + esTicket.setJunk((Boolean) entry.getValue()); + break; + case "created_date": + esTicket.setCreatedDate((String) entry.getValue()); + break; + case "updated_date": + esTicket.setUpdatedDate((String) entry.getValue()); + break; + case "created_date_ts": + longValue = ((Number) entry.getValue()).longValue(); + esTicket.setCreatedDateTS(longValue); + break; + case "updated_date_ts": + longValue = ((Number) entry.getValue()).longValue(); + esTicket.setUpdatedDateTS(longValue); + break; + case "last_updated_by": + longValue = ((Number) entry.getValue()).longValue(); + esTicket.setLastUpdatedBy(longValue); + break; + case "is_escalated": + esTicket.setEscalated((Boolean) entry.getValue()); + break; + case "escalated_date": + esTicket.setEscalatedDate((String) entry.getValue()); + break; + case "escalated_date_ts": + longValue = ((Number) entry.getValue()).longValue(); + esTicket.setEscalatedDateTS(longValue); + break; + case "escalated_to": + longValue = ((Number) entry.getValue()).longValue(); + esTicket.setEscalatedTo(longValue); + break; + case "status": + for (TicketStatus enumValue : TicketStatus.values()) { + if (enumValue.name().equals(entry.getValue().toString())) { + esTicket.setStatus(enumValue); break; - case "escalated_by": - longValue = ((Number) entry.getValue()).longValue(); - esTicket.setEscalatedBy(longValue); + } + } + break; + case "request_type": + esTicket.setRequestType((String) entry.getValue()); + break; + case "priority": + for (TicketPriority enumValue : TicketPriority.values()) { + if (enumValue.name().equals(entry.getValue().toString())) { + esTicket.setPriority(enumValue); break; + } } - } - documents.add(esTicket); + break; + case "escalated_by": + longValue = ((Number) entry.getValue()).longValue(); + esTicket.setEscalatedBy(longValue); + break; } - return documents; } private BoolQueryBuilder createTicketSearchQuery(SearchRequest searchRequest) { BoolQueryBuilder finalQuery = QueryBuilders.boolQuery(); // search by keyword if (searchRequest.getSearchKeyword() != null && !searchRequest.getSearchKeyword().isBlank()) { - MatchQueryBuilder firstNameKeywordMatchQuery = QueryBuilders.matchQuery("requester_first_name", searchRequest.getSearchKeyword()); - MatchQueryBuilder phoneKeywordMatchQuery = QueryBuilders.matchQuery("requester_phone", searchRequest.getSearchKeyword()); - MatchQueryBuilder emailKeywordMatchQuery = QueryBuilders.matchQuery("requester_email", searchRequest.getSearchKeyword()); + RegexpQueryBuilder firstNameKeywordMatchQuery = QueryBuilders.regexpQuery("requester_first_name", ".*" + searchRequest.getSearchKeyword().toLowerCase() + ".*"); + RegexpQueryBuilder phoneKeywordMatchQuery = QueryBuilders.regexpQuery("requester_phone", ".*" + searchRequest.getSearchKeyword().toLowerCase() + ".*"); + RegexpQueryBuilder emailKeywordMatchQuery = QueryBuilders.regexpQuery("requester_email", ".*" + searchRequest.getSearchKeyword().toLowerCase() + ".*"); BoolQueryBuilder keywordSearchQuery = QueryBuilders.boolQuery(); keywordSearchQuery.should(firstNameKeywordMatchQuery).should(phoneKeywordMatchQuery).should(emailKeywordMatchQuery); finalQuery.must(keywordSearchQuery); } - if (searchRequest.getPriority() != null) { - MatchQueryBuilder priorityMatchQuery = QueryBuilders.matchQuery("priority", searchRequest.getPriority()); + getPriority(String.valueOf(searchRequest.getPriority()), finalQuery); + getCCRangeQuery(((Number) searchRequest.getFilter().get("cc")).longValue(), finalQuery); + getDateRangeQuery(searchRequest, finalQuery); + getStatusQuery((List<String>) searchRequest.getFilter().get("status"), finalQuery); + getJunkQuery(searchRequest.getIsJunk(), finalQuery); + getEsclatedTicketsQuery(searchRequest.getIsEscalated(), finalQuery); + return finalQuery; + } + + private BoolQueryBuilder getPriority(String priority, BoolQueryBuilder finalQuery) { + if (priority != null) { + MatchQueryBuilder priorityMatchQuery = QueryBuilders.matchQuery("priority", priority); BoolQueryBuilder prioritySearchQuery = QueryBuilders.boolQuery(); prioritySearchQuery.must(priorityMatchQuery); finalQuery.must(prioritySearchQuery); } - if (searchRequest.getFilter().get("cc") != null) { - MatchQueryBuilder ccMatchQuery = QueryBuilders.matchQuery("assigned_to_id", searchRequest.getFilter().get("cc")); + return finalQuery; + } + + private BoolQueryBuilder getCCRangeQuery(Long cc, BoolQueryBuilder finalQuery) { + if (cc != null) { + MatchQueryBuilder ccMatchQuery = QueryBuilders.matchQuery("assigned_to_id", cc); BoolQueryBuilder ccSearchQuery = QueryBuilders.boolQuery(); ccSearchQuery.must(ccMatchQuery); finalQuery.must(ccSearchQuery); } - getDateRangeQuery(searchRequest, finalQuery); - getStatusQuery((List<String>) searchRequest.getFilter().get("status"), finalQuery); - getJunkQuery(searchRequest.getIsJunk(), finalQuery); - getEsclatedTicketsQuery(searchRequest.getIsEscalated(), finalQuery); return finalQuery; } - private static BoolQueryBuilder getJunkQuery(Boolean isJunk, BoolQueryBuilder finalQuery) { + private BoolQueryBuilder getJunkQuery(Boolean isJunk, BoolQueryBuilder finalQuery) { if (isJunk != null) { MatchQueryBuilder junkMatchQuery = QueryBuilders.matchQuery("is_junk", isJunk); BoolQueryBuilder junkSearchQuery = QueryBuilders.boolQuery(); @@ -282,7 +518,7 @@ public class SearchServiceImpl implements SearchService { return finalQuery; } - private static BoolQueryBuilder getEsclatedTicketsQuery(Boolean isEscalated, BoolQueryBuilder finalQuery) { + private BoolQueryBuilder getEsclatedTicketsQuery(Boolean isEscalated, BoolQueryBuilder finalQuery) { if (isEscalated != null) { MatchQueryBuilder esclatedMatchQuery = QueryBuilders.matchQuery("is_escalated", isEscalated); BoolQueryBuilder esclatedSearchQuery = QueryBuilders.boolQuery(); @@ -292,7 +528,7 @@ public class SearchServiceImpl implements SearchService { return finalQuery; } - private static BoolQueryBuilder getStatusQuery(List<String> statusList, BoolQueryBuilder finalQuery) { + private BoolQueryBuilder getStatusQuery(List<String> statusList, BoolQueryBuilder finalQuery) { if (statusList != null) { MatchQueryBuilder statusMatchQuery = null; BoolQueryBuilder statusSearchQuery = QueryBuilders.boolQuery(); @@ -306,7 +542,7 @@ public class SearchServiceImpl implements SearchService { return finalQuery; } - private static BoolQueryBuilder getDateRangeQuery(SearchRequest searchRequest, BoolQueryBuilder finalQuery) { + private BoolQueryBuilder getDateRangeQuery(SearchRequest searchRequest, BoolQueryBuilder finalQuery) { if (searchRequest.getDate() != null && searchRequest.getDate().getFrom() != null && searchRequest.getDate().getFrom() > 0) { RangeQueryBuilder fromTimestampMatchQuery = QueryBuilders.rangeQuery("created_date_ts").gte(searchRequest.getDate().getFrom()); if (searchRequest.getDate().getTo() != null && searchRequest.getDate().getTo() > 0) { @@ -318,4 +554,22 @@ public class SearchServiceImpl implements SearchService { } return finalQuery; } + + private BoolQueryBuilder getGte15DaysQuery(SearchRequest searchRequest, BoolQueryBuilder finalQuery) { + Instant currentTimestamp = Instant.now(); + RangeQueryBuilder fromTimestampMatchQuery = QueryBuilders.rangeQuery("created_date_ts").lte(currentTimestamp.minus(PENDING_15_DAYS, ChronoUnit.DAYS).toEpochMilli()); + BoolQueryBuilder timestampSearchQuery = QueryBuilders.boolQuery(); + timestampSearchQuery.must(fromTimestampMatchQuery); + finalQuery.must(timestampSearchQuery); + return finalQuery; + } + + private BoolQueryBuilder getGte21DaysQuery(SearchRequest searchRequest, BoolQueryBuilder finalQuery) { + Instant currentTimestamp = Instant.now(); + RangeQueryBuilder fromTimestampMatchQuery = QueryBuilders.rangeQuery("created_date_ts").lte(currentTimestamp.minus(PENDING_21_DAYS, ChronoUnit.DAYS).toEpochMilli()); + BoolQueryBuilder timestampSearchQuery = QueryBuilders.boolQuery(); + timestampSearchQuery.must(fromTimestampMatchQuery); + finalQuery.must(timestampSearchQuery); + return finalQuery; + } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b7157798908b9d91a4a33c2c3405f970a659c8e5..d004b9690c05ec847b03bdd41a581adf9c0f80be 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,14 +1,12 @@ # Details for our datasource -#spring.datasource.url=jdbc:postgresql://192.168.64.5:5432/grievance -spring.datasource.url=jdbc:postgresql://localhost:5432/grievance_desk +spring.datasource.url=jdbc:postgresql://192.168.64.5:5432/grievance spring.datasource.username=postgres -#spring.datasource.password=postgres -spring.datasource.password=mysecretpassword +spring.datasource.password=postgres # Hibernate properties spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect spring.jpa.show-sql=true -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=none spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl spring.jpa.properties.hibernate.format_sql=true spring.main.allow-bean-definition-overriding=true @@ -46,9 +44,15 @@ gcp.max.file.size=2mb gcp.config.file.path=/Users/shishirsuman/Desktop/upsmf.json gcp.client.id= gcp.client.email= -gcp.pkcs.key= gcp.private.key.id= +gcp.pkcs.key= +#Dashboard +pending.21.days=21 +pending.15.days=15 +email.ids=nodalofficer@yopmail.com,grievance@yopmail.com +subject.daily.report=Daily Report +subject.bi.weekly.report=Bi Weekly Report api.user.createUrl=http://localhost:5298/api/v1/user/create