Subversion Repositories SmartDukaan

Rev

Rev 36792 | Details | Compare with Previous | Last modification | View Log | RSS feed

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