Subversion Repositories SmartDukaan

Rev

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

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