Subversion Repositories SmartDukaan

Rev

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

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