Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
30859 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
3
import com.spice.profitmandi.common.enumuration.MessageType;
4
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
5
import com.spice.profitmandi.common.model.CustomRetailer;
6
import com.spice.profitmandi.common.model.SendNotificationModel;
31020 tejbeer 7
import com.spice.profitmandi.common.util.Utils;
30859 tejbeer 8
import com.spice.profitmandi.dao.entity.auth.AuthUser;
9
import com.spice.profitmandi.dao.entity.dtr.CreditAccount;
10
import com.spice.profitmandi.dao.entity.dtr.CreditStatus;
30913 tejbeer 11
import com.spice.profitmandi.dao.entity.fofo.CurrentPartnerDailyInvestment;
30859 tejbeer 12
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
13
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
32681 amit.gupta 14
import com.spice.profitmandi.dao.entity.transaction.*;
30989 tejbeer 15
import com.spice.profitmandi.dao.entity.user.Address;
30859 tejbeer 16
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
32197 jai.hind 17
import com.spice.profitmandi.dao.enumuration.transaction.LoanSummaryType;
30859 tejbeer 18
import com.spice.profitmandi.dao.enumuration.transaction.SanctionStatus;
32681 amit.gupta 19
import com.spice.profitmandi.dao.model.*;
30859 tejbeer 20
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
30936 tejbeer 21
import com.spice.profitmandi.dao.repository.cs.CsService;
31666 amit.gupta 22
import com.spice.profitmandi.dao.repository.cs.CsService1;
30859 tejbeer 23
import com.spice.profitmandi.dao.repository.dtr.CreditAccountRepository;
24
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
25
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
30913 tejbeer 26
import com.spice.profitmandi.dao.repository.fofo.CurrentPartnerDailyInvestmentRepository;
32528 tejbeer 27
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
30859 tejbeer 28
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
32681 amit.gupta 29
import com.spice.profitmandi.dao.repository.transaction.*;
30989 tejbeer 30
import com.spice.profitmandi.dao.repository.user.AddressRepository;
30859 tejbeer 31
import com.spice.profitmandi.service.NotificationService;
32
import com.spice.profitmandi.service.transaction.SDCreditService;
33
import com.spice.profitmandi.service.user.RetailerService;
32197 jai.hind 34
import com.spice.profitmandi.service.user.UserService;
30936 tejbeer 35
import com.spice.profitmandi.web.model.LoginDetails;
36
import com.spice.profitmandi.web.util.CookiesProcessor;
31020 tejbeer 37
import com.spice.profitmandi.web.util.MVCResponseSender;
32681 amit.gupta 38
import org.apache.logging.log4j.LogManager;
39
import org.apache.logging.log4j.Logger;
40
import org.springframework.beans.factory.annotation.Autowired;
41
import org.springframework.mail.javamail.JavaMailSender;
42
import org.springframework.stereotype.Controller;
43
import org.springframework.ui.Model;
44
import org.springframework.web.bind.annotation.RequestBody;
45
import org.springframework.web.bind.annotation.RequestMapping;
46
import org.springframework.web.bind.annotation.RequestMethod;
47
import org.springframework.web.bind.annotation.RequestParam;
30859 tejbeer 48
 
32681 amit.gupta 49
import javax.servlet.http.HttpServletRequest;
50
import javax.transaction.Transactional;
51
import java.math.BigDecimal;
52
import java.math.RoundingMode;
53
import java.time.Duration;
54
import java.time.LocalDate;
55
import java.time.LocalDateTime;
56
import java.time.LocalTime;
57
import java.time.temporal.ChronoUnit;
58
import java.util.*;
59
import java.util.Map.Entry;
60
import java.util.stream.Collectors;
61
 
30859 tejbeer 62
@Controller
63
@Transactional(rollbackOn = Throwable.class)
64
public class SDCreditController {
65
 
32052 tejbeer 66
    @Autowired
67
    private RetailerService retailerService;
32439 tejbeer 68
 
32197 jai.hind 69
    @Autowired
70
    private UserService userService;
30859 tejbeer 71
 
32052 tejbeer 72
    @Autowired
73
    SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 74
 
32052 tejbeer 75
    @Autowired
76
    SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 77
 
32052 tejbeer 78
    @Autowired
79
    PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
30859 tejbeer 80
 
32052 tejbeer 81
    @Autowired
82
    private FofoStoreRepository fofoStoreRepository;
30859 tejbeer 83
 
32052 tejbeer 84
    @Autowired
85
    private CreditAccountRepository creditAccountRepository;
30859 tejbeer 86
 
32052 tejbeer 87
    @Autowired
88
    private SDCreditService sdCreditService;
30859 tejbeer 89
 
32052 tejbeer 90
    @Autowired
91
    private CsService1 csService1;
31666 amit.gupta 92
 
32052 tejbeer 93
    @Autowired
94
    private NotificationService notificationService;
30859 tejbeer 95
 
32052 tejbeer 96
    @Autowired
97
    private AuthRepository authRepository;
30859 tejbeer 98
 
32052 tejbeer 99
    @Autowired
100
    private UserRepository userRepository;
30859 tejbeer 101
 
32052 tejbeer 102
    @Autowired
103
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30913 tejbeer 104
 
32052 tejbeer 105
    @Autowired
106
    private UserWalletRepository userWalletRepository;
30929 tejbeer 107
 
32052 tejbeer 108
    @Autowired
109
    LoanRepository loanRepository;
30929 tejbeer 110
 
32052 tejbeer 111
    @Autowired
112
    private CookiesProcessor cookiesProcessor;
30936 tejbeer 113
 
32052 tejbeer 114
    @Autowired
115
    private CsService csService;
30936 tejbeer 116
 
32052 tejbeer 117
    @Autowired
118
    AddressRepository addressRepository;
30989 tejbeer 119
 
32052 tejbeer 120
    @Autowired
121
    OrderRepository orderRepository;
31020 tejbeer 122
 
32052 tejbeer 123
    @Autowired
124
    private LoanStatementRepository loanStatementRepository;
31020 tejbeer 125
 
32052 tejbeer 126
    @Autowired
127
    private com.spice.profitmandi.dao.repository.user.UserRepository userUserRepository;
30989 tejbeer 128
 
32052 tejbeer 129
    @Autowired
130
    private JavaMailSender mailSender;
31020 tejbeer 131
 
32052 tejbeer 132
    @Autowired
133
    private MVCResponseSender mvcResponseSender;
31020 tejbeer 134
 
32528 tejbeer 135
    @Autowired
136
    private FofoOrderItemRepository fofoOrderItemRepository;
137
 
32052 tejbeer 138
    private static final Logger LOGGER = LogManager.getLogger(SDCreditController.class);
30859 tejbeer 139
 
32052 tejbeer 140
    @RequestMapping(value = "/getSDCreditReq", method = RequestMethod.GET)
141
    public String getSDCreditReq(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
30859 tejbeer 142
 
32052 tejbeer 143
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30859 tejbeer 144
 
32052 tejbeer 145
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
146
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
147
            int fofoId = customRetailerEntry.getKey();
30859 tejbeer 148
 
32052 tejbeer 149
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
30859 tejbeer 150
 
32052 tejbeer 151
            if (sdCreditRequirement != null) {
30913 tejbeer 152
 
32052 tejbeer 153
                BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30910 tejbeer 154
 
32052 tejbeer 155
                BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30910 tejbeer 156
 
32052 tejbeer 157
                LOGGER.info("utilizedLimit {} ", utilizedLimit);
30910 tejbeer 158
 
32052 tejbeer 159
                LOGGER.info("availableLimit {} ", availableLimit);
30910 tejbeer 160
 
32052 tejbeer 161
                sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30910 tejbeer 162
 
32052 tejbeer 163
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
164
            }
30859 tejbeer 165
 
32052 tejbeer 166
        }
30859 tejbeer 167
 
32052 tejbeer 168
        model.addAttribute("customRetailerMap", customRetailerMap);
169
        model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
170
        return "sd-credit";
171
    }
30921 tejbeer 172
 
32052 tejbeer 173
    @RequestMapping(value = "/creditRequirement", method = RequestMethod.POST)
174
    public String sdCredit(HttpServletRequest request, @RequestBody SdCreditRequirementModel sdCreditRequirementModel, Model model) throws Exception {
30859 tejbeer 175
 
32052 tejbeer 176
        LOGGER.info("sdCreditRequirementModel {} ", sdCreditRequirementModel);
30859 tejbeer 177
 
32052 tejbeer 178
        int fofoId = sdCreditRequirementModel.getFofoId();
30859 tejbeer 179
 
32052 tejbeer 180
        SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(sdCreditRequirementModel.getFofoId());
30859 tejbeer 181
 
32052 tejbeer 182
        FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(sdCreditRequirementModel.getFofoId());
183
        sdCreditRequirement.setSecurityCheck(sdCreditRequirementModel.getSecurityCheck());
184
        // sdCreditRequirement.setSecurityCheck(2);
30859 tejbeer 185
 
32052 tejbeer 186
        sdCreditRequirement.setInterestRate(sdCreditRequirementModel.getInterest());
187
        sdCreditRequirement.setFreeDays(sdCreditRequirementModel.getFreeDays());
188
        sdCreditRequirement.setLimit(sdCreditRequirementModel.getLimit());
189
        BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30865 tejbeer 190
 
32052 tejbeer 191
        BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30865 tejbeer 192
 
32052 tejbeer 193
        LOGGER.info("utilizedLimit {} ", utilizedLimit);
30909 tejbeer 194
 
32052 tejbeer 195
        LOGGER.info("availableLimit {} ", availableLimit);
30909 tejbeer 196
 
32052 tejbeer 197
        sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30859 tejbeer 198
 
32052 tejbeer 199
        sdCreditRequirement.setCreditDays(15);
200
        sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30859 tejbeer 201
 
32052 tejbeer 202
        if (sdCreditRequirement.getSecurityCheck() > 0) {
30859 tejbeer 203
 
32052 tejbeer 204
            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(sdCreditRequirementModel.getFofoId(), Gateway.SDDIRECT);
205
            if (creditAccount == null) {
206
                creditAccount = new CreditAccount();
207
                creditAccount.setFofoId(sdCreditRequirementModel.getFofoId());
208
                creditAccount.setGateway(Gateway.SDDIRECT);
209
                creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
210
                creditAccount.setActive(false);
30859 tejbeer 211
 
32052 tejbeer 212
                creditAccount.setUpdatedOn(LocalDateTime.now());
30859 tejbeer 213
 
32052 tejbeer 214
                creditAccountRepository.persist(creditAccount);
215
            }
30859 tejbeer 216
 
32052 tejbeer 217
            creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
218
            creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
219
            creditAccount.setAvailableAmount(availableLimit.floatValue());
220
            creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
221
            creditAccount.setUpdatedOn(LocalDateTime.now());
30859 tejbeer 222
 
32052 tejbeer 223
        }
224
        LOGGER.info("sdCreditRequirement {} ", sdCreditRequirement);
30859 tejbeer 225
 
32052 tejbeer 226
        CustomRetailer customRetailer = retailerService.getFofoRetailer(sdCreditRequirementModel.getFofoId());
30859 tejbeer 227
 
32052 tejbeer 228
        sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(sdCreditRequirementModel.getFofoId());
30865 tejbeer 229
 
32052 tejbeer 230
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = new HashMap<>();
231
        sdCreditRequirementMap.put(sdCreditRequirement.getFofoId(), sdCreditRequirement);
232
        model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
233
        model.addAttribute("customRetailer", customRetailer);
30859 tejbeer 234
 
32052 tejbeer 235
        return "sd-credit-requirement-row";
30859 tejbeer 236
 
32052 tejbeer 237
    }
30859 tejbeer 238
 
32052 tejbeer 239
    @RequestMapping(value = "/getSanctionRequest", method = RequestMethod.GET)
240
    public String getSanctionRequest(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
30859 tejbeer 241
 
32052 tejbeer 242
        List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectByDate(LocalDate.now());
30859 tejbeer 243
 
32041 amit.gupta 244
 
32052 tejbeer 245
        if (!sanctionRequests.isEmpty()) {
30859 tejbeer 246
 
32053 tejbeer 247
            List<Integer> authIds = sanctionRequests.stream().map(x -> x.getAuthId()).collect(Collectors.toList());
248
 
249
            Map<Integer, String> authMap = authRepository.selectAllAuthUserByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getFullName()));
250
 
251
 
32052 tejbeer 252
            List<Integer> fofoIds = sanctionRequests.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
30859 tejbeer 253
 
32052 tejbeer 254
            Map<Integer, Long> partnerCreditDaysMap = new HashMap<>();
31110 tejbeer 255
 
32052 tejbeer 256
            Map<Integer, Integer> partnerActiveLoanMap = new HashMap<>();
32681 amit.gupta 257
            Map<Integer, Integer> partnerAverageCreditDaysMap = new HashMap<>();
31110 tejbeer 258
 
32528 tejbeer 259
            LocalDateTime curDate = LocalDate.now().atStartOfDay();
260
 
261
            Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
262
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
263
 
264
            Map<Integer, Double> mtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
265
 
266
            Map<Integer, Double> lmsSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
267
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1), 0, false);
268
 
32681 amit.gupta 269
            List<Loan> loans = loanRepository.selectAllLoans(fofoIds, DateRangeModel.withStartDate(curDate.minusYears(2)));
32740 amit.gupta 270
            Map<Integer, List<Loan>> partnerClosedLoansMap = loans.stream().filter(x -> x.getPendingAmount().compareTo(BigDecimal.ZERO)==0)
271
                    .collect(Collectors.groupingBy(x -> x.getFofoId()));
32528 tejbeer 272
 
31110 tejbeer 273
 
32740 amit.gupta 274
            Map<Integer, List<Loan>> activeLoansMap = loans.stream().filter(x -> x.getPendingAmount().compareTo(BigDecimal.ZERO) == 1).collect(Collectors.groupingBy(x -> x.getFofoId()));
32528 tejbeer 275
 
32681 amit.gupta 276
            for (Integer fofoId : fofoIds) {
32693 amit.gupta 277
                LOGGER.info("Fofo Id - {}", fofoId);
32681 amit.gupta 278
                List<Loan> activeLoans = activeLoansMap.get(fofoId);
279
                if (activeLoans != null) {
280
                    partnerActiveLoanMap.put(fofoId, activeLoans.size());
32742 amit.gupta 281
                    Loan loan = activeLoans.stream().sorted(Comparator.comparing(Loan::getCreatedOn)).findFirst().get();
32052 tejbeer 282
                    long daysBetween = Duration.between(loan.getCreatedOn(), LocalDateTime.now()).toDays();
283
                    partnerCreditDaysMap.put(fofoId, daysBetween);
284
                }
32681 amit.gupta 285
                List<Loan> closedLoans = partnerClosedLoansMap.get(fofoId);
286
                if (closedLoans != null) {
287
                    long averageCreditDays = Math.round(closedLoans.stream().mapToLong(x -> Duration.between(x.getCreatedOn(),
32683 amit.gupta 288
                            x.getSettledOn() == null ? x.getCreatedOn().plusDays(10) : x.getSettledOn()).toDays() + 1).average().orElse(0.0));
32681 amit.gupta 289
                    partnerAverageCreditDaysMap.put(fofoId, (int) averageCreditDays);
290
                }
31110 tejbeer 291
 
32052 tejbeer 292
            }
32693 amit.gupta 293
            LOGGER.info("partnerAverageCreditDaysMap - {}", partnerAverageCreditDaysMap);
32681 amit.gupta 294
            model.addAttribute("partnerActiveLoanMap", partnerActiveLoanMap);
295
            model.addAttribute("partnerCreditDaysMap", partnerCreditDaysMap);
296
            model.addAttribute("partnerAverageCreditDaysMap", partnerAverageCreditDaysMap);
31110 tejbeer 297
 
32052 tejbeer 298
            Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30967 tejbeer 299
 
32052 tejbeer 300
            Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
30859 tejbeer 301
 
32052 tejbeer 302
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
303
            Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 304
 
32052 tejbeer 305
            model.addAttribute("customRetailerMap", customRetailerMap);
30859 tejbeer 306
 
32052 tejbeer 307
            model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
308
            model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
30859 tejbeer 309
 
32052 tejbeer 310
            model.addAttribute("userWalletMap", userWalletMap);
32053 tejbeer 311
            model.addAttribute("authMap", authMap);
32528 tejbeer 312
            model.addAttribute("lmtdSale", lmtdSale);
313
            model.addAttribute("mtdSale", mtdSale);
314
            model.addAttribute("lmsSale", lmsSale);
31020 tejbeer 315
 
32052 tejbeer 316
        }
30859 tejbeer 317
 
32052 tejbeer 318
        model.addAttribute("sanctionRequests", sanctionRequests);
30859 tejbeer 319
 
32052 tejbeer 320
        model.addAttribute("sanctionStatus", SanctionStatus.values());
321
        return "sanction-request";
30859 tejbeer 322
 
32052 tejbeer 323
    }
30859 tejbeer 324
 
32052 tejbeer 325
    @RequestMapping(value = "/sanctionRequest", method = RequestMethod.POST)
326
    public String sanctionRequest(HttpServletRequest request, @RequestBody SanctionRequestModel sanctionRequestModel, Model model) throws Exception {
30859 tejbeer 327
 
32052 tejbeer 328
        LOGGER.info("sanctionRequestModel {} ", sanctionRequestModel);
329
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 330
 
32052 tejbeer 331
        SanctionRequest sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
30859 tejbeer 332
 
32052 tejbeer 333
        Map<Integer, String> authMap = new HashMap<Integer, String>();
334
        AuthUser authUser = authRepository.selectById(sanctionRequest.getAuthId());
30859 tejbeer 335
 
32052 tejbeer 336
        authMap.put(authUser.getId(), authUser.getFullName());
30859 tejbeer 337
 
32052 tejbeer 338
        model.addAttribute("authMap", authMap);
339
        List<Integer> fofoIds = sanctionRequestRepository.selectByDate(LocalDate.now()).stream().map(x -> x.getFofoId()).collect(Collectors.toList());
30859 tejbeer 340
 
32052 tejbeer 341
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
30859 tejbeer 342
 
32052 tejbeer 343
        LOGGER.info("freeDays {} ", sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays());
30989 tejbeer 344
 
32052 tejbeer 345
        if (sanctionRequestModel.getStatus().equals(SanctionStatus.APPROVED)) {
346
            CustomRetailer customRetailer = customRetailerMap.get(sanctionRequest.getFofoId());
347
            sanctionRequest.setApprovalTimestamp(LocalDateTime.now());
348
            BigDecimal availableAmount = sdCreditService.getAvailableAmount(sanctionRequest.getFofoId());
30989 tejbeer 349
 
32052 tejbeer 350
            String title = "Sanction Request Approved";
351
            String url = "http://app.smartdukaan.com/pages/home/credit";
352
            String message = "Congratulations! Your credit limit is increased for today Rs." + sanctionRequest.getApprovalAmount().setScale(2, RoundingMode.HALF_UP) + ". Your total available limit is Rs." + availableAmount.setScale(2, RoundingMode.HALF_UP) + ".";
353
            notificationService.sendNotification(sanctionRequest.getFofoId(), title, MessageType.notification, title, message, url);
354
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(sanctionRequest.getFofoId());
30859 tejbeer 355
 
32052 tejbeer 356
            Address address = addressRepository.selectById(user.getAddressId());
30859 tejbeer 357
 
32052 tejbeer 358
            notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30989 tejbeer 359
 
32052 tejbeer 360
            String empMessage = "Congratulations! Your Partner " + customRetailer.getBusinessName() + " credit limit is increased for today Rs." + sanctionRequest.getApprovalAmount().setScale(2, RoundingMode.HALF_UP) + " and total available limit is Rs." + availableAmount.setScale(2, RoundingMode.HALF_UP) + ".";
361
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
362
            sendNotificationModel.setCampaignName("Sanction Request");
363
            sendNotificationModel.setTitle("title");
364
            sendNotificationModel.setMessage(empMessage);
365
            sendNotificationModel.setType("url");
366
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/credit");
367
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
368
            sendNotificationModel.setMessageType(MessageType.notification);
369
            sendNotificationModel.setUserIds(Arrays.asList(userRepository.selectByEmailId(authUser.getEmailId()).getId()));
370
            System.out.println(sendNotificationModel);
371
            notificationService.sendNotification(sendNotificationModel);
30859 tejbeer 372
 
32052 tejbeer 373
            notificationService.sendWhatsappMessage(empMessage, title, authUser.getMobileNumber());
30859 tejbeer 374
 
32052 tejbeer 375
        }
30859 tejbeer 376
 
32135 tejbeer 377
        sanctionRequest.setFreeDays(sanctionRequestModel.getFreeDays());
30967 tejbeer 378
 
32135 tejbeer 379
 
32052 tejbeer 380
        sanctionRequest.setApprovalAmount(sanctionRequestModel.getApprovalAmount());
381
        sanctionRequest.setStatus(sanctionRequestModel.getStatus());
382
        sanctionRequest.setStockHold(sanctionRequestModel.isStockHold());
32683 amit.gupta 383
 
32528 tejbeer 384
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
30967 tejbeer 385
 
32528 tejbeer 386
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
387
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), sanctionRequest.getFofoId(), false);
388
 
389
        Map<Integer, Double> mtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), sanctionRequest.getFofoId(), false);
390
 
391
        Map<Integer, Double> lmsSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
392
                curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1), sanctionRequest.getFofoId(), false);
393
 
394
 
32052 tejbeer 395
        Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 396
 
32052 tejbeer 397
        Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
30859 tejbeer 398
 
32052 tejbeer 399
        sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
400
        model.addAttribute("customRetailerMap", customRetailerMap);
401
        model.addAttribute("sanctionRequest", sanctionRequest);
402
        model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
403
        model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
404
        model.addAttribute("userWalletMap", userWalletMap);
30859 tejbeer 405
 
32052 tejbeer 406
        model.addAttribute("sanctionStatus", SanctionStatus.values());
32683 amit.gupta 407
 
32528 tejbeer 408
        model.addAttribute("lmtdSale", lmtdSale);
409
        model.addAttribute("mtdSale", mtdSale);
410
        model.addAttribute("lmsSale", lmsSale);
30859 tejbeer 411
 
32528 tejbeer 412
 
32052 tejbeer 413
        return "sanction-request-row";
30936 tejbeer 414
 
32052 tejbeer 415
    }
30929 tejbeer 416
 
32052 tejbeer 417
    List<String> emails = Arrays.asList("kamini.sharma@smartdukaan.com", "neeraj.gupta@smartdukaan.com", "amit.gupta@smartdukaan.com");
30929 tejbeer 418
 
32052 tejbeer 419
    @RequestMapping(value = "/getLoans", method = RequestMethod.GET)
420
    public String getLoans(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
30936 tejbeer 421
 
32052 tejbeer 422
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
423
        String email = loginDetails.getEmailId();
30936 tejbeer 424
 
32052 tejbeer 425
        AuthUser authUser = authRepository.selectByEmailOrMobile(email);
426
        Set<Integer> fofoIds = csService1.getAuthFofoIds(email, false);
30936 tejbeer 427
 
32052 tejbeer 428
        LOGGER.info("fofoIds" + fofoIds);
429
        if (fofoIds == null) {
430
            throw new ProfitMandiBusinessException("you are not authorized", "", "you are not authorized" + " " + "");
431
        }
30936 tejbeer 432
 
32052 tejbeer 433
        List<Loan> loans = loanRepository.selectAllLoans(new ArrayList<>(fofoIds));
30929 tejbeer 434
 
32052 tejbeer 435
        List<Integer> loanFofoIds = loans.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
30929 tejbeer 436
 
32052 tejbeer 437
        List<SDCreditRequirement> sdCreditRequirements = sdCreditRequirementRepository.selectByFofoIds(new ArrayList<>(loanFofoIds));
30929 tejbeer 438
 
32052 tejbeer 439
        Map<Integer, Long> loanCountMap = loans.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
32456 jai.hind 440
        LOGGER.info("loanCountMap" + loanCountMap);
30929 tejbeer 441
 
32052 tejbeer 442
        Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(fofoIds).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
443
        Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30929 tejbeer 444
 
32052 tejbeer 445
        model.addAttribute("userWalletMap", userWalletMap);
30929 tejbeer 446
 
32052 tejbeer 447
        model.addAttribute("currentPartnerDailyInvestmentMap", currentPartnerDailyInvestmentMap);
30929 tejbeer 448
 
32052 tejbeer 449
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(new ArrayList<>(fofoIds));
450
        model.addAttribute("sdCreditRequirements", sdCreditRequirements);
451
        model.addAttribute("loanCountMap", loanCountMap);
452
        model.addAttribute("customRetailerMap", customRetailerMap);
453
        return "loan-summary";
30929 tejbeer 454
 
32052 tejbeer 455
    }
32439 tejbeer 456
 
32197 jai.hind 457
    @RequestMapping(value = "/getPartnerWiseLoanSummary", method = RequestMethod.GET)
458
    public String getPartnerWiseLoanSummary(HttpServletRequest request, @RequestParam LoanSummaryType loanSummaryType, Model model) throws ProfitMandiBusinessException {
459
        Map<Integer, FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
460
        List<Loan> loans = new ArrayList<>();
461
        List<Loan> activeLoans = loanRepository.selectAllActiveLoan();
462
        if (loanSummaryType.equals(LoanSummaryType.TOTAL_LOAN)) {
463
            loans.addAll(activeLoans);
464
        } else if (loanSummaryType.equals(LoanSummaryType.DEFAULT_LOAN)) {
465
            for (Loan loan : activeLoans) {
466
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDateTime.now());
467
                if (noOfdaysBetween > 15) {
468
                    loans.add(loan);
469
                }
470
            }
30929 tejbeer 471
 
32197 jai.hind 472
        } else if (loanSummaryType.equals(LoanSummaryType.DUE_LOAN)) {
473
            for (Loan loan : activeLoans) {
474
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDateTime.now());
475
                if (noOfdaysBetween <= 15 && noOfdaysBetween >= 0) {
476
                    loans.add(loan);
477
                }
478
            }
479
        }
32439 tejbeer 480
        List<Integer> fofoIds = loans.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
481
        Map<Integer, Double> fofoIdLoansMap = loans.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> x.getPendingAmount().doubleValue())));
32197 jai.hind 482
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
32528 tejbeer 483
        Map<Integer, Long> loanCountMap = loans.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
32197 jai.hind 484
        model.addAttribute("customRetailerMap", customRetailerMap);
485
        model.addAttribute("loans", loans);
486
        model.addAttribute("fofoReportingModelMap", fofoReportingModelMap);
487
        model.addAttribute("fofoIdLoansMap", fofoIdLoansMap);
32456 jai.hind 488
        model.addAttribute("loanCountMap", loanCountMap);
32197 jai.hind 489
        return "partner-wise-loan-summary";
490
    }
491
 
32052 tejbeer 492
    @RequestMapping(value = "/getLoanSummary", method = RequestMethod.GET)
493
    public String getLoanSummary(HttpServletRequest request, @RequestParam int fofoId, Model model) throws ProfitMandiBusinessException {
30929 tejbeer 494
 
32052 tejbeer 495
        SDCreditResponseOut sdCreditResponseOut = sdCreditService.sdDirectService(fofoId);
496
        CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
30929 tejbeer 497
 
32052 tejbeer 498
        model.addAttribute("customRetailer", customRetailer);
499
        model.addAttribute("loanSummary", sdCreditResponseOut.getLoans());
30929 tejbeer 500
 
32052 tejbeer 501
        return "loan-summary-detail";
31020 tejbeer 502
 
32052 tejbeer 503
    }
31020 tejbeer 504
 
32439 tejbeer 505
    @RequestMapping(value = "/getSanctionUnholdOrder", method = RequestMethod.GET)
506
    public String getSanctionUnholdOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
31020 tejbeer 507
 
32052 tejbeer 508
        List<Order> allOrders = orderRepository.selectHoldOrder();
31020 tejbeer 509
 
32439 tejbeer 510
        List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanction();
31020 tejbeer 511
 
32442 tejbeer 512
 
513
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
32052 tejbeer 514
        if (!allOrders.isEmpty()) {
515
            Map<Integer, Double> transactionAmountMap = allOrders.stream().collect(
516
                    Collectors.groupingBy(Order::getTransactionId, Collectors.summingDouble(x -> x.getTotalAmount())));
31020 tejbeer 517
 
32052 tejbeer 518
            Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream().collect(Collectors.groupingBy(Order::getTransactionId, Collectors.toList()));
31020 tejbeer 519
 
520
 
32052 tejbeer 521
            model.addAttribute("transactionAmountMap", transactionAmountMap);
31020 tejbeer 522
 
32052 tejbeer 523
            model.addAttribute("transactionOrdersMap", transactionOrdersMap);
31020 tejbeer 524
 
32439 tejbeer 525
        }
526
        model.addAttribute("sanctionRequests", sanctionRequests);
31020 tejbeer 527
 
32442 tejbeer 528
        model.addAttribute("customRetailerMap", customRetailerMap);
31020 tejbeer 529
 
32442 tejbeer 530
 
32439 tejbeer 531
        return "sanction-order-unhold";
31020 tejbeer 532
 
32439 tejbeer 533
    }
31020 tejbeer 534
 
535
 
32439 tejbeer 536
    @RequestMapping(value = "/getSanctionHoldOrder", method = RequestMethod.GET)
537
    public String getSanctionHoldOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
31020 tejbeer 538
 
32439 tejbeer 539
        List<Order> allOrders = orderRepository.selectHoldOrder();
31020 tejbeer 540
 
32439 tejbeer 541
        List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanction();
32442 tejbeer 542
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
31020 tejbeer 543
 
32439 tejbeer 544
        if (!allOrders.isEmpty()) {
545
            Map<Integer, Double> transactionAmountMap = allOrders.stream().collect(
546
                    Collectors.groupingBy(Order::getTransactionId, Collectors.summingDouble(x -> x.getTotalAmount())));
31020 tejbeer 547
 
32439 tejbeer 548
            Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream().collect(Collectors.groupingBy(Order::getTransactionId, Collectors.toList()));
549
 
550
 
551
            model.addAttribute("transactionAmountMap", transactionAmountMap);
552
 
553
            model.addAttribute("transactionOrdersMap", transactionOrdersMap);
554
 
32052 tejbeer 555
        }
32439 tejbeer 556
        model.addAttribute("sanctionRequests", sanctionRequests);
32442 tejbeer 557
        model.addAttribute("customRetailerMap", customRetailerMap);
31020 tejbeer 558
 
32439 tejbeer 559
 
32052 tejbeer 560
        return "sanction-order-hold";
31020 tejbeer 561
 
32052 tejbeer 562
    }
31020 tejbeer 563
 
32052 tejbeer 564
    @RequestMapping(value = "/unholdOrder", method = RequestMethod.POST)
565
    public String unholdOrder(HttpServletRequest request, @RequestParam int transactionId, Model model) throws Exception {
31020 tejbeer 566
 
32052 tejbeer 567
        List<Order> orders = orderRepository.selectAllByTransactionId(transactionId);
31020 tejbeer 568
 
32455 tejbeer 569
        SanctionRequest sanctionRequest = sanctionRequestRepository.selectByTransactionId(transactionId);
570
 
571
 
32052 tejbeer 572
        LOGGER.info("orders" + orders);
31020 tejbeer 573
 
32455 tejbeer 574
        if (sanctionRequest != null) {
575
            sanctionRequest.setPendingAmount(BigDecimal.ZERO);
576
        }
577
 
32052 tejbeer 578
        if (!orders.isEmpty()) {
579
            orders.forEach(x -> x.setShipmentHold(false));
580
        }
31020 tejbeer 581
 
32052 tejbeer 582
        double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
31020 tejbeer 583
 
32052 tejbeer 584
        try {
31020 tejbeer 585
 
32052 tejbeer 586
            List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
31020 tejbeer 587
 
32052 tejbeer 588
            authUserEmail.add("vinay.p@smartdukaan.com");
589
            authUserEmail.add("shivam.gupta@smartdukaan.com");
31020 tejbeer 590
 
32052 tejbeer 591
            String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
31020 tejbeer 592
 
32052 tejbeer 593
            String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
31020 tejbeer 594
 
32052 tejbeer 595
            String subject = "Dispatched " + (orders.get(0).getRetailerName());
596
            String message = String.format("Dear Team, \n" + "Kindly note the meterial for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + " is dispatched.");
31020 tejbeer 597
 
32052 tejbeer 598
            LOGGER.info("message" + message);
31020 tejbeer 599
 
32052 tejbeer 600
            Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
601
        } catch (Exception e) {
31020 tejbeer 602
 
32052 tejbeer 603
            e.printStackTrace();
31020 tejbeer 604
 
32052 tejbeer 605
        }
31020 tejbeer 606
 
32052 tejbeer 607
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31020 tejbeer 608
 
32052 tejbeer 609
        return "response";
610
 
611
    }
612
 
30859 tejbeer 613
}