Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
25979 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
29266 manish 3
import com.google.gson.Gson;
31370 tejbeer 4
import com.mongodb.DBObject;
25988 tejbeer 5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
33843 ranu 6
import com.spice.profitmandi.common.model.*;
29426 manish 7
import com.spice.profitmandi.common.util.FileUtil;
34627 aman.kumar 8
import com.spice.profitmandi.common.util.FormattingUtils;
31370 tejbeer 9
import com.spice.profitmandi.common.web.util.ResponseSender;
25979 tejbeer 10
import com.spice.profitmandi.dao.entity.auth.AuthUser;
32464 tejbeer 11
import com.spice.profitmandi.dao.entity.catalog.BrandCatalog;
30416 tejbeer 12
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
33843 ranu 13
import com.spice.profitmandi.dao.entity.user.*;
30773 amit.gupta 14
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
31249 tejbeer 15
import com.spice.profitmandi.dao.enumuration.dtr.CommunicationType;
29598 tejbeer 16
import com.spice.profitmandi.dao.enumuration.dtr.LeadSource;
25979 tejbeer 17
import com.spice.profitmandi.dao.enumuration.dtr.LeadStatus;
33843 ranu 18
import com.spice.profitmandi.dao.model.*;
25979 tejbeer 19
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
30185 tejbeer 20
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionPlanRepository;
30434 tejbeer 21
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
30416 tejbeer 22
import com.spice.profitmandi.dao.repository.cs.CsService;
29266 manish 23
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
33843 ranu 24
import com.spice.profitmandi.dao.repository.dtr.*;
30416 tejbeer 25
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
35223 ranu 26
import com.spice.profitmandi.dao.repository.fofo.RbmRatingRepository;
25979 tejbeer 27
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
30445 tejbeer 28
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
29266 manish 29
import com.spice.profitmandi.service.AuthService;
30416 tejbeer 30
import com.spice.profitmandi.service.PartnerCollectionService;
33917 ranu 31
import com.spice.profitmandi.service.RbmTargetService;
32464 tejbeer 32
import com.spice.profitmandi.service.catalog.BrandsService;
34650 aman.kumar 33
import com.spice.profitmandi.service.order.OrderService;
30416 tejbeer 34
import com.spice.profitmandi.service.user.RetailerService;
25979 tejbeer 35
import com.spice.profitmandi.web.model.LoginDetails;
36
import com.spice.profitmandi.web.util.CookiesProcessor;
37
import com.spice.profitmandi.web.util.MVCResponseSender;
35548 aman 38
import org.apache.commons.csv.CSVFormat;
39
import org.apache.commons.csv.CSVParser;
33843 ranu 40
import org.apache.commons.csv.CSVRecord;
34707 aman.kumar 41
import org.apache.commons.io.output.ByteArrayOutputStream;
33843 ranu 42
import org.apache.logging.log4j.LogManager;
43
import org.apache.logging.log4j.Logger;
44
import org.springframework.beans.factory.annotation.Autowired;
45
import org.springframework.core.io.InputStreamResource;
46
import org.springframework.http.HttpHeaders;
47
import org.springframework.http.HttpStatus;
48
import org.springframework.http.MediaType;
49
import org.springframework.http.ResponseEntity;
50
import org.springframework.stereotype.Controller;
35507 ranu 51
import org.springframework.transaction.annotation.Transactional;
33843 ranu 52
import org.springframework.ui.Model;
53
import org.springframework.util.StringUtils;
54
import org.springframework.web.bind.annotation.*;
55
import org.springframework.web.multipart.MultipartFile;
25979 tejbeer 56
 
33843 ranu 57
import javax.servlet.http.HttpServletRequest;
58
import javax.servlet.http.HttpServletResponse;
59
import java.io.ByteArrayInputStream;
60
import java.io.InputStream;
35548 aman 61
import java.io.InputStreamReader;
62
import java.io.Reader;
35223 ranu 63
import java.text.DecimalFormat;
36101 ranu 64
import java.time.DayOfWeek;
33843 ranu 65
import java.time.LocalDate;
66
import java.time.LocalDateTime;
36101 ranu 67
import java.time.LocalTime;
33843 ranu 68
import java.time.format.DateTimeFormatter;
36101 ranu 69
import java.time.temporal.TemporalAdjusters;
33843 ranu 70
import java.util.*;
71
import java.util.Map.Entry;
72
import java.util.stream.Collectors;
73
 
25979 tejbeer 74
@Controller
35458 amit 75
@Transactional(rollbackFor = Throwable.class)
25979 tejbeer 76
public class LeadController {
32464 tejbeer 77
    private static final Logger LOGGER = LogManager.getLogger(LeadController.class);
25979 tejbeer 78
 
32464 tejbeer 79
    @Autowired
80
    private LeadRepository leadRepository;
25979 tejbeer 81
 
32464 tejbeer 82
    @Autowired
83
    private LeadActivityRepository leadActivityRepository;
25979 tejbeer 84
 
32464 tejbeer 85
    @Autowired
36787 ranu 86
    private com.spice.profitmandi.dao.repository.dtr.LeadVisitRequestRepository leadVisitRequestRepository;
87
 
88
    @Autowired
32464 tejbeer 89
    private StateRepository stateRepository;
25979 tejbeer 90
 
32464 tejbeer 91
    @Autowired
92
    private AuthService authService;
29266 manish 93
 
32464 tejbeer 94
    @Autowired
95
    private AuthRepository authRepository;
25979 tejbeer 96
 
32464 tejbeer 97
    @Autowired
98
    private Gson gson;
29266 manish 99
 
32464 tejbeer 100
    @Autowired
101
    private CookiesProcessor cookiesProcessor;
29426 manish 102
 
32464 tejbeer 103
    @Autowired
104
    PositionRepository positionRepository;
25979 tejbeer 105
 
32464 tejbeer 106
    @Autowired
107
    private MVCResponseSender mvcResponseSender;
25979 tejbeer 108
 
32464 tejbeer 109
    @Autowired
110
    private PartnerCollectionPlanRepository partnerCollectionPlanRepository;
30185 tejbeer 111
 
32464 tejbeer 112
    @Autowired
113
    private CsService csService;
30416 tejbeer 114
 
32464 tejbeer 115
    @Autowired
116
    private FofoStoreRepository fofoStoreRepository;
30416 tejbeer 117
 
32464 tejbeer 118
    @Autowired
119
    private PartnerCollectionService partnerCollectionService;
30416 tejbeer 120
 
32464 tejbeer 121
    @Autowired
122
    private RetailerService retailerService;
30416 tejbeer 123
 
32464 tejbeer 124
    @Autowired
125
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30434 tejbeer 126
 
32464 tejbeer 127
    @Autowired
128
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
30445 tejbeer 129
 
32464 tejbeer 130
    @Autowired
131
    private UserWalletRepository userWalletRepository;
30445 tejbeer 132
 
32464 tejbeer 133
    @Autowired
134
    private FranchiseeVisitRepository franchiseeVisitRepository;
30522 tejbeer 135
 
32464 tejbeer 136
    @Autowired
137
    private FranchiseeActivityRepository franchiseeActivityRepository;
30522 tejbeer 138
 
32464 tejbeer 139
    @Autowired
140
    private VisitRequestRepository visitRequestRepository;
31249 tejbeer 141
 
32464 tejbeer 142
    @Autowired
143
    private LeadBrandRepository leadBrandRepository;
31370 tejbeer 144
 
32464 tejbeer 145
    @Autowired
146
    private LeadDetailRepository leadDetailRepository;
31370 tejbeer 147
 
32464 tejbeer 148
    @Autowired
36642 ranu 149
    private LeadLiveLocationRepository leadLiveLocationRepository;
150
 
151
    @Autowired
36644 ranu 152
    private BeatRouteRepository beatRouteRepository;
36642 ranu 153
 
154
    @Autowired
36644 ranu 155
    private LeadRouteRepository leadRouteRepository;
156
 
157
    @Autowired
158
    private BeatRepository beatRepository;
159
 
160
    @Autowired
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);
34963 aman 538
            leadStatus.add(LeadStatus.followUp);
34707 aman.kumar 539
        }
540
        if (color.contains("All")) {
541
            color.add("yellow");
542
            color.add("green");
543
        }
34650 aman.kumar 544
 
545
        Map<Integer, List<LeadActivity>> leadActivityMap = new HashMap<>();
546
        boolean authPositon = positionRepository.hasCategory(authUser.getId(), ProfitMandiConstants.TICKET_CATEGORY_SALES);
547
        List<Integer> authUserIds = null;
548
        List<Lead> leadFollowUp = new ArrayList<>();
549
 
550
        if (authPositon) {
551
            authUserIds = authService.getAllReportees(authUser.getId());
552
            authUserIds.add(authUser.getId());
35769 amit 553
            if (startDateTime == null) {
34650 aman.kumar 554
                if (!leadStatus.contains(LeadStatus.followUp)) {
555
                    leads = leadRepository.selectAllByColorStatusAndUpdatedTimestampAndAuthIds(leadStatus, authUserIds, color, LocalDateTime.now().minusMonths(1));
556
                }
557
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
558
                    leadFollowUp = leadRepository.selectByAssignAuthIdsAndStatus(authUserIds, LeadStatus.followUp);
559
                    leads.addAll(leadFollowUp);
560
                }
561
            } else {
36982 aman 562
                // Date range selected: return ALL selected statuses (including follow-up) created within [start, end].
563
                // Follow-up is now date-bounded via this same query instead of pulling every follow-up ever,
564
                // which previously made a date-range download ignore the dates and drop non-follow-up statuses.
565
                leads = leadRepository.selectAllByColorStatusAndBetweenCreatedDateAndAuthIds(leadStatus, authUserIds, color, startDateTime, endDateTime);
34650 aman.kumar 566
            }
567
        } else {
35769 amit 568
            if (startDateTime == null) {
34650 aman.kumar 569
                if (!leadStatus.contains(LeadStatus.followUp)) {
570
                    leads = leadRepository.selectAllByColorStatusAndUpdatedTimestamp(leadStatus, color, LocalDateTime.now().minusMonths(1));
571
                }
572
                if (leadStatus.contains(LeadStatus.followUp) || leadStatus.contains(LeadStatus.All)) {
573
                    leadFollowUp = leadRepository.selectAllByStatus(LeadStatus.followUp);
574
                    leads.addAll(leadFollowUp);
575
                }
576
            } else {
36982 aman 577
                // Date range selected: return ALL selected statuses (including follow-up) created within [start, end].
578
                leads = leadRepository.selectAllByColorStatusAndBetweenCreatedDate(leadStatus, color, startDateTime, endDateTime);
34650 aman.kumar 579
            }
34707 aman.kumar 580
        }
34650 aman.kumar 581
 
34707 aman.kumar 582
        // Build activity map and auth map (SAME AS VIEW ENDPOINT)
34650 aman.kumar 583
        if (!leads.isEmpty()) {
34707 aman.kumar 584
            List<Integer> leadIds = leads.stream().map(Lead::getId).collect(Collectors.toList());
585
            leadActivityMap = leadActivityRepository.selectAllByleadIds(leadIds).stream()
586
                    .collect(Collectors.groupingBy(LeadActivity::getLeadId));
34650 aman.kumar 587
        }
34707 aman.kumar 588
        List<Integer> authIds = leads.stream().map(Lead::getAssignTo).collect(Collectors.toList());
35395 amit 589
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream()
34707 aman.kumar 590
                .collect(Collectors.toMap(AuthUser::getId, x -> x));
591
 
592
        // Build CSV rows (USE DIRECT LEAD PROPERTIES - NO ACTIVITY FALLBACK)
34650 aman.kumar 593
        List<List<?>> rows = new ArrayList<>();
594
        for (Lead lead : leads) {
595
            List<LeadActivity> activities = leadActivityMap.get(lead.getId());
34707 aman.kumar 596
 
597
            // Use FIRST activity's schedule timestamp if exists
34650 aman.kumar 598
            String scheduleTimestamp = (activities != null && !activities.isEmpty())
599
                    ? FormattingUtils.format(activities.get(0).getSchelduleTimestamp())
34707 aman.kumar 600
                    : "";
34650 aman.kumar 601
 
34707 aman.kumar 602
            // DIRECTLY use Lead properties (NO fallback to activity)
603
            Double potential = lead.getPotential();
604
            String outLetName = lead.getOutLetName() != null ? lead.getOutLetName() : "";
34650 aman.kumar 605
 
34707 aman.kumar 606
            // Assignee name (blank if missing)
607
            String assignTo = "";
608
            if (authIdAndAuthUserMap.containsKey(lead.getAssignTo())) {
609
                AuthUser user = authIdAndAuthUserMap.get(lead.getAssignTo());
610
                assignTo = (user.getFirstName() + " " + user.getLastName()).trim();
611
            }
34650 aman.kumar 612
 
34707 aman.kumar 613
            rows.add(Arrays.asList(
35579 aman 614
                    lead.getId(),
34707 aman.kumar 615
                    lead.getSource(),
616
                    lead.getFullName(),
617
                    outLetName,
618
                    potential,
619
                    lead.getLeadMobile(),
620
                    lead.getAddress() != null ? lead.getAddress() : "",
621
                    lead.getCity() != null ? lead.getCity() : "",
622
                    lead.getState() != null ? lead.getState() : "",
623
                    lead.getCreatedBy() != null ? lead.getCreatedBy() : "",
624
                    lead.getStatus().toString(),
625
                    FormattingUtils.format(lead.getCreatedTimestamp()),
626
                    FormattingUtils.format(lead.getUpdatedTimestamp()),
627
                    scheduleTimestamp,
628
                    lead.getClosureTimestamp() != null
629
                            ? FormattingUtils.format(lead.getClosureTimestamp())
630
                            : "",  // Handle null closure
631
                    assignTo,
632
                    lead.getColor() != null ? lead.getColor() : ""
633
            ));
634
        }
34650 aman.kumar 635
 
34707 aman.kumar 636
        // Generate CSV response
637
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
35579 aman 638
                Arrays.asList("Id", "Source", "Partner Name", "Outlet Name", "Potential", "Mobile", "Address", "City", "State",
34707 aman.kumar 639
                        "Created By", "Status", "Created On", "Updated On", "Scheduled Timestamp",
640
                        "Closure Timestamp", "Assign To", "Color"),
641
                rows
642
        );
643
        return orderService.downloadReportInCsv(baos, rows, "LeadDetails_");
34650 aman.kumar 644
    }
645
 
32464 tejbeer 646
    @RequestMapping(value = "/getClosedLead", method = RequestMethod.GET)
647
    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 {
648
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
649
        List<Lead> leads = null;
650
        long size = 0;
651
        leads = leadRepository.selectAllByStatus(status, offset, limit);
652
        size = leadRepository.selectCountByStatus(status);
25988 tejbeer 653
 
32464 tejbeer 654
        if (!leads.isEmpty()) {
655
            List<Integer> authIds = new ArrayList<>();
656
            for (Lead lead : leads) {
657
                authIds.add(lead.getAssignTo());
658
            }
35395 amit 659
            Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25988 tejbeer 660
 
32464 tejbeer 661
            model.addAttribute("leads", leads);
662
            model.addAttribute("start", offset + 1);
663
            model.addAttribute("size", size);
664
            model.addAttribute("searchTerm", searchTerm);
665
            model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
666
            model.addAttribute("url", "/getPaginatedClosedLeads");
25988 tejbeer 667
 
32464 tejbeer 668
            if (leads.size() < limit) {
669
                model.addAttribute("end", offset + leads.size());
670
            } else {
671
                model.addAttribute("end", offset + limit);
672
            }
25988 tejbeer 673
 
32464 tejbeer 674
        } else {
675
            model.addAttribute("lead", leads);
25988 tejbeer 676
 
32464 tejbeer 677
            model.addAttribute("size", size);
678
        }
25988 tejbeer 679
 
32464 tejbeer 680
        model.addAttribute("authUsers", authUsers);
681
        return "lead-close";
682
    }
25988 tejbeer 683
 
32464 tejbeer 684
    @RequestMapping(value = "/getPaginatedClosedLeads", method = RequestMethod.GET)
685
    public String getPaginatedClosedLeads(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws ProfitMandiBusinessException {
686
        List<Lead> leads = null;
687
        leads = leadRepository.selectAllByStatus(status, offset, limit);
25988 tejbeer 688
 
32464 tejbeer 689
        if (!leads.isEmpty()) {
690
            List<Integer> authIds = new ArrayList<>();
691
            for (Lead lead : leads) {
692
                authIds.add(lead.getAssignTo());
693
            }
35395 amit 694
            Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32464 tejbeer 695
            model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
696
            model.addAttribute("leads", leads);
697
            model.addAttribute("url", "/getPaginatedClosedLeads");
25988 tejbeer 698
 
32464 tejbeer 699
        } else {
700
            model.addAttribute("leads", leads);
25988 tejbeer 701
 
32464 tejbeer 702
        }
703
        return "lead-close-paginated";
704
    }
25988 tejbeer 705
 
32464 tejbeer 706
    @RequestMapping(value = "/searchLeads")
707
    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 {
708
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
709
        List<Lead> leads = null;
710
        long size = 0;
711
        if (!(searchTerm.equals(""))) {
712
            leads = leadRepository.selectBySearchTerm(status, searchTerm, offset, limit);
34155 tejus.loha 713
            size = leadRepository.selectCountByStatus(status);
714
            Map<Integer, AuthUser> authIdAndAuthUserMap = new HashMap<>();
715
            List<Integer> authIds = new ArrayList<>();
32464 tejbeer 716
            if (!(leads.size() == 0)) {
717
                for (Lead lead : leads) {
718
                    authIds.add(lead.getAssignTo());
719
                }
35395 amit 720
                authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32464 tejbeer 721
                if (leads.size() < limit) {
722
                    model.addAttribute("end", offset + leads.size());
723
                } else {
724
                    model.addAttribute("end", offset + limit);
725
                }
726
            } else {
34155 tejus.loha 727
                model.addAttribute("end", offset + limit);
32464 tejbeer 728
            }
34155 tejus.loha 729
            model.addAttribute("leads", leads);
730
            model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
731
            model.addAttribute("start", offset + 1);
732
            model.addAttribute("size", size);
733
            model.addAttribute("searchTerm", searchTerm);
32464 tejbeer 734
        } else {
735
            leads = leadRepository.selectAllByStatus(status, offset, limit);
736
            size = leadRepository.selectCountByStatus(status);
25988 tejbeer 737
 
32464 tejbeer 738
            if (!leads.isEmpty()) {
739
                List<Integer> authIds = new ArrayList<>();
740
                for (Lead lead : leads) {
741
                    authIds.add(lead.getAssignTo());
742
                }
35395 amit 743
                Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25988 tejbeer 744
 
32464 tejbeer 745
                model.addAttribute("leads", leads);
746
                model.addAttribute("start", offset + 1);
747
                model.addAttribute("size", size);
748
                model.addAttribute("searchTerm", searchTerm);
749
                model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
25988 tejbeer 750
 
32464 tejbeer 751
                if (leads.size() < limit) {
752
                    model.addAttribute("end", offset + leads.size());
753
                } else {
754
                    model.addAttribute("end", offset + limit);
755
                }
25988 tejbeer 756
 
32464 tejbeer 757
            }
758
        }
25988 tejbeer 759
 
32464 tejbeer 760
        model.addAttribute("authUsers", authUsers);
761
        return "lead-close";
762
    }
25988 tejbeer 763
 
32464 tejbeer 764
    @RequestMapping(value = "/searchLeadPaginated")
765
    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 {
766
        LOGGER.info("In search Item....");
767
        List<Lead> leads = null;
768
        if (!searchTerm.equals("")) {
769
            leads = leadRepository.selectBySearchTerm(status, searchTerm, offset, limit);
770
            if (!(leads.size() == 0)) {
25988 tejbeer 771
 
32464 tejbeer 772
                List<Integer> authIds = new ArrayList<>();
773
                for (Lead lead : leads) {
774
                    authIds.add(lead.getAssignTo());
775
                }
35395 amit 776
                Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32464 tejbeer 777
                model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
778
                model.addAttribute("leads", leads);
779
            }
780
        }
31249 tejbeer 781
 
32464 tejbeer 782
        return "lead-close-paginated";
31249 tejbeer 783
 
32464 tejbeer 784
    }
31249 tejbeer 785
 
32464 tejbeer 786
    @RequestMapping(value = "/getLeadActivity", method = RequestMethod.GET)
787
    public String getLeadActivity(HttpServletRequest request, @RequestParam int leadId, Model model) throws Exception {
788
        List<LeadActivity> leadActivity = leadActivityRepository.selectBYLeadId(leadId);
25979 tejbeer 789
 
32464 tejbeer 790
        LOGGER.info("leadActivity" + leadActivity);
31370 tejbeer 791
 
32464 tejbeer 792
        model.addAttribute("leadActivity", leadActivity);
793
        model.addAttribute("authUserMap", authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x)));
31370 tejbeer 794
 
32464 tejbeer 795
        return "lead_activity_modal";
796
    }
31370 tejbeer 797
 
32464 tejbeer 798
    @RequestMapping(value = "/getLead", method = RequestMethod.GET)
799
    public ResponseEntity<?> getLead(HttpServletRequest request, @RequestParam int leadId) throws Exception {
800
        Lead lead = leadRepository.selectById(leadId);
31370 tejbeer 801
 
32464 tejbeer 802
        LeadDetail leadDetail = leadDetailRepository.selectByLeadId(lead.getId());
803
        if (leadDetail != null) {
804
            lead.setOutLetName(leadDetail.getOutletName());
805
        }
31249 tejbeer 806
 
32464 tejbeer 807
        return responseSender.ok(lead);
25979 tejbeer 808
 
32464 tejbeer 809
    }
31249 tejbeer 810
 
32464 tejbeer 811
    @RequestMapping(value = "/createLead", method = RequestMethod.POST)
812
    public String CreateLead(HttpServletRequest request, @RequestBody CreateRefferalRequest createRefferalRequest, Model model) throws Exception {
813
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
35083 vikas 814
        Lead leadDetails = leadRepository.selectByMobileNumber(createRefferalRequest.getMobile());
815
        LOGGER.info("Lead Details {}", leadDetails);
31249 tejbeer 816
 
35083 vikas 817
        if (leadDetails != null && leadDetails.getStatus() != LeadStatus.notInterested) {
818
            AuthUser authUser1 = authRepository.selectById(leadDetails.getAssignTo());
819
            model.addAttribute("response1", "Lead already exists, created by " + leadDetails.getCreatedBy() +
820
                    " on " + FormattingUtils.format(leadDetails.getCreatedTimestamp()) +
34671 aman.kumar 821
                    ", assigned to " + authUser1.getFullName());
822
            return "response";
34627 aman.kumar 823
 
34671 aman.kumar 824
 
34627 aman.kumar 825
        }
826
 
32464 tejbeer 827
        LOGGER.info("createRefferalRequest" + createRefferalRequest.getSchelduleTimestamp());
828
        Lead lead = new Lead();
829
        lead.setFirstName(createRefferalRequest.getFirstName());
830
        lead.setLastName(createRefferalRequest.getLastName());
831
        lead.setLeadMobile(createRefferalRequest.getMobile());
832
        lead.setState(createRefferalRequest.getState());
833
        lead.setCity(createRefferalRequest.getCity());
834
        lead.setAddress(createRefferalRequest.getAddress());
835
        lead.setCreatedTimestamp(LocalDateTime.now());
836
        lead.setUpdatedTimestamp(LocalDateTime.now());
837
        lead.setStatus(createRefferalRequest.getStatus());
838
        lead.setAssignTo(createRefferalRequest.getAssignTo());
839
        lead.setSource(createRefferalRequest.getSource());
36741 ranu 840
        if (Boolean.TRUE.equals(createRefferalRequest.getColorCheck())) {
32471 tejbeer 841
            lead.setColor("Green");
842
        } else {
843
            lead.setColor("Yellow");
844
        }
32464 tejbeer 845
        // change
846
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
847
        String authUserName = authUser.getFirstName() + " " + authUser.getLastName();
848
        lead.setCreatedBy(authUserName);
849
        lead.setAuthId(authUser.getId());
850
        LOGGER.info("lead --- {}", lead);
851
        leadRepository.persist(lead);
852
        LeadActivity leadActivity = new LeadActivity();
853
        leadActivity.setLeadId(lead.getId());
854
        leadActivity.setRemark(createRefferalRequest.getRemark());
855
        leadActivity.setAuthId(authUser.getId());
32471 tejbeer 856
 
32464 tejbeer 857
        LOGGER.info("createRefferalRequest" + createRefferalRequest.getCommunicationType());
25979 tejbeer 858
 
32464 tejbeer 859
        if (createRefferalRequest.getStatus() == LeadStatus.followUp) {
860
            leadActivity.setSchelduleTimestamp(createRefferalRequest.getSchelduleTimestamp());
861
            leadActivity.setCommunicationType(createRefferalRequest.getCommunicationType());
25979 tejbeer 862
 
32464 tejbeer 863
            if (leadActivity.getCommunicationType().equals(CommunicationType.VISIT)) {
864
                visitRequestRepository.createVisitRequest(lead.getId(), "lead", lead.getAssignTo(), createRefferalRequest.getSchelduleTimestamp());
865
            }
866
        } else {
867
            leadActivity.setSchelduleTimestamp(null);
868
        }
869
        leadActivity.setCreatedTimestamp(LocalDateTime.now());
870
        leadActivityRepository.persist(leadActivity);
34127 tejus.loha 871
        if (!lead.getStatus().equals(LeadStatus.notInterested)) {
872
            LeadDetailModel leadDetail = new LeadDetailModel();
873
            leadDetail.setLeadId(lead.getId());
874
            leadDetail.setOutletName(createRefferalRequest.getOutletName());
875
            leadDetail.setCounterSize(createRefferalRequest.getCounterSize());
25979 tejbeer 876
 
31249 tejbeer 877
 
34127 tejus.loha 878
            leadDetail.setFrontp(createRefferalRequest.getFrontp());
879
            leadDetail.setFrontWithMarket(createRefferalRequest.getFrontWithMarket());
31370 tejbeer 880
 
881
 
34127 tejus.loha 882
            leadDetail.setInternalLongShot(createRefferalRequest.getInternalLongShot());
31370 tejbeer 883
 
34127 tejus.loha 884
            leadDetail.setInternalLeftWall(createRefferalRequest.getInternalLeftWall());
29598 tejbeer 885
 
34127 tejus.loha 886
            leadDetail.setInternalRightWall(createRefferalRequest.getInternalRightWall());
887
            List<LeadBrandModel> brandModels = new ArrayList<LeadBrandModel>();
27605 tejbeer 888
 
34127 tejus.loha 889
            for (LeadBrandModel leadBrandModel : createRefferalRequest.getLeadBrands()) {
25979 tejbeer 890
 
34127 tejus.loha 891
                LeadBrandModel leadBrand = new LeadBrandModel();
892
                leadBrand.setBrand(leadBrandModel.getBrand());
893
                leadBrand.setValue(leadBrandModel.getValue());
29598 tejbeer 894
 
34127 tejus.loha 895
                brandModels.add(leadBrand);
25979 tejbeer 896
 
34127 tejus.loha 897
            }
29598 tejbeer 898
 
34127 tejus.loha 899
            leadDetail.setLeadBrands(brandModels);
29598 tejbeer 900
 
32471 tejbeer 901
            leadRepository.persistLeadDetail(leadDetail, authUser);
902
        }
32464 tejbeer 903
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
29598 tejbeer 904
 
32464 tejbeer 905
        return "response";
29598 tejbeer 906
 
32464 tejbeer 907
    }
29476 manish 908
 
29473 manish 909
 
32464 tejbeer 910
    @RequestMapping(value = "/editLead", method = RequestMethod.POST)
911
    public String EditLead(HttpServletRequest request, @RequestBody CreateLeacdActivityRequest createLeadActivityRequest, Model model) throws Exception {
912
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29426 manish 913
 
32464 tejbeer 914
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
29426 manish 915
 
34113 tejus.loha 916
        Lead lead = leadRepository.selectById(createLeadActivityRequest.getId());
917
        AuthUser leadAuthUser = authRepository.selectById(lead.getAuthId());
32464 tejbeer 918
        LeadDetail leadDetail = leadDetailRepository.selectByLeadId(createLeadActivityRequest.getId());
29426 manish 919
 
36789 ranu 920
        // Geo gate: required for follow-up / finalized (anything that schedules
921
        // a visit or beat slot). For notInterested (close-out) no geo / no beat
922
        // is needed — only the activity (status + reason + remark) is saved.
36792 ranu 923
        // Non-sales assignees (BGC / other internal hand-offs) also bypass the
924
        // gate — those are just routing the lead to another department's queue
925
        // and don't carry a beat-day attachment.
926
        int assignToId = createLeadActivityRequest.getAssignTo();
927
        boolean assigneeIsSales = assignToId > 0
928
                && positionRepository.hasCategory(assignToId, ProfitMandiConstants.TICKET_CATEGORY_SALES);
929
        if (createLeadActivityRequest.getStatus() != LeadStatus.notInterested && assigneeIsSales) {
36789 ranu 930
            LeadLiveLocation approvedGeo = leadLiveLocationRepository.selectApprovedByLeadId(createLeadActivityRequest.getId());
931
            if (approvedGeo == null) {
932
                throw new ProfitMandiBusinessException("Lead", "", "Live geo-location for this lead has not been approved yet. Please approve the geo-location before editing.");
933
            }
36761 ranu 934
        }
935
 
34113 tejus.loha 936
        if (leadDetail == null && !createLeadActivityRequest.getStatus().equals(LeadStatus.notInterested) && leadAuthUser.isActive()) {
29426 manish 937
 
32464 tejbeer 938
            throw new ProfitMandiBusinessException("LeadDetail", "", "Please fill lead detail");
939
        }
29445 manish 940
 
32464 tejbeer 941
        LeadActivity leadActivity = new LeadActivity();
942
        leadActivity.setLeadId(createLeadActivityRequest.getId());
943
        leadActivity.setRemark(createLeadActivityRequest.getRemark());
29598 tejbeer 944
 
32464 tejbeer 945
        LOGGER.info("createRefferalRequest" + createLeadActivityRequest);
29598 tejbeer 946
 
32464 tejbeer 947
        if (createLeadActivityRequest.getStatus() == LeadStatus.followUp) {
948
            leadActivity.setSchelduleTimestamp(createLeadActivityRequest.getScheldule());
949
            leadActivity.setCommunicationType(createLeadActivityRequest.getCommunicationType());
36741 ranu 950
            // A beat-day pick wires the lead onto that beat's route regardless of
951
            // communication type (TELEPHONIC = call on that beat day).
952
            String beatSelection = createLeadActivityRequest.getBeatSelection();
953
            if (beatSelection != null && beatSelection.contains("|")) {
36644 ranu 954
                int beatId = 0;
955
                LocalDate beatDate = createLeadActivityRequest.getScheldule() != null
956
                        ? createLeadActivityRequest.getScheldule().toLocalDate() : LocalDate.now();
957
                String beatName = "Beat";
36642 ranu 958
 
36741 ranu 959
                String[] parts = beatSelection.split("\\|", 3);
960
                beatDate = LocalDate.parse(parts[0]);
961
                beatName = parts.length > 1 ? parts[1] : "Beat";
962
                if (parts.length > 2) {
963
                    try {
964
                        beatId = Integer.parseInt(parts[2]);
965
                    } catch (NumberFormatException ignored) {
36642 ranu 966
                    }
967
                }
968
 
36644 ranu 969
                // Find optimal insert position using lead geolocation
970
                int insertAt = 0;
971
                LeadLiveLocation leadGeo = leadLiveLocationRepository.selectApprovedByLeadId(createLeadActivityRequest.getId());
972
                List<BeatRoute> existingStops = beatId > 0
973
                        ? beatRouteRepository.selectByBeatId(beatId).stream()
974
                        .sorted(Comparator.comparingInt(BeatRoute::getSequenceOrder))
975
                        .collect(Collectors.toList())
976
                        : new ArrayList<>();
36642 ranu 977
 
36644 ranu 978
                insertAt = existingStops.size(); // default: append at end
979
 
980
                if (!existingStops.isEmpty() && leadGeo != null) {
981
                    // Use nearest neighbor to find optimal position
982
                    // (simplified — append at end for now, full geocoding done in LeadGeoLocationController)
983
                    insertAt = existingStops.size();
984
                }
985
 
986
                // Shift existing stops
987
                for (BeatRoute stop : existingStops) {
988
                    if (stop.getSequenceOrder() >= insertAt) {
989
                        stop.setSequenceOrder(stop.getSequenceOrder() + 1);
990
                    }
991
                }
992
 
993
                // Create lead_route entry (directly APPROVED)
994
                LeadRoute leadRoute = new LeadRoute();
995
                leadRoute.setBeatId(beatId);
996
                leadRoute.setLeadId(createLeadActivityRequest.getId());
997
                leadRoute.setScheduleDate(beatDate);
998
                leadRoute.setSequenceOrder(insertAt);
999
                leadRoute.setStatus("APPROVED");
1000
                leadRoute.setRequestedBy(authUser.getId());
1001
                leadRoute.setApprovedBy(authUser.getId());
1002
                leadRoute.setApprovedTimestamp(LocalDateTime.now());
1003
                leadRoute.setCreatedTimestamp(LocalDateTime.now());
1004
                leadRoute.setUpdatedTimestamp(LocalDateTime.now());
1005
 
1006
                // Set nearest store
1007
                if (!existingStops.isEmpty()) {
1008
                    leadRoute.setNearestStoreId(existingStops.get(Math.min(insertAt, existingStops.size() - 1)).getFofoId());
1009
                }
1010
                leadRouteRepository.persist(leadRoute);
1011
 
1012
                // Create visit request
1013
                visitRequestRepository.createVisitRequest(
1014
                        createLeadActivityRequest.getId(), "lead",
1015
                        createLeadActivityRequest.getAssignTo(),
1016
                        beatDate.atTime(10, 0));
1017
 
36642 ranu 1018
                // Log activity
36644 ranu 1019
                LeadActivity visitActivity = new LeadActivity();
1020
                visitActivity.setLeadId(createLeadActivityRequest.getId());
1021
                visitActivity.setRemark("Lead scheduled for visit on beat: " + beatName
1022
                        + " (" + beatDate + ") at stop #" + (insertAt + 1));
1023
                visitActivity.setAuthId(authUser.getId());
1024
                visitActivity.setCreatedTimestamp(LocalDateTime.now());
1025
                leadActivityRepository.persist(visitActivity);
32464 tejbeer 1026
            }
1027
        } else {
1028
            leadActivity.setSchelduleTimestamp(null);
1029
        }
1030
        leadActivity.setCreatedTimestamp(LocalDateTime.now());
1031
        leadActivity.setAuthId(authUser.getId());
1032
        leadActivityRepository.persist(leadActivity);
1033
        lead.setAssignTo(createLeadActivityRequest.getAssignTo());
1034
        lead.setStatus(createLeadActivityRequest.getStatus());
35548 aman 1035
        lead.setState(createLeadActivityRequest.getState());
1036
        lead.setCity(createLeadActivityRequest.getCity());
35769 amit 1037
        if (createLeadActivityRequest.getSource() != null && !createLeadActivityRequest.getSource().isEmpty()) {
1038
            lead.setSource(createLeadActivityRequest.getSource());
1039
        }
36741 ranu 1040
        if (Boolean.TRUE.equals(createLeadActivityRequest.getColorCheck())) {
32471 tejbeer 1041
            lead.setColor("Green");
1042
        } else {
1043
            lead.setColor("Yellow");
1044
        }
32464 tejbeer 1045
        lead.setNotinterestedReason(createLeadActivityRequest.getReason());
1046
        lead.setUpdatedTimestamp(LocalDateTime.now());
29426 manish 1047
 
32464 tejbeer 1048
        int authId = 0;
34127 tejus.loha 1049
        authId = lead.getAssignTo();
1050
        Map<Integer, LeadActivity> leadActivityMap = new HashMap<>();
29426 manish 1051
 
34127 tejus.loha 1052
        List<LeadActivity> leadActivitys = leadActivityRepository.selectBYLeadId(lead.getId());
29426 manish 1053
 
34127 tejus.loha 1054
        if (!leadActivitys.isEmpty()) {
1055
            leadActivityMap.put(lead.getId(), leadActivitys.get(0));
1056
        }
29426 manish 1057
 
34127 tejus.loha 1058
        Map<Integer, AuthUser> authIdAndAuthUserMap = new HashMap<>();
1059
        AuthUser AuthUser = authRepository.selectById(authId);
29426 manish 1060
 
34127 tejus.loha 1061
        authIdAndAuthUserMap.put(AuthUser.getId(), AuthUser);
29426 manish 1062
 
34127 tejus.loha 1063
        model.addAttribute("leadActivityMap", leadActivityMap);
1064
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
29426 manish 1065
 
30185 tejbeer 1066
 
33223 amit.gupta 1067
        model.addAttribute("lead", lead);
30185 tejbeer 1068
 
36818 ranu 1069
        // Best-effort hierarchy email — fired after the lead+activity are persisted
1070
        // so a mail failure never blocks the assignment. Covers every editLead path
1071
        // (followUp, notInterested, etc.) so every assignment is announced upward.
1072
        try {
1073
            sendLeadAssignmentEmail(lead, AuthUser, authUser,
1074
                    createLeadActivityRequest.getStatus() != null ? createLeadActivityRequest.getStatus().toString() : null);
1075
        } catch (Exception e) {
1076
            LOGGER.warn("Lead-assignment email fan-out failed (lead id {}): {}", lead.getId(), e.getMessage());
1077
        }
1078
 
32464 tejbeer 1079
        return "edit-lead";
30185 tejbeer 1080
 
32464 tejbeer 1081
    }
31370 tejbeer 1082
 
36818 ranu 1083
    // Hierarchy-wide email when a lead is assigned. Recipients:
1084
    //   - the assignee themselves (L1)
1085
    //   - every manager above the assignee, capped at L4
1086
    // L5 / Final / super-admins are intentionally NOT copied on lead-management mails.
1087
    private void sendLeadAssignmentEmail(Lead lead, AuthUser assignee, AuthUser requestedBy, String status) {
1088
        if (gmailRelaySender == null || lead == null || assignee == null) return;
1089
 
1090
        java.util.LinkedHashSet<String> recipients = new java.util.LinkedHashSet<>();
1091
        if (assignee.getEmailId() != null && !assignee.getEmailId().isEmpty()) {
1092
            recipients.add(assignee.getEmailId());
1093
        }
1094
        try {
1095
            for (AuthUser m : authService.getAllManagers(assignee.getId())) {
1096
                if (m.getEmailId() == null || m.getEmailId().isEmpty()) continue;
1097
                // Cap chain at L4 — L5 / Final never receive lead-management mails.
1098
                com.spice.profitmandi.dao.enumuration.cs.EscalationType lvl = highestEscalation(m.getId());
1099
                if (lvl != null
1100
                        && com.spice.profitmandi.dao.enumuration.cs.EscalationType.L4.isGreaterThanEqualTo(lvl)) {
1101
                    recipients.add(m.getEmailId());
1102
                }
1103
            }
1104
        } catch (Exception ignored) {
1105
        }
1106
        if (recipients.isEmpty()) return;
1107
 
1108
        // TEST OVERRIDE — uncomment to route all lead-assignment mail to one inbox.
1109
        // recipients.clear();
1110
        // recipients.add("ranu.rajput@smartdukaan.com");
1111
 
1112
        String leadName = ((lead.getFirstName() != null ? lead.getFirstName() : "")
1113
                + " " + (lead.getLastName() != null ? lead.getLastName() : "")).trim();
1114
        if (leadName.isEmpty()) leadName = "Lead #" + lead.getId();
1115
        String assigneeName = ((assignee.getFirstName() != null ? assignee.getFirstName() : "")
1116
                + " " + (assignee.getLastName() != null ? assignee.getLastName() : "")).trim();
1117
 
1118
        String subject = "Lead assigned — " + leadName + " → " + assigneeName;
1119
        StringBuilder text = new StringBuilder();
1120
        text.append("A lead has been assigned.\n\n");
1121
        text.append("Lead:        ").append(leadName).append("\n");
1122
        if (lead.getLeadMobile() != null) text.append("Mobile:      ").append(lead.getLeadMobile()).append("\n");
1123
        if (lead.getOutLetName() != null) text.append("Outlet:      ").append(lead.getOutLetName()).append("\n");
1124
        if (lead.getCity() != null || lead.getState() != null) {
1125
            text.append("Location:    ")
1126
                    .append(lead.getCity() != null ? lead.getCity() : "")
1127
                    .append(lead.getCity() != null && lead.getState() != null ? ", " : "")
1128
                    .append(lead.getState() != null ? lead.getState() : "")
1129
                    .append("\n");
1130
        }
1131
        text.append("Assignee:    ").append(assigneeName).append("\n");
1132
        if (status != null) text.append("Status:      ").append(status).append("\n");
1133
        if (requestedBy != null) {
1134
            String rbName = ((requestedBy.getFirstName() != null ? requestedBy.getFirstName() : "")
1135
                    + " " + (requestedBy.getLastName() != null ? requestedBy.getLastName() : "")).trim();
1136
            text.append("Assigned by: ").append(rbName.isEmpty() ? ("#" + requestedBy.getId()) : rbName).append("\n");
1137
        }
1138
 
1139
        try {
1140
            javax.mail.internet.MimeMessage message = gmailRelaySender.createMimeMessage();
1141
            org.springframework.mail.javamail.MimeMessageHelper helper = new org.springframework.mail.javamail.MimeMessageHelper(message, true);
1142
            helper.setSubject(subject);
1143
            helper.setText(text.toString());
1144
            helper.setTo(recipients.toArray(new String[0]));
1145
            helper.setFrom(new javax.mail.internet.InternetAddress("sdtech@smartdukaan.com", "SD Tech"));
1146
            gmailRelaySender.send(message);
1147
        } catch (Exception e) {
1148
            LOGGER.warn("Lead-assignment mail send failed: {}", e.getMessage());
1149
        }
1150
    }
1151
 
1152
    // Returns the user's highest escalation across all positions (or null).
1153
    // Used to gate the chain-mail cap.
1154
    private com.spice.profitmandi.dao.enumuration.cs.EscalationType highestEscalation(int authUserId) {
1155
        com.spice.profitmandi.dao.enumuration.cs.EscalationType highest = null;
1156
        try {
1157
            for (com.spice.profitmandi.dao.entity.cs.Position p : positionRepository.selectPositionByAuthId(authUserId)) {
1158
                if (highest == null || p.getEscalationType().isGreaterThanEqualTo(highest)) {
1159
                    highest = p.getEscalationType();
1160
                }
1161
            }
1162
        } catch (Exception ignored) {
1163
        }
1164
        return highest;
1165
    }
1166
 
32464 tejbeer 1167
    @RequestMapping(value = "/downloadIvoryLead", method = RequestMethod.GET)
1168
    public ResponseEntity<?> downloadDelayDayTemplate(HttpServletRequest request) throws Exception {
1169
        List<String> stateNames = stateRepository.selectAll().stream().map(x -> x.getName()).collect(Collectors.toList());
31370 tejbeer 1170
 
32464 tejbeer 1171
        List<List<?>> rows = new ArrayList<>();
31496 tejbeer 1172
 
32464 tejbeer 1173
        List<LeadSource> lss = LeadSource.enumValues;
31370 tejbeer 1174
 
32464 tejbeer 1175
        for (LeadSource ls : lss) {
1176
            rows.add(Arrays.asList("-", "-", "-", "-", "-", "-", "-", ls));
31478 tejbeer 1177
 
32464 tejbeer 1178
        }
1179
        for (String stateName : stateNames) {
1180
            rows.add(Arrays.asList("-", "-", "-", "-", stateName, "-", "-", "-"));
31478 tejbeer 1181
 
32464 tejbeer 1182
        }
31478 tejbeer 1183
 
32464 tejbeer 1184
        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 1185
 
32464 tejbeer 1186
        final HttpHeaders headers = new HttpHeaders();
1187
        headers.set("Content-Type", "text/csv");
1188
        headers.set("Content-disposition", "inline; filename=leads.format.csv");
1189
        headers.setContentLength(baos.toByteArray().length);
31478 tejbeer 1190
 
32464 tejbeer 1191
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1192
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1193
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
31478 tejbeer 1194
 
32464 tejbeer 1195
    }
31478 tejbeer 1196
 
32464 tejbeer 1197
    @RequestMapping(value = "/csvFileAndSetLead", method = RequestMethod.POST)
1198
    public String readCsvFileAndSetLead(HttpServletRequest request, Model model, HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
31478 tejbeer 1199
 
32464 tejbeer 1200
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1201
        String email = loginDetails.getEmailId();
31478 tejbeer 1202
 
32464 tejbeer 1203
        AuthUser createdBy = authRepository.selectByEmailOrMobile(email);
31478 tejbeer 1204
 
32464 tejbeer 1205
        LOGGER.info("file" + file.toString());
31478 tejbeer 1206
 
32464 tejbeer 1207
        String fileName = file.getName();
31370 tejbeer 1208
 
32464 tejbeer 1209
        String fileNames = file.getOriginalFilename();
31370 tejbeer 1210
 
32464 tejbeer 1211
        LOGGER.info("fileName" + fileName);
1212
        LOGGER.info("fileNames" + fileNames);
31370 tejbeer 1213
 
32464 tejbeer 1214
        List<CSVRecord> records = FileUtil.readFile(file);
31370 tejbeer 1215
 
32464 tejbeer 1216
        for (CSVRecord record : records) {
31370 tejbeer 1217
 
32464 tejbeer 1218
            Lead lead = new Lead();
1219
            lead.setFirstName(record.get(0));
1220
            lead.setLastName(record.get(1));
1221
            lead.setAddress(record.get(2));
1222
            lead.setCity(record.get(3));
1223
            lead.setState(record.get(4));
1224
            lead.setLeadMobile(record.get(5));
1225
            LOGGER.info("record" + record.get(6));
31370 tejbeer 1226
 
32464 tejbeer 1227
            AuthUser assignTo = authRepository.selectByEmailOrMobile(record.get(6));
31370 tejbeer 1228
 
32464 tejbeer 1229
            if (assignTo == null) {
1230
                throw new ProfitMandiBusinessException("Assign To ", record.get(6), "email id not exist");
1231
            }
31370 tejbeer 1232
 
32464 tejbeer 1233
            lead.setAssignTo(assignTo.getId());
1234
            lead.setSource(record.get(7));
31370 tejbeer 1235
 
32464 tejbeer 1236
            lead.setCreatedTimestamp(LocalDateTime.now());
31370 tejbeer 1237
 
32464 tejbeer 1238
            lead.setUpdatedTimestamp(LocalDateTime.now());
1239
            lead.setStatus(LeadStatus.pending);
1240
            lead.setColor("yellow");
1241
            // change
1242
            lead.setCreatedBy(createdBy.getFullName());
1243
            lead.setAuthId(createdBy.getId());
31370 tejbeer 1244
 
32464 tejbeer 1245
            leadRepository.persist(lead);
31370 tejbeer 1246
 
32464 tejbeer 1247
            LeadActivity leadActivity = new LeadActivity();
1248
            leadActivity.setLeadId(lead.getId());
1249
            leadActivity.setRemark("New Lead");
1250
            leadActivity.setSchelduleTimestamp(null);
31370 tejbeer 1251
 
32464 tejbeer 1252
            leadActivity.setCreatedTimestamp(LocalDateTime.now());
1253
            leadActivityRepository.persist(leadActivity);
1254
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31370 tejbeer 1255
 
32464 tejbeer 1256
        }
31370 tejbeer 1257
 
32464 tejbeer 1258
        model.addAttribute("responseSTG", mvcResponseSender.createResponseString(true));
31370 tejbeer 1259
 
32464 tejbeer 1260
        return "response";
31370 tejbeer 1261
 
32464 tejbeer 1262
    }
31370 tejbeer 1263
 
32464 tejbeer 1264
    @RequestMapping(value = "/teamCommitment", method = RequestMethod.GET)
1265
    public String teamCommitments(HttpServletRequest request, Model model) throws Exception {
31370 tejbeer 1266
 
32464 tejbeer 1267
        return "team-commitment";
31370 tejbeer 1268
 
32464 tejbeer 1269
    }
31370 tejbeer 1270
 
32464 tejbeer 1271
    @RequestMapping(value = "/leadDetail", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
1272
    public String leadDetail(HttpServletRequest request, @RequestBody LeadDetailModel leadDetailModel, Model model) throws Exception {
31370 tejbeer 1273
 
32464 tejbeer 1274
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1275
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
31370 tejbeer 1276
 
32471 tejbeer 1277
        leadRepository.persistLeadDetail(leadDetailModel, authUser);
32464 tejbeer 1278
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31370 tejbeer 1279
 
32464 tejbeer 1280
        return "response";
31370 tejbeer 1281
 
32464 tejbeer 1282
    }
31370 tejbeer 1283
 
32464 tejbeer 1284
    @RequestMapping(value = "/getLeadDetail", method = RequestMethod.GET)
1285
    public String getLeadDetail(HttpServletRequest request, Model model) throws Exception {
1286
        List<Integer> followUpleadIds = leadRepository.selectAllByStatus(LeadStatus.followUp).stream().map(x -> x.getId()).collect(Collectors.toList());
1287
        List<LeadDetail> leadDetails = leadDetailRepository.selectByLeadIds(followUpleadIds);
31370 tejbeer 1288
 
32464 tejbeer 1289
        List<DBObject> mobileBrands = mongoClient.getAllBrandsToDisplay(3);
31370 tejbeer 1290
 
32464 tejbeer 1291
        List<String> brands = mobileBrands.stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
31370 tejbeer 1292
 
32464 tejbeer 1293
        model.addAttribute("brands", brands);
1294
        if (!leadDetails.isEmpty()) {
31370 tejbeer 1295
 
32464 tejbeer 1296
            List<Integer> detailsIds = leadDetails.stream().map(x -> x.getId()).collect(Collectors.toList());
31370 tejbeer 1297
 
32464 tejbeer 1298
            List<Integer> leadIds = leadDetails.stream().map(x -> x.getLeadId()).collect(Collectors.toList());
31370 tejbeer 1299
 
32464 tejbeer 1300
            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 1301
 
32464 tejbeer 1302
            Map<Integer, Optional<LeadActivity>> leadActivityMap = leadActivityRepository.selectAllByleadIds(leadIds).stream().collect(Collectors.groupingBy(x -> x.getLeadId(), Collectors.maxBy(Comparator.comparing(LeadActivity::getId))));
31370 tejbeer 1303
 
32464 tejbeer 1304
            model.addAttribute("leadActivityMap", leadActivityMap);
30185 tejbeer 1305
 
32464 tejbeer 1306
            List<LeadBrand> leadBrands = leadBrandRepository.selectByLeadDetailId(detailsIds);
30185 tejbeer 1307
 
32464 tejbeer 1308
            LOGGER.info("leadBrands {}" + leadBrands);
30185 tejbeer 1309
 
32464 tejbeer 1310
            Map<Integer, Map<String, Integer>> leadDetailBrandValue = new HashMap<>();
30416 tejbeer 1311
 
32464 tejbeer 1312
            Map<Integer, List<LeadBrand>> leadDetail = leadBrands.stream().collect(Collectors.groupingBy(x -> x.getLeadDetailId(), Collectors.toList()));
30416 tejbeer 1313
 
32464 tejbeer 1314
            for (Entry<Integer, List<LeadBrand>> leadDetailEntry : leadDetail.entrySet()) {
30416 tejbeer 1315
 
32464 tejbeer 1316
                Map<String, Integer> brandValue = new HashMap<>();
30416 tejbeer 1317
 
32464 tejbeer 1318
                for (LeadBrand leadBrand : leadDetailEntry.getValue()) {
1319
                    brandValue.put(leadBrand.getBrand(), leadBrand.getValue());
30416 tejbeer 1320
 
32464 tejbeer 1321
                }
1322
                leadDetailBrandValue.put(leadDetailEntry.getKey(), brandValue);
1323
            }
30416 tejbeer 1324
 
32464 tejbeer 1325
            LOGGER.info("leadDetailBrandValue {}" + leadDetailBrandValue);
30416 tejbeer 1326
 
32464 tejbeer 1327
            model.addAttribute("leadDetailBrandValue", leadDetailBrandValue);
30416 tejbeer 1328
 
32464 tejbeer 1329
            model.addAttribute("leadMap", leadMap);
1330
        }
30434 tejbeer 1331
 
32464 tejbeer 1332
        model.addAttribute("leadDetails", leadDetails);
30434 tejbeer 1333
 
32464 tejbeer 1334
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1335
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
30434 tejbeer 1336
 
32464 tejbeer 1337
        return "lead-detail";
30458 tejbeer 1338
 
32464 tejbeer 1339
    }
30458 tejbeer 1340
 
32464 tejbeer 1341
    @RequestMapping(value = "/getLeadDetailByLeadId", method = RequestMethod.GET)
35548 aman 1342
    public ResponseEntity<?> getLeadDetailByLeadId(@RequestParam int leadId) {
30458 tejbeer 1343
 
35548 aman 1344
        Lead lead = leadRepository.selectById(leadId);
32464 tejbeer 1345
        LeadDetail leadDetail = leadDetailRepository.selectByLeadId(leadId);
35548 aman 1346
        Map<String, Object> response = new HashMap<>();
1347
        response.put("city", lead.getCity());
1348
        response.put("state", lead.getState());
1349
        if (leadDetail != null) {
1350
            response.put("outletName", leadDetail.getOutletName());
1351
            response.put("counterSize", leadDetail.getCounterSize());
1352
        }
1353
        return responseSender.ok(response);
1354
    }
30458 tejbeer 1355
 
35548 aman 1356
    @PostMapping("/upload-assign-id")
1357
    public ResponseEntity<?> uploadAssignIdCsv(
1358
            @RequestParam("file") MultipartFile file)
1359
            throws Exception {
1360
 
1361
        try (Reader reader = new InputStreamReader(file.getInputStream());
1362
             CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT)) {
1363
 
1364
            List<CSVRecord> records = parser.getRecords();
1365
 
1366
            if (records.size() < 2) {
1367
                throw new ProfitMandiBusinessException(
1368
                        "Uploaded File", "", "No records Found");
1369
            }
1370
 
1371
            records.remove(0);
1372
 
1373
            for (CSVRecord record : records) {
1374
 
1375
                int leadId = Integer.parseInt(record.get(0));
1376
                int assignId = Integer.parseInt(record.get(1));
1377
 
1378
                Lead lead = leadRepository.selectById(leadId);
1379
 
1380
                if (lead == null) {
1381
                    LOGGER.warn("Lead not found for id {}", leadId);
1382
                    continue;
1383
                }
1384
 
1385
                lead.setAssignTo(assignId);
1386
            }
1387
        }
1388
 
1389
        return responseSender.ok("CSV processed successfully");
32464 tejbeer 1390
    }
30434 tejbeer 1391
 
35548 aman 1392
 
1393
 
32464 tejbeer 1394
    @RequestMapping(value = "/getTeamCommitment", method = RequestMethod.GET)
1395
    public String getTeamCommitments(HttpServletRequest request, @RequestParam LocalDateTime date, Model model) throws Exception {
30781 tejbeer 1396
 
32464 tejbeer 1397
        List<TeamCommitmentModel> commitments = partnerCollectionPlanRepository.selectTeamCommitmentByDate(date.toLocalDate());
30416 tejbeer 1398
 
32464 tejbeer 1399
        model.addAttribute("commitments", commitments);
1400
        return "team-commitment-table";
30416 tejbeer 1401
 
32464 tejbeer 1402
    }
30416 tejbeer 1403
 
33917 ranu 1404
    @Autowired
1405
    RbmTargetService rbmTargetService;
1406
 
1407
    @RequestMapping(value = "/rbmTodayArr", method = RequestMethod.GET)
1408
    public String getRbmTodayArr(HttpServletRequest request, Model model, @RequestParam(value = "startDate", required = false) LocalDate startDate) throws Exception {
1409
        List<RbmArrViewModel> rbmArrViewModels;
35223 ranu 1410
        DecimalFormat decimalFormat = new DecimalFormat("#"); // No decimal places
33917 ranu 1411
        if (startDate != null) {
1412
            rbmArrViewModels = rbmTargetService.getRbmTodayArr(startDate);
1413
        } else {
1414
            rbmArrViewModels = rbmTargetService.getRbmTodayArr();
1415
        }
1416
 
35223 ranu 1417
        Set<AuthUser> authUsers = new HashSet<>();
1418
        Set<AuthUser> rbmAuthUsers = csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM, EscalationType.L1).stream().filter(x -> x.isActive()).collect(Collectors.toSet());
1419
        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 1420
 
35223 ranu 1421
        authUsers.addAll(rbmAuthUsers);
1422
        authUsers.addAll(salesAuthUsers);
33953 ranu 1423
 
35223 ranu 1424
        double totalAchieved = rbmArrViewModels.stream().mapToDouble(RbmArrViewModel::getTotalAchievedTarget).sum();
1425
        double totalTargetSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayTarget).sum();
1426
 
1427
        double totalHidSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayHidTarget).sum();
1428
        double totalHidAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedHidTarget).sum();
1429
 
1430
        double totalFastSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayFastMovingTarget).sum();
1431
        double totalFastAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedFastMovingTarget).sum();
1432
 
1433
        double totalSlowSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodaySlowMovingTarget).sum();
1434
        double totalSlowAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedSlowMovingTarget).sum();
1435
 
1436
        double totalRunningSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayRunningTarget).sum();
1437
        double totalRunningAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedRunningTarget).sum();
1438
 
1439
        double totalOtherSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayOtherMovingTarget).sum();
1440
        double totalOtherAchievedSum = rbmArrViewModels.stream().mapToLong(RbmArrViewModel::getTodayAchievedOtherMovingTarget).sum();
1441
 
34055 ranu 1442
        List<Sold15daysOldAgingModel> sold15daysOldAgingModels = rbmTargetService.getAgingSale(LocalDate.now(), LocalDate.now().plusDays(1));
1443
        List<Our15DaysOldAgingStock> our15DaysOldAgingStocks = rbmTargetService.our15DaysAgingStock();
1444
 
35223 ranu 1445
        long totalSoldSlow = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getSlowmovingBilled).sum();
1446
        long totalSoldRun = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getRunningBilled).sum();
1447
        long totalSoldFast = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getFastmovingBilled).sum();
1448
        long totalSoldHid = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getHidBilled).sum();
1449
        long totalSoldOther = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getOthersBilled).sum();
1450
        long totalSoldAging = sold15daysOldAgingModels.stream().mapToLong(Sold15daysOldAgingModel::getTotalBilled).sum();
34103 ranu 1451
 
35223 ranu 1452
 
34103 ranu 1453
//        first week count of rbm partner billing
1454
        LocalDate firstOfCurrentMonth = LocalDate.now().withDayOfMonth(1);
1455
        LocalDate seventhOfCurrentMonth = LocalDate.now().withDayOfMonth(7);
1456
 
1457
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsFirstWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(firstOfCurrentMonth, seventhOfCurrentMonth);
1458
 
1459
        Map<String, Long> rbmBilledCountMapFirstWeek = rbmBilledFofoIdsModelsFirstWeek.stream()
1460
                .filter(x -> x.getStatus().equals("Billed"))
1461
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1462
 
34119 ranu 1463
        long totalFirstWeekCount = rbmBilledCountMapFirstWeek.values().stream()
1464
                .mapToLong(Long::longValue)
1465
                .sum();
1466
 
34114 ranu 1467
        Map<String, Long> rbmTargetedFofoIdCountMap = rbmBilledFofoIdsModelsFirstWeek.stream()
1468
                .collect(Collectors.groupingBy(
1469
                        RbmBilledFofoIdsModel::getRbmName, // Group by RBM Name
1470
                        Collectors.counting() // Count all fofoId entries for each RBM
1471
                ));
34103 ranu 1472
 
34119 ranu 1473
        long totalTargetedCount = rbmTargetedFofoIdCountMap.values().stream().mapToLong(x -> x.longValue()).sum();
34114 ranu 1474
 
1475
 
34103 ranu 1476
//        second week count of rbm partner billing
1477
 
1478
        LocalDate eightOfCurrentMonth = LocalDate.now().withDayOfMonth(8);
1479
        LocalDate fifteenOfCurrentMonth = LocalDate.now().withDayOfMonth(15);
1480
 
1481
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsSecondWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(eightOfCurrentMonth, fifteenOfCurrentMonth);
1482
 
1483
        Map<String, Long> rbmBilledCountMapSecondWeek = rbmBilledFofoIdsModelsSecondWeek.stream()
1484
                .filter(x -> x.getStatus().equals("Billed"))
1485
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1486
 
34119 ranu 1487
        long totalSecondWeekCount = rbmBilledCountMapSecondWeek.values().stream().mapToLong(Long::longValue).sum();
34103 ranu 1488
 
1489
//      third week count of rbm partner billing
1490
 
1491
        LocalDate sixteenOfCurrentMonth = LocalDate.now().withDayOfMonth(16);
34144 ranu 1492
        LocalDate twentySecondOfCurrentMonth = LocalDate.now().withDayOfMonth(22);
34103 ranu 1493
 
34144 ranu 1494
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsThirdWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(sixteenOfCurrentMonth, twentySecondOfCurrentMonth);
34103 ranu 1495
 
1496
        Map<String, Long> rbmBilledCountMapThirdWeek = rbmBilledFofoIdsModelsThirdWeek.stream()
1497
                .filter(x -> x.getStatus().equals("Billed"))
1498
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1499
 
34119 ranu 1500
        long totalThirdWeekCount = rbmBilledCountMapThirdWeek.values().stream().mapToLong(Long::longValue).sum();
34103 ranu 1501
 
34119 ranu 1502
 
34103 ranu 1503
        //      fourth week count of rbm partner billing
1504
 
34144 ranu 1505
        LocalDate twentyThirdOfCurrentMonth = LocalDate.now().withDayOfMonth(23);
34103 ranu 1506
        LocalDate lastDayOfCurrentMonth = LocalDate.now().withDayOfMonth(LocalDate.now().lengthOfMonth());
1507
 
34144 ranu 1508
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsFourthWeek = rbmTargetService.getDateWiseBilledFofoIdByRbm(twentyThirdOfCurrentMonth, lastDayOfCurrentMonth);
34103 ranu 1509
 
1510
        Map<String, Long> rbmBilledCountMapFourthWeek = rbmBilledFofoIdsModelsFourthWeek.stream()
1511
                .filter(x -> x.getStatus().equals("Billed"))
1512
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1513
 
34119 ranu 1514
        long totalFourthWeekCount = rbmBilledCountMapFourthWeek.values().stream().mapToLong(x -> x.longValue()).sum();
34103 ranu 1515
 
34119 ranu 1516
 
34103 ranu 1517
//      mtd rbm partner billing
1518
 
1519
        List<RbmBilledFofoIdsModel> rbmBilledFofoIdsModelsMtd = rbmTargetService.getDateWiseBilledFofoIdByRbm(firstOfCurrentMonth, LocalDate.now());
1520
 
1521
        Map<String, Long> rbmBilledCountMapMtd = rbmBilledFofoIdsModelsMtd.stream()
1522
                .filter(x -> x.getStatus().equals("Billed"))
1523
                .collect(Collectors.groupingBy(RbmBilledFofoIdsModel::getRbmName, Collectors.counting()));
1524
 
34119 ranu 1525
        long totalMtdCount = rbmBilledCountMapMtd.values().stream().mapToLong(Long::longValue).sum();
1526
 
1527
        Map<String, Long> zeroBilledCountMap = rbmTargetedFofoIdCountMap.entrySet().stream()
1528
                .collect(Collectors.toMap(
1529
                        Map.Entry::getKey,
1530
                        entry -> entry.getValue() - rbmBilledCountMapMtd.getOrDefault(entry.getKey(), 0L)
1531
                ));
1532
 
1533
        long totalZeroBilledCount = zeroBilledCountMap.values().stream().mapToLong(Long::longValue).sum();
1534
 
36101 ranu 1535
        //        rbmRating by franchisee visits (weekly: Monday to Sunday)
35223 ranu 1536
 
1537
        Map<Integer, String> rbmIdToNameMap = authUsers.stream()
1538
                .collect(Collectors.toMap(AuthUser::getId, AuthUser::getFullName));
1539
 
36101 ranu 1540
        // Calculate current week: Monday (start) to Sunday (end)
1541
        LocalDate today = LocalDate.now();
1542
        LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
1543
        LocalDate sunday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
1544
        LocalDateTime weekStart = monday.atStartOfDay();
1545
        LocalDateTime weekEnd = sunday.atTime(LocalTime.MAX);
1546
 
35223 ranu 1547
        Map<String, RbMRatingModel> rbmNameToRatingMap = rbmRatingRepository
36101 ranu 1548
                .findAverageRatingByRbmIdAndDateRange(new ArrayList<>(rbmIdToNameMap.keySet()), weekStart, weekEnd)
1549
                .stream().collect(Collectors.toMap(
35223 ranu 1550
                        x -> rbmIdToNameMap.get(x.getRbmId()),
1551
                        x -> x
1552
                ));
1553
 
1554
 
33917 ranu 1555
        LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);
1556
        model.addAttribute("rbmArrViewModels", rbmArrViewModels);
35223 ranu 1557
        model.addAttribute("rbmNameToRatingMap", rbmNameToRatingMap);
1558
 
1559
        model.addAttribute("totalTargetSum", decimalFormat.format(totalTargetSum));
1560
        model.addAttribute("totalAchieved", decimalFormat.format(totalAchieved));
1561
 
1562
        model.addAttribute("totalHidSum", decimalFormat.format(totalHidSum));
1563
        model.addAttribute("totalHidAchievedSum", decimalFormat.format(totalHidAchievedSum));
1564
 
1565
        model.addAttribute("totalFastSum", decimalFormat.format(totalFastSum));
1566
        model.addAttribute("totalFastAchievedSum", decimalFormat.format(totalFastAchievedSum));
1567
 
1568
        model.addAttribute("totalSlowSum", decimalFormat.format(totalSlowSum));
1569
        model.addAttribute("totalSlowAchievedSum", decimalFormat.format(totalSlowAchievedSum));
1570
 
1571
        model.addAttribute("totalRunningSum", decimalFormat.format(totalRunningSum));
1572
        model.addAttribute("totalRunningAchievedSum", decimalFormat.format(totalRunningAchievedSum));
1573
 
1574
        model.addAttribute("totalOtherSum", decimalFormat.format(totalOtherSum));
1575
        model.addAttribute("totalOtherAchievedSum", decimalFormat.format(totalOtherAchievedSum));
1576
 
1577
        model.addAttribute("our15DaysOldAgingStocks", our15DaysOldAgingStocks);
34055 ranu 1578
        model.addAttribute("sold15daysOldAgingModels", sold15daysOldAgingModels);
35223 ranu 1579
        model.addAttribute("totalSoldSlow", totalSoldSlow);
1580
        model.addAttribute("totalSoldRun", totalSoldRun);
1581
        model.addAttribute("totalSoldFast", totalSoldFast);
1582
        model.addAttribute("totalSoldHid", totalSoldHid);
1583
        model.addAttribute("totalSoldOther", totalSoldOther);
1584
        model.addAttribute("totalSoldAging", totalSoldAging);
33917 ranu 1585
 
34114 ranu 1586
        model.addAttribute("rbmTargetedFofoIdCountMap", rbmTargetedFofoIdCountMap);
34103 ranu 1587
        model.addAttribute("rbmBilledCountMapFirstWeek", rbmBilledCountMapFirstWeek);
1588
        model.addAttribute("rbmBilledCountMapSecondWeek", rbmBilledCountMapSecondWeek);
1589
        model.addAttribute("rbmBilledCountMapThirdWeek", rbmBilledCountMapThirdWeek);
1590
        model.addAttribute("rbmBilledCountMapFourthWeek", rbmBilledCountMapFourthWeek);
1591
        model.addAttribute("rbmBilledCountMapMtd", rbmBilledCountMapMtd);
34119 ranu 1592
        model.addAttribute("zeroBilledCountMap", zeroBilledCountMap);
1593
        model.addAttribute("totalFirstWeekCount", totalFirstWeekCount);
1594
        model.addAttribute("totalTargetedCount", totalTargetedCount);
1595
        model.addAttribute("totalSecondWeekCount", totalSecondWeekCount);
1596
        model.addAttribute("totalThirdWeekCount", totalThirdWeekCount);
1597
        model.addAttribute("totalFourthWeekCount", totalFourthWeekCount);
1598
        model.addAttribute("totalMtdCount", totalMtdCount);
1599
        model.addAttribute("totalZeroBilledCount", totalZeroBilledCount);
34103 ranu 1600
 
33917 ranu 1601
        return "rbm-today-arr";
1602
    }
1603
 
1604
 
32464 tejbeer 1605
    @RequestMapping(value = "/partnerHealth", method = RequestMethod.GET)
1606
    public String partnerHealth(HttpServletRequest request, @RequestParam(name = "email", required = false) String email, Model model) throws Exception {
1607
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30416 tejbeer 1608
 
32464 tejbeer 1609
        if (StringUtils.isEmpty(email)) {
1610
            email = loginDetails.getEmailId();
1611
        } else {
1612
            AuthUser selectedUser = authRepository.selectByEmailOrMobile(email);
30416 tejbeer 1613
 
32464 tejbeer 1614
            model.addAttribute("selectedUser", selectedUser);
30445 tejbeer 1615
 
32464 tejbeer 1616
        }
30445 tejbeer 1617
 
32464 tejbeer 1618
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
30445 tejbeer 1619
 
32464 tejbeer 1620
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
1621
        List<Integer> fofoIds = new ArrayList<>(storeGuyMap.get(email));
1622
        LocalDateTime startDate = LocalDate.now().atStartOfDay();
1623
        if (fofoIds != null && fofoIds.size() > 0) {
1624
            List<Integer> fofoIdList = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> !x.isInternal()).map(x -> x.getId()).collect(Collectors.toList());
30420 tejbeer 1625
 
32464 tejbeer 1626
            Map<Integer, PartnerCollectionPlanModel> foundCollectionMap = partnerCollectionService.getCollectionMap(fofoIdList, startDate);
30416 tejbeer 1627
 
32464 tejbeer 1628
            List<Integer> remarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(fofoIdList);
30416 tejbeer 1629
 
32464 tejbeer 1630
            LOGGER.info("remarkIds {}", remarkIds);
30416 tejbeer 1631
 
32464 tejbeer 1632
            long todayOverallCall = 0;
1633
            if (!remarkIds.isEmpty()) {
30416 tejbeer 1634
 
32464 tejbeer 1635
                if (authUser.getEmailId().equals(email)) {
30441 tejbeer 1636
 
32464 tejbeer 1637
                    todayOverallCall = partnerCollectionRemarkRepository.selectByIds(remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
1638
                } else {
30441 tejbeer 1639
 
32464 tejbeer 1640
                    todayOverallCall = partnerCollectionRemarkRepository.selectByAuthIdAndIds(authRepository.selectByEmailOrMobile(email).getId(), remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
30416 tejbeer 1641
 
32464 tejbeer 1642
                }
30416 tejbeer 1643
 
32464 tejbeer 1644
            }
1645
            ChartLeadModel cm = new ChartLeadModel();
30416 tejbeer 1646
 
32464 tejbeer 1647
            if (!foundCollectionMap.isEmpty()) {
1648
                cm = this.getCollectionCount(foundCollectionMap.values().stream().collect(Collectors.toList()));
30416 tejbeer 1649
 
32464 tejbeer 1650
            }
1651
            model.addAttribute("chartPartnerHealth", gson.toJson(cm));
1652
            Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = new HashMap<>();
30416 tejbeer 1653
 
32464 tejbeer 1654
            List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository.selectAll(fofoIdList, startDate.toLocalDate().minusDays(1));
1655
            if (!partnerDailyInvestments.isEmpty()) {
1656
                partnerDailyInvestmentMap = partnerDailyInvestments.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
1657
            }
30416 tejbeer 1658
 
32464 tejbeer 1659
            Map<LocalDate, Map<Integer, PartnerCollectionPlanModel>> pcpmMap = new TreeMap<>();
1660
            for (int i = 0; i <= 6; i++) {
30416 tejbeer 1661
 
32464 tejbeer 1662
                Map<Integer, PartnerCollectionPlanModel> collectionMap = partnerCollectionService.getCollectionMap(fofoIdList, startDate.minusDays(i));
30416 tejbeer 1663
 
32464 tejbeer 1664
                pcpmMap.put(startDate.minusDays(i).toLocalDate(), collectionMap);
1665
            }
30416 tejbeer 1666
 
32464 tejbeer 1667
            Map<Integer, PartnerCollectionPlanModel> todayPcpmMap = pcpmMap.get(startDate.toLocalDate());
1668
            model.addAttribute("todayPcpmMap", todayPcpmMap);
30416 tejbeer 1669
 
32464 tejbeer 1670
            TotalTargetColectionModel totalTargetCollection = partnerCollectionService.getTotalTargetCollection(todayPcpmMap, startDate);
1671
            model.addAttribute("totalPartnerTargetCollection", totalTargetCollection.getTotalTarget());
30416 tejbeer 1672
 
32464 tejbeer 1673
            model.addAttribute("totalPartnerAchievement", totalTargetCollection.getTotalAchievement());
30416 tejbeer 1674
 
32464 tejbeer 1675
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1676
            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));
1677
            List<Integer> allReportees = authService.getAllReportees(authUser.getId());
30416 tejbeer 1678
 
32464 tejbeer 1679
            List<Integer> salesPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
1680
            List<Integer> rbmPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
30416 tejbeer 1681
 
32464 tejbeer 1682
            salesPositionsAuthIds.addAll(rbmPositionsAuthIds);
30416 tejbeer 1683
 
32464 tejbeer 1684
            Set<Integer> empHierarchy = allReportees.stream().filter(x -> salesPositionsAuthIds.contains(x)).collect(Collectors.toSet());
34027 ranu 1685
            List<AuthUser> authUsers = new ArrayList<>();
1686
            if (!empHierarchy.isEmpty()) {
35395 amit 1687
                authUsers = authRepository.selectByIds(new ArrayList<>(empHierarchy));
34027 ranu 1688
            }
30416 tejbeer 1689
 
1690
 
32464 tejbeer 1691
            Map<Integer, AuthUser> authUserMap = authRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
30416 tejbeer 1692
 
32464 tejbeer 1693
            LOGGER.info("todayPcpmMap {}", todayPcpmMap);
30416 tejbeer 1694
 
32464 tejbeer 1695
            model.addAttribute("authUsers", authUsers);
1696
            model.addAttribute("authUserMap", authUserMap);
1697
            model.addAttribute("partnerCollectionPlanMap", pcpmMap);
1698
            model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
1699
            model.addAttribute("customRetailers", customRetailers);
1700
            model.addAttribute("rankColorMap", ProfitMandiConstants.Rank_Color_Map);
1701
            model.addAttribute("todayOverallCall", todayOverallCall);
30522 tejbeer 1702
 
32464 tejbeer 1703
        }
1704
        return "partner-health";
30522 tejbeer 1705
 
32464 tejbeer 1706
    }
30522 tejbeer 1707
 
32464 tejbeer 1708
    public ChartLeadModel getCollectionCount(List<PartnerCollectionPlanModel> pcpm) throws ProfitMandiBusinessException {
30522 tejbeer 1709
 
32464 tejbeer 1710
        Map<Integer, Long> rankCount = pcpm.stream().collect(Collectors.groupingBy(x -> x.getRank(), Collectors.mapping(PartnerCollectionPlanModel::getRank, Collectors.counting())));
30522 tejbeer 1711
 
32464 tejbeer 1712
        ChartLeadModel cm = new ChartLeadModel();
30522 tejbeer 1713
 
32464 tejbeer 1714
        List<String> labels = new ArrayList<>();
1715
        labels.add("Plan for Today");
1716
        labels.add("Carry Forward");
1717
        labels.add("Untouched");
1718
        labels.add("Plan for Future");
1719
        labels.add("Normal");
30522 tejbeer 1720
 
32464 tejbeer 1721
        List<String> backgroundColor = new ArrayList<>();
1722
        List<Long> values = new ArrayList<>();
30522 tejbeer 1723
 
32464 tejbeer 1724
        for (String label : labels) {
30522 tejbeer 1725
 
32464 tejbeer 1726
            if (label.equals("Plan for Today")) {
1727
                backgroundColor.add("#007bff");
1728
                values.add(rankCount.get(1));
1729
            }
1730
            if (label.equals("Carry Forward")) {
1731
                backgroundColor.add("#ffc107");
1732
                values.add(rankCount.get(2));
1733
            }
1734
            if (label.equals("Untouched")) {
1735
                backgroundColor.add("#dc3545");
1736
                values.add(rankCount.get(3));
1737
            }
1738
            if (label.equals("Plan for Future")) {
1739
                backgroundColor.add("#6c757d");
1740
                values.add(rankCount.get(4));
1741
            }
1742
            if (label.equals("Normal")) {
1743
                backgroundColor.add("White");
1744
                values.add(rankCount.get(5));
1745
            }
30522 tejbeer 1746
 
32464 tejbeer 1747
        }
30522 tejbeer 1748
 
32464 tejbeer 1749
        LOGGER.info("backgroundColor" + backgroundColor);
1750
        LOGGER.info("labelsChartLead" + labels);
1751
        LeadStatusData data = new LeadStatusData();
1752
        data.setData(values);
1753
        data.setBackgroundColor(backgroundColor);
1754
        data.setLabel("DataSet 1");
30522 tejbeer 1755
 
32464 tejbeer 1756
        PieLables label = new PieLables();
1757
        label.setFontColor("black");
1758
        label.setFontSize(15);
30522 tejbeer 1759
 
32464 tejbeer 1760
        Legend legend = new Legend();
1761
        legend.setLabels(label);
1762
        legend.setPosition("left");
30522 tejbeer 1763
 
32464 tejbeer 1764
        List<LeadStatusData> dataList = new ArrayList<>();
1765
        dataList.add(data);
30522 tejbeer 1766
 
32464 tejbeer 1767
        DataLeadModel datasets = new DataLeadModel();
1768
        datasets.setDatasets(dataList);
1769
        datasets.setLabels(labels);
30522 tejbeer 1770
 
32464 tejbeer 1771
        OptionModel om = new OptionModel();
1772
        om.setLegend(legend);
30522 tejbeer 1773
 
32464 tejbeer 1774
        cm.setType("pie");
1775
        cm.setData(datasets);
1776
        cm.setOptions(om);
30522 tejbeer 1777
 
32464 tejbeer 1778
        return cm;
1779
    }
30522 tejbeer 1780
 
32464 tejbeer 1781
    @RequestMapping(value = "/franchiseVisit", method = RequestMethod.GET)
1782
    public String franchiseVisit(HttpServletRequest request, @RequestParam(name = "email", required = false) String email, Model model) throws Exception {
1783
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30522 tejbeer 1784
 
32464 tejbeer 1785
        AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
30522 tejbeer 1786
 
32464 tejbeer 1787
        List<Integer> salesPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
1788
        List<Integer> rbmPositionsAuthIds = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM).stream().map(x -> x.getAuthUserId()).collect(Collectors.toList());
30522 tejbeer 1789
 
32464 tejbeer 1790
        salesPositionsAuthIds.addAll(rbmPositionsAuthIds);
30522 tejbeer 1791
 
32464 tejbeer 1792
        List<Integer> allReportees = authService.getAllReportees(authUser.getId());
30522 tejbeer 1793
 
32464 tejbeer 1794
        Set<Integer> empHierarchy = allReportees.stream().filter(x -> salesPositionsAuthIds.contains(x)).collect(Collectors.toSet());
30522 tejbeer 1795
 
35395 amit 1796
        List<AuthUser> authUsers = authRepository.selectByIds(new ArrayList<>(empHierarchy));
30522 tejbeer 1797
 
32464 tejbeer 1798
        Map<Integer, String> monthValueMap = new HashMap<>();
1799
        for (int i = 0; i <= 5; i++) {
1800
            LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1801
            monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
1802
        }
30522 tejbeer 1803
 
32464 tejbeer 1804
        model.addAttribute("authUsers", authUsers);
1805
        model.addAttribute("monthValueMap", monthValueMap);
30522 tejbeer 1806
 
32464 tejbeer 1807
        return "franchise-visit";
30522 tejbeer 1808
 
32464 tejbeer 1809
    }
30522 tejbeer 1810
 
32464 tejbeer 1811
    @RequestMapping(value = "/getFranchiseVisit", method = RequestMethod.GET)
1812
    public String getFranchiseVisit(HttpServletRequest request, @RequestParam(name = "authId", required = false) int authId, int yearMonth, Model model) throws Exception {
30522 tejbeer 1813
 
32464 tejbeer 1814
        LocalDateTime startDate = LocalDate.now().minusMonths(8).withDayOfMonth(1).atStartOfDay();
1815
        LocalDateTime endDate = startDate.plusMonths(1).withDayOfMonth(1).toLocalDate().atStartOfDay();
30522 tejbeer 1816
 
32464 tejbeer 1817
        DateRangeModel drm = DateRangeModel.of(startDate, endDate);
30522 tejbeer 1818
 
32464 tejbeer 1819
        List<FranchiseeVisit> visits = franchiseeVisitRepository.selectByAuthUserAndDateRange(drm, authId);
30522 tejbeer 1820
 
32464 tejbeer 1821
        if (!visits.isEmpty()) {
30522 tejbeer 1822
 
32464 tejbeer 1823
            Map<Integer, List<FranchiseeVisit>> franchiseeVisitMap = visits.stream().collect(Collectors.groupingBy(x -> x.getScheduleTimestamp().getDayOfMonth()));
30522 tejbeer 1824
 
32464 tejbeer 1825
            model.addAttribute("franchiseeVisitMap", franchiseeVisitMap);
30522 tejbeer 1826
 
32464 tejbeer 1827
        }
30771 amit.gupta 1828
 
32464 tejbeer 1829
        model.addAttribute("visits", visits);
1830
        model.addAttribute("monthLength", startDate.toLocalDate().lengthOfMonth());
30771 amit.gupta 1831
 
32464 tejbeer 1832
        // Calender
30771 amit.gupta 1833
 
32464 tejbeer 1834
        int Year = startDate.getYear(); // year
1835
        int startDayOfMonth = 5;
1836
        int spaces = startDayOfMonth;
30771 amit.gupta 1837
 
32464 tejbeer 1838
        int month = startDate.getMonthValue();
30771 amit.gupta 1839
 
32464 tejbeer 1840
        int[] days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
30771 amit.gupta 1841
 
32464 tejbeer 1842
        LOGGER.info("visits {} ", visits);
30771 amit.gupta 1843
 
32464 tejbeer 1844
        if ((((Year % 4 == 0) && (Year % 100 != 0)) || (Year % 400 == 0)) && month == 2) {
1845
            days[month] = 29;
1846
        }
30771 amit.gupta 1847
 
32464 tejbeer 1848
        spaces = (days[month - 1] + spaces) % 7;
30771 amit.gupta 1849
 
32464 tejbeer 1850
        model.addAttribute("month", month);
1851
        model.addAttribute("spaces", spaces);
1852
        model.addAttribute("days", days);
30771 amit.gupta 1853
 
32464 tejbeer 1854
        return "franchise-visit-container";
30771 amit.gupta 1855
 
32464 tejbeer 1856
    }
31249 tejbeer 1857
 
32464 tejbeer 1858
    @RequestMapping(value = "/getFranchiseeActivity", method = RequestMethod.GET)
1859
    public String getFranchiseeActivity(HttpServletRequest request, int visitId, Model model) throws Exception {
31249 tejbeer 1860
 
32464 tejbeer 1861
        List<FranchiseeActivity> franchiseeActivities = franchiseeActivityRepository.selectByFranchiseeVisitId(visitId);
31249 tejbeer 1862
 
32464 tejbeer 1863
        FranchiseeVisit franchiseeVisit = franchiseeVisitRepository.selectById(visitId);
31249 tejbeer 1864
 
32464 tejbeer 1865
        Map<Integer, AuthUser> authIdAndAuthUserMap = authRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1866
        model.addAttribute("authIdAndAuthUserMap", authIdAndAuthUserMap);
31249 tejbeer 1867
 
32464 tejbeer 1868
        model.addAttribute("franchiseeVisit", franchiseeVisit);
1869
        model.addAttribute("franchiseeActivity", franchiseeActivities.get(0));
31249 tejbeer 1870
 
32464 tejbeer 1871
        return "franchie-visit-detail";
31249 tejbeer 1872
 
32464 tejbeer 1873
    }
31249 tejbeer 1874
 
32464 tejbeer 1875
    @RequestMapping(value = "/indent/today_target", method = RequestMethod.GET)
1876
    public String todayTarget(HttpServletRequest request, Model model) throws Exception {
1877
        List<RBMPerformanceSummaryModel> summaryModels = new ArrayList<>();
1878
        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());
1879
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
1880
        List<TeamCommitmentModel> teamCommitmentModels = partnerCollectionPlanRepository.selectTeamCommitmentByDate(LocalDate.now());
1881
        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())));
1882
        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())));
1883
        LocalDateTime startDate = LocalDate.now().atStartOfDay();
1884
        for (int rbmAuthId : rbmPositionsAuthIds) {
1885
            RBMPerformanceSummaryModel rbmPerformanceSummaryModel = new RBMPerformanceSummaryModel();
1886
            rbmPerformanceSummaryModel.setAuthId(rbmAuthId);
1887
            AuthUser authUser = authRepository.selectById(rbmAuthId);
1888
            rbmPerformanceSummaryModel.setAuthName(authUser.getFullName());
33844 ranu 1889
            List<Integer> fofoIds = new ArrayList<>(storeGuyMap.get(authUser.getEmailId()));
31249 tejbeer 1890
 
32464 tejbeer 1891
            if (fofoIds.size() > 0) {
1892
                fofoIds = fofoStoreRepository.selectByRetailerIds(fofoIds).stream().filter(x -> !x.isInternal()).map(x -> x.getId()).collect(Collectors.toList());
31249 tejbeer 1893
 
32464 tejbeer 1894
                /*
1895
                 * Map<Integer, PartnerCollectionPlanModel> foundCollectionMap =
1896
                 * partnerCollectionService .getCollectionMap(fofoIds, startDate);
1897
                 */
31249 tejbeer 1898
 
33844 ranu 1899
                List<Integer> remarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(fofoIds);
1900
 
32464 tejbeer 1901
                LOGGER.info("remarkIds {}", remarkIds);
31249 tejbeer 1902
 
32464 tejbeer 1903
                long todayOverallCall = 0;
1904
                if (!remarkIds.isEmpty()) {
1905
                    todayOverallCall = partnerCollectionRemarkRepository.selectByIds(remarkIds).stream().filter(x -> x.getCreateTimestamp().toLocalDate().equals(LocalDate.now())).collect(Collectors.counting());
31249 tejbeer 1906
 
32464 tejbeer 1907
                }
31249 tejbeer 1908
 
32464 tejbeer 1909
                Map<Integer, PartnerCollectionPlanModel> collectionMap = partnerCollectionService.getCollectionMap(fofoIds, startDate);
31249 tejbeer 1910
 
32464 tejbeer 1911
                ChartLeadModel cm = this.getCollectionCount(collectionMap.values().stream().collect(Collectors.toList()));
31249 tejbeer 1912
 
32464 tejbeer 1913
                long collectionTarget = collectionMap.values().stream().filter(x -> x.getTargetPlan() != null).collect(Collectors.summingLong(x -> x.getTargetPlan()));
1914
                long collection = collectionMap.values().stream().filter(
1915
                        x -> x.getTargetPlan() != null && x.getTargetPlan() != 0 && x.getAchievementPlan() != null).collect(Collectors.summingLong(x -> x.getAchievementPlan()));
1916
                rbmPerformanceSummaryModel.setChartLeadModel(cm);
1917
                rbmPerformanceSummaryModel.setPartnersCommunicated(todayOverallCall);
1918
                rbmPerformanceSummaryModel.setCollectionTarget(collectionTarget);
1919
                rbmPerformanceSummaryModel.setCollection(collection);
1920
                rbmPerformanceSummaryModel.setSecondaryTarget(rbmSecondaryTargetMap.get(rbmAuthId) == null ? 0 : rbmSecondaryTargetMap.get(rbmAuthId).floatValue());
1921
                rbmPerformanceSummaryModel.setSecondary(
1922
                        rbmSecondaryMap.get(rbmAuthId) == null ? 0 : rbmSecondaryMap.get(rbmAuthId).floatValue());
1923
                summaryModels.add(rbmPerformanceSummaryModel);
1924
                // cm.getData().getDatasets().get(0).getData().;
1925
                // cm.getData().getDatasets().get(0).getBackgroundColor();
1926
                // cm.getData().getLabels()
31249 tejbeer 1927
 
32464 tejbeer 1928
            }
1929
        }
1930
        model.addAttribute("summaryModels", summaryModels);
1931
        return "today_target";
1932
    }
31249 tejbeer 1933
 
32464 tejbeer 1934
    @RequestMapping(value = "/visitPlan", method = RequestMethod.GET)
1935
    public String visitPlan(HttpServletRequest request, Model model) throws Exception {
31249 tejbeer 1936
 
32464 tejbeer 1937
        return "visit-request-plan";
1938
    }
31249 tejbeer 1939
 
32464 tejbeer 1940
    @RequestMapping(value = "/visit/getVisitPlan", method = RequestMethod.GET)
1941
    public String getVisitPlan(HttpServletRequest request, @RequestParam LocalDate date, Model model) throws Exception {
1942
        List<VisitRequest> visitRequests = visitRequestRepository.selectByAuthIdAndDate(date);
31249 tejbeer 1943
 
32464 tejbeer 1944
        List<Integer> leadIds = visitRequests.stream().filter(x -> x.getVisitType().equals("lead")).map(x -> x.getVisitId()).collect(Collectors.toList());
1945
        Map<Integer, Lead> leadMap = new HashMap<>();
1946
        if (!leadIds.isEmpty()) {
1947
            List<Lead> leads = leadRepository.selectAllByIds(leadIds);
31249 tejbeer 1948
 
32464 tejbeer 1949
            for (Lead lead : leads) {
1950
                List<LeadActivity> leadActivities = leadActivityRepository.selectBYLeadId(lead.getId());
1951
                lead.setScheduledTimestamp(leadActivities.get(0).getSchelduleTimestamp());
1952
                lead.setLeadActivity(leadActivities.get(0));
31249 tejbeer 1953
 
32464 tejbeer 1954
                leadMap.put(lead.getId(), lead);
1955
            }
31249 tejbeer 1956
 
32464 tejbeer 1957
        }
1958
        List<Integer> franchiseeIds = visitRequests.stream().filter(x -> x.getVisitType().equals("franchiseeVisit")).map(x -> x.getVisitId()).collect(Collectors.toList());
1959
        Map<Integer, FranchiseeVisit> franchiseeVisitsMap = new HashMap<>();
1960
        if (!franchiseeIds.isEmpty()) {
1961
            List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectAllByIds(franchiseeIds);
1962
            LOGGER.info("franchiseeVisits {}", franchiseeVisits);
31249 tejbeer 1963
 
32464 tejbeer 1964
            for (FranchiseeVisit franchiseeVisit : franchiseeVisits) {
1965
                List<FranchiseeActivity> franchiseeActivities = franchiseeActivityRepository.selectByFranchiseeVisitId(franchiseeVisit.getId());
1966
                LOGGER.info("franchiseeActivities {}", franchiseeActivities);
1967
 
1968
                franchiseeVisit.setScheduleTimestamp(franchiseeActivities.get(0).getSchelduleTimestamp());
1969
                franchiseeVisit.setFranchiseeActivity(franchiseeActivities.get(0));
1970
 
1971
                franchiseeVisitsMap.put(franchiseeVisit.getId(), franchiseeVisit);
1972
            }
1973
 
1974
        }
1975
 
1976
        Map<Integer, List<VisitRequest>> visitRequestMap = visitRequests.stream().collect(Collectors.groupingBy(x -> x.getCreatedBy()));
1977
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
1978
        List<UserVisitModel> userVisits = new ArrayList<>();
1979
 
1980
        for (AuthUser authUser : authUsers) {
1981
 
1982
            List<VisitRequest> authVisitRequests = visitRequestMap.get(authUser.getId());
1983
 
1984
            if (authVisitRequests != null) {
1985
                UserVisitModel userVisitModel = new UserVisitModel();
1986
                userVisitModel.setAuthUser(authUser.getFullName());
1987
                List<VisitDescriptionModel> visitDescriptions = new ArrayList<>();
1988
 
1989
                for (VisitRequest authVisitRequest : authVisitRequests) {
1990
                    VisitDescriptionModel visitDescriptionModel = new VisitDescriptionModel();
1991
                    visitDescriptionModel.setVisitId(authVisitRequest.getVisitId());
1992
 
1993
                    if (authVisitRequest.getVisitType().equals("lead")) {
1994
                        Lead lead = leadMap.get(authVisitRequest.getVisitId());
1995
 
1996
                        visitDescriptionModel.setVisitName(lead.getFirstName());
1997
                        visitDescriptionModel.setCity(lead.getCity());
1998
                        visitDescriptionModel.setState(lead.getState());
1999
                        visitDescriptionModel.setScheduleTime(lead.getScheduledTimestamp());
2000
                        visitDescriptionModel.setRemarks(lead.getLeadActivity().getRemark());
2001
 
2002
                    } else {
2003
                        FranchiseeVisit franchiseeVisit = franchiseeVisitsMap.get(authVisitRequest.getVisitId());
2004
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(franchiseeVisit.getFofoId());
2005
 
2006
                        visitDescriptionModel.setVisitName(franchiseeVisit.getPartnerName());
2007
                        visitDescriptionModel.setCity(customRetailer.getAddress().getCity());
2008
                        visitDescriptionModel.setState(customRetailer.getAddress().getState());
2009
                        visitDescriptionModel.setScheduleTime(franchiseeVisit.getFranchiseeActivity().getSchelduleTimestamp());
2010
                        visitDescriptionModel.setRemarks(franchiseeVisit.getAgenda());
2011
 
2012
                    }
2013
 
2014
                    if (authVisitRequest.getActionedBy() != 0) {
2015
                        AuthUser au = authRepository.selectById(authVisitRequest.getActionedBy());
2016
 
2017
                        visitDescriptionModel.setActionBy(au.getFullName());
2018
                    }
2019
                    visitDescriptionModel.setStatus(authVisitRequest.getStatus());
2020
                    visitDescriptionModel.setVisitType(authVisitRequest.getVisitType());
2021
                    visitDescriptions.add(visitDescriptionModel);
2022
                }
2023
 
2024
                userVisitModel.setVisitDescriptions(visitDescriptions);
2025
                userVisits.add(userVisitModel);
2026
            }
2027
 
2028
        }
2029
 
2030
        model.addAttribute("userVisits", userVisits);
2031
 
2032
        return "visit-request-plan";
2033
    }
25979 tejbeer 2034
}