Subversion Repositories SmartDukaan

Rev

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