Subversion Repositories SmartDukaan

Rev

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