Subversion Repositories SmartDukaan

Rev

Rev 36787 | Rev 36792 | 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.
928
        if (createLeadActivityRequest.getStatus() != LeadStatus.notInterested) {
929
            LeadLiveLocation approvedGeo = leadLiveLocationRepository.selectApprovedByLeadId(createLeadActivityRequest.getId());
930
            if (approvedGeo == null) {
931
                throw new ProfitMandiBusinessException("Lead", "", "Live geo-location for this lead has not been approved yet. Please approve the geo-location before editing.");
932
            }
36761 ranu 933
        }
934
 
34113 tejus.loha 935
        if (leadDetail == null && !createLeadActivityRequest.getStatus().equals(LeadStatus.notInterested) && leadAuthUser.isActive()) {
29426 manish 936
 
32464 tejbeer 937
            throw new ProfitMandiBusinessException("LeadDetail", "", "Please fill lead detail");
938
        }
29445 manish 939
 
32464 tejbeer 940
        LeadActivity leadActivity = new LeadActivity();
941
        leadActivity.setLeadId(createLeadActivityRequest.getId());
942
        leadActivity.setRemark(createLeadActivityRequest.getRemark());
29598 tejbeer 943
 
32464 tejbeer 944
        LOGGER.info("createRefferalRequest" + createLeadActivityRequest);
29598 tejbeer 945
 
32464 tejbeer 946
        if (createLeadActivityRequest.getStatus() == LeadStatus.followUp) {
947
            leadActivity.setSchelduleTimestamp(createLeadActivityRequest.getScheldule());
948
            leadActivity.setCommunicationType(createLeadActivityRequest.getCommunicationType());
36741 ranu 949
            // A beat-day pick wires the lead onto that beat's route regardless of
950
            // communication type (TELEPHONIC = call on that beat day).
951
            String beatSelection = createLeadActivityRequest.getBeatSelection();
952
            if (beatSelection != null && beatSelection.contains("|")) {
36644 ranu 953
                int beatId = 0;
954
                LocalDate beatDate = createLeadActivityRequest.getScheldule() != null
955
                        ? createLeadActivityRequest.getScheldule().toLocalDate() : LocalDate.now();
956
                String beatName = "Beat";
36642 ranu 957
 
36741 ranu 958
                String[] parts = beatSelection.split("\\|", 3);
959
                beatDate = LocalDate.parse(parts[0]);
960
                beatName = parts.length > 1 ? parts[1] : "Beat";
961
                if (parts.length > 2) {
962
                    try {
963
                        beatId = Integer.parseInt(parts[2]);
964
                    } catch (NumberFormatException ignored) {
36642 ranu 965
                    }
966
                }
967
 
36644 ranu 968
                // Find optimal insert position using lead geolocation
969
                int insertAt = 0;
970
                LeadLiveLocation leadGeo = leadLiveLocationRepository.selectApprovedByLeadId(createLeadActivityRequest.getId());
971
                List<BeatRoute> existingStops = beatId > 0
972
                        ? beatRouteRepository.selectByBeatId(beatId).stream()
973
                        .sorted(Comparator.comparingInt(BeatRoute::getSequenceOrder))
974
                        .collect(Collectors.toList())
975
                        : new ArrayList<>();
36642 ranu 976
 
36644 ranu 977
                insertAt = existingStops.size(); // default: append at end
978
 
979
                if (!existingStops.isEmpty() && leadGeo != null) {
980
                    // Use nearest neighbor to find optimal position
981
                    // (simplified — append at end for now, full geocoding done in LeadGeoLocationController)
982
                    insertAt = existingStops.size();
983
                }
984
 
985
                // Shift existing stops
986
                for (BeatRoute stop : existingStops) {
987
                    if (stop.getSequenceOrder() >= insertAt) {
988
                        stop.setSequenceOrder(stop.getSequenceOrder() + 1);
989
                    }
990
                }
991
 
992
                // Create lead_route entry (directly APPROVED)
993
                LeadRoute leadRoute = new LeadRoute();
994
                leadRoute.setBeatId(beatId);
995
                leadRoute.setLeadId(createLeadActivityRequest.getId());
996
                leadRoute.setScheduleDate(beatDate);
997
                leadRoute.setSequenceOrder(insertAt);
998
                leadRoute.setStatus("APPROVED");
999
                leadRoute.setRequestedBy(authUser.getId());
1000
                leadRoute.setApprovedBy(authUser.getId());
1001
                leadRoute.setApprovedTimestamp(LocalDateTime.now());
1002
                leadRoute.setCreatedTimestamp(LocalDateTime.now());
1003
                leadRoute.setUpdatedTimestamp(LocalDateTime.now());
1004
 
1005
                // Set nearest store
1006
                if (!existingStops.isEmpty()) {
1007
                    leadRoute.setNearestStoreId(existingStops.get(Math.min(insertAt, existingStops.size() - 1)).getFofoId());
1008
                }
1009
                leadRouteRepository.persist(leadRoute);
1010
 
1011
                // Create visit request
1012
                visitRequestRepository.createVisitRequest(
1013
                        createLeadActivityRequest.getId(), "lead",
1014
                        createLeadActivityRequest.getAssignTo(),
1015
                        beatDate.atTime(10, 0));
1016
 
36642 ranu 1017
                // Log activity
36644 ranu 1018
                LeadActivity visitActivity = new LeadActivity();
1019
                visitActivity.setLeadId(createLeadActivityRequest.getId());
1020
                visitActivity.setRemark("Lead scheduled for visit on beat: " + beatName
1021
                        + " (" + beatDate + ") at stop #" + (insertAt + 1));
1022
                visitActivity.setAuthId(authUser.getId());
1023
                visitActivity.setCreatedTimestamp(LocalDateTime.now());
1024
                leadActivityRepository.persist(visitActivity);
32464 tejbeer 1025
            }
1026
        } else {
1027
            leadActivity.setSchelduleTimestamp(null);
1028
        }
1029
        leadActivity.setCreatedTimestamp(LocalDateTime.now());
1030
        leadActivity.setAuthId(authUser.getId());
1031
        leadActivityRepository.persist(leadActivity);
1032
        lead.setAssignTo(createLeadActivityRequest.getAssignTo());
1033
        lead.setStatus(createLeadActivityRequest.getStatus());
35548 aman 1034
        lead.setState(createLeadActivityRequest.getState());
1035
        lead.setCity(createLeadActivityRequest.getCity());
35769 amit 1036
        if (createLeadActivityRequest.getSource() != null && !createLeadActivityRequest.getSource().isEmpty()) {
1037
            lead.setSource(createLeadActivityRequest.getSource());
1038
        }
36741 ranu 1039
        if (Boolean.TRUE.equals(createLeadActivityRequest.getColorCheck())) {
32471 tejbeer 1040
            lead.setColor("Green");
1041
        } else {
1042
            lead.setColor("Yellow");
1043
        }
32464 tejbeer 1044
        lead.setNotinterestedReason(createLeadActivityRequest.getReason());
1045
        lead.setUpdatedTimestamp(LocalDateTime.now());
29426 manish 1046
 
32464 tejbeer 1047
        int authId = 0;
34127 tejus.loha 1048
        authId = lead.getAssignTo();
1049
        Map<Integer, LeadActivity> leadActivityMap = new HashMap<>();
29426 manish 1050
 
34127 tejus.loha 1051
        List<LeadActivity> leadActivitys = leadActivityRepository.selectBYLeadId(lead.getId());
29426 manish 1052
 
34127 tejus.loha 1053
        if (!leadActivitys.isEmpty()) {
1054
            leadActivityMap.put(lead.getId(), leadActivitys.get(0));
1055
        }
29426 manish 1056
 
34127 tejus.loha 1057
        Map<Integer, AuthUser> authIdAndAuthUserMap = new HashMap<>();
1058
        AuthUser AuthUser = authRepository.selectById(authId);
29426 manish 1059
 
34127 tejus.loha 1060
        authIdAndAuthUserMap.put(AuthUser.getId(), AuthUser);
29426 manish 1061
 
34127 tejus.loha 1062
        model.addAttribute("leadActivityMap", leadActivityMap);
1063
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
29426 manish 1064
 
30185 tejbeer 1065
 
33223 amit.gupta 1066
        model.addAttribute("lead", lead);
30185 tejbeer 1067
 
32464 tejbeer 1068
        return "edit-lead";
30185 tejbeer 1069
 
32464 tejbeer 1070
    }
31370 tejbeer 1071
 
32464 tejbeer 1072
    @RequestMapping(value = "/downloadIvoryLead", method = RequestMethod.GET)
1073
    public ResponseEntity<?> downloadDelayDayTemplate(HttpServletRequest request) throws Exception {
1074
        List<String> stateNames = stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList());
31370 tejbeer 1075
 
32464 tejbeer 1076
        List<List<?>> rows = new ArrayList<>();
31496 tejbeer 1077
 
32464 tejbeer 1078
        List<LeadSource> lss = LeadSource.enumValues;
31370 tejbeer 1079
 
32464 tejbeer 1080
        for (LeadSource ls : lss) {
1081
            rows.add(Arrays.asList("-", "-", "-", "-", "-", "-", "-", ls));
31478 tejbeer 1082
 
32464 tejbeer 1083
        }
1084
        for (String stateName : stateNames) {
1085
            rows.add(Arrays.asList("-", "-", "-", "-", stateName, "-", "-", "-"));
31478 tejbeer 1086
 
32464 tejbeer 1087
        }
31478 tejbeer 1088
 
32464 tejbeer 1089
        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 1090
 
32464 tejbeer 1091
        final HttpHeaders headers = new HttpHeaders();
1092
        headers.set("Content-Type", "text/csv");
1093
        headers.set("Content-disposition", "inline; filename=leads.format.csv");
1094
        headers.setContentLength(baos.toByteArray().length);
31478 tejbeer 1095
 
32464 tejbeer 1096
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1097
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1098
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
31478 tejbeer 1099
 
32464 tejbeer 1100
    }
31478 tejbeer 1101
 
32464 tejbeer 1102
    @RequestMapping(value = "/csvFileAndSetLead", method = RequestMethod.POST)
1103
    public String readCsvFileAndSetLead(HttpServletRequest request, Model model, HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
31478 tejbeer 1104
 
32464 tejbeer 1105
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1106
        String email = loginDetails.getEmailId();
31478 tejbeer 1107
 
32464 tejbeer 1108
        AuthUser createdBy = authRepository.selectByEmailOrMobile(email);
31478 tejbeer 1109
 
32464 tejbeer 1110
        LOGGER.info("file" + file.toString());
31478 tejbeer 1111
 
32464 tejbeer 1112
        String fileName = file.getName();
31370 tejbeer 1113
 
32464 tejbeer 1114
        String fileNames = file.getOriginalFilename();
31370 tejbeer 1115
 
32464 tejbeer 1116
        LOGGER.info("fileName" + fileName);
1117
        LOGGER.info("fileNames" + fileNames);
31370 tejbeer 1118
 
32464 tejbeer 1119
        List<CSVRecord> records = FileUtil.readFile(file);
31370 tejbeer 1120
 
32464 tejbeer 1121
        for (CSVRecord record : records) {
31370 tejbeer 1122
 
32464 tejbeer 1123
            Lead lead = new Lead();
1124
            lead.setFirstName(record.get(0));
1125
            lead.setLastName(record.get(1));
1126
            lead.setAddress(record.get(2));
1127
            lead.setCity(record.get(3));
1128
            lead.setState(record.get(4));
1129
            lead.setLeadMobile(record.get(5));
1130
            LOGGER.info("record" + record.get(6));
31370 tejbeer 1131
 
32464 tejbeer 1132
            AuthUser assignTo = authRepository.selectByEmailOrMobile(record.get(6));
31370 tejbeer 1133
 
32464 tejbeer 1134
            if (assignTo == null) {
1135
                throw new ProfitMandiBusinessException("Assign To ", record.get(6), "email id not exist");
1136
            }
31370 tejbeer 1137
 
32464 tejbeer 1138
            lead.setAssignTo(assignTo.getId());
1139
            lead.setSource(record.get(7));
31370 tejbeer 1140
 
32464 tejbeer 1141
            lead.setCreatedTimestamp(LocalDateTime.now());
31370 tejbeer 1142
 
32464 tejbeer 1143
            lead.setUpdatedTimestamp(LocalDateTime.now());
1144
            lead.setStatus(LeadStatus.pending);
1145
            lead.setColor("yellow");
1146
            // change
1147
            lead.setCreatedBy(createdBy.getFullName());
1148
            lead.setAuthId(createdBy.getId());
31370 tejbeer 1149
 
32464 tejbeer 1150
            leadRepository.persist(lead);
31370 tejbeer 1151
 
32464 tejbeer 1152
            LeadActivity leadActivity = new LeadActivity();
1153
            leadActivity.setLeadId(lead.getId());
1154
            leadActivity.setRemark("New Lead");
1155
            leadActivity.setSchelduleTimestamp(null);
31370 tejbeer 1156
 
32464 tejbeer 1157
            leadActivity.setCreatedTimestamp(LocalDateTime.now());
1158
            leadActivityRepository.persist(leadActivity);
1159
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31370 tejbeer 1160
 
32464 tejbeer 1161
        }
31370 tejbeer 1162
 
32464 tejbeer 1163
        model.addAttribute("responseSTG", mvcResponseSender.createResponseString(true));
31370 tejbeer 1164
 
32464 tejbeer 1165
        return "response";
31370 tejbeer 1166
 
32464 tejbeer 1167
    }
31370 tejbeer 1168
 
32464 tejbeer 1169
    @RequestMapping(value = "/teamCommitment", method = RequestMethod.GET)
1170
    public String teamCommitments(HttpServletRequest request, Model model) throws Exception {
31370 tejbeer 1171
 
32464 tejbeer 1172
        return "team-commitment";
31370 tejbeer 1173
 
32464 tejbeer 1174
    }
31370 tejbeer 1175
 
32464 tejbeer 1176
    @RequestMapping(value = "/leadDetail", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
1177
    public String leadDetail(HttpServletRequest request, @RequestBody LeadDetailModel leadDetailModel, Model model) throws Exception {
31370 tejbeer 1178
 
32464 tejbeer 1179
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1180
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
31370 tejbeer 1181
 
32471 tejbeer 1182
        leadRepository.persistLeadDetail(leadDetailModel, authUser);
32464 tejbeer 1183
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31370 tejbeer 1184
 
32464 tejbeer 1185
        return "response";
31370 tejbeer 1186
 
32464 tejbeer 1187
    }
31370 tejbeer 1188
 
32464 tejbeer 1189
    @RequestMapping(value = "/getLeadDetail", method = RequestMethod.GET)
1190
    public String getLeadDetail(HttpServletRequest request, Model model) throws Exception {
1191
        List<Integer> followUpleadIds = leadRepository.selectAllByStatus(LeadStatus.followUp).stream().map(x -> x.getId()).collect(Collectors.toList());
1192
        List<LeadDetail> leadDetails = leadDetailRepository.selectByLeadIds(followUpleadIds);
31370 tejbeer 1193
 
32464 tejbeer 1194
        List<DBObject> mobileBrands = mongoClient.getAllBrandsToDisplay(3);
31370 tejbeer 1195
 
32464 tejbeer 1196
        List<String> brands = mobileBrands.stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
31370 tejbeer 1197
 
32464 tejbeer 1198
        model.addAttribute("brands", brands);
1199
        if (!leadDetails.isEmpty()) {
31370 tejbeer 1200
 
32464 tejbeer 1201
            List<Integer> detailsIds = leadDetails.stream().map(x -> x.getId()).collect(Collectors.toList());
31370 tejbeer 1202
 
32464 tejbeer 1203
            List<Integer> leadIds = leadDetails.stream().map(x -> x.getLeadId()).collect(Collectors.toList());
31370 tejbeer 1204
 
32464 tejbeer 1205
            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 1206
 
32464 tejbeer 1207
            Map<Integer, Optional<LeadActivity>> leadActivityMap = leadActivityRepository.selectAllByleadIds(leadIds).stream().collect(Collectors.groupingBy(x -> x.getLeadId(), Collectors.maxBy(Comparator.comparing(LeadActivity::getId))));
31370 tejbeer 1208
 
32464 tejbeer 1209
            model.addAttribute("leadActivityMap", leadActivityMap);
30185 tejbeer 1210
 
32464 tejbeer 1211
            List<LeadBrand> leadBrands = leadBrandRepository.selectByLeadDetailId(detailsIds);
30185 tejbeer 1212
 
32464 tejbeer 1213
            LOGGER.info("leadBrands {}" + leadBrands);
30185 tejbeer 1214
 
32464 tejbeer 1215
            Map<Integer, Map<String, Integer>> leadDetailBrandValue = new HashMap<>();
30416 tejbeer 1216
 
32464 tejbeer 1217
            Map<Integer, List<LeadBrand>> leadDetail = leadBrands.stream().collect(Collectors.groupingBy(x -> x.getLeadDetailId(), Collectors.toList()));
30416 tejbeer 1218
 
32464 tejbeer 1219
            for (Entry<Integer, List<LeadBrand>> leadDetailEntry : leadDetail.entrySet()) {
30416 tejbeer 1220
 
32464 tejbeer 1221
                Map<String, Integer> brandValue = new HashMap<>();
30416 tejbeer 1222
 
32464 tejbeer 1223
                for (LeadBrand leadBrand : leadDetailEntry.getValue()) {
1224
                    brandValue.put(leadBrand.getBrand(), leadBrand.getValue());
30416 tejbeer 1225
 
32464 tejbeer 1226
                }
1227
                leadDetailBrandValue.put(leadDetailEntry.getKey(), brandValue);
1228
            }
30416 tejbeer 1229
 
32464 tejbeer 1230
            LOGGER.info("leadDetailBrandValue {}" + leadDetailBrandValue);
30416 tejbeer 1231
 
32464 tejbeer 1232
            model.addAttribute("leadDetailBrandValue", leadDetailBrandValue);
30416 tejbeer 1233
 
32464 tejbeer 1234
            model.addAttribute("leadMap", leadMap);
1235
        }
30434 tejbeer 1236
 
32464 tejbeer 1237
        model.addAttribute("leadDetails", leadDetails);
30434 tejbeer 1238
 
32464 tejbeer 1239
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1240
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
30434 tejbeer 1241
 
32464 tejbeer 1242
        return "lead-detail";
30458 tejbeer 1243
 
32464 tejbeer 1244
    }
30458 tejbeer 1245
 
32464 tejbeer 1246
    @RequestMapping(value = "/getLeadDetailByLeadId", method = RequestMethod.GET)
35548 aman 1247
    public ResponseEntity<?> getLeadDetailByLeadId(@RequestParam int leadId) {
30458 tejbeer 1248
 
35548 aman 1249
        Lead lead = leadRepository.selectById(leadId);
32464 tejbeer 1250
        LeadDetail leadDetail = leadDetailRepository.selectByLeadId(leadId);
35548 aman 1251
        Map<String, Object> response = new HashMap<>();
1252
        response.put("city", lead.getCity());
1253
        response.put("state", lead.getState());
1254
        if (leadDetail != null) {
1255
            response.put("outletName", leadDetail.getOutletName());
1256
            response.put("counterSize", leadDetail.getCounterSize());
1257
        }
1258
        return responseSender.ok(response);
1259
    }
30458 tejbeer 1260
 
35548 aman 1261
    @PostMapping("/upload-assign-id")
1262
    public ResponseEntity<?> uploadAssignIdCsv(
1263
            @RequestParam("file") MultipartFile file)
1264
            throws Exception {
1265
 
1266
        try (Reader reader = new InputStreamReader(file.getInputStream());
1267
             CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT)) {
1268
 
1269
            List<CSVRecord> records = parser.getRecords();
1270
 
1271
            if (records.size() < 2) {
1272
                throw new ProfitMandiBusinessException(
1273
                        "Uploaded File", "", "No records Found");
1274
            }
1275
 
1276
            records.remove(0);
1277
 
1278
            for (CSVRecord record : records) {
1279
 
1280
                int leadId = Integer.parseInt(record.get(0));
1281
                int assignId = Integer.parseInt(record.get(1));
1282
 
1283
                Lead lead = leadRepository.selectById(leadId);
1284
 
1285
                if (lead == null) {
1286
                    LOGGER.warn("Lead not found for id {}", leadId);
1287
                    continue;
1288
                }
1289
 
1290
                lead.setAssignTo(assignId);
1291
            }
1292
        }
1293
 
1294
        return responseSender.ok("CSV processed successfully");
32464 tejbeer 1295
    }
30434 tejbeer 1296
 
35548 aman 1297
 
1298
 
32464 tejbeer 1299
    @RequestMapping(value = "/getTeamCommitment", method = RequestMethod.GET)
1300
    public String getTeamCommitments(HttpServletRequest request, @RequestParam LocalDateTime date, Model model) throws Exception {
30781 tejbeer 1301
 
32464 tejbeer 1302
        List<TeamCommitmentModel> commitments = partnerCollectionPlanRepository.selectTeamCommitmentByDate(date.toLocalDate());
30416 tejbeer 1303
 
32464 tejbeer 1304
        model.addAttribute("commitments", commitments);
1305
        return "team-commitment-table";
30416 tejbeer 1306
 
32464 tejbeer 1307
    }
30416 tejbeer 1308
 
33917 ranu 1309
    @Autowired
1310
    RbmTargetService rbmTargetService;
1311
 
1312
    @RequestMapping(value = "/rbmTodayArr", method = RequestMethod.GET)
1313
    public String getRbmTodayArr(HttpServletRequest request, Model model, @RequestParam(value = "startDate", required = false) LocalDate startDate) throws Exception {
1314
        List<RbmArrViewModel> rbmArrViewModels;
35223 ranu 1315
        DecimalFormat decimalFormat = new DecimalFormat("#"); // No decimal places
33917 ranu 1316
        if (startDate != null) {
1317
            rbmArrViewModels = rbmTargetService.getRbmTodayArr(startDate);
1318
        } else {
1319
            rbmArrViewModels = rbmTargetService.getRbmTodayArr();
1320
        }
1321
 
35223 ranu 1322
        Set<AuthUser> authUsers = new HashSet<>();
1323
        Set<AuthUser> rbmAuthUsers = csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM, EscalationType.L1).stream().filter(x -> x.isActive()).collect(Collectors.toSet());
1324
        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 1325
 
35223 ranu 1326
        authUsers.addAll(rbmAuthUsers);
1327
        authUsers.addAll(salesAuthUsers);
33953 ranu 1328
 
35223 ranu 1329
        double totalAchieved = rbmArrViewModels.stream().mapToDouble(RbmArrViewModel::getTotalAchievedTarget).sum();
1330
        double totalTargetSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayTarget).sum();
1331
 
1332
        double totalHidSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayHidTarget).sum();
1333
        double totalHidAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedHidTarget).sum();
1334
 
1335
        double totalFastSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayFastMovingTarget).sum();
1336
        double totalFastAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedFastMovingTarget).sum();
1337
 
1338
        double totalSlowSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodaySlowMovingTarget).sum();
1339
        double totalSlowAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedSlowMovingTarget).sum();
1340
 
1341
        double totalRunningSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayRunningTarget).sum();
1342
        double totalRunningAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedRunningTarget).sum();
1343
 
1344
        double totalOtherSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayOtherMovingTarget).sum();
1345
        double totalOtherAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedOtherMovingTarget).sum();
1346
 
34055 ranu 1347
        List<Sold15daysOldAgingModel> sold15daysOldAgingModels = rbmTargetService.getAgingSale(LocalDate.now(), LocalDate.now().plusDays(1));
1348
        List<Our15DaysOldAgingStock> our15DaysOldAgingStocks = rbmTargetService.our15DaysAgingStock();
1349
 
35223 ranu 1350
        long totalSoldSlow = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getSlowmovingBilled).sum();
1351
        long totalSoldRun = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getRunningBilled).sum();
1352
        long totalSoldFast = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getFastmovingBilled).sum();
1353
        long totalSoldHid = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getHidBilled).sum();
1354
        long totalSoldOther = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getOthersBilled).sum();
1355
        long totalSoldAging = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getTotalBilled).sum();
34103 ranu 1356
 
35223 ranu 1357
 
34103 ranu 1358
//        first week count of rbm partner billing
1359
        LocalDate firstOfCurrentMonth = LocalDate.now().withDayOfMonth(1);
1360
        LocalDate seventhOfCurrentMonth = LocalDate.now().withDayOfMonth(7);
1361
 
1362
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsFirstWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(firstOfCurrentMonth, seventhOfCurrentMonth);
1363
 
1364
        Map<String, Long> rbmBilledCountMapFirstWeek = rbmBilledFofoIdsModelsFirstWeek.stream()
1365
                .filter(x -> x.getStatus().equals("Billed"))
1366
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1367
 
34119 ranu 1368
        long totalFirstWeekCount = rbmBilledCountMapFirstWeek.values().stream()
1369
                .mapToLong(Long::longValue)
1370
                .sum();
1371
 
34114 ranu 1372
        Map<String, Long> rbmTargetedFofoIdCountMap = rbmBilledFofoIdsModelsFirstWeek.stream()
1373
                .collect(Collectors.groupingBy(
1374
                        RbmBilledFofoIdsModel::getRbmName, // Group by RBM Name
1375
                        Collectors.counting() // Count all fofoId entries for each RBM
1376
                ));
34103 ranu 1377
 
34119 ranu 1378
        long totalTargetedCount = rbmTargetedFofoIdCountMap.values().stream().mapToLong(x -> x.longValue()).sum();
34114 ranu 1379
 
1380
 
34103 ranu 1381
//        second week count of rbm partner billing
1382
 
1383
        LocalDate eightOfCurrentMonth = LocalDate.now().withDayOfMonth(8);
1384
        LocalDate fifteenOfCurrentMonth = LocalDate.now().withDayOfMonth(15);
1385
 
1386
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsSecondWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(eightOfCurrentMonth, fifteenOfCurrentMonth);
1387
 
1388
        Map<String, Long> rbmBilledCountMapSecondWeek = rbmBilledFofoIdsModelsSecondWeek.stream()
1389
                .filter(x -> x.getStatus().equals("Billed"))
1390
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1391
 
34119 ranu 1392
        long totalSecondWeekCount = rbmBilledCountMapSecondWeek.values().stream().mapToLong(Long::longValue).sum();
34103 ranu 1393
 
1394
//      third week count of rbm partner billing
1395
 
1396
        LocalDate sixteenOfCurrentMonth = LocalDate.now().withDayOfMonth(16);
34144 ranu 1397
        LocalDate twentySecondOfCurrentMonth = LocalDate.now().withDayOfMonth(22);
34103 ranu 1398
 
34144 ranu 1399
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsThirdWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(sixteenOfCurrentMonth, twentySecondOfCurrentMonth);
34103 ranu 1400
 
1401
        Map<String, Long> rbmBilledCountMapThirdWeek = rbmBilledFofoIdsModelsThirdWeek.stream()
1402
                .filter(x -> x.getStatus().equals("Billed"))
1403
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1404
 
34119 ranu 1405
        long totalThirdWeekCount = rbmBilledCountMapThirdWeek.values().stream().mapToLong(Long::longValue).sum();
34103 ranu 1406
 
34119 ranu 1407
 
34103 ranu 1408
        //      fourth week count of rbm partner billing
1409
 
34144 ranu 1410
        LocalDate twentyThirdOfCurrentMonth = LocalDate.now().withDayOfMonth(23);
34103 ranu 1411
        LocalDate lastDayOfCurrentMonth = LocalDate.now().withDayOfMonth(LocalDate.now().lengthOfMonth());
1412
 
34144 ranu 1413
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsFourthWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(twentyThirdOfCurrentMonth, lastDayOfCurrentMonth);
34103 ranu 1414
 
1415
        Map<String, Long> rbmBilledCountMapFourthWeek = rbmBilledFofoIdsModelsFourthWeek.stream()
1416
                .filter(x -> x.getStatus().equals("Billed"))
1417
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1418
 
34119 ranu 1419
        long totalFourthWeekCount = rbmBilledCountMapFourthWeek.values().stream().mapToLong(x -> x.longValue()).sum();
34103 ranu 1420
 
34119 ranu 1421
 
34103 ranu 1422
//      mtd rbm partner billing
1423
 
1424
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsMtd = rbmTargetService.getDateWiseBilledFofoIdByRbm(firstOfCurrentMonth, LocalDate.now());
1425
 
1426
        Map<String, Long> rbmBilledCountMapMtd = rbmBilledFofoIdsModelsMtd.stream()
1427
                .filter(x -> x.getStatus().equals("Billed"))
1428
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1429
 
34119 ranu 1430
        long totalMtdCount = rbmBilledCountMapMtd.values().stream().mapToLong(Long::longValue).sum();
1431
 
1432
        Map<String, Long> zeroBilledCountMap = rbmTargetedFofoIdCountMap.entrySet().stream()
1433
                .collect(Collectors.toMap(
1434
                        Map.Entry::getKey,
1435
                        entry -> entry.getValue() - rbmBilledCountMapMtd.getOrDefault(entry.getKey(), 0L)
1436
                ));
1437
 
1438
        long totalZeroBilledCount = zeroBilledCountMap.values().stream().mapToLong(Long::longValue).sum();
1439
 
36101 ranu 1440
        //        rbmRating by franchisee visits (weekly: Monday to Sunday)
35223 ranu 1441
 
1442
        Map<Integer, String> rbmIdToNameMap = authUsers.stream()
1443
                .collect(Collectors.toMap(AuthUser::getId, AuthUser::getFullName));
1444
 
36101 ranu 1445
        // Calculate current week: Monday (start) to Sunday (end)
1446
        LocalDate today = LocalDate.now();
1447
        LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
1448
        LocalDate sunday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
1449
        LocalDateTime weekStart = monday.atStartOfDay();
1450
        LocalDateTime weekEnd = sunday.atTime(LocalTime.MAX);
1451
 
35223 ranu 1452
        Map<String, RbMRatingModel> rbmNameToRatingMap = rbmRatingRepository
36101 ranu 1453
                .findAverageRatingByRbmIdAndDateRange(new ArrayList<>(rbmIdToNameMap.keySet()), weekStart, weekEnd)
1454
                .stream().collect(Collectors.toMap(
35223 ranu 1455
                        x -> rbmIdToNameMap.get(x.getRbmId()),
1456
                        x -> x
1457
                ));
1458
 
1459
 
33917 ranu 1460
        LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);
1461
        model.addAttribute("rbmArrViewModels", rbmArrViewModels);
35223 ranu 1462
        model.addAttribute("rbmNameToRatingMap", rbmNameToRatingMap);
1463
 
1464
        model.addAttribute("totalTargetSum", decimalFormat.format(totalTargetSum));
1465
        model.addAttribute("totalAchieved", decimalFormat.format(totalAchieved));
1466
 
1467
        model.addAttribute("totalHidSum", decimalFormat.format(totalHidSum));
1468
        model.addAttribute("totalHidAchievedSum", decimalFormat.format(totalHidAchievedSum));
1469
 
1470
        model.addAttribute("totalFastSum", decimalFormat.format(totalFastSum));
1471
        model.addAttribute("totalFastAchievedSum", decimalFormat.format(totalFastAchievedSum));
1472
 
1473
        model.addAttribute("totalSlowSum", decimalFormat.format(totalSlowSum));
1474
        model.addAttribute("totalSlowAchievedSum", decimalFormat.format(totalSlowAchievedSum));
1475
 
1476
        model.addAttribute("totalRunningSum", decimalFormat.format(totalRunningSum));
1477
        model.addAttribute("totalRunningAchievedSum", decimalFormat.format(totalRunningAchievedSum));
1478
 
1479
        model.addAttribute("totalOtherSum", decimalFormat.format(totalOtherSum));
1480
        model.addAttribute("totalOtherAchievedSum", decimalFormat.format(totalOtherAchievedSum));
1481
 
1482
        model.addAttribute("our15DaysOldAgingStocks", our15DaysOldAgingStocks);
34055 ranu 1483
        model.addAttribute("sold15daysOldAgingModels", sold15daysOldAgingModels);
35223 ranu 1484
        model.addAttribute("totalSoldSlow", totalSoldSlow);
1485
        model.addAttribute("totalSoldRun", totalSoldRun);
1486
        model.addAttribute("totalSoldFast", totalSoldFast);
1487
        model.addAttribute("totalSoldHid", totalSoldHid);
1488
        model.addAttribute("totalSoldOther", totalSoldOther);
1489
        model.addAttribute("totalSoldAging", totalSoldAging);
33917 ranu 1490
 
34114 ranu 1491
        model.addAttribute("rbmTargetedFofoIdCountMap", rbmTargetedFofoIdCountMap);
34103 ranu 1492
        model.addAttribute("rbmBilledCountMapFirstWeek", rbmBilledCountMapFirstWeek);
1493
        model.addAttribute("rbmBilledCountMapSecondWeek", rbmBilledCountMapSecondWeek);
1494
        model.addAttribute("rbmBilledCountMapThirdWeek", rbmBilledCountMapThirdWeek);
1495
        model.addAttribute("rbmBilledCountMapFourthWeek", rbmBilledCountMapFourthWeek);
1496
        model.addAttribute("rbmBilledCountMapMtd", rbmBilledCountMapMtd);
34119 ranu 1497
        model.addAttribute("zeroBilledCountMap", zeroBilledCountMap);
1498
        model.addAttribute("totalFirstWeekCount", totalFirstWeekCount);
1499
        model.addAttribute("totalTargetedCount", totalTargetedCount);
1500
        model.addAttribute("totalSecondWeekCount", totalSecondWeekCount);
1501
        model.addAttribute("totalThirdWeekCount", totalThirdWeekCount);
1502
        model.addAttribute("totalFourthWeekCount", totalFourthWeekCount);
1503
        model.addAttribute("totalMtdCount", totalMtdCount);
1504
        model.addAttribute("totalZeroBilledCount", totalZeroBilledCount);
34103 ranu 1505
 
33917 ranu 1506
        return "rbm-today-arr";
1507
    }
1508
 
1509
 
32464 tejbeer 1510
    @RequestMapping(value = "/partnerHealth", method = RequestMethod.GET)
1511
    public String partnerHealth(HttpServletRequest request, @RequestParam(name = "email", required = false) String email, Model model) throws Exception {
1512
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30416 tejbeer 1513
 
32464 tejbeer 1514
        if (StringUtils.isEmpty(email)) {
1515
            email = loginDetails.getEmailId();
1516
        } else {
1517
            AuthUser selectedUser = authRepository.selectByEmailOrMobile(email);
30416 tejbeer 1518
 
32464 tejbeer 1519
            model.addAttribute("selectedUser", selectedUser);
30445 tejbeer 1520
 
32464 tejbeer 1521
        }
30445 tejbeer 1522
 
32464 tejbeer 1523
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
30445 tejbeer 1524
 
32464 tejbeer 1525
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
1526
        List<Integer> fofoIds = new ArrayList<>(storeGuyMap.get(email));
1527
        LocalDateTime startDate = LocalDate.now().atStartOfDay();
1528
        if (fofoIds != null && fofoIds.size() > 0) {
1529
            List<Integer> fofoIdList = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> !x.isInternal()).map(x -> x.getId()).collect(Collectors.toList());
30420 tejbeer 1530
 
32464 tejbeer 1531
            Map<Integer, PartnerCollectionPlanModel> foundCollectionMap = partnerCollectionService.getCollectionMap(fofoIdList, startDate);
30416 tejbeer 1532
 
32464 tejbeer 1533
            List<Integer> remarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(fofoIdList);
30416 tejbeer 1534
 
32464 tejbeer 1535
            LOGGER.info("remarkIds {}", remarkIds);
30416 tejbeer 1536
 
32464 tejbeer 1537
            long todayOverallCall = 0;
1538
            if (!remarkIds.isEmpty()) {
30416 tejbeer 1539
 
32464 tejbeer 1540
                if (authUser.getEmailId().equals(email)) {
30441 tejbeer 1541
 
32464 tejbeer 1542
                    todayOverallCall = partnerCollectionRemarkRepository.selectByIds(remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
1543
                } else {
30441 tejbeer 1544
 
32464 tejbeer 1545
                    todayOverallCall = partnerCollectionRemarkRepository.selectByAuthIdAndIds(authRepository.selectByEmailOrMobile(email).getId(), remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
30416 tejbeer 1546
 
32464 tejbeer 1547
                }
30416 tejbeer 1548
 
32464 tejbeer 1549
            }
1550
            ChartLeadModel cm = new ChartLeadModel();
30416 tejbeer 1551
 
32464 tejbeer 1552
            if (!foundCollectionMap.isEmpty()) {
1553
                cm = this.getCollectionCount(foundCollectionMap.values().stream().collect(Collectors.toList()));
30416 tejbeer 1554
 
32464 tejbeer 1555
            }
1556
            model.addAttribute("chartPartnerHealth", gson.toJson(cm));
1557
            Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = new HashMap<>();
30416 tejbeer 1558
 
32464 tejbeer 1559
            List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository.selectAll(fofoIdList, startDate.toLocalDate().minusDays(1));
1560
            if (!partnerDailyInvestments.isEmpty()) {
1561
                partnerDailyInvestmentMap = partnerDailyInvestments.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
1562
            }
30416 tejbeer 1563
 
32464 tejbeer 1564
            Map<LocalDate, Map<Integer, PartnerCollectionPlanModel>> pcpmMap = new TreeMap<>();
1565
            for (int i = 0; i <= 6; i++) {
30416 tejbeer 1566
 
32464 tejbeer 1567
                Map<Integer, PartnerCollectionPlanModel> collectionMap = partnerCollectionService.getCollectionMap(fofoIdList, startDate.minusDays(i));
30416 tejbeer 1568
 
32464 tejbeer 1569
                pcpmMap.put(startDate.minusDays(i).toLocalDate(), collectionMap);
1570
            }
30416 tejbeer 1571
 
32464 tejbeer 1572
            Map<Integer, PartnerCollectionPlanModel> todayPcpmMap = pcpmMap.get(startDate.toLocalDate());
1573
            model.addAttribute("todayPcpmMap", todayPcpmMap);
30416 tejbeer 1574
 
32464 tejbeer 1575
            TotalTargetColectionModel totalTargetCollection = partnerCollectionService.getTotalTargetCollection(todayPcpmMap, startDate);
1576
            model.addAttribute("totalPartnerTargetCollection", totalTargetCollection.getTotalTarget());
30416 tejbeer 1577
 
32464 tejbeer 1578
            model.addAttribute("totalPartnerAchievement", totalTargetCollection.getTotalAchievement());
30416 tejbeer 1579
 
32464 tejbeer 1580
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1581
            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));
1582
            List<Integer> allReportees = authService.getAllReportees(authUser.getId());
30416 tejbeer 1583
 
32464 tejbeer 1584
            List<Integer> salesPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
1585
            List<Integer> rbmPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
30416 tejbeer 1586
 
32464 tejbeer 1587
            salesPositionsAuthIds.addAll(rbmPositionsAuthIds);
30416 tejbeer 1588
 
32464 tejbeer 1589
            Set<Integer> empHierarchy = allReportees.stream().filter(x -> salesPositionsAuthIds.contains(x)).collect(Collectors.toSet());
34027 ranu 1590
            List<AuthUser> authUsers = new ArrayList<>();
1591
            if (!empHierarchy.isEmpty()) {
35395 amit 1592
                authUsers = authRepository.selectByIds(new ArrayList<>(empHierarchy));
34027 ranu 1593
            }
30416 tejbeer 1594
 
1595
 
32464 tejbeer 1596
            Map<Integer, AuthUser> authUserMap = authRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
30416 tejbeer 1597
 
32464 tejbeer 1598
            LOGGER.info("todayPcpmMap {}", todayPcpmMap);
30416 tejbeer 1599
 
32464 tejbeer 1600
            model.addAttribute("authUsers", authUsers);
1601
            model.addAttribute("authUserMap", authUserMap);
1602
            model.addAttribute("partnerCollectionPlanMap", pcpmMap);
1603
            model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
1604
            model.addAttribute("customRetailers", customRetailers);
1605
            model.addAttribute("rankColorMap", ProfitMandiConstants.Rank_Color_Map);
1606
            model.addAttribute("todayOverallCall", todayOverallCall);
30522 tejbeer 1607
 
32464 tejbeer 1608
        }
1609
        return "partner-health";
30522 tejbeer 1610
 
32464 tejbeer 1611
    }
30522 tejbeer 1612
 
32464 tejbeer 1613
    public ChartLeadModel getCollectionCount(List<PartnerCollectionPlanModel> pcpm) throws ProfitMandiBusinessException {
30522 tejbeer 1614
 
32464 tejbeer 1615
        Map<Integer, Long> rankCount = pcpm.stream().collect(Collectors.groupingBy(x -> x.getRank(), Collectors.mapping(PartnerCollectionPlanModel::getRank, Collectors.counting())));
30522 tejbeer 1616
 
32464 tejbeer 1617
        ChartLeadModel cm = new ChartLeadModel();
30522 tejbeer 1618
 
32464 tejbeer 1619
        List<String> labels = new ArrayList<>();
1620
        labels.add("Plan for Today");
1621
        labels.add("Carry Forward");
1622
        labels.add("Untouched");
1623
        labels.add("Plan for Future");
1624
        labels.add("Normal");
30522 tejbeer 1625
 
32464 tejbeer 1626
        List<String> backgroundColor = new ArrayList<>();
1627
        List<Long> values = new ArrayList<>();
30522 tejbeer 1628
 
32464 tejbeer 1629
        for (String label : labels) {
30522 tejbeer 1630
 
32464 tejbeer 1631
            if (label.equals("Plan for Today")) {
1632
                backgroundColor.add("#007bff");
1633
                values.add(rankCount.get(1));
1634
            }
1635
            if (label.equals("Carry Forward")) {
1636
                backgroundColor.add("#ffc107");
1637
                values.add(rankCount.get(2));
1638
            }
1639
            if (label.equals("Untouched")) {
1640
                backgroundColor.add("#dc3545");
1641
                values.add(rankCount.get(3));
1642
            }
1643
            if (label.equals("Plan for Future")) {
1644
                backgroundColor.add("#6c757d");
1645
                values.add(rankCount.get(4));
1646
            }
1647
            if (label.equals("Normal")) {
1648
                backgroundColor.add("White");
1649
                values.add(rankCount.get(5));
1650
            }
30522 tejbeer 1651
 
32464 tejbeer 1652
        }
30522 tejbeer 1653
 
32464 tejbeer 1654
        LOGGER.info("backgroundColor" + backgroundColor);
1655
        LOGGER.info("labelsChartLead" + labels);
1656
        LeadStatusData data = new LeadStatusData();
1657
        data.setData(values);
1658
        data.setBackgroundColor(backgroundColor);
1659
        data.setLabel("DataSet 1");
30522 tejbeer 1660
 
32464 tejbeer 1661
        PieLables label = new PieLables();
1662
        label.setFontColor("black");
1663
        label.setFontSize(15);
30522 tejbeer 1664
 
32464 tejbeer 1665
        Legend legend = new Legend();
1666
        legend.setLabels(label);
1667
        legend.setPosition("left");
30522 tejbeer 1668
 
32464 tejbeer 1669
        List<LeadStatusData> dataList = new ArrayList<>();
1670
        dataList.add(data);
30522 tejbeer 1671
 
32464 tejbeer 1672
        DataLeadModel datasets = new DataLeadModel();
1673
        datasets.setDatasets(dataList);
1674
        datasets.setLabels(labels);
30522 tejbeer 1675
 
32464 tejbeer 1676
        OptionModel om = new OptionModel();
1677
        om.setLegend(legend);
30522 tejbeer 1678
 
32464 tejbeer 1679
        cm.setType("pie");
1680
        cm.setData(datasets);
1681
        cm.setOptions(om);
30522 tejbeer 1682
 
32464 tejbeer 1683
        return cm;
1684
    }
30522 tejbeer 1685
 
32464 tejbeer 1686
    @RequestMapping(value = "/franchiseVisit", method = RequestMethod.GET)
1687
    public String franchiseVisit(HttpServletRequest request, @RequestParam(name = "email", required = false) String email, Model model) throws Exception {
1688
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30522 tejbeer 1689
 
32464 tejbeer 1690
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
30522 tejbeer 1691
 
32464 tejbeer 1692
        List<Integer> salesPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
1693
        List<Integer> rbmPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
30522 tejbeer 1694
 
32464 tejbeer 1695
        salesPositionsAuthIds.addAll(rbmPositionsAuthIds);
30522 tejbeer 1696
 
32464 tejbeer 1697
        List<Integer> allReportees = authService.getAllReportees(authUser.getId());
30522 tejbeer 1698
 
32464 tejbeer 1699
        Set<Integer> empHierarchy = allReportees.stream().filter(x -> salesPositionsAuthIds.contains(x)).collect(Collectors.toSet());
30522 tejbeer 1700
 
35395 amit 1701
        List<AuthUser> authUsers = authRepository.selectByIds(new ArrayList<>(empHierarchy));
30522 tejbeer 1702
 
32464 tejbeer 1703
        Map<Integer, String> monthValueMap = new HashMap<>();
1704
        for (int i = 0; i <= 5; i++) {
1705
            LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1706
            monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
1707
        }
30522 tejbeer 1708
 
32464 tejbeer 1709
        model.addAttribute("authUsers", authUsers);
1710
        model.addAttribute("monthValueMap", monthValueMap);
30522 tejbeer 1711
 
32464 tejbeer 1712
        return "franchise-visit";
30522 tejbeer 1713
 
32464 tejbeer 1714
    }
30522 tejbeer 1715
 
32464 tejbeer 1716
    @RequestMapping(value = "/getFranchiseVisit", method = RequestMethod.GET)
1717
    public String getFranchiseVisit(HttpServletRequest request, @RequestParam(name = "authId", required = false) int authId, int yearMonth, Model model) throws Exception {
30522 tejbeer 1718
 
32464 tejbeer 1719
        LocalDateTime startDate = LocalDate.now().minusMonths(8).withDayOfMonth(1).atStartOfDay();
1720
        LocalDateTime endDate = startDate.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
30522 tejbeer 1721
 
32464 tejbeer 1722
        DateRangeModel drm = DateRangeModel.of(startDate, endDate);
30522 tejbeer 1723
 
32464 tejbeer 1724
        List<FranchiseeVisit> visits = franchiseeVisitRepository.selectByAuthUserAndDateRange(drm, authId);
30522 tejbeer 1725
 
32464 tejbeer 1726
        if (!visits.isEmpty()) {
30522 tejbeer 1727
 
32464 tejbeer 1728
            Map<Integer, List<FranchiseeVisit>> franchiseeVisitMap = visits.stream().collect(Collectors.groupingBy(x -> x.getScheduleTimestamp().getDayOfMonth()));
30522 tejbeer 1729
 
32464 tejbeer 1730
            model.addAttribute("franchiseeVisitMap", franchiseeVisitMap);
30522 tejbeer 1731
 
32464 tejbeer 1732
        }
30771 amit.gupta 1733
 
32464 tejbeer 1734
        model.addAttribute("visits", visits);
1735
        model.addAttribute("monthLength", startDate.toLocalDate().lengthOfMonth());
30771 amit.gupta 1736
 
32464 tejbeer 1737
        // Calender
30771 amit.gupta 1738
 
32464 tejbeer 1739
        int Year = startDate.getYear(); // year
1740
        int startDayOfMonth = 5;
1741
        int spaces = startDayOfMonth;
30771 amit.gupta 1742
 
32464 tejbeer 1743
        int month = startDate.getMonthValue();
30771 amit.gupta 1744
 
32464 tejbeer 1745
        int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
30771 amit.gupta 1746
 
32464 tejbeer 1747
        LOGGER.info("visits {} ", visits);
30771 amit.gupta 1748
 
32464 tejbeer 1749
        if ((((Year % 4 == 0) && (Year % 100 != 0)) || (Year % 400 == 0)) && month == 2) {
1750
            days[month] = 29;
1751
        }
30771 amit.gupta 1752
 
32464 tejbeer 1753
        spaces = (days[month - 1] + spaces) % 7;
30771 amit.gupta 1754
 
32464 tejbeer 1755
        model.addAttribute("month", month);
1756
        model.addAttribute("spaces", spaces);
1757
        model.addAttribute("days", days);
30771 amit.gupta 1758
 
32464 tejbeer 1759
        return "franchise-visit-container";
30771 amit.gupta 1760
 
32464 tejbeer 1761
    }
31249 tejbeer 1762
 
32464 tejbeer 1763
    @RequestMapping(value = "/getFranchiseeActivity", method = RequestMethod.GET)
1764
    public String getFranchiseeActivity(HttpServletRequest request, int visitId, Model model) throws Exception {
31249 tejbeer 1765
 
32464 tejbeer 1766
        List<FranchiseeActivity> franchiseeActivities = franchiseeActivityRepository.selectByFranchiseeVisitId(visitId);
31249 tejbeer 1767
 
32464 tejbeer 1768
        FranchiseeVisit franchiseeVisit = franchiseeVisitRepository.selectById(visitId);
31249 tejbeer 1769
 
32464 tejbeer 1770
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1771
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
31249 tejbeer 1772
 
32464 tejbeer 1773
        model.addAttribute("franchiseeVisit", franchiseeVisit);
1774
        model.addAttribute("franchiseeActivity", franchiseeActivities.get(0));
31249 tejbeer 1775
 
32464 tejbeer 1776
        return "franchie-visit-detail";
31249 tejbeer 1777
 
32464 tejbeer 1778
    }
31249 tejbeer 1779
 
32464 tejbeer 1780
    @RequestMapping(value = "/indent/today_target", method = RequestMethod.GET)
1781
    public String todayTarget(HttpServletRequest request, Model model) throws Exception {
1782
        List<RBMPerformanceSummaryModel> summaryModels = new ArrayList<>();
1783
        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());
1784
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
1785
        List<TeamCommitmentModel> teamCommitmentModels = partnerCollectionPlanRepository.selectTeamCommitmentByDate(LocalDate.now());
1786
        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())));
1787
        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())));
1788
        LocalDateTime startDate = LocalDate.now().atStartOfDay();
1789
        for (int rbmAuthId : rbmPositionsAuthIds) {
1790
            RBMPerformanceSummaryModel rbmPerformanceSummaryModel = new RBMPerformanceSummaryModel();
1791
            rbmPerformanceSummaryModel.setAuthId(rbmAuthId);
1792
            AuthUser authUser = authRepository.selectById(rbmAuthId);
1793
            rbmPerformanceSummaryModel.setAuthName(authUser.getFullName());
33844 ranu 1794
            List<Integer> fofoIds = new ArrayList<>(storeGuyMap.get(authUser.getEmailId()));
31249 tejbeer 1795
 
32464 tejbeer 1796
            if (fofoIds.size() > 0) {
1797
                fofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> !x.isInternal()).map(x -> x.getId()).collect(Collectors.toList());
31249 tejbeer 1798
 
32464 tejbeer 1799
                /*
1800
                 * Map<Integer, PartnerCollectionPlanModel> foundCollectionMap =
1801
                 * partnerCollectionService .getCollectionMap(fofoIds, startDate);
1802
                 */
31249 tejbeer 1803
 
33844 ranu 1804
                List<Integer> remarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(fofoIds);
1805
 
32464 tejbeer 1806
                LOGGER.info("remarkIds {}", remarkIds);
31249 tejbeer 1807
 
32464 tejbeer 1808
                long todayOverallCall = 0;
1809
                if (!remarkIds.isEmpty()) {
1810
                    todayOverallCall = partnerCollectionRemarkRepository.selectByIds(remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
31249 tejbeer 1811
 
32464 tejbeer 1812
                }
31249 tejbeer 1813
 
32464 tejbeer 1814
                Map<Integer, PartnerCollectionPlanModel> collectionMap = partnerCollectionService.getCollectionMap(fofoIds, startDate);
31249 tejbeer 1815
 
32464 tejbeer 1816
                ChartLeadModel cm = this.getCollectionCount(collectionMap.values().stream().collect(Collectors.toList()));
31249 tejbeer 1817
 
32464 tejbeer 1818
                long collectionTarget = collectionMap.values().stream().filter(x -> x.getTargetPlan() != null).collect(Collectors.summingLong(x -> x.getTargetPlan()));
1819
                long collection = collectionMap.values().stream().filter(
1820
                        x -> x.getTargetPlan() != null && x.getTargetPlan() != 0 && x.getAchievementPlan() != null).collect(Collectors.summingLong(x -> x.getAchievementPlan()));
1821
                rbmPerformanceSummaryModel.setChartLeadModel(cm);
1822
                rbmPerformanceSummaryModel.setPartnersCommunicated(todayOverallCall);
1823
                rbmPerformanceSummaryModel.setCollectionTarget(collectionTarget);
1824
                rbmPerformanceSummaryModel.setCollection(collection);
1825
                rbmPerformanceSummaryModel.setSecondaryTarget(rbmSecondaryTargetMap.get(rbmAuthId) == null ? 0 : rbmSecondaryTargetMap.get(rbmAuthId).floatValue());
1826
                rbmPerformanceSummaryModel.setSecondary(
1827
                        rbmSecondaryMap.get(rbmAuthId) == null ? 0 : rbmSecondaryMap.get(rbmAuthId).floatValue());
1828
                summaryModels.add(rbmPerformanceSummaryModel);
1829
                // cm.getData().getDatasets().get(0).getData().;
1830
                // cm.getData().getDatasets().get(0).getBackgroundColor();
1831
                // cm.getData().getLabels()
31249 tejbeer 1832
 
32464 tejbeer 1833
            }
1834
        }
1835
        model.addAttribute("summaryModels", summaryModels);
1836
        return "today_target";
1837
    }
31249 tejbeer 1838
 
32464 tejbeer 1839
    @RequestMapping(value = "/visitPlan", method = RequestMethod.GET)
1840
    public String visitPlan(HttpServletRequest request, Model model) throws Exception {
31249 tejbeer 1841
 
32464 tejbeer 1842
        return "visit-request-plan";
1843
    }
31249 tejbeer 1844
 
32464 tejbeer 1845
    @RequestMapping(value = "/visit/getVisitPlan", method = RequestMethod.GET)
1846
    public String getVisitPlan(HttpServletRequest request, @RequestParam LocalDate date, Model model) throws Exception {
1847
        List<VisitRequest> visitRequests = visitRequestRepository.selectByAuthIdAndDate(date);
31249 tejbeer 1848
 
32464 tejbeer 1849
        List<Integer> leadIds = visitRequests.stream().filter(x -> x.getVisitType().equals("lead")).map(x -> x.getVisitId()).collect(Collectors.toList());
1850
        Map<Integer, Lead> leadMap = new HashMap<>();
1851
        if (!leadIds.isEmpty()) {
1852
            List<Lead> leads = leadRepository.selectAllByIds(leadIds);
31249 tejbeer 1853
 
32464 tejbeer 1854
            for (Lead lead : leads) {
1855
                List<LeadActivity> leadActivities = leadActivityRepository.selectBYLeadId(lead.getId());
1856
                lead.setScheduledTimestamp(leadActivities.get(0).getSchelduleTimestamp());
1857
                lead.setLeadActivity(leadActivities.get(0));
31249 tejbeer 1858
 
32464 tejbeer 1859
                leadMap.put(lead.getId(), lead);
1860
            }
31249 tejbeer 1861
 
32464 tejbeer 1862
        }
1863
        List<Integer> franchiseeIds = visitRequests.stream().filter(x -> x.getVisitType().equals("franchiseeVisit")).map(x -> x.getVisitId()).collect(Collectors.toList());
1864
        Map<Integer, FranchiseeVisit> franchiseeVisitsMap = new HashMap<>();
1865
        if (!franchiseeIds.isEmpty()) {
1866
            List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectAllByIds(franchiseeIds);
1867
            LOGGER.info("franchiseeVisits {}", franchiseeVisits);
31249 tejbeer 1868
 
32464 tejbeer 1869
            for (FranchiseeVisit franchiseeVisit : franchiseeVisits) {
1870
                List<FranchiseeActivity> franchiseeActivities = franchiseeActivityRepository.selectByFranchiseeVisitId(franchiseeVisit.getId());
1871
                LOGGER.info("franchiseeActivities {}", franchiseeActivities);
1872
 
1873
                franchiseeVisit.setScheduleTimestamp(franchiseeActivities.get(0).getSchelduleTimestamp());
1874
                franchiseeVisit.setFranchiseeActivity(franchiseeActivities.get(0));
1875
 
1876
                franchiseeVisitsMap.put(franchiseeVisit.getId(), franchiseeVisit);
1877
            }
1878
 
1879
        }
1880
 
1881
        Map<Integer, List<VisitRequest>> visitRequestMap = visitRequests.stream().collect(Collectors.groupingBy(x -> x.getCreatedBy()));
1882
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
1883
        List<UserVisitModel> userVisits = new ArrayList<>();
1884
 
1885
        for (AuthUser authUser : authUsers) {
1886
 
1887
            List<VisitRequest> authVisitRequests = visitRequestMap.get(authUser.getId());
1888
 
1889
            if (authVisitRequests != null) {
1890
                UserVisitModel userVisitModel = new UserVisitModel();
1891
                userVisitModel.setAuthUser(authUser.getFullName());
1892
                List<VisitDescriptionModel> visitDescriptions = new ArrayList<>();
1893
 
1894
                for (VisitRequest authVisitRequest : authVisitRequests) {
1895
                    VisitDescriptionModel visitDescriptionModel = new VisitDescriptionModel();
1896
                    visitDescriptionModel.setVisitId(authVisitRequest.getVisitId());
1897
 
1898
                    if (authVisitRequest.getVisitType().equals("lead")) {
1899
                        Lead lead = leadMap.get(authVisitRequest.getVisitId());
1900
 
1901
                        visitDescriptionModel.setVisitName(lead.getFirstName());
1902
                        visitDescriptionModel.setCity(lead.getCity());
1903
                        visitDescriptionModel.setState(lead.getState());
1904
                        visitDescriptionModel.setScheduleTime(lead.getScheduledTimestamp());
1905
                        visitDescriptionModel.setRemarks(lead.getLeadActivity().getRemark());
1906
 
1907
                    } else {
1908
                        FranchiseeVisit franchiseeVisit = franchiseeVisitsMap.get(authVisitRequest.getVisitId());
1909
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(franchiseeVisit.getFofoId());
1910
 
1911
                        visitDescriptionModel.setVisitName(franchiseeVisit.getPartnerName());
1912
                        visitDescriptionModel.setCity(customRetailer.getAddress().getCity());
1913
                        visitDescriptionModel.setState(customRetailer.getAddress().getState());
1914
                        visitDescriptionModel.setScheduleTime(franchiseeVisit.getFranchiseeActivity().getSchelduleTimestamp());
1915
                        visitDescriptionModel.setRemarks(franchiseeVisit.getAgenda());
1916
 
1917
                    }
1918
 
1919
                    if (authVisitRequest.getActionedBy() != 0) {
1920
                        AuthUser au = authRepository.selectById(authVisitRequest.getActionedBy());
1921
 
1922
                        visitDescriptionModel.setActionBy(au.getFullName());
1923
                    }
1924
                    visitDescriptionModel.setStatus(authVisitRequest.getStatus());
1925
                    visitDescriptionModel.setVisitType(authVisitRequest.getVisitType());
1926
                    visitDescriptions.add(visitDescriptionModel);
1927
                }
1928
 
1929
                userVisitModel.setVisitDescriptions(visitDescriptions);
1930
                userVisits.add(userVisitModel);
1931
            }
1932
 
1933
        }
1934
 
1935
        model.addAttribute("userVisits", userVisits);
1936
 
1937
        return "visit-request-plan";
1938
    }
25979 tejbeer 1939
}