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