Subversion Repositories SmartDukaan

Rev

Rev 36789 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
25979 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
29266 manish 3
import com.google.gson.Gson;
31370 tejbeer 4
import com.mongodb.DBObject;
25988 tejbeer 5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
33843 ranu 6
import com.spice.profitmandi.common.model.*;
29426 manish 7
import com.spice.profitmandi.common.util.FileUtil;
34627 aman.kumar 8
import com.spice.profitmandi.common.util.FormattingUtils;
31370 tejbeer 9
import com.spice.profitmandi.common.web.util.ResponseSender;
25979 tejbeer 10
import com.spice.profitmandi.dao.entity.auth.AuthUser;
32464 tejbeer 11
import com.spice.profitmandi.dao.entity.catalog.BrandCatalog;
30416 tejbeer 12
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
33843 ranu 13
import com.spice.profitmandi.dao.entity.user.*;
30773 amit.gupta 14
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
31249 tejbeer 15
import com.spice.profitmandi.dao.enumuration.dtr.CommunicationType;
29598 tejbeer 16
import com.spice.profitmandi.dao.enumuration.dtr.LeadSource;
25979 tejbeer 17
import com.spice.profitmandi.dao.enumuration.dtr.LeadStatus;
33843 ranu 18
import com.spice.profitmandi.dao.model.*;
25979 tejbeer 19
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
30185 tejbeer 20
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionPlanRepository;
30434 tejbeer 21
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
30416 tejbeer 22
import com.spice.profitmandi.dao.repository.cs.CsService;
29266 manish 23
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
33843 ranu 24
import com.spice.profitmandi.dao.repository.dtr.*;
30416 tejbeer 25
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
35223 ranu 26
import com.spice.profitmandi.dao.repository.fofo.RbmRatingRepository;
25979 tejbeer 27
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
30445 tejbeer 28
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
29266 manish 29
import com.spice.profitmandi.service.AuthService;
30416 tejbeer 30
import com.spice.profitmandi.service.PartnerCollectionService;
33917 ranu 31
import com.spice.profitmandi.service.RbmTargetService;
32464 tejbeer 32
import com.spice.profitmandi.service.catalog.BrandsService;
34650 aman.kumar 33
import com.spice.profitmandi.service.order.OrderService;
30416 tejbeer 34
import com.spice.profitmandi.service.user.RetailerService;
25979 tejbeer 35
import com.spice.profitmandi.web.model.LoginDetails;
36
import com.spice.profitmandi.web.util.CookiesProcessor;
37
import com.spice.profitmandi.web.util.MVCResponseSender;
35548 aman 38
import org.apache.commons.csv.CSVFormat;
39
import org.apache.commons.csv.CSVParser;
33843 ranu 40
import org.apache.commons.csv.CSVRecord;
34707 aman.kumar 41
import org.apache.commons.io.output.ByteArrayOutputStream;
33843 ranu 42
import org.apache.logging.log4j.LogManager;
43
import org.apache.logging.log4j.Logger;
44
import org.springframework.beans.factory.annotation.Autowired;
45
import org.springframework.core.io.InputStreamResource;
46
import org.springframework.http.HttpHeaders;
47
import org.springframework.http.HttpStatus;
48
import org.springframework.http.MediaType;
49
import org.springframework.http.ResponseEntity;
50
import org.springframework.stereotype.Controller;
35507 ranu 51
import org.springframework.transaction.annotation.Transactional;
33843 ranu 52
import org.springframework.ui.Model;
53
import org.springframework.util.StringUtils;
54
import org.springframework.web.bind.annotation.*;
55
import org.springframework.web.multipart.MultipartFile;
25979 tejbeer 56
 
33843 ranu 57
import javax.servlet.http.HttpServletRequest;
58
import javax.servlet.http.HttpServletResponse;
59
import java.io.ByteArrayInputStream;
60
import java.io.InputStream;
35548 aman 61
import java.io.InputStreamReader;
62
import java.io.Reader;
35223 ranu 63
import java.text.DecimalFormat;
36101 ranu 64
import java.time.DayOfWeek;
33843 ranu 65
import java.time.LocalDate;
66
import java.time.LocalDateTime;
36101 ranu 67
import java.time.LocalTime;
33843 ranu 68
import java.time.format.DateTimeFormatter;
36101 ranu 69
import java.time.temporal.TemporalAdjusters;
33843 ranu 70
import java.util.*;
71
import java.util.Map.Entry;
72
import java.util.stream.Collectors;
73
 
25979 tejbeer 74
@Controller
35458 amit 75
@Transactional(rollbackFor = Throwable.class)
25979 tejbeer 76
public class LeadController {
32464 tejbeer 77
    private static final Logger LOGGER = LogManager.getLogger(LeadController.class);
25979 tejbeer 78
 
32464 tejbeer 79
    @Autowired
80
    private LeadRepository leadRepository;
25979 tejbeer 81
 
32464 tejbeer 82
    @Autowired
83
    private LeadActivityRepository leadActivityRepository;
25979 tejbeer 84
 
32464 tejbeer 85
    @Autowired
36787 ranu 86
    private com.spice.profitmandi.dao.repository.dtr.LeadVisitRequestRepository leadVisitRequestRepository;
87
 
88
    @Autowired
32464 tejbeer 89
    private StateRepository stateRepository;
25979 tejbeer 90
 
32464 tejbeer 91
    @Autowired
92
    private AuthService authService;
29266 manish 93
 
32464 tejbeer 94
    @Autowired
95
    private AuthRepository authRepository;
25979 tejbeer 96
 
32464 tejbeer 97
    @Autowired
98
    private Gson gson;
29266 manish 99
 
32464 tejbeer 100
    @Autowired
101
    private CookiesProcessor cookiesProcessor;
29426 manish 102
 
32464 tejbeer 103
    @Autowired
104
    PositionRepository positionRepository;
25979 tejbeer 105
 
32464 tejbeer 106
    @Autowired
107
    private MVCResponseSender mvcResponseSender;
25979 tejbeer 108
 
32464 tejbeer 109
    @Autowired
110
    private PartnerCollectionPlanRepository partnerCollectionPlanRepository;
30185 tejbeer 111
 
32464 tejbeer 112
    @Autowired
113
    private CsService csService;
30416 tejbeer 114
 
32464 tejbeer 115
    @Autowired
116
    private FofoStoreRepository fofoStoreRepository;
30416 tejbeer 117
 
32464 tejbeer 118
    @Autowired
119
    private PartnerCollectionService partnerCollectionService;
30416 tejbeer 120
 
32464 tejbeer 121
    @Autowired
122
    private RetailerService retailerService;
30416 tejbeer 123
 
32464 tejbeer 124
    @Autowired
125
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30434 tejbeer 126
 
32464 tejbeer 127
    @Autowired
128
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
30445 tejbeer 129
 
32464 tejbeer 130
    @Autowired
131
    private UserWalletRepository userWalletRepository;
30445 tejbeer 132
 
32464 tejbeer 133
    @Autowired
134
    private FranchiseeVisitRepository franchiseeVisitRepository;
30522 tejbeer 135
 
32464 tejbeer 136
    @Autowired
137
    private FranchiseeActivityRepository franchiseeActivityRepository;
30522 tejbeer 138
 
32464 tejbeer 139
    @Autowired
140
    private VisitRequestRepository visitRequestRepository;
31249 tejbeer 141
 
32464 tejbeer 142
    @Autowired
143
    private LeadBrandRepository leadBrandRepository;
31370 tejbeer 144
 
32464 tejbeer 145
    @Autowired
146
    private LeadDetailRepository leadDetailRepository;
31370 tejbeer 147
 
32464 tejbeer 148
    @Autowired
36642 ranu 149
    private LeadLiveLocationRepository leadLiveLocationRepository;
150
 
151
    @Autowired
36644 ranu 152
    private BeatRouteRepository beatRouteRepository;
36642 ranu 153
 
154
    @Autowired
36644 ranu 155
    private LeadRouteRepository leadRouteRepository;
156
 
157
    @Autowired
158
    private BeatRepository beatRepository;
159
 
160
    @Autowired
32464 tejbeer 161
    private Mongo mongoClient;
31370 tejbeer 162
 
32464 tejbeer 163
    @Autowired
164
    private ResponseSender<?> responseSender;
31370 tejbeer 165
 
32464 tejbeer 166
    @Autowired
167
    private BrandsService brandsService;
34650 aman.kumar 168
    @Autowired
169
    OrderService orderService;
25988 tejbeer 170
 
35223 ranu 171
 
172
    @Autowired
173
    private RbmRatingRepository rbmRatingRepository;
174
 
32464 tejbeer 175
    List<LeadStatus> status = Arrays.asList(LeadStatus.notInterested, LeadStatus.finalized);
27609 tejbeer 176
 
32464 tejbeer 177
    @RequestMapping(value = "/getOpenLead", method = RequestMethod.GET)
35769 amit 178
    public String getOpenLead(HttpServletRequest request, @RequestParam(name = "leadStatus", required = false, defaultValue = "All") List<LeadStatus> leadStatus, @RequestParam(name = "color", required = false, defaultValue = "All") List<String> color, @RequestParam(name = "startDate", required = false) LocalDate startDate, @RequestParam(name = "endDate", required = false) LocalDate endDate, Model model) throws Exception {
29445 manish 179
 
29426 manish 180
 
35769 amit 181
        LocalDateTime startDateTime = startDate != null ? startDate.atStartOfDay() : null;
182
        LocalDateTime endDateTime = endDate != null ? endDate.atTime(23, 59, 59) : null;
183
        LOGGER.info("startDateTime: " + startDateTime + ", endDateTime: " + endDateTime);
184
 
32464 tejbeer 185
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
186
        String emailId = loginDetails.getEmailId();
187
        AuthUser authUser = authRepository.selectByEmailOrMobile(emailId);
29426 manish 188
 
34890 aman 189
        boolean isPositionSales = positionRepository.hasCategory(authUser.getId(), ProfitMandiConstants.TICKET_CATEGORY_SALES);
27610 tejbeer 190
 
32464 tejbeer 191
        if (leadStatus.contains(LeadStatus.All)) {
27615 tejbeer 192
 
32464 tejbeer 193
            leadStatus.add(LeadStatus.pending);
194
            leadStatus.add(LeadStatus.notInterested);
195
            leadStatus.add(LeadStatus.finalized);
196
        }
29744 tejbeer 197
 
32464 tejbeer 198
        if (color.contains("All")) {
199
            color.add("yellow");
200
            color.add("green");
201
        }
29445 manish 202
 
32464 tejbeer 203
        List<Lead> leads = new ArrayList<>();
29445 manish 204
 
32464 tejbeer 205
        model.addAttribute("colors", color);
29744 tejbeer 206
 
32464 tejbeer 207
        Map<Integer, List<LeadActivity>> leadActivityMap = new HashMap<>();
29445 manish 208
 
32464 tejbeer 209
        List<Integer> authUserIds = null;
29445 manish 210
 
32464 tejbeer 211
        LOGGER.info("color111" + color);
212
        List<Lead> leadFollowUp = new ArrayList<>();
34890 aman 213
        if (isPositionSales) {
32464 tejbeer 214
            authUserIds = authService.getAllReportees(authUser.getId());
215
            authUserIds.add(authUser.getId());
216
            LOGGER.info("authIds" + authUserIds);
29753 tejbeer 217
 
32464 tejbeer 218
            LOGGER.info("leadStatus" + leadStatus);
29445 manish 219
 
35769 amit 220
            if (startDateTime == null) {
29445 manish 221
 
32464 tejbeer 222
                if (!leadStatus.contains(LeadStatus.followUp)) {
29852 tejbeer 223
 
32464 tejbeer 224
                    leads = leadRepository.selectAllByColorStatusAndUpdatedTimestampAndAuthIds(leadStatus, authUserIds, color, LocalDateTime.now().minusMonths(1));
225
                }
29852 tejbeer 226
 
32464 tejbeer 227
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
228
                    leadFollowUp = leadRepository.selectByAssignAuthIdsAndStatus(authUserIds, LeadStatus.followUp);
229
                    leads.addAll(leadFollowUp);
230
                }
29445 manish 231
 
32464 tejbeer 232
            } else {
29852 tejbeer 233
 
32464 tejbeer 234
                if (!leadStatus.contains(LeadStatus.followUp)) {
35769 amit 235
                    leads = leadRepository.selectAllByColorStatusAndBetweenCreatedDateAndAuthIds(leadStatus, authUserIds, color, startDateTime, endDateTime);
32464 tejbeer 236
                }
29852 tejbeer 237
 
32464 tejbeer 238
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
30290 tejbeer 239
 
32464 tejbeer 240
                    leadFollowUp = leadRepository.selectByAssignAuthIdsAndStatus(authUserIds, LeadStatus.followUp);
29852 tejbeer 241
 
32464 tejbeer 242
                    leads.addAll(leadFollowUp);
29852 tejbeer 243
 
32464 tejbeer 244
                }
29445 manish 245
 
32464 tejbeer 246
            }
29445 manish 247
 
32464 tejbeer 248
        } else {
29445 manish 249
 
35769 amit 250
            if (startDateTime == null) {
32464 tejbeer 251
                if (!leadStatus.contains(LeadStatus.followUp)) {
29852 tejbeer 252
 
32464 tejbeer 253
                    leads = leadRepository.selectAllByColorStatusAndUpdatedTimestamp(leadStatus, color, LocalDateTime.now().minusMonths(1));
254
                }
255
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
30290 tejbeer 256
 
32464 tejbeer 257
                    leadFollowUp = leadRepository.selectAllByStatus(LeadStatus.followUp);
29445 manish 258
 
32464 tejbeer 259
                    leads.addAll(leadFollowUp);
260
                }
261
                LOGGER.info("leadlocalDateTime1" + leads);
29445 manish 262
 
32464 tejbeer 263
            } else {
264
                if (!leadStatus.contains(LeadStatus.followUp)) {
35769 amit 265
                    leads = leadRepository.selectAllByColorStatusAndBetweenCreatedDate(leadStatus, color, startDateTime, endDateTime);
32464 tejbeer 266
                }
29852 tejbeer 267
 
34890 aman 268
                if (leadStatus.contains(LeadStatus.followUp)) {
30290 tejbeer 269
 
32464 tejbeer 270
                    leadFollowUp = leadRepository.selectAllByStatus(LeadStatus.followUp);
29445 manish 271
 
32464 tejbeer 272
                    leads.addAll(leadFollowUp);
273
                }
274
                LOGGER.info("leadlocalDateTime2" + leads);
29426 manish 275
 
32464 tejbeer 276
            }
29445 manish 277
 
32464 tejbeer 278
        }
27642 tejbeer 279
 
34890 aman 280
        if (isPositionSales && authUserIds.size() > 0) {
32464 tejbeer 281
            List<String> leadCreators = new ArrayList<>();
282
            leadCreators.add("daily-sync");
34032 amit.gupta 283
            leadCreators.addAll(csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_SALES, Arrays.asList(EscalationType.L1, EscalationType.L2)).stream().map(x -> x.getFullName()).collect(Collectors.toList()));
284
            leadCreators.addAll(csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_BGC, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3)).stream().map(x -> x.getFullName()).collect(Collectors.toList()));
32464 tejbeer 285
            model.addAttribute("leadCreators", leadCreators);
286
        }
287
        List<Lead> weekLast = new ArrayList<>();
288
        List<Lead> weekThird = new ArrayList<>();
289
        List<Lead> weekSecond = new ArrayList<>();
290
        List<Lead> weekFirst = new ArrayList<>();
291
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
292
        List<LeadWeakWiseModel> lwDays = new ArrayList<>();
29266 manish 293
 
32464 tejbeer 294
        for (int i = 7; i >= 1; i--) {
295
            LocalDateTime startOfDay = curDate.minusDays(i);
29266 manish 296
 
32464 tejbeer 297
            LeadWeakWiseModel lm = new LeadWeakWiseModel();
298
            lm.setMonth(startOfDay.toLocalDate());
299
            lwDays.add(lm);
300
        }
301
        if (!leads.isEmpty()) {
29266 manish 302
 
32464 tejbeer 303
            weekLast.addAll(
304
                    leads.stream().filter(x -> x.getCreatedTimestamp().isAfter(curDate.minusDays(28)) && x.getCreatedTimestamp().isBefore(curDate.minusDays(21))).collect(Collectors.toList()));
29266 manish 305
 
32464 tejbeer 306
            weekThird.addAll(leads.stream().filter(x -> x.getCreatedTimestamp().isAfter(curDate.minusDays(21)) && x.getCreatedTimestamp().isBefore(curDate.minusDays(14))).collect(Collectors.toList()));
29426 manish 307
 
32464 tejbeer 308
            weekSecond.addAll(leads.stream().filter(x -> x.getCreatedTimestamp().isAfter(curDate.minusDays(14)) && x.getCreatedTimestamp().isBefore(curDate.minusDays(7))).collect(Collectors.toList()));
29744 tejbeer 309
 
32464 tejbeer 310
            weekFirst.addAll(leads.stream().filter(x -> x.getCreatedTimestamp().isAfter(curDate.minusDays(7))).collect(Collectors.toList()));
29266 manish 311
 
32464 tejbeer 312
        }
313
        LOGGER.info("weekLast" + weekLast);
314
        LOGGER.info("weekThird" + weekThird);
315
        LOGGER.info("weekSecond" + weekSecond);
316
        Map<String, Long> leadLasts = weekLast.stream().collect(Collectors.groupingBy(x -> x.getCreatedBy(), Collectors.counting()));
317
        Map<String, Long> leadThirds = weekThird.stream().collect(Collectors.groupingBy(x -> x.getCreatedBy(), Collectors.counting()));
318
        Map<String, Long> leadSeconds = weekSecond.stream().collect(Collectors.groupingBy(x -> x.getCreatedBy(), Collectors.mapping(Lead::getCreatedBy, Collectors.counting())));
29266 manish 319
 
32464 tejbeer 320
        Map<String, Map<LocalDate, Long>> leadFirsts = weekFirst.stream().collect(Collectors.groupingBy(x -> x.getCreatedBy(), Collectors.groupingBy(x -> x.getCreatedTimestamp().toLocalDate(), Collectors.counting())));
29266 manish 321
 
32464 tejbeer 322
        LOGGER.info("leadFirsts" + leadFirsts);
25979 tejbeer 323
 
32464 tejbeer 324
        List<Integer> authIds = new ArrayList<>();
325
        if (!leads.isEmpty()) {
27610 tejbeer 326
 
32464 tejbeer 327
            authIds.addAll(leads.stream().map(x -> x.getAssignTo()).collect(Collectors.toList()));
29744 tejbeer 328
 
32464 tejbeer 329
            leadActivityMap = leadActivityRepository.selectAllByleadIds(leads.stream().map(x -> x.getId()).collect(Collectors.toList())).stream().collect(Collectors.groupingBy(LeadActivity::getLeadId, Collectors.toList()));
27723 tejbeer 330
 
35395 amit 331
            Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32464 tejbeer 332
            model.addAttribute("leadActivityMap", leadActivityMap);
333
            model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
36787 ranu 334
 
335
            // Pending visit requests per lead — drives the "Visit request pending"
336
            // badge on the row template. Best-effort: never blocks the list render.
337
            try {
338
                List<Integer> leadIds = leads.stream().map(Lead::getId).collect(Collectors.toList());
339
                List<com.spice.profitmandi.dao.entity.user.LeadVisitRequest> pending =
340
                        leadVisitRequestRepository.selectByLeadIdsAndStatus(leadIds, "PENDING");
341
                Set<Integer> pendingSet = pending.stream()
342
                        .map(com.spice.profitmandi.dao.entity.user.LeadVisitRequest::getLeadId)
343
                        .collect(Collectors.toSet());
344
                model.addAttribute("pendingVisitRequestLeadIds", pendingSet);
345
            } catch (Exception e) {
346
                LOGGER.warn("pending visit-request lookup failed: {}", e.getMessage());
347
                model.addAttribute("pendingVisitRequestLeadIds", new HashSet<Integer>());
348
            }
32464 tejbeer 349
        }
29266 manish 350
 
32464 tejbeer 351
        ChartLeadModel cm = this.getLeadChart(leads);
352
        model.addAttribute("chartLead", gson.toJson(cm));
29266 manish 353
 
32464 tejbeer 354
        LOGGER.info("ChartLeadModel" + gson.toJson(cm));
355
        LOGGER.info("lwDays" + lwDays);
29426 manish 356
 
32464 tejbeer 357
        LOGGER.info("leads" + leads);
358
        List<String> stateNames = stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList());
34127 tejus.loha 359
//        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
35098 ranu 360
        List<AuthUser> authUsers = new ArrayList<>();
361
        List<AuthUser> salesUsers = csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_SALES, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3));
362
        List<AuthUser> abmUsers = csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_ABM, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3));
35252 aman 363
        List<AuthUser> bgcUsers = csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_BGC, Arrays.asList(EscalationType.L1, EscalationType.L2, EscalationType.L3));
35098 ranu 364
        authUsers.addAll(salesUsers);
365
        authUsers.addAll(abmUsers);
35252 aman 366
        authUsers.addAll(bgcUsers);
32464 tejbeer 367
        LocalDate lastDate = curDate.minusDays(1).toLocalDate();
29426 manish 368
 
32464 tejbeer 369
        List<LocalDate> weekDates = new ArrayList<>();
29426 manish 370
 
32464 tejbeer 371
        weekDates.add(curDate.minusDays(28).toLocalDate());
372
        weekDates.add(curDate.minusDays(22).toLocalDate());
373
        weekDates.add(curDate.minusDays(21).toLocalDate());
374
        weekDates.add(curDate.minusDays(15).toLocalDate());
375
        weekDates.add(curDate.minusDays(14).toLocalDate());
376
        weekDates.add(curDate.minusDays(8).toLocalDate());
377
        weekDates.add(curDate.minusDays(7).toLocalDate());
378
        LOGGER.info("lastDate" + lastDate);
29426 manish 379
 
32464 tejbeer 380
        model.addAttribute("weekDates", weekDates);
31249 tejbeer 381
 
35769 amit 382
        model.addAttribute("startDate", startDate);
383
        model.addAttribute("endDate", endDate);
32464 tejbeer 384
        model.addAttribute("lastDate", lastDate);
385
        model.addAttribute("stateNames", stateNames);
31249 tejbeer 386
 
32464 tejbeer 387
        model.addAttribute("communicationTypes", CommunicationType.values());
25979 tejbeer 388
 
32464 tejbeer 389
        model.addAttribute("authUsers", authUsers);
33223 amit.gupta 390
        model.addAttribute("leads", leads);
32464 tejbeer 391
        model.addAttribute("leadStatus", LeadStatus.values());
392
        model.addAttribute("leadLasts", leadLasts);
393
        model.addAttribute("leadThirds", leadThirds);
394
        model.addAttribute("leadSeconds", leadSeconds);
395
        model.addAttribute("leadFirsts", leadFirsts);
396
        model.addAttribute("lwDays", lwDays);
31370 tejbeer 397
 
32464 tejbeer 398
        model.addAttribute("selectedLeadStatus", leadStatus.get(0));
31370 tejbeer 399
 
35548 aman 400
        boolean showBulkUploader =
401
                "sm@smartdukaan.com".equalsIgnoreCase(emailId);
31370 tejbeer 402
 
35548 aman 403
        model.addAttribute("showBulkUploader", showBulkUploader);
404
 
32464 tejbeer 405
        List<BrandCatalog> brandsDisplays = brandsService.getBrandsToDisplay(3);
406
        brandsDisplays.addAll(brandsService.getBrandsToDisplay(6));
407
        model.addAttribute("brandsDisplays", brandsDisplays.stream().distinct().collect(Collectors.toList()));
31370 tejbeer 408
 
32464 tejbeer 409
        LOGGER.info("brandsDisplays" + brandsDisplays);
27642 tejbeer 410
 
36642 ranu 411
        // Geo location status map for all leads
412
        if (!leads.isEmpty()) {
413
            List<Integer> allLeadIds = leads.stream().map(Lead::getId).collect(Collectors.toList());
414
            Map<Integer, LeadLiveLocation> geoLocationMap = leadLiveLocationRepository.selectByLeadIds(allLeadIds).stream()
415
                    .collect(Collectors.toMap(LeadLiveLocation::getLeadId, x -> x, (a, b) -> a));
416
            model.addAttribute("geoLocationMap", geoLocationMap);
417
        } else {
418
            model.addAttribute("geoLocationMap", new HashMap<>());
419
        }
420
        model.addAttribute("salesUsers", salesUsers);
421
        model.addAttribute("bgcUsers", bgcUsers);
25979 tejbeer 422
 
32464 tejbeer 423
        return "lead";
29266 manish 424
 
32464 tejbeer 425
    }
29266 manish 426
 
32464 tejbeer 427
    public ChartLeadModel getLeadChart(List<Lead> leads) throws ProfitMandiBusinessException {
29426 manish 428
 
32464 tejbeer 429
        Map<LeadStatus, Long> leadStatusMap = leads.stream().collect(
430
                Collectors.groupingBy(x -> x.getStatus(), Collectors.mapping(Lead::getStatus, Collectors.counting())));
29266 manish 431
 
32464 tejbeer 432
        Map<String, Long> hotLeadsMap = leads.stream().collect(
433
                Collectors.groupingBy(x -> x.getColor(), Collectors.mapping(Lead::getColor, Collectors.counting())));
29445 manish 434
 
32464 tejbeer 435
        LOGGER.info("hotLeadsMap" + hotLeadsMap);
436
        ChartLeadModel cm = new ChartLeadModel();
29445 manish 437
 
32464 tejbeer 438
        HashSet<LeadStatus> labels = new HashSet<LeadStatus>();
439
        labels.addAll(leadStatusMap.keySet());
29445 manish 440
 
32464 tejbeer 441
        List<String> hotLeads = new ArrayList<>();
442
        hotLeads.addAll(leadStatusMap.keySet().stream().map(x -> x.toString()).collect(Collectors.toSet()));
443
        hotLeads.add("HotLead");
29598 tejbeer 444
 
32464 tejbeer 445
        List<String> hotLeadKeys = new ArrayList<>();
29445 manish 446
 
32464 tejbeer 447
        hotLeadKeys.add("HotLead");
448
        List<String> hotLeadGreen = new ArrayList<>(hotLeadKeys);
29266 manish 449
 
32464 tejbeer 450
        LOGGER.info("hotLeads" + hotLeads);
29266 manish 451
 
32464 tejbeer 452
        List<LeadStatus> labelList = new ArrayList<>(labels);
453
        List<String> backgroundColor = new ArrayList<>();
454
        LOGGER.info("hotLeadKeys" + hotLeadKeys);
455
        List<Long> values = new ArrayList<>();
29598 tejbeer 456
 
32464 tejbeer 457
        for (String hotLead : hotLeads) {
29445 manish 458
 
32464 tejbeer 459
            if (hotLead.equals("pending")) {
460
                backgroundColor.add("pink");
461
                values.add(leadStatusMap.get(LeadStatus.pending));
462
            }
463
            if (hotLead.equals("notInterested")) {
464
                backgroundColor.add("red");
465
                values.add(leadStatusMap.get(LeadStatus.notInterested));
466
            }
467
            if (hotLead.equals("followUp")) {
468
                backgroundColor.add("#9ACD32");
469
                values.add(leadStatusMap.get(LeadStatus.followUp));
470
            }
471
            if (hotLead.equals("finalized")) {
472
                backgroundColor.add("blue");
473
                values.add(leadStatusMap.get(LeadStatus.finalized));
474
            }
29445 manish 475
 
32464 tejbeer 476
            if (hotLead.equals("HotLead")) {
477
                backgroundColor.add("green");
478
                values.add(hotLeadsMap.get("Green"));
29266 manish 479
 
32464 tejbeer 480
            }
29266 manish 481
 
32464 tejbeer 482
        }
483
        LOGGER.info("labelList" + labelList);
29266 manish 484
 
32464 tejbeer 485
        LOGGER.info("backgroundColor" + backgroundColor);
486
        LOGGER.info("labelsChartLead" + labels);
487
        LeadStatusData data = new LeadStatusData();
488
        data.setData(values);
489
        data.setBackgroundColor(backgroundColor);
490
        data.setLabel("DataSet 1");
29266 manish 491
 
32464 tejbeer 492
        PieLables label = new PieLables();
493
        label.setFontColor("black");
494
        label.setFontSize(15);
29266 manish 495
 
32464 tejbeer 496
        Legend legend = new Legend();
497
        legend.setLabels(label);
498
        legend.setPosition("left");
29266 manish 499
 
32464 tejbeer 500
        List<LeadStatusData> dataList = new ArrayList<>();
501
        dataList.add(data);
29266 manish 502
 
32464 tejbeer 503
        DataLeadModel datasets = new DataLeadModel();
504
        datasets.setDatasets(dataList);
505
        datasets.setLabels(hotLeads);
29266 manish 506
 
32464 tejbeer 507
        OptionModel om = new OptionModel();
508
        om.setLegend(legend);
29266 manish 509
 
32464 tejbeer 510
        cm.setType("pie");
511
        cm.setData(datasets);
512
        cm.setOptions(om);
25988 tejbeer 513
 
32464 tejbeer 514
        return cm;
515
    }
25988 tejbeer 516
 
34650 aman.kumar 517
    @RequestMapping(value = "/downloadDateWiseLead", method = RequestMethod.GET)
34707 aman.kumar 518
    public ResponseEntity<?> getdownloadLeadDataByDate(HttpServletRequest request,
519
                                                       @RequestParam(name = "leadStatus", required = false, defaultValue = "All") List<LeadStatus> leadStatus,
520
                                                       @RequestParam(name = "color", required = false, defaultValue = "All") List<String> color,
35769 amit 521
                                                       @RequestParam(name = "startDate", required = false) LocalDate startDate,
522
                                                       @RequestParam(name = "endDate", required = false) LocalDate endDate) throws Exception {
25988 tejbeer 523
 
34650 aman.kumar 524
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
525
        String emailId = fofoDetails.getEmailId();
35769 amit 526
        LocalDateTime startDateTime = startDate != null ? startDate.atStartOfDay() : null;
527
        LocalDateTime endDateTime = endDate != null ? endDate.atTime(23, 59, 59) : null;
34650 aman.kumar 528
        List<Lead> leads = new ArrayList<>();
529
        AuthUser authUser = authRepository.selectByEmailOrMobile(emailId);
530
 
34707 aman.kumar 531
        if (leadStatus.contains(LeadStatus.All)) {
532
            leadStatus.add(LeadStatus.pending);
533
            leadStatus.add(LeadStatus.notInterested);
534
            leadStatus.add(LeadStatus.finalized);
34963 aman 535
            leadStatus.add(LeadStatus.followUp);
34707 aman.kumar 536
        }
537
        if (color.contains("All")) {
538
            color.add("yellow");
539
            color.add("green");
540
        }
34650 aman.kumar 541
 
542
        Map<Integer, List<LeadActivity>> leadActivityMap = new HashMap<>();
543
        boolean authPositon = positionRepository.hasCategory(authUser.getId(), ProfitMandiConstants.TICKET_CATEGORY_SALES);
544
        List<Integer> authUserIds = null;
545
        List<Lead> leadFollowUp = new ArrayList<>();
546
 
547
        if (authPositon) {
548
            authUserIds = authService.getAllReportees(authUser.getId());
549
            authUserIds.add(authUser.getId());
35769 amit 550
            if (startDateTime == null) {
34650 aman.kumar 551
                if (!leadStatus.contains(LeadStatus.followUp)) {
552
                    leads = leadRepository.selectAllByColorStatusAndUpdatedTimestampAndAuthIds(leadStatus, authUserIds, color, LocalDateTime.now().minusMonths(1));
553
                }
554
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
555
                    leadFollowUp = leadRepository.selectByAssignAuthIdsAndStatus(authUserIds, LeadStatus.followUp);
556
                    leads.addAll(leadFollowUp);
557
                }
558
            } else {
559
                if (!leadStatus.contains(LeadStatus.followUp)) {
35769 amit 560
                    leads = leadRepository.selectAllByColorStatusAndBetweenCreatedDateAndAuthIds(leadStatus, authUserIds, color, startDateTime, endDateTime);
34650 aman.kumar 561
                }
562
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
563
                    leadFollowUp = leadRepository.selectByAssignAuthIdsAndStatus(authUserIds, LeadStatus.followUp);
564
                    leads.addAll(leadFollowUp);
565
                }
566
            }
567
        } else {
35769 amit 568
            if (startDateTime == null) {
34650 aman.kumar 569
                if (!leadStatus.contains(LeadStatus.followUp)) {
570
                    leads = leadRepository.selectAllByColorStatusAndUpdatedTimestamp(leadStatus, color, LocalDateTime.now().minusMonths(1));
571
                }
572
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
573
                    leadFollowUp = leadRepository.selectAllByStatus(LeadStatus.followUp);
574
                    leads.addAll(leadFollowUp);
575
                }
576
            } else {
35769 amit 577
                if (!leadStatus.contains(LeadStatus.followUp)) {
578
                    leads = leadRepository.selectAllByColorStatusAndBetweenCreatedDate(leadStatus, color, startDateTime, endDateTime);
34650 aman.kumar 579
                }
34894 aman 580
                if (leadStatus.contains(LeadStatus.followUp)) {
34650 aman.kumar 581
                    leadFollowUp = leadRepository.selectAllByStatus(LeadStatus.followUp);
582
                    leads.addAll(leadFollowUp);
35769 amit 583
                }
34650 aman.kumar 584
            }
34707 aman.kumar 585
        }
34650 aman.kumar 586
 
34707 aman.kumar 587
        // Build activity map and auth map (SAME AS VIEW ENDPOINT)
34650 aman.kumar 588
        if (!leads.isEmpty()) {
34707 aman.kumar 589
            List<Integer> leadIds = leads.stream().map(Lead::getId).collect(Collectors.toList());
590
            leadActivityMap = leadActivityRepository.selectAllByleadIds(leadIds).stream()
591
                    .collect(Collectors.groupingBy(LeadActivity::getLeadId));
34650 aman.kumar 592
        }
34707 aman.kumar 593
        List<Integer> authIds = leads.stream().map(Lead::getAssignTo).collect(Collectors.toList());
35395 amit 594
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream()
34707 aman.kumar 595
                .collect(Collectors.toMap(AuthUser::getId, x -> x));
596
 
597
        // Build CSV rows (USE DIRECT LEAD PROPERTIES - NO ACTIVITY FALLBACK)
34650 aman.kumar 598
        List<List<?>> rows = new ArrayList<>();
599
        for (Lead lead : leads) {
600
            List<LeadActivity> activities = leadActivityMap.get(lead.getId());
34707 aman.kumar 601
 
602
            // Use FIRST activity's schedule timestamp if exists
34650 aman.kumar 603
            String scheduleTimestamp = (activities != null && !activities.isEmpty())
604
                    ? FormattingUtils.format(activities.get(0).getSchelduleTimestamp())
34707 aman.kumar 605
                    : "";
34650 aman.kumar 606
 
34707 aman.kumar 607
            // DIRECTLY use Lead properties (NO fallback to activity)
608
            Double potential = lead.getPotential();
609
            String outLetName = lead.getOutLetName() != null ? lead.getOutLetName() : "";
34650 aman.kumar 610
 
34707 aman.kumar 611
            // Assignee name (blank if missing)
612
            String assignTo = "";
613
            if (authIdAndAuthUserMap.containsKey(lead.getAssignTo())) {
614
                AuthUser user = authIdAndAuthUserMap.get(lead.getAssignTo());
615
                assignTo = (user.getFirstName() + " " + user.getLastName()).trim();
616
            }
34650 aman.kumar 617
 
34707 aman.kumar 618
            rows.add(Arrays.asList(
35579 aman 619
                    lead.getId(),
34707 aman.kumar 620
                    lead.getSource(),
621
                    lead.getFullName(),
622
                    outLetName,
623
                    potential,
624
                    lead.getLeadMobile(),
625
                    lead.getAddress() != null ? lead.getAddress() : "",
626
                    lead.getCity() != null ? lead.getCity() : "",
627
                    lead.getState() != null ? lead.getState() : "",
628
                    lead.getCreatedBy() != null ? lead.getCreatedBy() : "",
629
                    lead.getStatus().toString(),
630
                    FormattingUtils.format(lead.getCreatedTimestamp()),
631
                    FormattingUtils.format(lead.getUpdatedTimestamp()),
632
                    scheduleTimestamp,
633
                    lead.getClosureTimestamp() != null
634
                            ? FormattingUtils.format(lead.getClosureTimestamp())
635
                            : "",  // Handle null closure
636
                    assignTo,
637
                    lead.getColor() != null ? lead.getColor() : ""
638
            ));
639
        }
34650 aman.kumar 640
 
34707 aman.kumar 641
        // Generate CSV response
642
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
35579 aman 643
                Arrays.asList("Id", "Source", "Partner Name", "Outlet Name", "Potential", "Mobile", "Address", "City", "State",
34707 aman.kumar 644
                        "Created By", "Status", "Created On", "Updated On", "Scheduled Timestamp",
645
                        "Closure Timestamp", "Assign To", "Color"),
646
                rows
647
        );
648
        return orderService.downloadReportInCsv(baos, rows, "LeadDetails_");
34650 aman.kumar 649
    }
650
 
32464 tejbeer 651
    @RequestMapping(value = "/getClosedLead", method = RequestMethod.GET)
652
    public String getClosedLead(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model) throws Exception {
653
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
654
        List<Lead> leads = null;
655
        long size = 0;
656
        leads = leadRepository.selectAllByStatus(status, offset, limit);
657
        size = leadRepository.selectCountByStatus(status);
25988 tejbeer 658
 
32464 tejbeer 659
        if (!leads.isEmpty()) {
660
            List<Integer> authIds = new ArrayList<>();
661
            for (Lead lead : leads) {
662
                authIds.add(lead.getAssignTo());
663
            }
35395 amit 664
            Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25988 tejbeer 665
 
32464 tejbeer 666
            model.addAttribute("leads", leads);
667
            model.addAttribute("start", offset + 1);
668
            model.addAttribute("size", size);
669
            model.addAttribute("searchTerm", searchTerm);
670
            model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
671
            model.addAttribute("url", "/getPaginatedClosedLeads");
25988 tejbeer 672
 
32464 tejbeer 673
            if (leads.size() < limit) {
674
                model.addAttribute("end", offset + leads.size());
675
            } else {
676
                model.addAttribute("end", offset + limit);
677
            }
25988 tejbeer 678
 
32464 tejbeer 679
        } else {
680
            model.addAttribute("lead", leads);
25988 tejbeer 681
 
32464 tejbeer 682
            model.addAttribute("size", size);
683
        }
25988 tejbeer 684
 
32464 tejbeer 685
        model.addAttribute("authUsers", authUsers);
686
        return "lead-close";
687
    }
25988 tejbeer 688
 
32464 tejbeer 689
    @RequestMapping(value = "/getPaginatedClosedLeads", method = RequestMethod.GET)
690
    public String getPaginatedClosedLeads(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws ProfitMandiBusinessException {
691
        List<Lead> leads = null;
692
        leads = leadRepository.selectAllByStatus(status, offset, limit);
25988 tejbeer 693
 
32464 tejbeer 694
        if (!leads.isEmpty()) {
695
            List<Integer> authIds = new ArrayList<>();
696
            for (Lead lead : leads) {
697
                authIds.add(lead.getAssignTo());
698
            }
35395 amit 699
            Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32464 tejbeer 700
            model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
701
            model.addAttribute("leads", leads);
702
            model.addAttribute("url", "/getPaginatedClosedLeads");
25988 tejbeer 703
 
32464 tejbeer 704
        } else {
705
            model.addAttribute("leads", leads);
25988 tejbeer 706
 
32464 tejbeer 707
        }
708
        return "lead-close-paginated";
709
    }
25988 tejbeer 710
 
32464 tejbeer 711
    @RequestMapping(value = "/searchLeads")
712
    public String getClosedLeads(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model) throws ProfitMandiBusinessException {
713
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
714
        List<Lead> leads = null;
715
        long size = 0;
716
        if (!(searchTerm.equals(""))) {
717
            leads = leadRepository.selectBySearchTerm(status, searchTerm, offset, limit);
34155 tejus.loha 718
            size = leadRepository.selectCountByStatus(status);
719
            Map<Integer, AuthUser> authIdAndAuthUserMap = new HashMap<>();
720
            List<Integer> authIds = new ArrayList<>();
32464 tejbeer 721
            if (!(leads.size() == 0)) {
722
                for (Lead lead : leads) {
723
                    authIds.add(lead.getAssignTo());
724
                }
35395 amit 725
                authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32464 tejbeer 726
                if (leads.size() < limit) {
727
                    model.addAttribute("end", offset + leads.size());
728
                } else {
729
                    model.addAttribute("end", offset + limit);
730
                }
731
            } else {
34155 tejus.loha 732
                model.addAttribute("end", offset + limit);
32464 tejbeer 733
            }
34155 tejus.loha 734
            model.addAttribute("leads", leads);
735
            model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
736
            model.addAttribute("start", offset + 1);
737
            model.addAttribute("size", size);
738
            model.addAttribute("searchTerm", searchTerm);
32464 tejbeer 739
        } else {
740
            leads = leadRepository.selectAllByStatus(status, offset, limit);
741
            size = leadRepository.selectCountByStatus(status);
25988 tejbeer 742
 
32464 tejbeer 743
            if (!leads.isEmpty()) {
744
                List<Integer> authIds = new ArrayList<>();
745
                for (Lead lead : leads) {
746
                    authIds.add(lead.getAssignTo());
747
                }
35395 amit 748
                Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25988 tejbeer 749
 
32464 tejbeer 750
                model.addAttribute("leads", leads);
751
                model.addAttribute("start", offset + 1);
752
                model.addAttribute("size", size);
753
                model.addAttribute("searchTerm", searchTerm);
754
                model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
25988 tejbeer 755
 
32464 tejbeer 756
                if (leads.size() < limit) {
757
                    model.addAttribute("end", offset + leads.size());
758
                } else {
759
                    model.addAttribute("end", offset + limit);
760
                }
25988 tejbeer 761
 
32464 tejbeer 762
            }
763
        }
25988 tejbeer 764
 
32464 tejbeer 765
        model.addAttribute("authUsers", authUsers);
766
        return "lead-close";
767
    }
25988 tejbeer 768
 
32464 tejbeer 769
    @RequestMapping(value = "/searchLeadPaginated")
770
    public String searchLeadPaginated(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model) throws ProfitMandiBusinessException {
771
        LOGGER.info("In search Item....");
772
        List<Lead> leads = null;
773
        if (!searchTerm.equals("")) {
774
            leads = leadRepository.selectBySearchTerm(status, searchTerm, offset, limit);
775
            if (!(leads.size() == 0)) {
25988 tejbeer 776
 
32464 tejbeer 777
                List<Integer> authIds = new ArrayList<>();
778
                for (Lead lead : leads) {
779
                    authIds.add(lead.getAssignTo());
780
                }
35395 amit 781
                Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32464 tejbeer 782
                model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
783
                model.addAttribute("leads", leads);
784
            }
785
        }
31249 tejbeer 786
 
32464 tejbeer 787
        return "lead-close-paginated";
31249 tejbeer 788
 
32464 tejbeer 789
    }
31249 tejbeer 790
 
32464 tejbeer 791
    @RequestMapping(value = "/getLeadActivity", method = RequestMethod.GET)
792
    public String getLeadActivity(HttpServletRequest request, @RequestParam int leadId, Model model) throws Exception {
793
        List<LeadActivity> leadActivity = leadActivityRepository.selectBYLeadId(leadId);
25979 tejbeer 794
 
32464 tejbeer 795
        LOGGER.info("leadActivity" + leadActivity);
31370 tejbeer 796
 
32464 tejbeer 797
        model.addAttribute("leadActivity", leadActivity);
798
        model.addAttribute("authUserMap", authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x)));
31370 tejbeer 799
 
32464 tejbeer 800
        return "lead_activity_modal";
801
    }
31370 tejbeer 802
 
32464 tejbeer 803
    @RequestMapping(value = "/getLead", method = RequestMethod.GET)
804
    public ResponseEntity<?> getLead(HttpServletRequest request, @RequestParam int leadId) throws Exception {
805
        Lead lead = leadRepository.selectById(leadId);
31370 tejbeer 806
 
32464 tejbeer 807
        LeadDetail leadDetail = leadDetailRepository.selectByLeadId(lead.getId());
808
        if (leadDetail != null) {
809
            lead.setOutLetName(leadDetail.getOutletName());
810
        }
31249 tejbeer 811
 
32464 tejbeer 812
        return responseSender.ok(lead);
25979 tejbeer 813
 
32464 tejbeer 814
    }
31249 tejbeer 815
 
32464 tejbeer 816
    @RequestMapping(value = "/createLead", method = RequestMethod.POST)
817
    public String CreateLead(HttpServletRequest request, @RequestBody CreateRefferalRequest createRefferalRequest, Model model) throws Exception {
818
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
35083 vikas 819
        Lead leadDetails = leadRepository.selectByMobileNumber(createRefferalRequest.getMobile());
820
        LOGGER.info("Lead Details {}", leadDetails);
31249 tejbeer 821
 
35083 vikas 822
        if (leadDetails != null && leadDetails.getStatus() != LeadStatus.notInterested) {
823
            AuthUser authUser1 = authRepository.selectById(leadDetails.getAssignTo());
824
            model.addAttribute("response1", "Lead already exists, created by " + leadDetails.getCreatedBy() +
825
                    " on " + FormattingUtils.format(leadDetails.getCreatedTimestamp()) +
34671 aman.kumar 826
                    ", assigned to " + authUser1.getFullName());
827
            return "response";
34627 aman.kumar 828
 
34671 aman.kumar 829
 
34627 aman.kumar 830
        }
831
 
32464 tejbeer 832
        LOGGER.info("createRefferalRequest" + createRefferalRequest.getSchelduleTimestamp());
833
        Lead lead = new Lead();
834
        lead.setFirstName(createRefferalRequest.getFirstName());
835
        lead.setLastName(createRefferalRequest.getLastName());
836
        lead.setLeadMobile(createRefferalRequest.getMobile());
837
        lead.setState(createRefferalRequest.getState());
838
        lead.setCity(createRefferalRequest.getCity());
839
        lead.setAddress(createRefferalRequest.getAddress());
840
        lead.setCreatedTimestamp(LocalDateTime.now());
841
        lead.setUpdatedTimestamp(LocalDateTime.now());
842
        lead.setStatus(createRefferalRequest.getStatus());
843
        lead.setAssignTo(createRefferalRequest.getAssignTo());
844
        lead.setSource(createRefferalRequest.getSource());
36741 ranu 845
        if (Boolean.TRUE.equals(createRefferalRequest.getColorCheck())) {
32471 tejbeer 846
            lead.setColor("Green");
847
        } else {
848
            lead.setColor("Yellow");
849
        }
32464 tejbeer 850
        // change
851
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
852
        String authUserName = authUser.getFirstName() + " " + authUser.getLastName();
853
        lead.setCreatedBy(authUserName);
854
        lead.setAuthId(authUser.getId());
855
        LOGGER.info("lead --- {}", lead);
856
        leadRepository.persist(lead);
857
        LeadActivity leadActivity = new LeadActivity();
858
        leadActivity.setLeadId(lead.getId());
859
        leadActivity.setRemark(createRefferalRequest.getRemark());
860
        leadActivity.setAuthId(authUser.getId());
32471 tejbeer 861
 
32464 tejbeer 862
        LOGGER.info("createRefferalRequest" + createRefferalRequest.getCommunicationType());
25979 tejbeer 863
 
32464 tejbeer 864
        if (createRefferalRequest.getStatus() == LeadStatus.followUp) {
865
            leadActivity.setSchelduleTimestamp(createRefferalRequest.getSchelduleTimestamp());
866
            leadActivity.setCommunicationType(createRefferalRequest.getCommunicationType());
25979 tejbeer 867
 
32464 tejbeer 868
            if (leadActivity.getCommunicationType().equals(CommunicationType.VISIT)) {
869
                visitRequestRepository.createVisitRequest(lead.getId(), "lead", lead.getAssignTo(), createRefferalRequest.getSchelduleTimestamp());
870
            }
871
        } else {
872
            leadActivity.setSchelduleTimestamp(null);
873
        }
874
        leadActivity.setCreatedTimestamp(LocalDateTime.now());
875
        leadActivityRepository.persist(leadActivity);
34127 tejus.loha 876
        if (!lead.getStatus().equals(LeadStatus.notInterested)) {
877
            LeadDetailModel leadDetail = new LeadDetailModel();
878
            leadDetail.setLeadId(lead.getId());
879
            leadDetail.setOutletName(createRefferalRequest.getOutletName());
880
            leadDetail.setCounterSize(createRefferalRequest.getCounterSize());
25979 tejbeer 881
 
31249 tejbeer 882
 
34127 tejus.loha 883
            leadDetail.setFrontp(createRefferalRequest.getFrontp());
884
            leadDetail.setFrontWithMarket(createRefferalRequest.getFrontWithMarket());
31370 tejbeer 885
 
886
 
34127 tejus.loha 887
            leadDetail.setInternalLongShot(createRefferalRequest.getInternalLongShot());
31370 tejbeer 888
 
34127 tejus.loha 889
            leadDetail.setInternalLeftWall(createRefferalRequest.getInternalLeftWall());
29598 tejbeer 890
 
34127 tejus.loha 891
            leadDetail.setInternalRightWall(createRefferalRequest.getInternalRightWall());
892
            List<LeadBrandModel> brandModels = new ArrayList<LeadBrandModel>();
27605 tejbeer 893
 
34127 tejus.loha 894
            for (LeadBrandModel leadBrandModel : createRefferalRequest.getLeadBrands()) {
25979 tejbeer 895
 
34127 tejus.loha 896
                LeadBrandModel leadBrand = new LeadBrandModel();
897
                leadBrand.setBrand(leadBrandModel.getBrand());
898
                leadBrand.setValue(leadBrandModel.getValue());
29598 tejbeer 899
 
34127 tejus.loha 900
                brandModels.add(leadBrand);
25979 tejbeer 901
 
34127 tejus.loha 902
            }
29598 tejbeer 903
 
34127 tejus.loha 904
            leadDetail.setLeadBrands(brandModels);
29598 tejbeer 905
 
32471 tejbeer 906
            leadRepository.persistLeadDetail(leadDetail, authUser);
907
        }
32464 tejbeer 908
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
29598 tejbeer 909
 
32464 tejbeer 910
        return "response";
29598 tejbeer 911
 
32464 tejbeer 912
    }
29476 manish 913
 
29473 manish 914
 
32464 tejbeer 915
    @RequestMapping(value = "/editLead", method = RequestMethod.POST)
916
    public String EditLead(HttpServletRequest request, @RequestBody CreateLeacdActivityRequest createLeadActivityRequest, Model model) throws Exception {
917
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29426 manish 918
 
32464 tejbeer 919
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
29426 manish 920
 
34113 tejus.loha 921
        Lead lead = leadRepository.selectById(createLeadActivityRequest.getId());
922
        AuthUser leadAuthUser = authRepository.selectById(lead.getAuthId());
32464 tejbeer 923
        LeadDetail leadDetail = leadDetailRepository.selectByLeadId(createLeadActivityRequest.getId());
29426 manish 924
 
36789 ranu 925
        // Geo gate: required for follow-up / finalized (anything that schedules
926
        // a visit or beat slot). For notInterested (close-out) no geo / no beat
927
        // is needed — only the activity (status + reason + remark) is saved.
36792 ranu 928
        // Non-sales assignees (BGC / other internal hand-offs) also bypass the
929
        // gate — those are just routing the lead to another department's queue
930
        // and don't carry a beat-day attachment.
931
        int assignToId = createLeadActivityRequest.getAssignTo();
932
        boolean assigneeIsSales = assignToId > 0
933
                && positionRepository.hasCategory(assignToId, ProfitMandiConstants.TICKET_CATEGORY_SALES);
934
        if (createLeadActivityRequest.getStatus() != LeadStatus.notInterested && assigneeIsSales) {
36789 ranu 935
            LeadLiveLocation approvedGeo = leadLiveLocationRepository.selectApprovedByLeadId(createLeadActivityRequest.getId());
936
            if (approvedGeo == null) {
937
                throw new ProfitMandiBusinessException("Lead", "", "Live geo-location for this lead has not been approved yet. Please approve the geo-location before editing.");
938
            }
36761 ranu 939
        }
940
 
34113 tejus.loha 941
        if (leadDetail == null && !createLeadActivityRequest.getStatus().equals(LeadStatus.notInterested) && leadAuthUser.isActive()) {
29426 manish 942
 
32464 tejbeer 943
            throw new ProfitMandiBusinessException("LeadDetail", "", "Please fill lead detail");
944
        }
29445 manish 945
 
32464 tejbeer 946
        LeadActivity leadActivity = new LeadActivity();
947
        leadActivity.setLeadId(createLeadActivityRequest.getId());
948
        leadActivity.setRemark(createLeadActivityRequest.getRemark());
29598 tejbeer 949
 
32464 tejbeer 950
        LOGGER.info("createRefferalRequest" + createLeadActivityRequest);
29598 tejbeer 951
 
32464 tejbeer 952
        if (createLeadActivityRequest.getStatus() == LeadStatus.followUp) {
953
            leadActivity.setSchelduleTimestamp(createLeadActivityRequest.getScheldule());
954
            leadActivity.setCommunicationType(createLeadActivityRequest.getCommunicationType());
36741 ranu 955
            // A beat-day pick wires the lead onto that beat's route regardless of
956
            // communication type (TELEPHONIC = call on that beat day).
957
            String beatSelection = createLeadActivityRequest.getBeatSelection();
958
            if (beatSelection != null && beatSelection.contains("|")) {
36644 ranu 959
                int beatId = 0;
960
                LocalDate beatDate = createLeadActivityRequest.getScheldule() != null
961
                        ? createLeadActivityRequest.getScheldule().toLocalDate() : LocalDate.now();
962
                String beatName = "Beat";
36642 ranu 963
 
36741 ranu 964
                String[] parts = beatSelection.split("\\|", 3);
965
                beatDate = LocalDate.parse(parts[0]);
966
                beatName = parts.length > 1 ? parts[1] : "Beat";
967
                if (parts.length > 2) {
968
                    try {
969
                        beatId = Integer.parseInt(parts[2]);
970
                    } catch (NumberFormatException ignored) {
36642 ranu 971
                    }
972
                }
973
 
36644 ranu 974
                // Find optimal insert position using lead geolocation
975
                int insertAt = 0;
976
                LeadLiveLocation leadGeo = leadLiveLocationRepository.selectApprovedByLeadId(createLeadActivityRequest.getId());
977
                List<BeatRoute> existingStops = beatId > 0
978
                        ? beatRouteRepository.selectByBeatId(beatId).stream()
979
                        .sorted(Comparator.comparingInt(BeatRoute::getSequenceOrder))
980
                        .collect(Collectors.toList())
981
                        : new ArrayList<>();
36642 ranu 982
 
36644 ranu 983
                insertAt = existingStops.size(); // default: append at end
984
 
985
                if (!existingStops.isEmpty() && leadGeo != null) {
986
                    // Use nearest neighbor to find optimal position
987
                    // (simplified — append at end for now, full geocoding done in LeadGeoLocationController)
988
                    insertAt = existingStops.size();
989
                }
990
 
991
                // Shift existing stops
992
                for (BeatRoute stop : existingStops) {
993
                    if (stop.getSequenceOrder() >= insertAt) {
994
                        stop.setSequenceOrder(stop.getSequenceOrder() + 1);
995
                    }
996
                }
997
 
998
                // Create lead_route entry (directly APPROVED)
999
                LeadRoute leadRoute = new LeadRoute();
1000
                leadRoute.setBeatId(beatId);
1001
                leadRoute.setLeadId(createLeadActivityRequest.getId());
1002
                leadRoute.setScheduleDate(beatDate);
1003
                leadRoute.setSequenceOrder(insertAt);
1004
                leadRoute.setStatus("APPROVED");
1005
                leadRoute.setRequestedBy(authUser.getId());
1006
                leadRoute.setApprovedBy(authUser.getId());
1007
                leadRoute.setApprovedTimestamp(LocalDateTime.now());
1008
                leadRoute.setCreatedTimestamp(LocalDateTime.now());
1009
                leadRoute.setUpdatedTimestamp(LocalDateTime.now());
1010
 
1011
                // Set nearest store
1012
                if (!existingStops.isEmpty()) {
1013
                    leadRoute.setNearestStoreId(existingStops.get(Math.min(insertAt, existingStops.size() - 1)).getFofoId());
1014
                }
1015
                leadRouteRepository.persist(leadRoute);
1016
 
1017
                // Create visit request
1018
                visitRequestRepository.createVisitRequest(
1019
                        createLeadActivityRequest.getId(), "lead",
1020
                        createLeadActivityRequest.getAssignTo(),
1021
                        beatDate.atTime(10, 0));
1022
 
36642 ranu 1023
                // Log activity
36644 ranu 1024
                LeadActivity visitActivity = new LeadActivity();
1025
                visitActivity.setLeadId(createLeadActivityRequest.getId());
1026
                visitActivity.setRemark("Lead scheduled for visit on beat: " + beatName
1027
                        + " (" + beatDate + ") at stop #" + (insertAt + 1));
1028
                visitActivity.setAuthId(authUser.getId());
1029
                visitActivity.setCreatedTimestamp(LocalDateTime.now());
1030
                leadActivityRepository.persist(visitActivity);
32464 tejbeer 1031
            }
1032
        } else {
1033
            leadActivity.setSchelduleTimestamp(null);
1034
        }
1035
        leadActivity.setCreatedTimestamp(LocalDateTime.now());
1036
        leadActivity.setAuthId(authUser.getId());
1037
        leadActivityRepository.persist(leadActivity);
1038
        lead.setAssignTo(createLeadActivityRequest.getAssignTo());
1039
        lead.setStatus(createLeadActivityRequest.getStatus());
35548 aman 1040
        lead.setState(createLeadActivityRequest.getState());
1041
        lead.setCity(createLeadActivityRequest.getCity());
35769 amit 1042
        if (createLeadActivityRequest.getSource() != null && !createLeadActivityRequest.getSource().isEmpty()) {
1043
            lead.setSource(createLeadActivityRequest.getSource());
1044
        }
36741 ranu 1045
        if (Boolean.TRUE.equals(createLeadActivityRequest.getColorCheck())) {
32471 tejbeer 1046
            lead.setColor("Green");
1047
        } else {
1048
            lead.setColor("Yellow");
1049
        }
32464 tejbeer 1050
        lead.setNotinterestedReason(createLeadActivityRequest.getReason());
1051
        lead.setUpdatedTimestamp(LocalDateTime.now());
29426 manish 1052
 
32464 tejbeer 1053
        int authId = 0;
34127 tejus.loha 1054
        authId = lead.getAssignTo();
1055
        Map<Integer, LeadActivity> leadActivityMap = new HashMap<>();
29426 manish 1056
 
34127 tejus.loha 1057
        List<LeadActivity> leadActivitys = leadActivityRepository.selectBYLeadId(lead.getId());
29426 manish 1058
 
34127 tejus.loha 1059
        if (!leadActivitys.isEmpty()) {
1060
            leadActivityMap.put(lead.getId(), leadActivitys.get(0));
1061
        }
29426 manish 1062
 
34127 tejus.loha 1063
        Map<Integer, AuthUser> authIdAndAuthUserMap = new HashMap<>();
1064
        AuthUser AuthUser = authRepository.selectById(authId);
29426 manish 1065
 
34127 tejus.loha 1066
        authIdAndAuthUserMap.put(AuthUser.getId(), AuthUser);
29426 manish 1067
 
34127 tejus.loha 1068
        model.addAttribute("leadActivityMap", leadActivityMap);
1069
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
29426 manish 1070
 
30185 tejbeer 1071
 
33223 amit.gupta 1072
        model.addAttribute("lead", lead);
30185 tejbeer 1073
 
32464 tejbeer 1074
        return "edit-lead";
30185 tejbeer 1075
 
32464 tejbeer 1076
    }
31370 tejbeer 1077
 
32464 tejbeer 1078
    @RequestMapping(value = "/downloadIvoryLead", method = RequestMethod.GET)
1079
    public ResponseEntity<?> downloadDelayDayTemplate(HttpServletRequest request) throws Exception {
1080
        List<String> stateNames = stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList());
31370 tejbeer 1081
 
32464 tejbeer 1082
        List<List<?>> rows = new ArrayList<>();
31496 tejbeer 1083
 
32464 tejbeer 1084
        List<LeadSource> lss = LeadSource.enumValues;
31370 tejbeer 1085
 
32464 tejbeer 1086
        for (LeadSource ls : lss) {
1087
            rows.add(Arrays.asList("-", "-", "-", "-", "-", "-", "-", ls));
31478 tejbeer 1088
 
32464 tejbeer 1089
        }
1090
        for (String stateName : stateNames) {
1091
            rows.add(Arrays.asList("-", "-", "-", "-", stateName, "-", "-", "-"));
31478 tejbeer 1092
 
32464 tejbeer 1093
        }
31478 tejbeer 1094
 
32464 tejbeer 1095
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("First Name", "Last Name", "Address", "City", "State", "Mobile", "Assign To(email)", "Source"), rows);
31478 tejbeer 1096
 
32464 tejbeer 1097
        final HttpHeaders headers = new HttpHeaders();
1098
        headers.set("Content-Type", "text/csv");
1099
        headers.set("Content-disposition", "inline; filename=leads.format.csv");
1100
        headers.setContentLength(baos.toByteArray().length);
31478 tejbeer 1101
 
32464 tejbeer 1102
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1103
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1104
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
31478 tejbeer 1105
 
32464 tejbeer 1106
    }
31478 tejbeer 1107
 
32464 tejbeer 1108
    @RequestMapping(value = "/csvFileAndSetLead", method = RequestMethod.POST)
1109
    public String readCsvFileAndSetLead(HttpServletRequest request, Model model, HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
31478 tejbeer 1110
 
32464 tejbeer 1111
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1112
        String email = loginDetails.getEmailId();
31478 tejbeer 1113
 
32464 tejbeer 1114
        AuthUser createdBy = authRepository.selectByEmailOrMobile(email);
31478 tejbeer 1115
 
32464 tejbeer 1116
        LOGGER.info("file" + file.toString());
31478 tejbeer 1117
 
32464 tejbeer 1118
        String fileName = file.getName();
31370 tejbeer 1119
 
32464 tejbeer 1120
        String fileNames = file.getOriginalFilename();
31370 tejbeer 1121
 
32464 tejbeer 1122
        LOGGER.info("fileName" + fileName);
1123
        LOGGER.info("fileNames" + fileNames);
31370 tejbeer 1124
 
32464 tejbeer 1125
        List<CSVRecord> records = FileUtil.readFile(file);
31370 tejbeer 1126
 
32464 tejbeer 1127
        for (CSVRecord record : records) {
31370 tejbeer 1128
 
32464 tejbeer 1129
            Lead lead = new Lead();
1130
            lead.setFirstName(record.get(0));
1131
            lead.setLastName(record.get(1));
1132
            lead.setAddress(record.get(2));
1133
            lead.setCity(record.get(3));
1134
            lead.setState(record.get(4));
1135
            lead.setLeadMobile(record.get(5));
1136
            LOGGER.info("record" + record.get(6));
31370 tejbeer 1137
 
32464 tejbeer 1138
            AuthUser assignTo = authRepository.selectByEmailOrMobile(record.get(6));
31370 tejbeer 1139
 
32464 tejbeer 1140
            if (assignTo == null) {
1141
                throw new ProfitMandiBusinessException("Assign To ", record.get(6), "email id not exist");
1142
            }
31370 tejbeer 1143
 
32464 tejbeer 1144
            lead.setAssignTo(assignTo.getId());
1145
            lead.setSource(record.get(7));
31370 tejbeer 1146
 
32464 tejbeer 1147
            lead.setCreatedTimestamp(LocalDateTime.now());
31370 tejbeer 1148
 
32464 tejbeer 1149
            lead.setUpdatedTimestamp(LocalDateTime.now());
1150
            lead.setStatus(LeadStatus.pending);
1151
            lead.setColor("yellow");
1152
            // change
1153
            lead.setCreatedBy(createdBy.getFullName());
1154
            lead.setAuthId(createdBy.getId());
31370 tejbeer 1155
 
32464 tejbeer 1156
            leadRepository.persist(lead);
31370 tejbeer 1157
 
32464 tejbeer 1158
            LeadActivity leadActivity = new LeadActivity();
1159
            leadActivity.setLeadId(lead.getId());
1160
            leadActivity.setRemark("New Lead");
1161
            leadActivity.setSchelduleTimestamp(null);
31370 tejbeer 1162
 
32464 tejbeer 1163
            leadActivity.setCreatedTimestamp(LocalDateTime.now());
1164
            leadActivityRepository.persist(leadActivity);
1165
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31370 tejbeer 1166
 
32464 tejbeer 1167
        }
31370 tejbeer 1168
 
32464 tejbeer 1169
        model.addAttribute("responseSTG", mvcResponseSender.createResponseString(true));
31370 tejbeer 1170
 
32464 tejbeer 1171
        return "response";
31370 tejbeer 1172
 
32464 tejbeer 1173
    }
31370 tejbeer 1174
 
32464 tejbeer 1175
    @RequestMapping(value = "/teamCommitment", method = RequestMethod.GET)
1176
    public String teamCommitments(HttpServletRequest request, Model model) throws Exception {
31370 tejbeer 1177
 
32464 tejbeer 1178
        return "team-commitment";
31370 tejbeer 1179
 
32464 tejbeer 1180
    }
31370 tejbeer 1181
 
32464 tejbeer 1182
    @RequestMapping(value = "/leadDetail", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
1183
    public String leadDetail(HttpServletRequest request, @RequestBody LeadDetailModel leadDetailModel, Model model) throws Exception {
31370 tejbeer 1184
 
32464 tejbeer 1185
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1186
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
31370 tejbeer 1187
 
32471 tejbeer 1188
        leadRepository.persistLeadDetail(leadDetailModel, authUser);
32464 tejbeer 1189
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31370 tejbeer 1190
 
32464 tejbeer 1191
        return "response";
31370 tejbeer 1192
 
32464 tejbeer 1193
    }
31370 tejbeer 1194
 
32464 tejbeer 1195
    @RequestMapping(value = "/getLeadDetail", method = RequestMethod.GET)
1196
    public String getLeadDetail(HttpServletRequest request, Model model) throws Exception {
1197
        List<Integer> followUpleadIds = leadRepository.selectAllByStatus(LeadStatus.followUp).stream().map(x -> x.getId()).collect(Collectors.toList());
1198
        List<LeadDetail> leadDetails = leadDetailRepository.selectByLeadIds(followUpleadIds);
31370 tejbeer 1199
 
32464 tejbeer 1200
        List<DBObject> mobileBrands = mongoClient.getAllBrandsToDisplay(3);
31370 tejbeer 1201
 
32464 tejbeer 1202
        List<String> brands = mobileBrands.stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
31370 tejbeer 1203
 
32464 tejbeer 1204
        model.addAttribute("brands", brands);
1205
        if (!leadDetails.isEmpty()) {
31370 tejbeer 1206
 
32464 tejbeer 1207
            List<Integer> detailsIds = leadDetails.stream().map(x -> x.getId()).collect(Collectors.toList());
31370 tejbeer 1208
 
32464 tejbeer 1209
            List<Integer> leadIds = leadDetails.stream().map(x -> x.getLeadId()).collect(Collectors.toList());
31370 tejbeer 1210
 
32464 tejbeer 1211
            Map<Integer, Lead> leadMap = leadRepository.selectAllByIds(leadIds).stream().filter(x -> x.getStatus().equals(LeadStatus.followUp)).collect(Collectors.toMap(x -> x.getId(), x -> x));
31370 tejbeer 1212
 
32464 tejbeer 1213
            Map<Integer, Optional<LeadActivity>> leadActivityMap = leadActivityRepository.selectAllByleadIds(leadIds).stream().collect(Collectors.groupingBy(x -> x.getLeadId(), Collectors.maxBy(Comparator.comparing(LeadActivity::getId))));
31370 tejbeer 1214
 
32464 tejbeer 1215
            model.addAttribute("leadActivityMap", leadActivityMap);
30185 tejbeer 1216
 
32464 tejbeer 1217
            List<LeadBrand> leadBrands = leadBrandRepository.selectByLeadDetailId(detailsIds);
30185 tejbeer 1218
 
32464 tejbeer 1219
            LOGGER.info("leadBrands {}" + leadBrands);
30185 tejbeer 1220
 
32464 tejbeer 1221
            Map<Integer, Map<String, Integer>> leadDetailBrandValue = new HashMap<>();
30416 tejbeer 1222
 
32464 tejbeer 1223
            Map<Integer, List<LeadBrand>> leadDetail = leadBrands.stream().collect(Collectors.groupingBy(x -> x.getLeadDetailId(), Collectors.toList()));
30416 tejbeer 1224
 
32464 tejbeer 1225
            for (Entry<Integer, List<LeadBrand>> leadDetailEntry : leadDetail.entrySet()) {
30416 tejbeer 1226
 
32464 tejbeer 1227
                Map<String, Integer> brandValue = new HashMap<>();
30416 tejbeer 1228
 
32464 tejbeer 1229
                for (LeadBrand leadBrand : leadDetailEntry.getValue()) {
1230
                    brandValue.put(leadBrand.getBrand(), leadBrand.getValue());
30416 tejbeer 1231
 
32464 tejbeer 1232
                }
1233
                leadDetailBrandValue.put(leadDetailEntry.getKey(), brandValue);
1234
            }
30416 tejbeer 1235
 
32464 tejbeer 1236
            LOGGER.info("leadDetailBrandValue {}" + leadDetailBrandValue);
30416 tejbeer 1237
 
32464 tejbeer 1238
            model.addAttribute("leadDetailBrandValue", leadDetailBrandValue);
30416 tejbeer 1239
 
32464 tejbeer 1240
            model.addAttribute("leadMap", leadMap);
1241
        }
30434 tejbeer 1242
 
32464 tejbeer 1243
        model.addAttribute("leadDetails", leadDetails);
30434 tejbeer 1244
 
32464 tejbeer 1245
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1246
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
30434 tejbeer 1247
 
32464 tejbeer 1248
        return "lead-detail";
30458 tejbeer 1249
 
32464 tejbeer 1250
    }
30458 tejbeer 1251
 
32464 tejbeer 1252
    @RequestMapping(value = "/getLeadDetailByLeadId", method = RequestMethod.GET)
35548 aman 1253
    public ResponseEntity<?> getLeadDetailByLeadId(@RequestParam int leadId) {
30458 tejbeer 1254
 
35548 aman 1255
        Lead lead = leadRepository.selectById(leadId);
32464 tejbeer 1256
        LeadDetail leadDetail = leadDetailRepository.selectByLeadId(leadId);
35548 aman 1257
        Map<String, Object> response = new HashMap<>();
1258
        response.put("city", lead.getCity());
1259
        response.put("state", lead.getState());
1260
        if (leadDetail != null) {
1261
            response.put("outletName", leadDetail.getOutletName());
1262
            response.put("counterSize", leadDetail.getCounterSize());
1263
        }
1264
        return responseSender.ok(response);
1265
    }
30458 tejbeer 1266
 
35548 aman 1267
    @PostMapping("/upload-assign-id")
1268
    public ResponseEntity<?> uploadAssignIdCsv(
1269
            @RequestParam("file") MultipartFile file)
1270
            throws Exception {
1271
 
1272
        try (Reader reader = new InputStreamReader(file.getInputStream());
1273
             CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT)) {
1274
 
1275
            List<CSVRecord> records = parser.getRecords();
1276
 
1277
            if (records.size() < 2) {
1278
                throw new ProfitMandiBusinessException(
1279
                        "Uploaded File", "", "No records Found");
1280
            }
1281
 
1282
            records.remove(0);
1283
 
1284
            for (CSVRecord record : records) {
1285
 
1286
                int leadId = Integer.parseInt(record.get(0));
1287
                int assignId = Integer.parseInt(record.get(1));
1288
 
1289
                Lead lead = leadRepository.selectById(leadId);
1290
 
1291
                if (lead == null) {
1292
                    LOGGER.warn("Lead not found for id {}", leadId);
1293
                    continue;
1294
                }
1295
 
1296
                lead.setAssignTo(assignId);
1297
            }
1298
        }
1299
 
1300
        return responseSender.ok("CSV processed successfully");
32464 tejbeer 1301
    }
30434 tejbeer 1302
 
35548 aman 1303
 
1304
 
32464 tejbeer 1305
    @RequestMapping(value = "/getTeamCommitment", method = RequestMethod.GET)
1306
    public String getTeamCommitments(HttpServletRequest request, @RequestParam LocalDateTime date, Model model) throws Exception {
30781 tejbeer 1307
 
32464 tejbeer 1308
        List<TeamCommitmentModel> commitments = partnerCollectionPlanRepository.selectTeamCommitmentByDate(date.toLocalDate());
30416 tejbeer 1309
 
32464 tejbeer 1310
        model.addAttribute("commitments", commitments);
1311
        return "team-commitment-table";
30416 tejbeer 1312
 
32464 tejbeer 1313
    }
30416 tejbeer 1314
 
33917 ranu 1315
    @Autowired
1316
    RbmTargetService rbmTargetService;
1317
 
1318
    @RequestMapping(value = "/rbmTodayArr", method = RequestMethod.GET)
1319
    public String getRbmTodayArr(HttpServletRequest request, Model model, @RequestParam(value = "startDate", required = false) LocalDate startDate) throws Exception {
1320
        List<RbmArrViewModel> rbmArrViewModels;
35223 ranu 1321
        DecimalFormat decimalFormat = new DecimalFormat("#"); // No decimal places
33917 ranu 1322
        if (startDate != null) {
1323
            rbmArrViewModels = rbmTargetService.getRbmTodayArr(startDate);
1324
        } else {
1325
            rbmArrViewModels = rbmTargetService.getRbmTodayArr();
1326
        }
1327
 
35223 ranu 1328
        Set<AuthUser> authUsers = new HashSet<>();
1329
        Set<AuthUser> rbmAuthUsers = csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM, EscalationType.L1).stream().filter(x -> x.isActive()).collect(Collectors.toSet());
1330
        Set<AuthUser> salesAuthUsers = csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_RBM, Arrays.asList(EscalationType.L1, EscalationType.L2)).stream().filter(x -> x.isActive()).collect(Collectors.toSet());
33953 ranu 1331
 
35223 ranu 1332
        authUsers.addAll(rbmAuthUsers);
1333
        authUsers.addAll(salesAuthUsers);
33953 ranu 1334
 
35223 ranu 1335
        double totalAchieved = rbmArrViewModels.stream().mapToDouble(RbmArrViewModel::getTotalAchievedTarget).sum();
1336
        double totalTargetSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayTarget).sum();
1337
 
1338
        double totalHidSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayHidTarget).sum();
1339
        double totalHidAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedHidTarget).sum();
1340
 
1341
        double totalFastSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayFastMovingTarget).sum();
1342
        double totalFastAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedFastMovingTarget).sum();
1343
 
1344
        double totalSlowSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodaySlowMovingTarget).sum();
1345
        double totalSlowAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedSlowMovingTarget).sum();
1346
 
1347
        double totalRunningSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayRunningTarget).sum();
1348
        double totalRunningAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedRunningTarget).sum();
1349
 
1350
        double totalOtherSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayOtherMovingTarget).sum();
1351
        double totalOtherAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedOtherMovingTarget).sum();
1352
 
34055 ranu 1353
        List<Sold15daysOldAgingModel> sold15daysOldAgingModels = rbmTargetService.getAgingSale(LocalDate.now(), LocalDate.now().plusDays(1));
1354
        List<Our15DaysOldAgingStock> our15DaysOldAgingStocks = rbmTargetService.our15DaysAgingStock();
1355
 
35223 ranu 1356
        long totalSoldSlow = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getSlowmovingBilled).sum();
1357
        long totalSoldRun = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getRunningBilled).sum();
1358
        long totalSoldFast = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getFastmovingBilled).sum();
1359
        long totalSoldHid = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getHidBilled).sum();
1360
        long totalSoldOther = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getOthersBilled).sum();
1361
        long totalSoldAging = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getTotalBilled).sum();
34103 ranu 1362
 
35223 ranu 1363
 
34103 ranu 1364
//        first week count of rbm partner billing
1365
        LocalDate firstOfCurrentMonth = LocalDate.now().withDayOfMonth(1);
1366
        LocalDate seventhOfCurrentMonth = LocalDate.now().withDayOfMonth(7);
1367
 
1368
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsFirstWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(firstOfCurrentMonth, seventhOfCurrentMonth);
1369
 
1370
        Map<String, Long> rbmBilledCountMapFirstWeek = rbmBilledFofoIdsModelsFirstWeek.stream()
1371
                .filter(x -> x.getStatus().equals("Billed"))
1372
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1373
 
34119 ranu 1374
        long totalFirstWeekCount = rbmBilledCountMapFirstWeek.values().stream()
1375
                .mapToLong(Long::longValue)
1376
                .sum();
1377
 
34114 ranu 1378
        Map<String, Long> rbmTargetedFofoIdCountMap = rbmBilledFofoIdsModelsFirstWeek.stream()
1379
                .collect(Collectors.groupingBy(
1380
                        RbmBilledFofoIdsModel::getRbmName, // Group by RBM Name
1381
                        Collectors.counting() // Count all fofoId entries for each RBM
1382
                ));
34103 ranu 1383
 
34119 ranu 1384
        long totalTargetedCount = rbmTargetedFofoIdCountMap.values().stream().mapToLong(x -> x.longValue()).sum();
34114 ranu 1385
 
1386
 
34103 ranu 1387
//        second week count of rbm partner billing
1388
 
1389
        LocalDate eightOfCurrentMonth = LocalDate.now().withDayOfMonth(8);
1390
        LocalDate fifteenOfCurrentMonth = LocalDate.now().withDayOfMonth(15);
1391
 
1392
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsSecondWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(eightOfCurrentMonth, fifteenOfCurrentMonth);
1393
 
1394
        Map<String, Long> rbmBilledCountMapSecondWeek = rbmBilledFofoIdsModelsSecondWeek.stream()
1395
                .filter(x -> x.getStatus().equals("Billed"))
1396
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1397
 
34119 ranu 1398
        long totalSecondWeekCount = rbmBilledCountMapSecondWeek.values().stream().mapToLong(Long::longValue).sum();
34103 ranu 1399
 
1400
//      third week count of rbm partner billing
1401
 
1402
        LocalDate sixteenOfCurrentMonth = LocalDate.now().withDayOfMonth(16);
34144 ranu 1403
        LocalDate twentySecondOfCurrentMonth = LocalDate.now().withDayOfMonth(22);
34103 ranu 1404
 
34144 ranu 1405
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsThirdWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(sixteenOfCurrentMonth, twentySecondOfCurrentMonth);
34103 ranu 1406
 
1407
        Map<String, Long> rbmBilledCountMapThirdWeek = rbmBilledFofoIdsModelsThirdWeek.stream()
1408
                .filter(x -> x.getStatus().equals("Billed"))
1409
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1410
 
34119 ranu 1411
        long totalThirdWeekCount = rbmBilledCountMapThirdWeek.values().stream().mapToLong(Long::longValue).sum();
34103 ranu 1412
 
34119 ranu 1413
 
34103 ranu 1414
        //      fourth week count of rbm partner billing
1415
 
34144 ranu 1416
        LocalDate twentyThirdOfCurrentMonth = LocalDate.now().withDayOfMonth(23);
34103 ranu 1417
        LocalDate lastDayOfCurrentMonth = LocalDate.now().withDayOfMonth(LocalDate.now().lengthOfMonth());
1418
 
34144 ranu 1419
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsFourthWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(twentyThirdOfCurrentMonth, lastDayOfCurrentMonth);
34103 ranu 1420
 
1421
        Map<String, Long> rbmBilledCountMapFourthWeek = rbmBilledFofoIdsModelsFourthWeek.stream()
1422
                .filter(x -> x.getStatus().equals("Billed"))
1423
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1424
 
34119 ranu 1425
        long totalFourthWeekCount = rbmBilledCountMapFourthWeek.values().stream().mapToLong(x -> x.longValue()).sum();
34103 ranu 1426
 
34119 ranu 1427
 
34103 ranu 1428
//      mtd rbm partner billing
1429
 
1430
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsMtd = rbmTargetService.getDateWiseBilledFofoIdByRbm(firstOfCurrentMonth, LocalDate.now());
1431
 
1432
        Map<String, Long> rbmBilledCountMapMtd = rbmBilledFofoIdsModelsMtd.stream()
1433
                .filter(x -> x.getStatus().equals("Billed"))
1434
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1435
 
34119 ranu 1436
        long totalMtdCount = rbmBilledCountMapMtd.values().stream().mapToLong(Long::longValue).sum();
1437
 
1438
        Map<String, Long> zeroBilledCountMap = rbmTargetedFofoIdCountMap.entrySet().stream()
1439
                .collect(Collectors.toMap(
1440
                        Map.Entry::getKey,
1441
                        entry -> entry.getValue() - rbmBilledCountMapMtd.getOrDefault(entry.getKey(), 0L)
1442
                ));
1443
 
1444
        long totalZeroBilledCount = zeroBilledCountMap.values().stream().mapToLong(Long::longValue).sum();
1445
 
36101 ranu 1446
        //        rbmRating by franchisee visits (weekly: Monday to Sunday)
35223 ranu 1447
 
1448
        Map<Integer, String> rbmIdToNameMap = authUsers.stream()
1449
                .collect(Collectors.toMap(AuthUser::getId, AuthUser::getFullName));
1450
 
36101 ranu 1451
        // Calculate current week: Monday (start) to Sunday (end)
1452
        LocalDate today = LocalDate.now();
1453
        LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
1454
        LocalDate sunday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
1455
        LocalDateTime weekStart = monday.atStartOfDay();
1456
        LocalDateTime weekEnd = sunday.atTime(LocalTime.MAX);
1457
 
35223 ranu 1458
        Map<String, RbMRatingModel> rbmNameToRatingMap = rbmRatingRepository
36101 ranu 1459
                .findAverageRatingByRbmIdAndDateRange(new ArrayList<>(rbmIdToNameMap.keySet()), weekStart, weekEnd)
1460
                .stream().collect(Collectors.toMap(
35223 ranu 1461
                        x -> rbmIdToNameMap.get(x.getRbmId()),
1462
                        x -> x
1463
                ));
1464
 
1465
 
33917 ranu 1466
        LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);
1467
        model.addAttribute("rbmArrViewModels", rbmArrViewModels);
35223 ranu 1468
        model.addAttribute("rbmNameToRatingMap", rbmNameToRatingMap);
1469
 
1470
        model.addAttribute("totalTargetSum", decimalFormat.format(totalTargetSum));
1471
        model.addAttribute("totalAchieved", decimalFormat.format(totalAchieved));
1472
 
1473
        model.addAttribute("totalHidSum", decimalFormat.format(totalHidSum));
1474
        model.addAttribute("totalHidAchievedSum", decimalFormat.format(totalHidAchievedSum));
1475
 
1476
        model.addAttribute("totalFastSum", decimalFormat.format(totalFastSum));
1477
        model.addAttribute("totalFastAchievedSum", decimalFormat.format(totalFastAchievedSum));
1478
 
1479
        model.addAttribute("totalSlowSum", decimalFormat.format(totalSlowSum));
1480
        model.addAttribute("totalSlowAchievedSum", decimalFormat.format(totalSlowAchievedSum));
1481
 
1482
        model.addAttribute("totalRunningSum", decimalFormat.format(totalRunningSum));
1483
        model.addAttribute("totalRunningAchievedSum", decimalFormat.format(totalRunningAchievedSum));
1484
 
1485
        model.addAttribute("totalOtherSum", decimalFormat.format(totalOtherSum));
1486
        model.addAttribute("totalOtherAchievedSum", decimalFormat.format(totalOtherAchievedSum));
1487
 
1488
        model.addAttribute("our15DaysOldAgingStocks", our15DaysOldAgingStocks);
34055 ranu 1489
        model.addAttribute("sold15daysOldAgingModels", sold15daysOldAgingModels);
35223 ranu 1490
        model.addAttribute("totalSoldSlow", totalSoldSlow);
1491
        model.addAttribute("totalSoldRun", totalSoldRun);
1492
        model.addAttribute("totalSoldFast", totalSoldFast);
1493
        model.addAttribute("totalSoldHid", totalSoldHid);
1494
        model.addAttribute("totalSoldOther", totalSoldOther);
1495
        model.addAttribute("totalSoldAging", totalSoldAging);
33917 ranu 1496
 
34114 ranu 1497
        model.addAttribute("rbmTargetedFofoIdCountMap", rbmTargetedFofoIdCountMap);
34103 ranu 1498
        model.addAttribute("rbmBilledCountMapFirstWeek", rbmBilledCountMapFirstWeek);
1499
        model.addAttribute("rbmBilledCountMapSecondWeek", rbmBilledCountMapSecondWeek);
1500
        model.addAttribute("rbmBilledCountMapThirdWeek", rbmBilledCountMapThirdWeek);
1501
        model.addAttribute("rbmBilledCountMapFourthWeek", rbmBilledCountMapFourthWeek);
1502
        model.addAttribute("rbmBilledCountMapMtd", rbmBilledCountMapMtd);
34119 ranu 1503
        model.addAttribute("zeroBilledCountMap", zeroBilledCountMap);
1504
        model.addAttribute("totalFirstWeekCount", totalFirstWeekCount);
1505
        model.addAttribute("totalTargetedCount", totalTargetedCount);
1506
        model.addAttribute("totalSecondWeekCount", totalSecondWeekCount);
1507
        model.addAttribute("totalThirdWeekCount", totalThirdWeekCount);
1508
        model.addAttribute("totalFourthWeekCount", totalFourthWeekCount);
1509
        model.addAttribute("totalMtdCount", totalMtdCount);
1510
        model.addAttribute("totalZeroBilledCount", totalZeroBilledCount);
34103 ranu 1511
 
33917 ranu 1512
        return "rbm-today-arr";
1513
    }
1514
 
1515
 
32464 tejbeer 1516
    @RequestMapping(value = "/partnerHealth", method = RequestMethod.GET)
1517
    public String partnerHealth(HttpServletRequest request, @RequestParam(name = "email", required = false) String email, Model model) throws Exception {
1518
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30416 tejbeer 1519
 
32464 tejbeer 1520
        if (StringUtils.isEmpty(email)) {
1521
            email = loginDetails.getEmailId();
1522
        } else {
1523
            AuthUser selectedUser = authRepository.selectByEmailOrMobile(email);
30416 tejbeer 1524
 
32464 tejbeer 1525
            model.addAttribute("selectedUser", selectedUser);
30445 tejbeer 1526
 
32464 tejbeer 1527
        }
30445 tejbeer 1528
 
32464 tejbeer 1529
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
30445 tejbeer 1530
 
32464 tejbeer 1531
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
1532
        List<Integer> fofoIds = new ArrayList<>(storeGuyMap.get(email));
1533
        LocalDateTime startDate = LocalDate.now().atStartOfDay();
1534
        if (fofoIds != null && fofoIds.size() > 0) {
1535
            List<Integer> fofoIdList = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> !x.isInternal()).map(x -> x.getId()).collect(Collectors.toList());
30420 tejbeer 1536
 
32464 tejbeer 1537
            Map<Integer, PartnerCollectionPlanModel> foundCollectionMap = partnerCollectionService.getCollectionMap(fofoIdList, startDate);
30416 tejbeer 1538
 
32464 tejbeer 1539
            List<Integer> remarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(fofoIdList);
30416 tejbeer 1540
 
32464 tejbeer 1541
            LOGGER.info("remarkIds {}", remarkIds);
30416 tejbeer 1542
 
32464 tejbeer 1543
            long todayOverallCall = 0;
1544
            if (!remarkIds.isEmpty()) {
30416 tejbeer 1545
 
32464 tejbeer 1546
                if (authUser.getEmailId().equals(email)) {
30441 tejbeer 1547
 
32464 tejbeer 1548
                    todayOverallCall = partnerCollectionRemarkRepository.selectByIds(remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
1549
                } else {
30441 tejbeer 1550
 
32464 tejbeer 1551
                    todayOverallCall = partnerCollectionRemarkRepository.selectByAuthIdAndIds(authRepository.selectByEmailOrMobile(email).getId(), remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
30416 tejbeer 1552
 
32464 tejbeer 1553
                }
30416 tejbeer 1554
 
32464 tejbeer 1555
            }
1556
            ChartLeadModel cm = new ChartLeadModel();
30416 tejbeer 1557
 
32464 tejbeer 1558
            if (!foundCollectionMap.isEmpty()) {
1559
                cm = this.getCollectionCount(foundCollectionMap.values().stream().collect(Collectors.toList()));
30416 tejbeer 1560
 
32464 tejbeer 1561
            }
1562
            model.addAttribute("chartPartnerHealth", gson.toJson(cm));
1563
            Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = new HashMap<>();
30416 tejbeer 1564
 
32464 tejbeer 1565
            List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository.selectAll(fofoIdList, startDate.toLocalDate().minusDays(1));
1566
            if (!partnerDailyInvestments.isEmpty()) {
1567
                partnerDailyInvestmentMap = partnerDailyInvestments.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
1568
            }
30416 tejbeer 1569
 
32464 tejbeer 1570
            Map<LocalDate, Map<Integer, PartnerCollectionPlanModel>> pcpmMap = new TreeMap<>();
1571
            for (int i = 0; i <= 6; i++) {
30416 tejbeer 1572
 
32464 tejbeer 1573
                Map<Integer, PartnerCollectionPlanModel> collectionMap = partnerCollectionService.getCollectionMap(fofoIdList, startDate.minusDays(i));
30416 tejbeer 1574
 
32464 tejbeer 1575
                pcpmMap.put(startDate.minusDays(i).toLocalDate(), collectionMap);
1576
            }
30416 tejbeer 1577
 
32464 tejbeer 1578
            Map<Integer, PartnerCollectionPlanModel> todayPcpmMap = pcpmMap.get(startDate.toLocalDate());
1579
            model.addAttribute("todayPcpmMap", todayPcpmMap);
30416 tejbeer 1580
 
32464 tejbeer 1581
            TotalTargetColectionModel totalTargetCollection = partnerCollectionService.getTotalTargetCollection(todayPcpmMap, startDate);
1582
            model.addAttribute("totalPartnerTargetCollection", totalTargetCollection.getTotalTarget());
30416 tejbeer 1583
 
32464 tejbeer 1584
            model.addAttribute("totalPartnerAchievement", totalTargetCollection.getTotalAchievement());
30416 tejbeer 1585
 
32464 tejbeer 1586
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1587
            Map<Integer, CustomRetailer> customRetailers = fofoIdList.stream().distinct().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1588
            List<Integer> allReportees = authService.getAllReportees(authUser.getId());
30416 tejbeer 1589
 
32464 tejbeer 1590
            List<Integer> salesPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
1591
            List<Integer> rbmPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
30416 tejbeer 1592
 
32464 tejbeer 1593
            salesPositionsAuthIds.addAll(rbmPositionsAuthIds);
30416 tejbeer 1594
 
32464 tejbeer 1595
            Set<Integer> empHierarchy = allReportees.stream().filter(x -> salesPositionsAuthIds.contains(x)).collect(Collectors.toSet());
34027 ranu 1596
            List<AuthUser> authUsers = new ArrayList<>();
1597
            if (!empHierarchy.isEmpty()) {
35395 amit 1598
                authUsers = authRepository.selectByIds(new ArrayList<>(empHierarchy));
34027 ranu 1599
            }
30416 tejbeer 1600
 
1601
 
32464 tejbeer 1602
            Map<Integer, AuthUser> authUserMap = authRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
30416 tejbeer 1603
 
32464 tejbeer 1604
            LOGGER.info("todayPcpmMap {}", todayPcpmMap);
30416 tejbeer 1605
 
32464 tejbeer 1606
            model.addAttribute("authUsers", authUsers);
1607
            model.addAttribute("authUserMap", authUserMap);
1608
            model.addAttribute("partnerCollectionPlanMap", pcpmMap);
1609
            model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
1610
            model.addAttribute("customRetailers", customRetailers);
1611
            model.addAttribute("rankColorMap", ProfitMandiConstants.Rank_Color_Map);
1612
            model.addAttribute("todayOverallCall", todayOverallCall);
30522 tejbeer 1613
 
32464 tejbeer 1614
        }
1615
        return "partner-health";
30522 tejbeer 1616
 
32464 tejbeer 1617
    }
30522 tejbeer 1618
 
32464 tejbeer 1619
    public ChartLeadModel getCollectionCount(List<PartnerCollectionPlanModel> pcpm) throws ProfitMandiBusinessException {
30522 tejbeer 1620
 
32464 tejbeer 1621
        Map<Integer, Long> rankCount = pcpm.stream().collect(Collectors.groupingBy(x -> x.getRank(), Collectors.mapping(PartnerCollectionPlanModel::getRank, Collectors.counting())));
30522 tejbeer 1622
 
32464 tejbeer 1623
        ChartLeadModel cm = new ChartLeadModel();
30522 tejbeer 1624
 
32464 tejbeer 1625
        List<String> labels = new ArrayList<>();
1626
        labels.add("Plan for Today");
1627
        labels.add("Carry Forward");
1628
        labels.add("Untouched");
1629
        labels.add("Plan for Future");
1630
        labels.add("Normal");
30522 tejbeer 1631
 
32464 tejbeer 1632
        List<String> backgroundColor = new ArrayList<>();
1633
        List<Long> values = new ArrayList<>();
30522 tejbeer 1634
 
32464 tejbeer 1635
        for (String label : labels) {
30522 tejbeer 1636
 
32464 tejbeer 1637
            if (label.equals("Plan for Today")) {
1638
                backgroundColor.add("#007bff");
1639
                values.add(rankCount.get(1));
1640
            }
1641
            if (label.equals("Carry Forward")) {
1642
                backgroundColor.add("#ffc107");
1643
                values.add(rankCount.get(2));
1644
            }
1645
            if (label.equals("Untouched")) {
1646
                backgroundColor.add("#dc3545");
1647
                values.add(rankCount.get(3));
1648
            }
1649
            if (label.equals("Plan for Future")) {
1650
                backgroundColor.add("#6c757d");
1651
                values.add(rankCount.get(4));
1652
            }
1653
            if (label.equals("Normal")) {
1654
                backgroundColor.add("White");
1655
                values.add(rankCount.get(5));
1656
            }
30522 tejbeer 1657
 
32464 tejbeer 1658
        }
30522 tejbeer 1659
 
32464 tejbeer 1660
        LOGGER.info("backgroundColor" + backgroundColor);
1661
        LOGGER.info("labelsChartLead" + labels);
1662
        LeadStatusData data = new LeadStatusData();
1663
        data.setData(values);
1664
        data.setBackgroundColor(backgroundColor);
1665
        data.setLabel("DataSet 1");
30522 tejbeer 1666
 
32464 tejbeer 1667
        PieLables label = new PieLables();
1668
        label.setFontColor("black");
1669
        label.setFontSize(15);
30522 tejbeer 1670
 
32464 tejbeer 1671
        Legend legend = new Legend();
1672
        legend.setLabels(label);
1673
        legend.setPosition("left");
30522 tejbeer 1674
 
32464 tejbeer 1675
        List<LeadStatusData> dataList = new ArrayList<>();
1676
        dataList.add(data);
30522 tejbeer 1677
 
32464 tejbeer 1678
        DataLeadModel datasets = new DataLeadModel();
1679
        datasets.setDatasets(dataList);
1680
        datasets.setLabels(labels);
30522 tejbeer 1681
 
32464 tejbeer 1682
        OptionModel om = new OptionModel();
1683
        om.setLegend(legend);
30522 tejbeer 1684
 
32464 tejbeer 1685
        cm.setType("pie");
1686
        cm.setData(datasets);
1687
        cm.setOptions(om);
30522 tejbeer 1688
 
32464 tejbeer 1689
        return cm;
1690
    }
30522 tejbeer 1691
 
32464 tejbeer 1692
    @RequestMapping(value = "/franchiseVisit", method = RequestMethod.GET)
1693
    public String franchiseVisit(HttpServletRequest request, @RequestParam(name = "email", required = false) String email, Model model) throws Exception {
1694
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30522 tejbeer 1695
 
32464 tejbeer 1696
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
30522 tejbeer 1697
 
32464 tejbeer 1698
        List<Integer> salesPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
1699
        List<Integer> rbmPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
30522 tejbeer 1700
 
32464 tejbeer 1701
        salesPositionsAuthIds.addAll(rbmPositionsAuthIds);
30522 tejbeer 1702
 
32464 tejbeer 1703
        List<Integer> allReportees = authService.getAllReportees(authUser.getId());
30522 tejbeer 1704
 
32464 tejbeer 1705
        Set<Integer> empHierarchy = allReportees.stream().filter(x -> salesPositionsAuthIds.contains(x)).collect(Collectors.toSet());
30522 tejbeer 1706
 
35395 amit 1707
        List<AuthUser> authUsers = authRepository.selectByIds(new ArrayList<>(empHierarchy));
30522 tejbeer 1708
 
32464 tejbeer 1709
        Map<Integer, String> monthValueMap = new HashMap<>();
1710
        for (int i = 0; i <= 5; i++) {
1711
            LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1712
            monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
1713
        }
30522 tejbeer 1714
 
32464 tejbeer 1715
        model.addAttribute("authUsers", authUsers);
1716
        model.addAttribute("monthValueMap", monthValueMap);
30522 tejbeer 1717
 
32464 tejbeer 1718
        return "franchise-visit";
30522 tejbeer 1719
 
32464 tejbeer 1720
    }
30522 tejbeer 1721
 
32464 tejbeer 1722
    @RequestMapping(value = "/getFranchiseVisit", method = RequestMethod.GET)
1723
    public String getFranchiseVisit(HttpServletRequest request, @RequestParam(name = "authId", required = false) int authId, int yearMonth, Model model) throws Exception {
30522 tejbeer 1724
 
32464 tejbeer 1725
        LocalDateTime startDate = LocalDate.now().minusMonths(8).withDayOfMonth(1).atStartOfDay();
1726
        LocalDateTime endDate = startDate.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
30522 tejbeer 1727
 
32464 tejbeer 1728
        DateRangeModel drm = DateRangeModel.of(startDate, endDate);
30522 tejbeer 1729
 
32464 tejbeer 1730
        List<FranchiseeVisit> visits = franchiseeVisitRepository.selectByAuthUserAndDateRange(drm, authId);
30522 tejbeer 1731
 
32464 tejbeer 1732
        if (!visits.isEmpty()) {
30522 tejbeer 1733
 
32464 tejbeer 1734
            Map<Integer, List<FranchiseeVisit>> franchiseeVisitMap = visits.stream().collect(Collectors.groupingBy(x -> x.getScheduleTimestamp().getDayOfMonth()));
30522 tejbeer 1735
 
32464 tejbeer 1736
            model.addAttribute("franchiseeVisitMap", franchiseeVisitMap);
30522 tejbeer 1737
 
32464 tejbeer 1738
        }
30771 amit.gupta 1739
 
32464 tejbeer 1740
        model.addAttribute("visits", visits);
1741
        model.addAttribute("monthLength", startDate.toLocalDate().lengthOfMonth());
30771 amit.gupta 1742
 
32464 tejbeer 1743
        // Calender
30771 amit.gupta 1744
 
32464 tejbeer 1745
        int Year = startDate.getYear(); // year
1746
        int startDayOfMonth = 5;
1747
        int spaces = startDayOfMonth;
30771 amit.gupta 1748
 
32464 tejbeer 1749
        int month = startDate.getMonthValue();
30771 amit.gupta 1750
 
32464 tejbeer 1751
        int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
30771 amit.gupta 1752
 
32464 tejbeer 1753
        LOGGER.info("visits {} ", visits);
30771 amit.gupta 1754
 
32464 tejbeer 1755
        if ((((Year % 4 == 0) && (Year % 100 != 0)) || (Year % 400 == 0)) && month == 2) {
1756
            days[month] = 29;
1757
        }
30771 amit.gupta 1758
 
32464 tejbeer 1759
        spaces = (days[month - 1] + spaces) % 7;
30771 amit.gupta 1760
 
32464 tejbeer 1761
        model.addAttribute("month", month);
1762
        model.addAttribute("spaces", spaces);
1763
        model.addAttribute("days", days);
30771 amit.gupta 1764
 
32464 tejbeer 1765
        return "franchise-visit-container";
30771 amit.gupta 1766
 
32464 tejbeer 1767
    }
31249 tejbeer 1768
 
32464 tejbeer 1769
    @RequestMapping(value = "/getFranchiseeActivity", method = RequestMethod.GET)
1770
    public String getFranchiseeActivity(HttpServletRequest request, int visitId, Model model) throws Exception {
31249 tejbeer 1771
 
32464 tejbeer 1772
        List<FranchiseeActivity> franchiseeActivities = franchiseeActivityRepository.selectByFranchiseeVisitId(visitId);
31249 tejbeer 1773
 
32464 tejbeer 1774
        FranchiseeVisit franchiseeVisit = franchiseeVisitRepository.selectById(visitId);
31249 tejbeer 1775
 
32464 tejbeer 1776
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1777
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
31249 tejbeer 1778
 
32464 tejbeer 1779
        model.addAttribute("franchiseeVisit", franchiseeVisit);
1780
        model.addAttribute("franchiseeActivity", franchiseeActivities.get(0));
31249 tejbeer 1781
 
32464 tejbeer 1782
        return "franchie-visit-detail";
31249 tejbeer 1783
 
32464 tejbeer 1784
    }
31249 tejbeer 1785
 
32464 tejbeer 1786
    @RequestMapping(value = "/indent/today_target", method = RequestMethod.GET)
1787
    public String todayTarget(HttpServletRequest request, Model model) throws Exception {
1788
        List<RBMPerformanceSummaryModel> summaryModels = new ArrayList<>();
1789
        List<Integer> rbmPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM).stream().filter(x -> Arrays.asList(EscalationType.L1, EscalationType.L2).contains(x.getEscalationType())).map(x -> x.getAuthUserId()).distinct().collect(Collectors.toList());
1790
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
1791
        List<TeamCommitmentModel> teamCommitmentModels = partnerCollectionPlanRepository.selectTeamCommitmentByDate(LocalDate.now());
1792
        Map<Integer, Double> rbmSecondaryTargetMap = teamCommitmentModels.stream().filter(x -> rbmPositionsAuthIds.contains(x.getAuthId())).collect(Collectors.groupingBy(x -> x.getAuthId(), Collectors.summingDouble(x -> x.getTotalTarget() == null ? 0 : x.getTotalTarget())));
1793
        Map<Integer, Double> rbmSecondaryMap = teamCommitmentModels.stream().filter(x -> rbmPositionsAuthIds.contains(x.getAuthId())).collect(Collectors.groupingBy(x -> x.getAuthId(), Collectors.summingDouble(x -> x.getTotalAchievement() == null ? 0 : x.getTotalAchievement())));
1794
        LocalDateTime startDate = LocalDate.now().atStartOfDay();
1795
        for (int rbmAuthId : rbmPositionsAuthIds) {
1796
            RBMPerformanceSummaryModel rbmPerformanceSummaryModel = new RBMPerformanceSummaryModel();
1797
            rbmPerformanceSummaryModel.setAuthId(rbmAuthId);
1798
            AuthUser authUser = authRepository.selectById(rbmAuthId);
1799
            rbmPerformanceSummaryModel.setAuthName(authUser.getFullName());
33844 ranu 1800
            List<Integer> fofoIds = new ArrayList<>(storeGuyMap.get(authUser.getEmailId()));
31249 tejbeer 1801
 
32464 tejbeer 1802
            if (fofoIds.size() > 0) {
1803
                fofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> !x.isInternal()).map(x -> x.getId()).collect(Collectors.toList());
31249 tejbeer 1804
 
32464 tejbeer 1805
                /*
1806
                 * Map<Integer, PartnerCollectionPlanModel> foundCollectionMap =
1807
                 * partnerCollectionService .getCollectionMap(fofoIds, startDate);
1808
                 */
31249 tejbeer 1809
 
33844 ranu 1810
                List<Integer> remarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(fofoIds);
1811
 
32464 tejbeer 1812
                LOGGER.info("remarkIds {}", remarkIds);
31249 tejbeer 1813
 
32464 tejbeer 1814
                long todayOverallCall = 0;
1815
                if (!remarkIds.isEmpty()) {
1816
                    todayOverallCall = partnerCollectionRemarkRepository.selectByIds(remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
31249 tejbeer 1817
 
32464 tejbeer 1818
                }
31249 tejbeer 1819
 
32464 tejbeer 1820
                Map<Integer, PartnerCollectionPlanModel> collectionMap = partnerCollectionService.getCollectionMap(fofoIds, startDate);
31249 tejbeer 1821
 
32464 tejbeer 1822
                ChartLeadModel cm = this.getCollectionCount(collectionMap.values().stream().collect(Collectors.toList()));
31249 tejbeer 1823
 
32464 tejbeer 1824
                long collectionTarget = collectionMap.values().stream().filter(x -> x.getTargetPlan() != null).collect(Collectors.summingLong(x -> x.getTargetPlan()));
1825
                long collection = collectionMap.values().stream().filter(
1826
                        x -> x.getTargetPlan() != null && x.getTargetPlan() != 0 && x.getAchievementPlan() != null).collect(Collectors.summingLong(x -> x.getAchievementPlan()));
1827
                rbmPerformanceSummaryModel.setChartLeadModel(cm);
1828
                rbmPerformanceSummaryModel.setPartnersCommunicated(todayOverallCall);
1829
                rbmPerformanceSummaryModel.setCollectionTarget(collectionTarget);
1830
                rbmPerformanceSummaryModel.setCollection(collection);
1831
                rbmPerformanceSummaryModel.setSecondaryTarget(rbmSecondaryTargetMap.get(rbmAuthId) == null ? 0 : rbmSecondaryTargetMap.get(rbmAuthId).floatValue());
1832
                rbmPerformanceSummaryModel.setSecondary(
1833
                        rbmSecondaryMap.get(rbmAuthId) == null ? 0 : rbmSecondaryMap.get(rbmAuthId).floatValue());
1834
                summaryModels.add(rbmPerformanceSummaryModel);
1835
                // cm.getData().getDatasets().get(0).getData().;
1836
                // cm.getData().getDatasets().get(0).getBackgroundColor();
1837
                // cm.getData().getLabels()
31249 tejbeer 1838
 
32464 tejbeer 1839
            }
1840
        }
1841
        model.addAttribute("summaryModels", summaryModels);
1842
        return "today_target";
1843
    }
31249 tejbeer 1844
 
32464 tejbeer 1845
    @RequestMapping(value = "/visitPlan", method = RequestMethod.GET)
1846
    public String visitPlan(HttpServletRequest request, Model model) throws Exception {
31249 tejbeer 1847
 
32464 tejbeer 1848
        return "visit-request-plan";
1849
    }
31249 tejbeer 1850
 
32464 tejbeer 1851
    @RequestMapping(value = "/visit/getVisitPlan", method = RequestMethod.GET)
1852
    public String getVisitPlan(HttpServletRequest request, @RequestParam LocalDate date, Model model) throws Exception {
1853
        List<VisitRequest> visitRequests = visitRequestRepository.selectByAuthIdAndDate(date);
31249 tejbeer 1854
 
32464 tejbeer 1855
        List<Integer> leadIds = visitRequests.stream().filter(x -> x.getVisitType().equals("lead")).map(x -> x.getVisitId()).collect(Collectors.toList());
1856
        Map<Integer, Lead> leadMap = new HashMap<>();
1857
        if (!leadIds.isEmpty()) {
1858
            List<Lead> leads = leadRepository.selectAllByIds(leadIds);
31249 tejbeer 1859
 
32464 tejbeer 1860
            for (Lead lead : leads) {
1861
                List<LeadActivity> leadActivities = leadActivityRepository.selectBYLeadId(lead.getId());
1862
                lead.setScheduledTimestamp(leadActivities.get(0).getSchelduleTimestamp());
1863
                lead.setLeadActivity(leadActivities.get(0));
31249 tejbeer 1864
 
32464 tejbeer 1865
                leadMap.put(lead.getId(), lead);
1866
            }
31249 tejbeer 1867
 
32464 tejbeer 1868
        }
1869
        List<Integer> franchiseeIds = visitRequests.stream().filter(x -> x.getVisitType().equals("franchiseeVisit")).map(x -> x.getVisitId()).collect(Collectors.toList());
1870
        Map<Integer, FranchiseeVisit> franchiseeVisitsMap = new HashMap<>();
1871
        if (!franchiseeIds.isEmpty()) {
1872
            List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectAllByIds(franchiseeIds);
1873
            LOGGER.info("franchiseeVisits {}", franchiseeVisits);
31249 tejbeer 1874
 
32464 tejbeer 1875
            for (FranchiseeVisit franchiseeVisit : franchiseeVisits) {
1876
                List<FranchiseeActivity> franchiseeActivities = franchiseeActivityRepository.selectByFranchiseeVisitId(franchiseeVisit.getId());
1877
                LOGGER.info("franchiseeActivities {}", franchiseeActivities);
1878
 
1879
                franchiseeVisit.setScheduleTimestamp(franchiseeActivities.get(0).getSchelduleTimestamp());
1880
                franchiseeVisit.setFranchiseeActivity(franchiseeActivities.get(0));
1881
 
1882
                franchiseeVisitsMap.put(franchiseeVisit.getId(), franchiseeVisit);
1883
            }
1884
 
1885
        }
1886
 
1887
        Map<Integer, List<VisitRequest>> visitRequestMap = visitRequests.stream().collect(Collectors.groupingBy(x -> x.getCreatedBy()));
1888
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
1889
        List<UserVisitModel> userVisits = new ArrayList<>();
1890
 
1891
        for (AuthUser authUser : authUsers) {
1892
 
1893
            List<VisitRequest> authVisitRequests = visitRequestMap.get(authUser.getId());
1894
 
1895
            if (authVisitRequests != null) {
1896
                UserVisitModel userVisitModel = new UserVisitModel();
1897
                userVisitModel.setAuthUser(authUser.getFullName());
1898
                List<VisitDescriptionModel> visitDescriptions = new ArrayList<>();
1899
 
1900
                for (VisitRequest authVisitRequest : authVisitRequests) {
1901
                    VisitDescriptionModel visitDescriptionModel = new VisitDescriptionModel();
1902
                    visitDescriptionModel.setVisitId(authVisitRequest.getVisitId());
1903
 
1904
                    if (authVisitRequest.getVisitType().equals("lead")) {
1905
                        Lead lead = leadMap.get(authVisitRequest.getVisitId());
1906
 
1907
                        visitDescriptionModel.setVisitName(lead.getFirstName());
1908
                        visitDescriptionModel.setCity(lead.getCity());
1909
                        visitDescriptionModel.setState(lead.getState());
1910
                        visitDescriptionModel.setScheduleTime(lead.getScheduledTimestamp());
1911
                        visitDescriptionModel.setRemarks(lead.getLeadActivity().getRemark());
1912
 
1913
                    } else {
1914
                        FranchiseeVisit franchiseeVisit = franchiseeVisitsMap.get(authVisitRequest.getVisitId());
1915
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(franchiseeVisit.getFofoId());
1916
 
1917
                        visitDescriptionModel.setVisitName(franchiseeVisit.getPartnerName());
1918
                        visitDescriptionModel.setCity(customRetailer.getAddress().getCity());
1919
                        visitDescriptionModel.setState(customRetailer.getAddress().getState());
1920
                        visitDescriptionModel.setScheduleTime(franchiseeVisit.getFranchiseeActivity().getSchelduleTimestamp());
1921
                        visitDescriptionModel.setRemarks(franchiseeVisit.getAgenda());
1922
 
1923
                    }
1924
 
1925
                    if (authVisitRequest.getActionedBy() != 0) {
1926
                        AuthUser au = authRepository.selectById(authVisitRequest.getActionedBy());
1927
 
1928
                        visitDescriptionModel.setActionBy(au.getFullName());
1929
                    }
1930
                    visitDescriptionModel.setStatus(authVisitRequest.getStatus());
1931
                    visitDescriptionModel.setVisitType(authVisitRequest.getVisitType());
1932
                    visitDescriptions.add(visitDescriptionModel);
1933
                }
1934
 
1935
                userVisitModel.setVisitDescriptions(visitDescriptions);
1936
                userVisits.add(userVisitModel);
1937
            }
1938
 
1939
        }
1940
 
1941
        model.addAttribute("userVisits", userVisits);
1942
 
1943
        return "visit-request-plan";
1944
    }
25979 tejbeer 1945
}