Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
24383 amit.gupta 1
package com.spice.profitmandi.dao.repository.cs;
24500 govind 2
 
31762 tejbeer 3
import java.time.LocalDateTime;
4
import java.util.ArrayList;
5
import java.util.Arrays;
6
import java.util.HashMap;
7
import java.util.HashSet;
8
import java.util.LinkedHashSet;
9
import java.util.List;
10
import java.util.Map;
11
import java.util.Set;
12
import java.util.stream.Collectors;
13
 
14
import org.apache.commons.collections4.map.HashedMap;
15
import org.apache.commons.lang.RandomStringUtils;
16
import org.apache.commons.lang.StringUtils;
17
import org.apache.logging.log4j.LogManager;
18
import org.apache.logging.log4j.Logger;
19
import org.springframework.beans.factory.annotation.Autowired;
20
import org.springframework.cache.annotation.Cacheable;
21
import org.springframework.mail.javamail.JavaMailSender;
22
import org.springframework.stereotype.Component;
23
 
24383 amit.gupta 24
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
24417 govind 25
import com.spice.profitmandi.common.model.CustomRetailer;
24439 govind 26
import com.spice.profitmandi.common.model.ProfitMandiConstants;
27
import com.spice.profitmandi.common.util.Utils;
24417 govind 28
import com.spice.profitmandi.dao.entity.auth.AuthUser;
31762 tejbeer 29
import com.spice.profitmandi.dao.entity.cs.Activity;
30
import com.spice.profitmandi.dao.entity.cs.PartnerRegion;
31
import com.spice.profitmandi.dao.entity.cs.Position;
32
import com.spice.profitmandi.dao.entity.cs.Region;
33
import com.spice.profitmandi.dao.entity.cs.Ticket;
34
import com.spice.profitmandi.dao.entity.cs.TicketAssigned;
35
import com.spice.profitmandi.dao.entity.cs.TicketCategory;
36
import com.spice.profitmandi.dao.entity.cs.TicketSubCategory;
24383 amit.gupta 37
import com.spice.profitmandi.dao.entity.fofo.ActivityType;
30003 tejbeer 38
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24417 govind 39
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
30003 tejbeer 40
import com.spice.profitmandi.dao.model.FofoReportingModel;
24417 govind 41
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
25570 tejbeer 42
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24417 govind 43
import com.spice.profitmandi.service.user.RetailerService;
24383 amit.gupta 44
 
45
@Component
46
public class CsServiceImpl implements CsService {
24417 govind 47
 
31762 tejbeer 48
    private static final int ALL_PARTNERS_REGION = 5;
27124 amit.gupta 49
 
31762 tejbeer 50
    private static final Logger LOGGER = LogManager.getLogger(CsServiceImpl.class);
24439 govind 51
 
31762 tejbeer 52
    private static final String ASSIGNED_TICKET = "Dear %s, New ticket #%s #%s created by %s has been assigned to you. Regards\nSmartdukaan";
53
    private static final String ESCALATED_TICKET = "Dear %s, Ticket #%s #%s created by %s has been escalated to you. Regards\nSmartdukaan";
54
    private static final String CATEGORY_CHANGED_TICKET = "Dear team, Category of Ticket #%s created by %s has been changed to %s. Regards\nSmartdukaan";
55
    private static final String ASSINMENT_SUBJECT = "Assignment Ticket";
24439 govind 56
 
31762 tejbeer 57
    @Autowired
58
    TicketRepository ticketRepository;
24417 govind 59
 
31762 tejbeer 60
    @Autowired
61
    JavaMailSender mailSender;
24439 govind 62
 
31762 tejbeer 63
    @Autowired
64
    TicketCategoryRepository ticketCategoryRepository;
24417 govind 65
 
31762 tejbeer 66
    @Autowired
67
    TicketSubCategoryRepository ticketSubCategoryRepository;
24417 govind 68
 
31762 tejbeer 69
    @Autowired
70
    ActivityRepository activityRepository;
24417 govind 71
 
31762 tejbeer 72
    @Autowired
73
    PartnerRegionRepository partnerRegionRepository;
24417 govind 74
 
31762 tejbeer 75
    @Autowired
76
    private PositionRepository positionRepository;
24417 govind 77
 
31762 tejbeer 78
    @Autowired
79
    private AuthRepository authRepository;
24417 govind 80
 
31762 tejbeer 81
    @Autowired
82
    private RetailerService retailerService;
24500 govind 83
 
31762 tejbeer 84
    @Autowired
85
    private RegionRepository regionRepository;
24417 govind 86
 
31762 tejbeer 87
    @Autowired
88
    private TicketAssignedRepository ticketAssignedRepository;
24500 govind 89
 
31762 tejbeer 90
    @Autowired
91
    private PartnersPositionRepository partnersPositionRepository;
25570 tejbeer 92
 
31762 tejbeer 93
    @Autowired
94
    private FofoStoreRepository fofoStoreRepository;
25570 tejbeer 95
 
31762 tejbeer 96
    @Override
97
    public void createTicket(int fofoId, int categoryId, int subcategoryId, String message) throws ProfitMandiBusinessException {
24417 govind 98
 
31762 tejbeer 99
        ActivityType type = ActivityType.OPENED;
100
        Ticket ticket = new Ticket();
101
        ticket.setSubCategoryId(subcategoryId);
102
        ticket.setFofoId(fofoId);
103
        ticket.setCreateTimestamp(LocalDateTime.now());
104
        ticket.setUpdateTimestamp(LocalDateTime.now());
105
        ticket.setHappyCode(getRandomString());
106
        ticketRepository.persist(ticket);
107
        this.addActivity(ticket, this.createActivity(type, message, 0));
108
        this.assignTicket(ticket);
27124 amit.gupta 109
 
31762 tejbeer 110
    }
27124 amit.gupta 111
 
31762 tejbeer 112
    @Override
113
    public void assignTicket(Ticket ticket) throws ProfitMandiBusinessException {
114
        TicketAssigned ticketAssigned = null;
115
        EscalationType newEscalationType = EscalationType.L1;
116
        if (ticket.getAssignmentId() > 0) {
117
            ticketAssigned = ticketAssignedRepository.selectById(ticket.getAssignmentId());
118
            newEscalationType = ticketAssigned.getEscalationType().next();
119
            if (newEscalationType == null || newEscalationType.equals(EscalationType.Final)) {
120
                LOGGER.info("Cant escalate further");
121
                return;
122
            }
123
        } else {
124
            ticket.setL1AuthUser(0);
125
            ticket.setL2AuthUser(0);
126
            ticket.setL3AuthUser(0);
127
            ticket.setL4AuthUser(0);
128
            ticket.setL5AuthUser(0);
129
        }
130
        ticket.setUpdateTimestamp(LocalDateTime.now());
27124 amit.gupta 131
 
132
 
31762 tejbeer 133
        TicketSubCategory ticketSubCategory = ticketSubCategoryRepository.selectById(ticket.getSubCategoryId());
134
        TicketCategory ticketCategory = ticketCategoryRepository.selectById(ticketSubCategory.getCategoryId());
135
        Map<Integer, EscalationType> escalationUserMap = new HashedMap<>();
136
        Set<Integer> assigneeUserIds = new LinkedHashSet<>();
137
        EscalationType escalationTypeNext = newEscalationType;
138
        do {
139
            int assigneeUserId = this.getAuthUserId(ticketCategory.getId(), escalationTypeNext, ticket.getFofoId());
140
            if (assigneeUserId == 0) {
141
                escalationTypeNext = escalationTypeNext.next();
142
                LOGGER.info("Escalation type next {}", escalationTypeNext);
143
                continue;
144
            }
145
            assigneeUserIds.add(assigneeUserId);
146
            escalationUserMap.put(assigneeUserId, escalationTypeNext);
147
            switch (escalationTypeNext) {
148
                case L1:
149
                    ticket.setL1AuthUser(assigneeUserId);
150
                    break;
151
                case L2:
152
                    ticket.setL2AuthUser(assigneeUserId);
153
                    break;
154
                case L3:
155
                    ticket.setL3AuthUser(assigneeUserId);
156
                    break;
157
                case L4:
158
                    ticket.setL4AuthUser(assigneeUserId);
159
                    break;
160
                case L5:
161
                    ticket.setL5AuthUser(assigneeUserId);
162
                    break;
27545 tejbeer 163
 
31762 tejbeer 164
                default:
165
                    break;
166
            }
167
            escalationTypeNext = escalationTypeNext.next();
168
            // LOGGER.info("Escalation type next {}", escalationTypeNext);
169
        } while (!escalationTypeNext.equals(EscalationType.Final));
27124 amit.gupta 170
 
31762 tejbeer 171
        int assigneeAuthId = assigneeUserIds.stream().findFirst().orElse(0);
27545 tejbeer 172
 
31762 tejbeer 173
        int managerAuthId = 0;
174
        EscalationType assigneeEscalationType = null;
175
        if (assigneeAuthId == 0) {
176
            assigneeAuthId = ProfitMandiConstants.FINAL_AUTH_ID;
177
            assigneeEscalationType = EscalationType.Final;
178
            managerAuthId = ProfitMandiConstants.FINAL_AUTH_ID;
179
        } else {
180
            assigneeEscalationType = escalationUserMap.get(assigneeAuthId);
181
            managerAuthId = assigneeUserIds.stream().skip(1).findFirst().orElse(0);
182
            if (managerAuthId == 0) {
183
                managerAuthId = ProfitMandiConstants.FINAL_AUTH_ID;
184
            }
185
        }
27545 tejbeer 186
 
31762 tejbeer 187
        TicketAssigned ticketAssignedNew = new TicketAssigned();
188
        ticketAssignedNew.setTicketId(ticket.getId());
189
        ticketAssignedNew.setAssineeId(assigneeAuthId);
190
        ticketAssignedNew.setEscalationType(assigneeEscalationType);
191
        ticketAssignedNew.setManagerId(managerAuthId);
192
        ticketAssignedNew.setCreateTimestamp(LocalDateTime.now());
193
        ticketAssignedRepository.persist(ticketAssignedNew);
194
        LOGGER.info(ticketAssigned);
24383 amit.gupta 195
 
31762 tejbeer 196
        AuthUser authUser = authRepository.selectById(ticketAssignedNew.getAssineeId());
197
        AuthUser authUserManager = null;
27124 amit.gupta 198
 
31762 tejbeer 199
        // Dont send cc mail if both are same
200
        if (managerAuthId != assigneeAuthId) {
201
            authUserManager = authRepository.selectById(managerAuthId);
202
        }
203
        ticket.setAssignmentId(ticketAssignedNew.getId());
27124 amit.gupta 204
 
31762 tejbeer 205
        List<Activity> activities = activityRepository.selectAll(ticket.getId());
206
        this.sendAssignedTicketMail(authUser, Arrays.asList(authUserManager), ticket, ticketAssigned != null, activities);
207
        if (!ticketAssignedNew.getEscalationType().equals(EscalationType.L1)) {
208
            this.addActivity(ticket, this.createActivity(ActivityType.ESCALATED, "Ticket ecalated and assigned to " + authUser.getName(), 0));
209
        } else {
210
            this.addActivity(ticket, this.createActivity(ActivityType.ASSIGNED, "Ticket assigned to " + authUser.getName(), 0));
211
        }
212
    }
27124 amit.gupta 213
 
31762 tejbeer 214
    @Override
215
    public void updateTicket(int categoryId, int subCategoryId, Ticket ticket, int authUserId, EscalationType escalationType) throws ProfitMandiBusinessException {
27545 tejbeer 216
 
31762 tejbeer 217
        TicketSubCategory ticketSubCategory = ticketSubCategoryRepository.getTicketSubCategoryMap().get(subCategoryId);
218
        if (ticketSubCategory == null) {
219
            throw new ProfitMandiBusinessException("Could not find subCategoryId " + subCategoryId + "- " + categoryId, "Problem", "Problem");
220
        }
221
        String storeName = retailerService.getAllFofoRetailers().get(ticket.getFofoId()).getBusinessName();
222
        List<TicketAssigned> oldTicketAssignedList = ticketAssignedRepository.selectByTicketIds(Arrays.asList(ticket.getId()));
223
        for (TicketAssigned oldTicketAssigned : oldTicketAssignedList) {
224
            ticketAssignedRepository.delete(oldTicketAssigned);
225
        }
27124 amit.gupta 226
 
31762 tejbeer 227
        if (ticket.getSubCategoryId() != ticketSubCategory.getId()) {
228
            ticket.setSubCategoryId(ticketSubCategory.getId());
229
            List<Integer> oldAssignedAuthUserIds = oldTicketAssignedList.stream().map(x -> x.getAssineeId()).collect(Collectors.toList());
230
            List<String> oldAssignedEmailIds = authRepository.selectAllAuthUserByIds(oldAssignedAuthUserIds).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
231
            String mailTo = oldAssignedEmailIds.remove(0);
232
            String message = String.format(CATEGORY_CHANGED_TICKET, ticket.getId(), storeName, ticketSubCategory.getTicketCategory().getName() + " - " + ticketSubCategory.getName());
233
            try {
234
                Utils.sendMailWithAttachments(mailSender, mailTo, oldAssignedEmailIds.toArray(new String[0]), "Ticket Category/Subcategory Changed", message, null);
235
            } catch (Exception e) {
236
                LOGGER.info("Could not send mail for ticket {}", ticket.toString());
237
            }
24417 govind 238
 
31762 tejbeer 239
            Activity categoryChangedActivity = this.createActivity(ActivityType.CATEGORY_CHANGED, "Category changed to " + ticketSubCategory.getTicketCategory().getName() + " - " + ticketSubCategory.getName(), 0);
240
            this.addActivity(ticket, categoryChangedActivity);
24439 govind 241
 
24383 amit.gupta 242
 
31762 tejbeer 243
        }
24383 amit.gupta 244
 
31762 tejbeer 245
        if (authUserId > 0) {
24439 govind 246
 
31762 tejbeer 247
            this.assignTicketByAuthId(ticket, authUserId, escalationType);
24417 govind 248
 
31762 tejbeer 249
        } else {
250
            ticket.setAssignmentId(0);
251
            this.assignTicket(ticket);
252
        }
24417 govind 253
 
31762 tejbeer 254
    }
24500 govind 255
 
31762 tejbeer 256
    private void assignTicketByAuthId(Ticket ticket, int authUserId, EscalationType escalationType) throws ProfitMandiBusinessException {
24500 govind 257
 
31762 tejbeer 258
        AuthUser authUser = authRepository.selectById(authUserId);
24500 govind 259
 
31762 tejbeer 260
        LOGGER.info("authUser {}", authUser);
24417 govind 261
 
31762 tejbeer 262
        int managerAuthId = authUser.getManagerId();
24417 govind 263
 
31762 tejbeer 264
        if (escalationType.equals(EscalationType.L1)) {
265
            ticket.setL1AuthUser(authUserId);
266
            ticket.setL2AuthUser(0);
267
            ticket.setL3AuthUser(0);
268
            ticket.setL4AuthUser(0);
269
            ticket.setL5AuthUser(0);
270
        } else if (escalationType.equals(EscalationType.L2)) {
271
            ticket.setL2AuthUser(authUserId);
272
            ticket.setL3AuthUser(0);
273
            ticket.setL4AuthUser(0);
274
            ticket.setL5AuthUser(0);
275
        }
276
        if (escalationType.equals(EscalationType.L3)) {
277
            ticket.setL3AuthUser(authUserId);
278
            ticket.setL4AuthUser(0);
279
            ticket.setL5AuthUser(0);
280
        }
281
        if (escalationType.equals(EscalationType.L4)) {
30426 tejbeer 282
 
31762 tejbeer 283
            ticket.setL4AuthUser(authUserId);
284
            ticket.setL5AuthUser(0);
285
        }
286
        if (escalationType.equals(EscalationType.L5)) {
287
            ticket.setL5AuthUser(authUserId);
288
        }
30426 tejbeer 289
 
24417 govind 290
 
31762 tejbeer 291
        TicketAssigned ticketAssignedNew = new TicketAssigned();
292
        ticketAssignedNew.setTicketId(ticket.getId());
293
        ticketAssignedNew.setAssineeId(authUserId);
294
        ticketAssignedNew.setEscalationType(escalationType);
295
        ticketAssignedNew.setManagerId(managerAuthId);
296
        ticketAssignedNew.setCreateTimestamp(LocalDateTime.now());
297
        ticketAssignedRepository.persist(ticketAssignedNew);
24439 govind 298
 
31762 tejbeer 299
        LOGGER.info("ticketAssignedNew {}", ticketAssignedNew);
24439 govind 300
 
24500 govind 301
 
31762 tejbeer 302
        AuthUser authUserManager = null;
24439 govind 303
 
24500 govind 304
 
31762 tejbeer 305
        // Dont send cc mail if both are same
306
        if (managerAuthId != authUserId) {
307
            authUserManager = authRepository.selectById(managerAuthId);
308
        }
309
        ticket.setAssignmentId(ticketAssignedNew.getId());
27124 amit.gupta 310
 
25570 tejbeer 311
 
31762 tejbeer 312
        List<Activity> activities = activityRepository.selectAll(ticket.getId());
25570 tejbeer 313
 
31762 tejbeer 314
        this.sendAssignedTicketMail(authUser, Arrays.asList(authUserManager), ticket, false, activities);
315
        if (!ticketAssignedNew.getEscalationType().equals(EscalationType.L1)) {
316
            this.addActivity(ticket, this.createActivity(ActivityType.ESCALATED, "Ticket ecalated and assigned to " + authUser.getName(), 0));
317
        } else {
318
            this.addActivity(ticket, this.createActivity(ActivityType.ASSIGNED, "Ticket assigned to " + authUser.getName(), 0));
319
        }
25570 tejbeer 320
 
31762 tejbeer 321
    }
25570 tejbeer 322
 
31762 tejbeer 323
    @Override
324
    public Activity createActivity(ActivityType activityType, String message, int createdBy) {
325
        Activity activity = new Activity();
326
        activity.setMessage(message);
327
        activity.setCreatedBy(createdBy);
328
        activity.setType(activityType);
329
        activity.setCreateTimestamp(LocalDateTime.now());
330
        activityRepository.persist(activity);
331
        return activity;
332
    }
25570 tejbeer 333
 
31762 tejbeer 334
    @Override
335
    public int getAuthUserId(int categoryId, EscalationType escalationType, int fofoId) {
336
        int authUserId = 0;
337
        List<Position> positions = positionRepository.selectPositionbyCategoryIdAndEscalationType(categoryId, escalationType);
338
        List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
339
        // Add all Partner regions id
340
        regionIds.add(ALL_PARTNERS_REGION);
341
        LOGGER.info("Escalation Type {}, Region Ids {}", escalationType, regionIds);
342
        List<Integer> partnerPositionsIds = partnersPositionRepository.selectByRegionIdAndPartnerId(regionIds, Arrays.asList(0, fofoId)).stream().map(x -> x.getPositionId()).collect(Collectors.toList());
343
        positions = positions.stream().filter(x -> partnerPositionsIds.contains(x.getId())).collect(Collectors.toList());
344
        LOGGER.info("User List List {}", positions.stream().map(x -> x.getAuthUserId()).collect(Collectors.toList()));
345
        if (positions.size() > 0) {
25570 tejbeer 346
 
31762 tejbeer 347
            List<Position> positionAssignee = positions.stream().filter(x -> x.isTicketAssignee()).collect(Collectors.toList());
25570 tejbeer 348
 
349
 
31762 tejbeer 350
            if (positionAssignee.size() > 0) {
25570 tejbeer 351
 
31762 tejbeer 352
                positions = positionAssignee;
353
            }
354
            List<AuthUser> authUsers = authRepository.selectAllAuthUserByIds(
355
                    positions.stream().map(x -> x.getAuthUserId()).collect(Collectors.toList()));
356
            authUsers = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toList());
357
            if (authUsers.size() > 0) {
358
                authUserId = authUsers.get(0).getId();
359
                /*
360
                 * Random rand = new Random(); authUserId =
361
                 * authUsers.get(rand.nextInt(authUsers.size())).getId();
362
                 */
363
            }
364
        }
365
        return authUserId;
25570 tejbeer 366
 
31762 tejbeer 367
    }
25597 amit.gupta 368
 
31762 tejbeer 369
    @Override
370
    public void addActivity(Ticket ticket, Activity activity) {
371
        activity.setTicketId(ticket.getId());
372
        ticket.setLastActivity(activity.getType());
373
        ticket.setLastActivityId(activity.getId());
374
    }
25597 amit.gupta 375
 
31762 tejbeer 376
    private String getRandomString() {
377
        int length = 4;
378
        boolean useLetters = false;
379
        boolean useNumbers = true;
380
        String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);
381
        return generatedString;
382
    }
25721 tejbeer 383
 
31762 tejbeer 384
    @Override
385
    public void addPartnerToRegion(int regionId, List<Integer> fofoIds) {
25721 tejbeer 386
 
31762 tejbeer 387
        for (int fofoId : fofoIds) {
388
            PartnerRegion partnerRegion = new PartnerRegion();
389
            partnerRegion.setFofoId(fofoId);
390
            partnerRegion.setRegionId(regionId);
391
            partnerRegionRepository.persist(partnerRegion);
392
        }
393
    }
25721 tejbeer 394
 
31762 tejbeer 395
    @Override
396
    public Map<Integer, AuthUser> getAuthUserIdAndAuthUserMap(List<TicketAssigned> ticketAssigneds) {
397
        Map<Integer, AuthUser> authUserIdAndAuthUserMap = new HashMap<>();
31152 tejbeer 398
 
31762 tejbeer 399
        for (TicketAssigned ticketAssigned : ticketAssigneds) {
400
            AuthUser authUser = authRepository.selectById(ticketAssigned.getAssineeId());
401
            authUserIdAndAuthUserMap.put(ticketAssigned.getTicketId(), authUser);
402
        }
403
        return authUserIdAndAuthUserMap;
404
    }
31465 tejbeer 405
 
31762 tejbeer 406
    @Override
407
    public Map<Integer, AuthUser> getTicketIdAndAuthUserMapUsingTickets(List<Ticket> tickets) {
408
        Map<Integer, AuthUser> authUserIdAndAuthUserMap = new HashMap<>();
31465 tejbeer 409
 
31762 tejbeer 410
        for (Ticket ticket : tickets) {
411
            AuthUser authUser = authRepository.selectById(ticket.getL1AuthUser());
412
            authUserIdAndAuthUserMap.put(ticket.getId(), authUser);
413
        }
414
        return authUserIdAndAuthUserMap;
415
    }
31152 tejbeer 416
 
31762 tejbeer 417
    @Override
418
    public Map<Integer, TicketSubCategory> getSubCategoryIdAndSubCategoryMap(List<Integer> subCategoryIds) {
419
        Map<Integer, TicketSubCategory> subCategoryIdAndSubCategoryMap = new HashMap<>();
420
        subCategoryIdAndSubCategoryMap = ticketSubCategoryRepository.selectByIds(subCategoryIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
421
        return subCategoryIdAndSubCategoryMap;
422
    }
31152 tejbeer 423
 
31762 tejbeer 424
    @Override
425
    public Map<Integer, CustomRetailer> getPartnerByFofoIds(List<Ticket> tickets) {
426
        List<Integer> fofoIds = new ArrayList<>();
427
        LOGGER.info(tickets);
428
        if (tickets == null) {
429
            return null;
430
        }
431
        for (Ticket ticket : tickets) {
432
            fofoIds.add(ticket.getFofoId());
433
        }
25721 tejbeer 434
 
31762 tejbeer 435
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
25721 tejbeer 436
 
31762 tejbeer 437
        Map<Integer, CustomRetailer> fofoIdsAndCustomRetailer = fofoIds.stream().distinct().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
438
        return fofoIdsAndCustomRetailer;
439
    }
25799 tejbeer 440
 
31762 tejbeer 441
    @Override
442
    public List<TicketCategory> getAllTicketCategotyFromSubCategory() {
25721 tejbeer 443
 
31762 tejbeer 444
        List<TicketSubCategory> ticketSubCategories = ticketSubCategoryRepository.selectAll();
445
        HashSet<Integer> categoryIds = new HashSet<>();
446
        for (TicketSubCategory ticketSubcategory : ticketSubCategories) {
447
            categoryIds.add(ticketSubcategory.getCategoryId());
448
        }
449
        List<TicketCategory> ticketcategories = ticketCategoryRepository.selectAll(new ArrayList<>(categoryIds));
450
        return ticketcategories;
451
    }
25799 tejbeer 452
 
31762 tejbeer 453
    @Override
454
    public Map<Integer, AuthUser> getAuthUserIdAndAuthUserMapUsingPositions(List<Position> positions) {
455
        Map<Integer, AuthUser> authUserIdAndAuthUserMap = new HashMap<>();
456
        for (Position position : positions) {
457
            AuthUser authUser = authRepository.selectById(position.getAuthUserId());
458
            authUserIdAndAuthUserMap.put(position.getAuthUserId(), authUser);
459
        }
460
        return authUserIdAndAuthUserMap;
461
    }
25721 tejbeer 462
 
31762 tejbeer 463
    @Override
464
    public Map<Integer, TicketCategory> getCategoryIdAndCategoryUsingPositions(List<Position> positions) {
465
        Map<Integer, TicketCategory> categoryIdAndCategoryMap = new HashMap<>();
466
        for (Position position : positions) {
467
            TicketCategory ticketCategory = ticketCategoryRepository.selectById(position.getCategoryId());
468
            categoryIdAndCategoryMap.put(position.getCategoryId(), ticketCategory);
469
        }
470
        return categoryIdAndCategoryMap;
471
    }
29318 tejbeer 472
 
31762 tejbeer 473
    @Override
474
    public Map<Integer, Region> getRegionIdAndRegionMap(List<Position> positions) {
475
        Map<Integer, Region> regionIdAndRegionMap = new HashMap<>();
476
        for (Position position : positions) {
477
            Region region = regionRepository.selectById(position.getRegionId());
478
            regionIdAndRegionMap.put(position.getRegionId(), region);
479
        }
480
        return regionIdAndRegionMap;
481
    }
29318 tejbeer 482
 
31762 tejbeer 483
    private void sendAssignedTicketMail(AuthUser authUserTo, List<AuthUser> authUsersCc, Ticket ticket, boolean isEscalated, List<Activity> activities) throws ProfitMandiBusinessException {
484
        try {
485
            String[] ccTo = authUsersCc.stream().filter(x -> x != null).map(x -> x.getEmailId()).toArray(String[]::new);
25721 tejbeer 486
 
31762 tejbeer 487
            String messageFormat = null;
488
            if (isEscalated) {
489
                messageFormat = ESCALATED_TICKET;
490
            } else {
491
                messageFormat = ASSIGNED_TICKET;
492
            }
493
            String message = String.format(messageFormat, authUserTo.getName(), ticket.getId(), activities.get(0).getMessage(), retailerService.getFofoRetailer(ticket.getFofoId()).getBusinessName());
494
            Utils.sendMailWithAttachments(mailSender, authUserTo.getEmailId(), ccTo, ASSINMENT_SUBJECT, message, null);
495
        } catch (Exception e) {
496
            e.printStackTrace();
497
            throw new ProfitMandiBusinessException("Ticket Assingment", authUserTo.getEmailId(), "Could not send ticket assignment mail");
498
        }
499
    }
26298 tejbeer 500
 
31762 tejbeer 501
    @Override
502
    public Map<Integer, List<CustomRetailer>> getPositionCustomRetailerMap(List<Position> positions) {
503
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
504
        Map<Integer, List<CustomRetailer>> positionRetailerMap = new HashMap<>();
505
        for (Position position : positions) {
506
            List<Integer> fofoIds = partnersPositionRepository.selectByPositionId(position.getId()).stream().map(x -> x.getFofoId()).collect(Collectors.toList());
26978 tejbeer 507
 
31762 tejbeer 508
            LOGGER.info("fofoIds - {}", fofoIds);
509
            if (!fofoIds.isEmpty()) {
510
                if (fofoIds.contains(0)) {
511
                    fofoIds = partnerRegionRepository.selectByRegionId(position.getRegionId()).stream().map(x -> x.getFofoId()).collect(Collectors.toList());
512
                    if (fofoIds.contains(0)) {
513
                        fofoIds = new ArrayList<>(customRetailerMap.keySet());
514
                    }
26978 tejbeer 515
 
31762 tejbeer 516
                }
517
                LOGGER.info("fofoIds - {}", fofoIds);
518
                positionRetailerMap.put(position.getId(), fofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()));
26978 tejbeer 519
 
31762 tejbeer 520
            }
521
        }
522
        return positionRetailerMap;
523
    }
26978 tejbeer 524
 
31762 tejbeer 525
    @Override
526
    public Map<Integer, List<CustomRetailer>> getRegionPartners(List<Position> positions) {
527
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
528
        Map<Integer, List<CustomRetailer>> positionIdAndpartnerRegionMap = new HashedMap<>();
529
        for (Position position : positions) {
530
            List<Integer> fofoIds = partnerRegionRepository.selectByRegionId(position.getRegionId()).stream().map(x -> x.getFofoId()).collect(Collectors.toList());
26978 tejbeer 531
 
31762 tejbeer 532
            if (!fofoIds.isEmpty()) {
533
                if (fofoIds.contains(0)) {
534
                    fofoIds = fofoStoreRepository.selectAll().stream().map(x -> x.getId()).collect(Collectors.toList());
26978 tejbeer 535
 
31762 tejbeer 536
                }
26978 tejbeer 537
 
31762 tejbeer 538
                Map<Integer, CustomRetailer> fofoRetailers = fofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
539
                positionIdAndpartnerRegionMap.put(position.getRegionId(), new ArrayList<CustomRetailer>(fofoRetailers.values()));
540
            }
26978 tejbeer 541
 
31762 tejbeer 542
        }
26978 tejbeer 543
 
31762 tejbeer 544
        return positionIdAndpartnerRegionMap;
545
    }
26978 tejbeer 546
 
31762 tejbeer 547
    @Override
548
    @Cacheable(value = "authUserEmailMapping", cacheManager = "thirtyMinsTimeOutCacheManager")
549
    public Map<String, Set<String>> getAuthUserPartnerEmailMapping() {
550
        Map<String, Set<String>> storeGuyMap = new HashMap<>();
551
        Set<Integer> activeFofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId()).collect(Collectors.toSet());
552
        List<Position> categoryPositions = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
553
        categoryPositions.addAll(positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM));
554
        Map<Integer, Position> positionsMap = categoryPositions.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
29229 tejbeer 555
 
31762 tejbeer 556
        Map<Integer, List<CustomRetailer>> positonPartnerMap = this.getPositionCustomRetailerMap(categoryPositions);
557
        for (Map.Entry<Integer, List<CustomRetailer>> positionPartnerEntry : positonPartnerMap.entrySet()) {
558
            int authUserId = positionsMap.get(positionPartnerEntry.getKey()).getAuthUserId();
559
            Set<String> partnerEmails = positionPartnerEntry.getValue().stream().filter(x -> activeFofoIds.contains(x.getPartnerId())).map(x -> x.getEmail()).collect(Collectors.toSet());
560
            AuthUser authUser = authRepository.selectById(authUserId);
561
            if (authUser.isActive()) {
562
                if (!storeGuyMap.containsKey(authUser.getEmailId())) {
563
                    storeGuyMap.put(authUser.getEmailId(), partnerEmails);
564
                } else {
565
                    storeGuyMap.get(authUser.getEmailId()).addAll(partnerEmails);
566
                }
567
            }
568
        }
569
        return storeGuyMap;
570
    }
29229 tejbeer 571
 
31762 tejbeer 572
    @Override
573
    @Cacheable(value = "authUserEmailPartnerIdMapping", cacheManager = "thirtyMinsTimeOutCacheManager")
574
    public Map<String, Set<Integer>> getAuthUserPartnerIdMapping() {
575
        Map<String, Set<Integer>> storeGuyMap = new HashMap<>();
576
        Set<Integer> activeFofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId()).collect(Collectors.toSet());
577
        List<Position> categoryPositions = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
578
        categoryPositions.addAll(positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM));
579
        categoryPositions.addAll(positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT));
580
        Map<Integer, Position> positionsMap = categoryPositions.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31161 tejbeer 581
 
31762 tejbeer 582
        Map<Integer, List<CustomRetailer>> positonPartnerMap = this.getPositionCustomRetailerMap(categoryPositions);
583
        for (Map.Entry<Integer, List<CustomRetailer>> positionPartnerEntry : positonPartnerMap.entrySet()) {
584
            int authUserId = positionsMap.get(positionPartnerEntry.getKey()).getAuthUserId();
585
            Set<Integer> partnerIds = positionPartnerEntry.getValue().stream().filter(x -> activeFofoIds.contains(x.getPartnerId())).map(x -> x.getPartnerId()).collect(Collectors.toSet());
586
            AuthUser authUser = authRepository.selectById(authUserId);
587
            if (authUser.isActive()) {
588
                if (!storeGuyMap.containsKey(authUser.getEmailId())) {
589
                    storeGuyMap.put(authUser.getEmailId(), partnerIds);
590
                } else {
591
                    storeGuyMap.get(authUser.getEmailId()).addAll(partnerIds);
592
                }
593
            }
594
        }
595
        return storeGuyMap;
596
    }
31472 tejbeer 597
 
31762 tejbeer 598
    @Override
599
    @Cacheable(value = "authUserPartnerEmailPartnerIdMapping", cacheManager = "thirtyMinsTimeOutCacheManager")
600
    public Map<String, Set<Integer>> getAuthUserPartnerIdMappingByCategoryIds(List<Integer> categoryIds, boolean activeOnly) {
601
        Map<String, Set<Integer>> authUserPartnerMap = new HashMap<>();
602
        Set<Integer> activeFofoIds;
603
        if (activeOnly) {
604
            activeFofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId()).collect(Collectors.toSet());
26298 tejbeer 605
 
31762 tejbeer 606
        } else {
607
            activeFofoIds = fofoStoreRepository.selectAll().stream().map(x -> x.getId()).collect(Collectors.toSet());
26298 tejbeer 608
 
31762 tejbeer 609
        }
26298 tejbeer 610
 
31762 tejbeer 611
        List<Position> categoryPositions = positionRepository.selectPositionByCategoryIds(categoryIds);
612
        Map<Integer, Position> positionsMap = categoryPositions.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
26298 tejbeer 613
 
31762 tejbeer 614
        Map<Integer, List<CustomRetailer>> positonPartnerMap = this.getPositionCustomRetailerMap(categoryPositions);
615
        for (Map.Entry<Integer, List<CustomRetailer>> positionPartnerEntry : positonPartnerMap.entrySet()) {
616
            int authUserId = positionsMap.get(positionPartnerEntry.getKey()).getAuthUserId();
617
            Set<Integer> partnerIds = positionPartnerEntry.getValue().stream().filter(x -> activeFofoIds.contains(x.getPartnerId())).map(x -> x.getPartnerId()).collect(Collectors.toSet());
618
            AuthUser authUser = authRepository.selectById(authUserId);
619
            if (authUser.isActive()) {
620
                if (!authUserPartnerMap.containsKey(authUser.getEmailId())) {
621
                    authUserPartnerMap.put(authUser.getEmailId(), partnerIds);
622
                } else {
623
                    authUserPartnerMap.get(authUser.getEmailId()).addAll(partnerIds);
624
                }
625
            }
626
        }
627
        return authUserPartnerMap;
628
    }
26298 tejbeer 629
 
31762 tejbeer 630
    @Override
631
    public List<String> getAuthUserByPartnerId(int fofoId) {
26298 tejbeer 632
 
31762 tejbeer 633
        List<String> emails = new ArrayList<>();
634
        List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
26298 tejbeer 635
 
31762 tejbeer 636
        regionIds.add(5);// All partners Id;
26298 tejbeer 637
 
31762 tejbeer 638
        List<Integer> partnerPositionIds = partnersPositionRepository.selectByRegionIdAndPartnerId(regionIds, Arrays.asList(fofoId, 0)).stream().map(x -> x.getPositionId()).collect(Collectors.toList());
26448 amit.gupta 639
 
31762 tejbeer 640
        LOGGER.info("partnerPositionIds" + partnerPositionIds);
27205 amit.gupta 641
 
31762 tejbeer 642
        List<Position> positions = positionRepository.selectAll(partnerPositionIds);
27548 tejbeer 643
 
31762 tejbeer 644
        positions = positions.stream().filter(x -> (x.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES || x.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM)).collect(Collectors.toList());
27548 tejbeer 645
 
31762 tejbeer 646
        if (!positions.isEmpty()) {
647
            for (Position partnerPostionId : positions) {
27548 tejbeer 648
 
31762 tejbeer 649
                AuthUser authUser = authRepository.selectById(partnerPostionId.getAuthUserId());
650
                LOGGER.info("authUser" + authUser);
651
                emails.add(authUser.getEmailId());
652
            }
653
        }
27548 tejbeer 654
 
31762 tejbeer 655
        return emails;
656
    }
27548 tejbeer 657
 
31762 tejbeer 658
    @Override
659
    public Map<EscalationType, String> getAuthUserAndEsclationTypeByPartnerId(int fofoId) {
27548 tejbeer 660
 
31762 tejbeer 661
        List<String> emails = new ArrayList<>();
662
        Map<EscalationType, String> emailEsclationTypeMap = new HashMap<>();
663
        List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
27548 tejbeer 664
 
31762 tejbeer 665
        regionIds.add(5);// All partners Id;
666
        List<Integer> fofoIds = new ArrayList<>();
667
        fofoIds.add(fofoId);
668
        fofoIds.add(0);
27548 tejbeer 669
 
31762 tejbeer 670
        LOGGER.info("fofoIds" + fofoIds);
671
        List<Integer> partnerPositionIds = partnersPositionRepository.selectByRegionIdAndPartnerId(regionIds, fofoIds).stream().map(x -> x.getPositionId()).collect(Collectors.toList());
27548 tejbeer 672
 
31762 tejbeer 673
        LOGGER.info("partnerPositionIds" + partnerPositionIds);
28377 tejbeer 674
 
31762 tejbeer 675
        for (Integer partnerPostionId : partnerPositionIds) {
676
            Position position = positionRepository.selectByIdAndCategoryId(partnerPostionId, ProfitMandiConstants.TICKET_CATEGORY_SALES);
677
            LOGGER.info("position" + position);
678
            if (position != null) {
28377 tejbeer 679
 
31762 tejbeer 680
                AuthUser authUser = authRepository.selectById(position.getAuthUserId());
681
                LOGGER.info("authUser" + authUser);
28377 tejbeer 682
 
31762 tejbeer 683
                emailEsclationTypeMap.put(position.getEscalationType(), authUser.getEmailId());
684
            }
685
        }
28377 tejbeer 686
 
31762 tejbeer 687
        LOGGER.info("emailEsclationTypeMap" + emailEsclationTypeMap);
28377 tejbeer 688
 
31762 tejbeer 689
        return emailEsclationTypeMap;
690
    }
31020 tejbeer 691
 
31762 tejbeer 692
    @Override
693
    @Cacheable(value = "authUserIdPartnerIdMapping", cacheManager = "thirtyMinsTimeOutCacheManager")
694
    public Map<Integer, List<Integer>> getAuthUserIdPartnerIdMapping() {
695
        Map<Integer, List<Integer>> storeGuyMap = new HashMap<>();
696
        Set<Integer> activeFofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId()).collect(Collectors.toSet());
697
        List<Position> categoryPositions = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
698
        categoryPositions.addAll(positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_RBM));
31020 tejbeer 699
 
31762 tejbeer 700
        categoryPositions.addAll(positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CRM));
31020 tejbeer 701
 
31762 tejbeer 702
        categoryPositions.addAll(positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_MARKETING));
28377 tejbeer 703
 
31762 tejbeer 704
        categoryPositions.addAll(positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_TRAINING));
28377 tejbeer 705
 
31762 tejbeer 706
        Map<Integer, Position> positionsMap = categoryPositions.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
29229 tejbeer 707
 
31762 tejbeer 708
        Map<Integer, List<CustomRetailer>> positonPartnerMap = this.getPositionCustomRetailerMap(categoryPositions);
709
        for (Map.Entry<Integer, List<CustomRetailer>> positionPartnerEntry : positonPartnerMap.entrySet()) {
710
            int authUserId = positionsMap.get(positionPartnerEntry.getKey()).getAuthUserId();
711
            List<Integer> partnerIds = positionPartnerEntry.getValue().stream().filter(x -> activeFofoIds.contains(x.getPartnerId())).map(x -> x.getPartnerId()).collect(Collectors.toList());
712
            AuthUser authUser = authRepository.selectById(authUserId);
713
            if (authUser != null && authUser.isActive()) {
714
                if (!storeGuyMap.containsKey(authUserId)) {
715
                    storeGuyMap.put(authUserId, partnerIds);
716
                } else {
717
                    storeGuyMap.get(authUserId).addAll(partnerIds);
718
                }
719
            }
720
        }
721
        storeGuyMap.keySet().stream().forEach(x -> {
722
            List<Integer> fofoIds = storeGuyMap.get(x);
723
            storeGuyMap.put(x, fofoIds.stream().distinct().collect(Collectors.toList()));
724
        });
725
        return storeGuyMap;
726
    }
28908 tejbeer 727
 
31762 tejbeer 728
    @Override
729
    @Cacheable(value = "L1L2Mapping", cacheManager = "thirtyMinsTimeOutCacheManager")
730
    public Map<Integer, List<Integer>> getL2L1Mapping() {
731
        List<Position> l1SalesPositions = positionRepository.selectPositionbyCategoryIdAndEscalationType(
732
                ProfitMandiConstants.TICKET_CATEGORY_SALES, EscalationType.L1);
733
        List<Position> l2SalesPositions = positionRepository.selectPositionbyCategoryIdAndEscalationType(
734
                ProfitMandiConstants.TICKET_CATEGORY_SALES, EscalationType.L2);
28908 tejbeer 735
 
31762 tejbeer 736
        LOGGER.info("position" + l1SalesPositions);
737
        Map<Integer, List<Integer>> authUserPartnerListMap = this.getAuthUserIdPartnerIdMapping();
738
        LOGGER.info("map" + authUserPartnerListMap);
28908 tejbeer 739
 
31762 tejbeer 740
        Map<Integer, List<Integer>> l2l1ListMap = new HashMap<>();
29318 tejbeer 741
 
31762 tejbeer 742
        for (Position l2SalePosition : l2SalesPositions) {
743
            int l2AuthUserId = l2SalePosition.getAuthUserId();
744
            if (authUserPartnerListMap.containsKey(l2SalePosition.getAuthUserId())) {
745
                List<Integer> mappedL1AuthUsers = new ArrayList<>();
746
                l2l1ListMap.put(l2AuthUserId, mappedL1AuthUsers);
747
                List<Integer> l2FofoIds = authUserPartnerListMap.get(l2AuthUserId);
748
                for (Position l1SalePosition : l1SalesPositions) {
749
                    int l1AuthUserId = l1SalePosition.getAuthUserId();
750
                    if (authUserPartnerListMap.containsKey(l1AuthUserId)) {
751
                        List<Integer> l1FofoIds = authUserPartnerListMap.get(l1SalePosition.getAuthUserId());
752
                        if (l2FofoIds.containsAll(l1FofoIds)) {
753
                            mappedL1AuthUsers.add(l1AuthUserId);
754
                        }
755
                    }
28856 manish 756
 
31762 tejbeer 757
                }
758
            }
29296 manish 759
 
31762 tejbeer 760
        }
29296 manish 761
 
31762 tejbeer 762
        return l2l1ListMap;
763
    }
29296 manish 764
 
31762 tejbeer 765
    @Override
766
    public Map<Integer, List<AuthUser>> getAssignedAuthList(List<Ticket> tickets) {
767
        if (tickets.size() == 0) {
768
            return new HashMap<>();
769
        }
770
        List<TicketAssigned> ticketAssignedList = ticketAssignedRepository.selectByTicketIds(tickets.stream().map(x -> x.getId()).collect(Collectors.toList()));
771
        List<Integer> authUserIds = ticketAssignedList.stream().map(x -> x.getAssineeId()).distinct().collect(Collectors.toList());
772
        Map<Integer, AuthUser> authUserMap = authRepository.selectAllAuthUserByIds(authUserIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
773
        return ticketAssignedList.stream().collect(Collectors.groupingBy(x -> x.getTicketId(), Collectors.mapping(x -> authUserMap.get(x.getAssineeId()), Collectors.toList())));
774
    }
28908 tejbeer 775
 
31762 tejbeer 776
    @Override
777
    public Map<EscalationType, AuthUser> getAuthUserAndEsclationByPartnerId(int fofoId) {
778
        Map<EscalationType, AuthUser> authuserEsclationTypeMap = new HashMap<>();
779
        List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
28908 tejbeer 780
 
31762 tejbeer 781
        regionIds.add(5);// All partners Id;
782
        List<Integer> fofoIds = new ArrayList<>();
783
        fofoIds.add(fofoId);
784
        fofoIds.add(0);
28908 tejbeer 785
 
31762 tejbeer 786
        LOGGER.info("fofoIds" + fofoIds);
787
        List<Integer> partnerPositionIds = partnersPositionRepository.selectByRegionIdAndPartnerId(regionIds, fofoIds).stream().map(x -> x.getPositionId()).collect(Collectors.toList());
28908 tejbeer 788
 
31762 tejbeer 789
        LOGGER.info("partnerPositionIds" + partnerPositionIds);
30003 tejbeer 790
 
31762 tejbeer 791
        for (Integer partnerPostionId : partnerPositionIds) {
792
            Position position = positionRepository.selectByIdAndCategoryId(partnerPostionId, ProfitMandiConstants.TICKET_CATEGORY_SALES);
793
            LOGGER.info("position" + position);
794
            if (position != null) {
30003 tejbeer 795
 
31762 tejbeer 796
                AuthUser authUser = authRepository.selectById(position.getAuthUserId());
797
                LOGGER.info("authUser" + authUser);
30003 tejbeer 798
 
31762 tejbeer 799
                authuserEsclationTypeMap.put(position.getEscalationType(), authUser);
800
            }
801
        }
30003 tejbeer 802
 
31762 tejbeer 803
        LOGGER.info("emailEsclationTypeMap" + authuserEsclationTypeMap);
30003 tejbeer 804
 
31762 tejbeer 805
        return authuserEsclationTypeMap;
806
    }
30044 tejbeer 807
 
31762 tejbeer 808
    @Override
809
    public List<AuthUser> getAuthUserIdByPartnerId(int fofoId) {
810
        List<AuthUser> authUsers = new ArrayList<>();
811
        List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
30044 tejbeer 812
 
31762 tejbeer 813
        regionIds.add(5);// All partners Id;
814
        List<Integer> fofoIds = new ArrayList<>();
815
        fofoIds.add(fofoId);
816
        fofoIds.add(0);
30044 tejbeer 817
 
31762 tejbeer 818
        LOGGER.info("fofoIds" + fofoIds);
819
        List<Integer> partnerPositionIds = partnersPositionRepository.selectByRegionIdAndPartnerId(regionIds, fofoIds).stream().map(x -> x.getPositionId()).collect(Collectors.toList());
30003 tejbeer 820
 
31762 tejbeer 821
        LOGGER.info("partnerPositionIds" + partnerPositionIds);
30003 tejbeer 822
 
31762 tejbeer 823
        for (Integer partnerPostionId : partnerPositionIds) {
824
            Position position = positionRepository.selectByIdAndCategoryId(partnerPostionId, ProfitMandiConstants.TICKET_CATEGORY_SALES);
825
            LOGGER.info("position" + position);
826
            if (position != null) {
30044 tejbeer 827
 
31762 tejbeer 828
                AuthUser authUser = authRepository.selectById(position.getAuthUserId());
829
                LOGGER.info("authUser" + authUser);
830
                authUsers.add(authUser);
831
            }
30003 tejbeer 832
 
31762 tejbeer 833
            Position rbmPosition = positionRepository.selectByIdAndCategoryId(partnerPostionId, ProfitMandiConstants.TICKET_CATEGORY_RBM);
834
            if (rbmPosition != null) {
30003 tejbeer 835
 
31762 tejbeer 836
                AuthUser authUser = authRepository.selectById(rbmPosition.getAuthUserId());
837
                LOGGER.info("authUser" + authUser);
838
                authUsers.add(authUser);
839
            }
30003 tejbeer 840
 
31762 tejbeer 841
        }
30003 tejbeer 842
 
31762 tejbeer 843
        return authUsers;
844
    }
30044 tejbeer 845
 
31762 tejbeer 846
    @Override
847
    public List<AuthUser> getAuthUserIds(int categoryId, List<EscalationType> escalationType) {
30044 tejbeer 848
 
31762 tejbeer 849
        List<Position> positions = positionRepository.selectPositionbyCategoryIdAndEscalationTypes(categoryId, escalationType);
850
        List<Integer> authIds = positions.stream().map(x -> x.getAuthUserId()).distinct().collect(Collectors.toList());
30003 tejbeer 851
 
31762 tejbeer 852
        LOGGER.info("authIds" + authIds);
30003 tejbeer 853
 
31762 tejbeer 854
        List<AuthUser> authUsers = authRepository.selectAllAuthUserByIds(authIds);
855
 
856
        LOGGER.info("authUsers" + authUsers);
857
        return authUsers;
858
    }
859
 
860
    @Override
861
    public List<AuthUser> getAuthUserByCategoryId(int categoryId, EscalationType escalationType) {
862
 
863
        List<Position> positions = positionRepository.selectPositionbyCategoryIdAndEscalationType(categoryId, escalationType);
864
        List<Integer> authIds = positions.stream().map(x -> x.getAuthUserId()).distinct().collect(Collectors.toList());
865
 
866
        LOGGER.info("authIds" + authIds);
867
        List<AuthUser> authUsers = new ArrayList<>();
868
        if (!authIds.isEmpty()) {
869
            authUsers = authRepository.selectAllAuthUserByIds(authIds);
870
        }
871
 
872
        LOGGER.info("authUsers" + authUsers);
873
        return authUsers;
874
    }
875
 
876
    @Override
877
    @Cacheable(value = "authUserByCategoryId", cacheManager = "thirtyMinsTimeOutCacheManager")
878
    public List<AuthUser> getAuthUserByCategoryId(int categoryId) {
879
        List<Position> positions = positionRepository.selectPositionByCategoryId(categoryId);
880
        List<Integer> authIds = positions.stream().map(x -> x.getAuthUserId()).distinct().collect(Collectors.toList());
881
 
882
        LOGGER.info("authIds" + authIds);
883
 
884
        List<AuthUser> authUsers = authRepository.selectAllAuthUserByIds(authIds).stream().filter(x -> x.getActive()).collect(Collectors.toList());
885
 
886
        LOGGER.info("authUsers" + authUsers);
887
        return authUsers;
888
    }
889
 
890
    private class SaleRoles {
891
 
892
        private List<String> l1;
893
        private List<String> l2;
894
        private List<String> l3;
895
        private List<String> l4;
896
 
897
        public SaleRoles() {
898
            l1 = new ArrayList<>();
899
            l2 = new ArrayList<>();
900
            l3 = new ArrayList<>();
901
            l4 = new ArrayList<>();
902
        }
903
 
904
        public List<String> getL1() {
905
            return l1;
906
        }
907
 
908
        public List<String> getL2() {
909
            return l2;
910
        }
911
 
912
        public List<String> getL3() {
913
            return l3;
914
        }
915
 
916
        public List<String> getL4() {
917
            return l4;
918
        }
919
 
920
        @Override
921
        public String toString() {
922
            return "SaleRoles [l1=" + l1 + ", l2=" + l2 + ", l3=" + l3 + ", l4=" + l4 + "]";
923
        }
924
 
925
    }
926
 
927
    @Override
928
    @Cacheable(value = "partnerSaleHeader", cacheManager = "oneDayCacheManager")
929
    public Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() {
930
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
931
 
932
        List<Position> positions = positionRepository.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
933
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
934
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = this.getPositionCustomRetailerMap(positions);
935
        for (Position position : positions) {
936
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
937
            if (crList == null)
938
                continue;
939
            for (CustomRetailer cr : crList) {
940
                if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
941
                    partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
942
                }
943
                SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
944
                AuthUser authUser = authUsersMap.get(position.getAuthUserId());
945
                if (authUser == null) {
946
                    continue;
947
                }
948
                String name = authUser.getFirstName() + " " + authUser.getLastName();
949
                if (position.getEscalationType().equals(EscalationType.L1)) {
950
                    saleRoles.getL1().add(name);
951
                } else if (position.getEscalationType().equals(EscalationType.L2)) {
952
                    saleRoles.getL2().add(name);
953
                }
954
 
955
            }
956
        }
957
 
958
        Set<CustomRetailer> allCrList = new HashSet<>();
959
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
960
            allCrList.addAll(cr);
961
        }
962
 
963
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
964
 
965
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
966
 
967
        for (CustomRetailer cr : allCrList) {
968
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
969
            if (fofoStore == null) {
970
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
971
                continue;
972
            }
973
            String code = fofoStore.getCode();
974
            // String storeName = "SmartDukaan-" +
975
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
976
            String businessName = cr.getBusinessName();
977
            try {
978
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
979
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
980
 
981
                if (StringUtils.isEmpty(territoryManager)) {
982
                    territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
983
                }
984
 
985
                FofoReportingModel reportingModel = new FofoReportingModel();
986
                reportingModel.setBusinessName(businessName);
987
                reportingModel.setCode(code);
988
                reportingModel.setFofoId(fofoStore.getId());
989
                reportingModel.setRegionalManager(stateManager);
990
                reportingModel.setTerritoryManager(territoryManager);
991
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
992
            } catch (Exception e) {
993
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
994
            }
995
        }
996
        return partnerIdSalesHeadersMap;
997
 
998
    }
999
 
1000
    @Override
1001
    public Map<Integer, TicketCategory> getSubCategoryIdAndCategoryMap(List<Integer> subCategoryIds) {
1002
        Map<Integer, TicketCategory> subCategoryIdAndCategoryMap = new HashMap<>();
1003
 
1004
        List<TicketSubCategory> ticketSubCategories = ticketSubCategoryRepository.selectByIds(subCategoryIds);
1005
 
1006
        for (TicketSubCategory ticketSubCategory : ticketSubCategories) {
1007
 
1008
            TicketCategory ticketCategory = ticketCategoryRepository.selectById(ticketSubCategory.getCategoryId());
1009
 
1010
            subCategoryIdAndCategoryMap.put(ticketSubCategory.getId(), ticketCategory);
1011
 
1012
        }
1013
        return subCategoryIdAndCategoryMap;
1014
    }
1015
 
24383 amit.gupta 1016
}