Subversion Repositories SmartDukaan

Rev

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