Subversion Repositories SmartDukaan

Rev

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