Subversion Repositories SmartDukaan

Rev

Rev 35158 | Rev 35216 | 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;
33858 ranu 43
import org.springframework.web.bind.annotation.*;
30859 tejbeer 44
 
32681 amit.gupta 45
import javax.servlet.http.HttpServletRequest;
46
import javax.transaction.Transactional;
47
import java.math.BigDecimal;
48
import java.math.RoundingMode;
49
import java.time.Duration;
50
import java.time.LocalDate;
51
import java.time.LocalDateTime;
52
import java.time.LocalTime;
53
import java.util.*;
54
import java.util.Map.Entry;
55
import java.util.stream.Collectors;
56
 
30859 tejbeer 57
@Controller
58
@Transactional(rollbackOn = Throwable.class)
59
public class SDCreditController {
60
 
32052 tejbeer 61
    @Autowired
62
    private RetailerService retailerService;
32439 tejbeer 63
 
32197 jai.hind 64
    @Autowired
65
    private UserService userService;
30859 tejbeer 66
 
32052 tejbeer 67
    @Autowired
68
    SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 69
 
32052 tejbeer 70
    @Autowired
71
    SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 72
 
32052 tejbeer 73
    @Autowired
74
    PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
30859 tejbeer 75
 
32052 tejbeer 76
    @Autowired
77
    private FofoStoreRepository fofoStoreRepository;
30859 tejbeer 78
 
32052 tejbeer 79
    @Autowired
80
    private CreditAccountRepository creditAccountRepository;
30859 tejbeer 81
 
32052 tejbeer 82
    @Autowired
83
    private SDCreditService sdCreditService;
30859 tejbeer 84
 
32052 tejbeer 85
    @Autowired
86
    private CsService1 csService1;
31666 amit.gupta 87
 
32052 tejbeer 88
    @Autowired
89
    private NotificationService notificationService;
30859 tejbeer 90
 
32052 tejbeer 91
    @Autowired
92
    private AuthRepository authRepository;
30859 tejbeer 93
 
32052 tejbeer 94
    @Autowired
95
    private UserRepository userRepository;
30859 tejbeer 96
 
32052 tejbeer 97
    @Autowired
98
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30913 tejbeer 99
 
32052 tejbeer 100
    @Autowired
101
    private UserWalletRepository userWalletRepository;
30929 tejbeer 102
 
32052 tejbeer 103
    @Autowired
104
    LoanRepository loanRepository;
30929 tejbeer 105
 
32052 tejbeer 106
    @Autowired
107
    private CookiesProcessor cookiesProcessor;
30936 tejbeer 108
 
32052 tejbeer 109
    @Autowired
110
    private CsService csService;
30936 tejbeer 111
 
32052 tejbeer 112
    @Autowired
113
    AddressRepository addressRepository;
30989 tejbeer 114
 
32052 tejbeer 115
    @Autowired
116
    OrderRepository orderRepository;
31020 tejbeer 117
 
32052 tejbeer 118
    @Autowired
119
    private LoanStatementRepository loanStatementRepository;
31020 tejbeer 120
 
32052 tejbeer 121
    @Autowired
122
    private com.spice.profitmandi.dao.repository.user.UserRepository userUserRepository;
30989 tejbeer 123
 
32052 tejbeer 124
    @Autowired
125
    private JavaMailSender mailSender;
31020 tejbeer 126
 
32052 tejbeer 127
    @Autowired
128
    private MVCResponseSender mvcResponseSender;
31020 tejbeer 129
 
32528 tejbeer 130
    @Autowired
131
    private FofoOrderItemRepository fofoOrderItemRepository;
132
 
32052 tejbeer 133
    private static final Logger LOGGER = LogManager.getLogger(SDCreditController.class);
30859 tejbeer 134
 
32052 tejbeer 135
    @RequestMapping(value = "/getSDCreditReq", method = RequestMethod.GET)
136
    public String getSDCreditReq(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
33854 tejus.loha 137
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
34969 ranu 138
        boolean isTarun = loginDetails.getEmailId().equals("tarun.verma@smartdukaan.com") || loginDetails.getEmailId().equals("kamini.sharma@smartdukaan.com");
30859 tejbeer 139
 
32052 tejbeer 140
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30859 tejbeer 141
 
32052 tejbeer 142
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
143
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
144
            int fofoId = customRetailerEntry.getKey();
30859 tejbeer 145
 
32052 tejbeer 146
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
30859 tejbeer 147
 
32052 tejbeer 148
            if (sdCreditRequirement != null) {
30913 tejbeer 149
 
32052 tejbeer 150
                BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30910 tejbeer 151
 
32052 tejbeer 152
                BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30910 tejbeer 153
 
32052 tejbeer 154
                LOGGER.info("utilizedLimit {} ", utilizedLimit);
30910 tejbeer 155
 
32052 tejbeer 156
                LOGGER.info("availableLimit {} ", availableLimit);
30910 tejbeer 157
 
32052 tejbeer 158
                sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30910 tejbeer 159
 
32052 tejbeer 160
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
161
            }
30859 tejbeer 162
 
32052 tejbeer 163
        }
30859 tejbeer 164
 
32052 tejbeer 165
        model.addAttribute("customRetailerMap", customRetailerMap);
166
        model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
33854 tejus.loha 167
        model.addAttribute("isTarun", isTarun);
32052 tejbeer 168
        return "sd-credit";
169
    }
30921 tejbeer 170
 
32052 tejbeer 171
    @RequestMapping(value = "/creditRequirement", method = RequestMethod.POST)
172
    public String sdCredit(HttpServletRequest request, @RequestBody SdCreditRequirementModel sdCreditRequirementModel, Model model) throws Exception {
30859 tejbeer 173
 
32052 tejbeer 174
        LOGGER.info("sdCreditRequirementModel {} ", sdCreditRequirementModel);
30859 tejbeer 175
 
32052 tejbeer 176
        int fofoId = sdCreditRequirementModel.getFofoId();
30859 tejbeer 177
 
32052 tejbeer 178
        SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(sdCreditRequirementModel.getFofoId());
30859 tejbeer 179
 
33854 tejus.loha 180
        // sdCreditRequirement.setSecurityCheck(2);
32052 tejbeer 181
        sdCreditRequirement.setSecurityCheck(sdCreditRequirementModel.getSecurityCheck());
30859 tejbeer 182
 
33854 tejus.loha 183
 
184
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
34969 ranu 185
        boolean isTarun = loginDetails.getEmailId().equals("tarun.verma@smartdukaan.com") || loginDetails.getEmailId().equals("kamini.sharma@smartdukaan.com");
33854 tejus.loha 186
        if (isTarun) {
187
            if (sdCreditRequirement.getLimit() != sdCreditRequirementModel.getLimit()) {
188
                sdCreditRequirement.setHardLimit(true);
35158 amit 189
                sdCreditService.updateMinInvestmentForHardLimit(sdCreditRequirement, true);
33854 tejus.loha 190
            }
191
        }
192
 
32052 tejbeer 193
        sdCreditRequirement.setInterestRate(sdCreditRequirementModel.getInterest());
194
        sdCreditRequirement.setFreeDays(sdCreditRequirementModel.getFreeDays());
195
        sdCreditRequirement.setLimit(sdCreditRequirementModel.getLimit());
196
        BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30865 tejbeer 197
 
32052 tejbeer 198
        BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30865 tejbeer 199
 
32052 tejbeer 200
        LOGGER.info("utilizedLimit {} ", utilizedLimit);
30909 tejbeer 201
 
32052 tejbeer 202
        LOGGER.info("availableLimit {} ", availableLimit);
30909 tejbeer 203
 
32052 tejbeer 204
        sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30859 tejbeer 205
 
32052 tejbeer 206
        sdCreditRequirement.setCreditDays(15);
207
        sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30859 tejbeer 208
 
32052 tejbeer 209
        if (sdCreditRequirement.getSecurityCheck() > 0) {
30859 tejbeer 210
 
32052 tejbeer 211
            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(sdCreditRequirementModel.getFofoId(), Gateway.SDDIRECT);
212
            if (creditAccount == null) {
213
                creditAccount = new CreditAccount();
214
                creditAccount.setFofoId(sdCreditRequirementModel.getFofoId());
215
                creditAccount.setGateway(Gateway.SDDIRECT);
216
                creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
217
                creditAccount.setActive(false);
30859 tejbeer 218
 
32052 tejbeer 219
                creditAccount.setUpdatedOn(LocalDateTime.now());
30859 tejbeer 220
 
32052 tejbeer 221
                creditAccountRepository.persist(creditAccount);
222
            }
223
            creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
224
            creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
225
            creditAccount.setAvailableAmount(availableLimit.floatValue());
226
            creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
227
            creditAccount.setUpdatedOn(LocalDateTime.now());
228
        }
229
        LOGGER.info("sdCreditRequirement {} ", sdCreditRequirement);
30859 tejbeer 230
 
32052 tejbeer 231
        CustomRetailer customRetailer = retailerService.getFofoRetailer(sdCreditRequirementModel.getFofoId());
30859 tejbeer 232
 
32052 tejbeer 233
        sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(sdCreditRequirementModel.getFofoId());
30865 tejbeer 234
 
32052 tejbeer 235
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = new HashMap<>();
236
        sdCreditRequirementMap.put(sdCreditRequirement.getFofoId(), sdCreditRequirement);
237
        model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
238
        model.addAttribute("customRetailer", customRetailer);
33854 tejus.loha 239
        model.addAttribute("isTarun", isTarun);
30859 tejbeer 240
 
32052 tejbeer 241
        return "sd-credit-requirement-row";
30859 tejbeer 242
 
32052 tejbeer 243
    }
30859 tejbeer 244
 
33854 tejus.loha 245
    @RequestMapping(value = "/resetHardLimit", method = RequestMethod.PUT)
246
    public String resetHardLimit(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
247
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
34969 ranu 248
        if (loginDetails.getEmailId().equals("tarun.verma@smartdukaan.com") || loginDetails.getEmailId().equals("kamini.sharma@smartdukaan.com")) {
33854 tejus.loha 249
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectById(id);
250
                sdCreditRequirement.setHardLimit(false);
35139 amit 251
            sdCreditRequirement.setLimit(sdCreditRequirement.getSuggestedLimit());
33854 tejus.loha 252
        }
253
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
254
        return "response";
255
    }
256
 
32052 tejbeer 257
    @RequestMapping(value = "/getSanctionRequest", method = RequestMethod.GET)
258
    public String getSanctionRequest(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
30859 tejbeer 259
 
34355 ranu 260
        List<SanctionRequest> sanctionRequests = sanctionRequestRepository.getL2ApprovedByDate(LocalDate.now(), SanctionStatus.APPROVED);
30859 tejbeer 261
 
32041 amit.gupta 262
 
32052 tejbeer 263
        if (!sanctionRequests.isEmpty()) {
30859 tejbeer 264
 
32053 tejbeer 265
            List<Integer> authIds = sanctionRequests.stream().map(x -> x.getAuthId()).collect(Collectors.toList());
266
 
267
            Map<Integer, String> authMap = authRepository.selectAllAuthUserByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getFullName()));
268
 
269
 
32052 tejbeer 270
            List<Integer> fofoIds = sanctionRequests.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
30859 tejbeer 271
 
32052 tejbeer 272
            Map<Integer, Long> partnerCreditDaysMap = new HashMap<>();
31110 tejbeer 273
 
32052 tejbeer 274
            Map<Integer, Integer> partnerActiveLoanMap = new HashMap<>();
32681 amit.gupta 275
            Map<Integer, Integer> partnerAverageCreditDaysMap = new HashMap<>();
31110 tejbeer 276
 
32528 tejbeer 277
            LocalDateTime curDate = LocalDate.now().atStartOfDay();
278
 
33505 amit.gupta 279
            /*Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
32528 tejbeer 280
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
281
 
282
            Map<Integer, Double> mtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
283
 
284
            Map<Integer, Double> lmsSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
33505 amit.gupta 285
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1), 0, false);*/
32528 tejbeer 286
 
33505 amit.gupta 287
            Map<Integer, Double> secondaryMtd = orderRepository
288
                    .selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
289
            Map<Integer, Double> secondaryLmtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
290
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1));
291
            Map<Integer, Double> secondaryLms = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
292
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1));
293
 
32681 amit.gupta 294
            List<Loan> loans = loanRepository.selectAllLoans(fofoIds, DateRangeModel.withStartDate(curDate.minusYears(2)));
33205 amit.gupta 295
            Map<Integer, List<Loan>> partnerClosedLoansMap = loans.stream().filter(x -> x.getPendingAmount().compareTo(BigDecimal.ZERO) == 0)
32740 amit.gupta 296
                    .collect(Collectors.groupingBy(x -> x.getFofoId()));
32528 tejbeer 297
 
31110 tejbeer 298
 
32740 amit.gupta 299
            Map<Integer, List<Loan>> activeLoansMap = loans.stream().filter(x -> x.getPendingAmount().compareTo(BigDecimal.ZERO) == 1).collect(Collectors.groupingBy(x -> x.getFofoId()));
32528 tejbeer 300
 
32681 amit.gupta 301
            for (Integer fofoId : fofoIds) {
32693 amit.gupta 302
                LOGGER.info("Fofo Id - {}", fofoId);
32681 amit.gupta 303
                List<Loan> activeLoans = activeLoansMap.get(fofoId);
304
                if (activeLoans != null) {
305
                    partnerActiveLoanMap.put(fofoId, activeLoans.size());
32742 amit.gupta 306
                    Loan loan = activeLoans.stream().sorted(Comparator.comparing(Loan::getCreatedOn)).findFirst().get();
32052 tejbeer 307
                    long daysBetween = Duration.between(loan.getCreatedOn(), LocalDateTime.now()).toDays();
308
                    partnerCreditDaysMap.put(fofoId, daysBetween);
309
                }
32681 amit.gupta 310
                List<Loan> closedLoans = partnerClosedLoansMap.get(fofoId);
311
                if (closedLoans != null) {
312
                    long averageCreditDays = Math.round(closedLoans.stream().mapToLong(x -> Duration.between(x.getCreatedOn(),
32683 amit.gupta 313
                            x.getSettledOn() == null ? x.getCreatedOn().plusDays(10) : x.getSettledOn()).toDays() + 1).average().orElse(0.0));
32681 amit.gupta 314
                    partnerAverageCreditDaysMap.put(fofoId, (int) averageCreditDays);
315
                }
31110 tejbeer 316
 
32052 tejbeer 317
            }
32681 amit.gupta 318
            model.addAttribute("partnerActiveLoanMap", partnerActiveLoanMap);
319
            model.addAttribute("partnerCreditDaysMap", partnerCreditDaysMap);
320
            model.addAttribute("partnerAverageCreditDaysMap", partnerAverageCreditDaysMap);
31110 tejbeer 321
 
32052 tejbeer 322
            Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30967 tejbeer 323
 
32052 tejbeer 324
            Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
30859 tejbeer 325
 
32052 tejbeer 326
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
327
            Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 328
 
32052 tejbeer 329
            model.addAttribute("customRetailerMap", customRetailerMap);
30859 tejbeer 330
 
32052 tejbeer 331
            model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
332
            model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
30859 tejbeer 333
 
32052 tejbeer 334
            model.addAttribute("userWalletMap", userWalletMap);
32053 tejbeer 335
            model.addAttribute("authMap", authMap);
33505 amit.gupta 336
            model.addAttribute("secondaryMtd", secondaryMtd);
337
            model.addAttribute("secondarylmtd", secondaryLmtd);
338
            model.addAttribute("secondarylms", secondaryLms);
31020 tejbeer 339
 
33354 amit.gupta 340
            List<CreditAccount> creditAccounts = creditAccountRepository.selectByFofoIds(fofoIds);
33854 tejus.loha 341
            model.addAttribute("creditAccounts", creditAccounts.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x.getGateway())));
32052 tejbeer 342
        }
30859 tejbeer 343
 
32052 tejbeer 344
        model.addAttribute("sanctionRequests", sanctionRequests);
30859 tejbeer 345
 
32052 tejbeer 346
        model.addAttribute("sanctionStatus", SanctionStatus.values());
347
        return "sanction-request";
30859 tejbeer 348
 
32052 tejbeer 349
    }
30859 tejbeer 350
 
34355 ranu 351
 
352
    @RequestMapping(value = "/getRbmL2SanctionRequest", method = RequestMethod.GET)
353
    public String getRbmL2SanctionRequest(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
354
 
355
        List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectByDate(LocalDate.now());
356
 
357
 
358
        if (!sanctionRequests.isEmpty()) {
359
 
360
            List<Integer> authIds = sanctionRequests.stream().map(x -> x.getAuthId()).collect(Collectors.toList());
361
 
362
            Map<Integer, String> authMap = authRepository.selectAllAuthUserByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getFullName()));
363
 
364
 
365
            List<Integer> fofoIds = sanctionRequests.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
366
 
367
            Map<Integer, Long> partnerCreditDaysMap = new HashMap<>();
368
 
369
            Map<Integer, Integer> partnerActiveLoanMap = new HashMap<>();
370
            Map<Integer, Integer> partnerAverageCreditDaysMap = new HashMap<>();
371
 
372
            LocalDateTime curDate = LocalDate.now().atStartOfDay();
373
 
374
            Map<Integer, Double> secondaryMtd = orderRepository
375
                    .selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
376
            Map<Integer, Double> secondaryLmtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
377
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1));
378
            Map<Integer, Double> secondaryLms = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
379
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1));
380
 
381
            List<Loan> loans = loanRepository.selectAllLoans(fofoIds, DateRangeModel.withStartDate(curDate.minusYears(2)));
382
            Map<Integer, List<Loan>> partnerClosedLoansMap = loans.stream().filter(x -> x.getPendingAmount().compareTo(BigDecimal.ZERO) == 0)
383
                    .collect(Collectors.groupingBy(x -> x.getFofoId()));
384
 
385
 
386
            Map<Integer, List<Loan>> activeLoansMap = loans.stream().filter(x -> x.getPendingAmount().compareTo(BigDecimal.ZERO) == 1).collect(Collectors.groupingBy(x -> x.getFofoId()));
387
 
388
            for (Integer fofoId : fofoIds) {
389
                LOGGER.info("Fofo Id - {}", fofoId);
390
                List<Loan> activeLoans = activeLoansMap.get(fofoId);
391
                if (activeLoans != null) {
392
                    partnerActiveLoanMap.put(fofoId, activeLoans.size());
393
                    Loan loan = activeLoans.stream().sorted(Comparator.comparing(Loan::getCreatedOn)).findFirst().get();
394
                    long daysBetween = Duration.between(loan.getCreatedOn(), LocalDateTime.now()).toDays();
395
                    partnerCreditDaysMap.put(fofoId, daysBetween);
396
                }
397
                List<Loan> closedLoans = partnerClosedLoansMap.get(fofoId);
398
                if (closedLoans != null) {
399
                    long averageCreditDays = Math.round(closedLoans.stream().mapToLong(x -> Duration.between(x.getCreatedOn(),
400
                            x.getSettledOn() == null ? x.getCreatedOn().plusDays(10) : x.getSettledOn()).toDays() + 1).average().orElse(0.0));
401
                    partnerAverageCreditDaysMap.put(fofoId, (int) averageCreditDays);
402
                }
403
 
404
            }
405
            model.addAttribute("partnerActiveLoanMap", partnerActiveLoanMap);
406
            model.addAttribute("partnerCreditDaysMap", partnerCreditDaysMap);
407
            model.addAttribute("partnerAverageCreditDaysMap", partnerAverageCreditDaysMap);
408
 
409
            Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
410
 
411
            Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
412
 
413
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
414
            Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
415
 
416
            model.addAttribute("customRetailerMap", customRetailerMap);
417
 
418
            model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
419
            model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
420
 
421
            model.addAttribute("userWalletMap", userWalletMap);
422
            model.addAttribute("authMap", authMap);
423
            model.addAttribute("secondaryMtd", secondaryMtd);
424
            model.addAttribute("secondarylmtd", secondaryLmtd);
425
            model.addAttribute("secondarylms", secondaryLms);
426
 
427
            List<CreditAccount> creditAccounts = creditAccountRepository.selectByFofoIds(fofoIds);
428
            model.addAttribute("creditAccounts", creditAccounts.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x.getGateway())));
429
        }
430
 
431
        model.addAttribute("sanctionRequests", sanctionRequests);
432
 
433
        model.addAttribute("sanctionStatus", SanctionStatus.values());
434
        return "sanction-request-l2";
435
 
436
    }
437
 
32052 tejbeer 438
    @RequestMapping(value = "/sanctionRequest", method = RequestMethod.POST)
439
    public String sanctionRequest(HttpServletRequest request, @RequestBody SanctionRequestModel sanctionRequestModel, Model model) throws Exception {
30859 tejbeer 440
 
32052 tejbeer 441
        LOGGER.info("sanctionRequestModel {} ", sanctionRequestModel);
442
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 443
 
32052 tejbeer 444
        SanctionRequest sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
30859 tejbeer 445
 
33205 amit.gupta 446
        Map<Integer, String> authMap = new HashMap<>();
32052 tejbeer 447
        AuthUser authUser = authRepository.selectById(sanctionRequest.getAuthId());
30859 tejbeer 448
 
32052 tejbeer 449
        authMap.put(authUser.getId(), authUser.getFullName());
30859 tejbeer 450
 
32052 tejbeer 451
        model.addAttribute("authMap", authMap);
452
        List<Integer> fofoIds = sanctionRequestRepository.selectByDate(LocalDate.now()).stream().map(x -> x.getFofoId()).collect(Collectors.toList());
30859 tejbeer 453
 
32052 tejbeer 454
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
30859 tejbeer 455
 
32052 tejbeer 456
        LOGGER.info("freeDays {} ", sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays());
30989 tejbeer 457
 
32052 tejbeer 458
        if (sanctionRequestModel.getStatus().equals(SanctionStatus.APPROVED)) {
459
            CustomRetailer customRetailer = customRetailerMap.get(sanctionRequest.getFofoId());
460
            sanctionRequest.setApprovalTimestamp(LocalDateTime.now());
461
            BigDecimal availableAmount = sdCreditService.getAvailableAmount(sanctionRequest.getFofoId());
30989 tejbeer 462
 
32052 tejbeer 463
            String title = "Sanction Request Approved";
464
            String url = "http://app.smartdukaan.com/pages/home/credit";
465
            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) + ".";
466
            notificationService.sendNotification(sanctionRequest.getFofoId(), title, MessageType.notification, title, message, url);
467
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(sanctionRequest.getFofoId());
30859 tejbeer 468
 
32052 tejbeer 469
            Address address = addressRepository.selectById(user.getAddressId());
32777 amit.gupta 470
            //TODO-Whatsapp
471
            //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30859 tejbeer 472
 
35210 vikas 473
            String empMessage = "Congratulations! Your Partner " + customRetailer.getBusinessName() + " credit limit is increased for today by Rs." + sanctionRequest.getApprovalAmount().setScale(2, RoundingMode.HALF_UP) + " and now the new total available limit is Rs." + availableAmount.setScale(2, RoundingMode.HALF_UP) + ".";
32052 tejbeer 474
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
475
            sendNotificationModel.setCampaignName("Sanction Request");
476
            sendNotificationModel.setTitle("title");
477
            sendNotificationModel.setMessage(empMessage);
478
            sendNotificationModel.setType("url");
479
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/credit");
480
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
481
            sendNotificationModel.setMessageType(MessageType.notification);
482
            sendNotificationModel.setUserIds(Arrays.asList(userRepository.selectByEmailId(authUser.getEmailId()).getId()));
483
            System.out.println(sendNotificationModel);
484
            notificationService.sendNotification(sendNotificationModel);
30859 tejbeer 485
 
32840 amit.gupta 486
            //notificationService.sendWhatsappMessage(empMessage, title, authUser.getMobileNumber());
30859 tejbeer 487
 
32052 tejbeer 488
        }
30859 tejbeer 489
 
32135 tejbeer 490
        sanctionRequest.setFreeDays(sanctionRequestModel.getFreeDays());
30967 tejbeer 491
 
34125 ranu 492
        sanctionRequest.setApprovalAmount(sanctionRequestModel.getApprovalAmount());
493
        if (sanctionRequestModel.getApprovalAmount() == null) {
494
            sanctionRequest.setStatus(SanctionStatus.REJECTED);
34355 ranu 495
            sanctionRequest.setRbmL2ApprovalStatus(SanctionStatus.REJECTED);
34125 ranu 496
        } else {
497
            sanctionRequest.setStatus(sanctionRequestModel.getStatus());
498
        }
32135 tejbeer 499
 
32052 tejbeer 500
        sanctionRequest.setStockHold(sanctionRequestModel.isStockHold());
32683 amit.gupta 501
 
32528 tejbeer 502
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
30967 tejbeer 503
 
33505 amit.gupta 504
        /*Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
32528 tejbeer 505
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), sanctionRequest.getFofoId(), false);
506
 
507
        Map<Integer, Double> mtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), sanctionRequest.getFofoId(), false);
508
 
509
        Map<Integer, Double> lmsSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
33505 amit.gupta 510
                curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1), sanctionRequest.getFofoId(), false);*/
32528 tejbeer 511
 
33505 amit.gupta 512
        Map<Integer, Double> secondaryMtd = orderRepository
513
                .selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
514
        Map<Integer, Double> secondarylmtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
515
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1));
516
        Map<Integer, Double> secondarylms = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
517
                curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1));
32528 tejbeer 518
 
32052 tejbeer 519
        Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 520
 
32052 tejbeer 521
        Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
30859 tejbeer 522
 
32052 tejbeer 523
        sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
524
        model.addAttribute("customRetailerMap", customRetailerMap);
525
        model.addAttribute("sanctionRequest", sanctionRequest);
526
        model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
527
        model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
528
        model.addAttribute("userWalletMap", userWalletMap);
30859 tejbeer 529
 
32052 tejbeer 530
        model.addAttribute("sanctionStatus", SanctionStatus.values());
32683 amit.gupta 531
 
33505 amit.gupta 532
        model.addAttribute("secondarylmtd", secondarylmtd);
533
        model.addAttribute("secondaryMtd", secondaryMtd);
534
        model.addAttribute("secondarylms", secondarylms);
30859 tejbeer 535
 
33354 amit.gupta 536
        List<CreditAccount> creditAccounts = creditAccountRepository.selectByFofoIds(Arrays.asList(sanctionRequest.getFofoId()));
33854 tejus.loha 537
        model.addAttribute("creditAccounts", creditAccounts.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x.getGateway())));
32052 tejbeer 538
        return "sanction-request-row";
30936 tejbeer 539
 
32052 tejbeer 540
    }
30929 tejbeer 541
 
34355 ranu 542
    @RequestMapping(value = "/rbmL2ApprovalSanctionRequest", method = RequestMethod.POST)
543
    public String rbmL2ApprovalSanctionRequest(HttpServletRequest request, @RequestBody SanctionRequestModel sanctionRequestModel, Model model) throws Exception {
34357 ranu 544
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
545
        AuthUser approverAuthUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());
34355 ranu 546
        LOGGER.info("sanctionRequestModel {} ", sanctionRequestModel);
547
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
548
 
549
        SanctionRequest sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
550
 
551
        Map<Integer, String> authMap = new HashMap<>();
34357 ranu 552
 
34355 ranu 553
        AuthUser authUser = authRepository.selectById(sanctionRequest.getAuthId());
554
 
555
        authMap.put(authUser.getId(), authUser.getFullName());
556
 
557
        model.addAttribute("authMap", authMap);
558
        List<Integer> fofoIds = sanctionRequestRepository.selectByDate(LocalDate.now()).stream().map(x -> x.getFofoId()).collect(Collectors.toList());
559
 
560
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
561
 
562
        LOGGER.info("freeDays {} ", sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays());
563
 
564
        if (sanctionRequestModel.getStatus().equals(SanctionStatus.APPROVED)) {
565
            sanctionRequest.setRbmL2ApprovalTimestamp(LocalDateTime.now());
34357 ranu 566
            sanctionRequest.setRbmL2ApproverEmail(approverAuthUser.getEmailId());
34355 ranu 567
        }
568
 
569
        sanctionRequest.setFreeDays(sanctionRequestModel.getFreeDays());
570
 
571
        sanctionRequest.setApprovalAmount(sanctionRequestModel.getApprovalAmount());
572
        if (sanctionRequestModel.getApprovalAmount() == null) {
573
 
574
            sanctionRequest.setStatus(SanctionStatus.REJECTED);
575
 
576
            sanctionRequest.setRbmL2ApprovalStatus(SanctionStatus.REJECTED);
577
            sanctionRequest.setRbmL2ApprovalTimestamp(LocalDateTime.now());
34357 ranu 578
            sanctionRequest.setRbmL2ApproverEmail(approverAuthUser.getEmailId());
34355 ranu 579
        } else {
580
            sanctionRequest.setRbmL2ApprovalStatus(sanctionRequestModel.getStatus());
581
        }
582
 
583
        sanctionRequest.setStockHold(sanctionRequestModel.isStockHold());
584
 
585
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
586
 
587
 
588
        Map<Integer, Double> secondaryMtd = orderRepository
589
                .selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
590
        Map<Integer, Double> secondarylmtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
591
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1));
592
        Map<Integer, Double> secondarylms = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
593
                curDate.withDayOfMonth(1).minusMonths(1), curDate.withDayOfMonth(1));
594
 
595
        Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
596
 
597
        Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
598
 
599
        sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
600
        model.addAttribute("customRetailerMap", customRetailerMap);
601
        model.addAttribute("sanctionRequest", sanctionRequest);
602
        model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
603
        model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
604
        model.addAttribute("userWalletMap", userWalletMap);
605
 
606
        model.addAttribute("sanctionStatus", SanctionStatus.values());
607
 
608
        model.addAttribute("secondarylmtd", secondarylmtd);
609
        model.addAttribute("secondaryMtd", secondaryMtd);
610
        model.addAttribute("secondarylms", secondarylms);
611
 
612
        List<CreditAccount> creditAccounts = creditAccountRepository.selectByFofoIds(Arrays.asList(sanctionRequest.getFofoId()));
613
        model.addAttribute("creditAccounts", creditAccounts.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x.getGateway())));
614
        return "rbm-l2-pending-sanction-request";
615
 
616
    }
617
 
32052 tejbeer 618
    List<String> emails = Arrays.asList("kamini.sharma@smartdukaan.com", "neeraj.gupta@smartdukaan.com", "amit.gupta@smartdukaan.com");
30929 tejbeer 619
 
32052 tejbeer 620
    @RequestMapping(value = "/getLoans", method = RequestMethod.GET)
621
    public String getLoans(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
30936 tejbeer 622
 
32052 tejbeer 623
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
624
        String email = loginDetails.getEmailId();
30936 tejbeer 625
 
32052 tejbeer 626
        AuthUser authUser = authRepository.selectByEmailOrMobile(email);
627
        Set<Integer> fofoIds = csService1.getAuthFofoIds(email, false);
30936 tejbeer 628
 
32052 tejbeer 629
        LOGGER.info("fofoIds" + fofoIds);
630
        if (fofoIds == null) {
631
            throw new ProfitMandiBusinessException("you are not authorized", "", "you are not authorized" + " " + "");
632
        }
30936 tejbeer 633
 
33827 ranu 634
        List<LoanCountByFofoIdModel> loanCountByFofoIdModels = loanRepository.getAllLoanCountByFofoId(fofoIds);
635
        Map<Integer, Long> loanCountMap = loanCountByFofoIdModels.stream().collect(Collectors.toMap(LoanCountByFofoIdModel::getFofoId, LoanCountByFofoIdModel::getLoanCount));
30929 tejbeer 636
 
33827 ranu 637
//        List<Loan> loans = loanRepository.selectAllLoans(new ArrayList<>(fofoIds));
30929 tejbeer 638
 
33827 ranu 639
        List<Integer> loanFofoIds = loanCountByFofoIdModels.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
640
 
32052 tejbeer 641
        List<SDCreditRequirement> sdCreditRequirements = sdCreditRequirementRepository.selectByFofoIds(new ArrayList<>(loanFofoIds));
30929 tejbeer 642
 
33827 ranu 643
//        Map<Integer, Long> loanCountMap = loans.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
644
//        LOGGER.info("loanCountMap" + loanCountMap);
30929 tejbeer 645
 
32052 tejbeer 646
        Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(fofoIds).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));
647
        Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30929 tejbeer 648
 
32052 tejbeer 649
        model.addAttribute("userWalletMap", userWalletMap);
30929 tejbeer 650
 
32052 tejbeer 651
        model.addAttribute("currentPartnerDailyInvestmentMap", currentPartnerDailyInvestmentMap);
30929 tejbeer 652
 
32052 tejbeer 653
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(new ArrayList<>(fofoIds));
654
        model.addAttribute("sdCreditRequirements", sdCreditRequirements);
655
        model.addAttribute("loanCountMap", loanCountMap);
656
        model.addAttribute("customRetailerMap", customRetailerMap);
657
        return "loan-summary";
30929 tejbeer 658
 
32052 tejbeer 659
    }
32439 tejbeer 660
 
32197 jai.hind 661
    @RequestMapping(value = "/getPartnerWiseLoanSummary", method = RequestMethod.GET)
662
    public String getPartnerWiseLoanSummary(HttpServletRequest request, @RequestParam LoanSummaryType loanSummaryType, Model model) throws ProfitMandiBusinessException {
663
        Map<Integer, FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
33533 amit.gupta 664
        List<Loan> loans = loanRepository.selectAllActiveLoan();
665
        if (loanSummaryType.equals(LoanSummaryType.DEFAULT_LOAN)) {
33854 tejus.loha 666
            loans = loans.stream().filter(x -> x.isDefault()).collect(Collectors.toList());
32197 jai.hind 667
        } else if (loanSummaryType.equals(LoanSummaryType.DUE_LOAN)) {
33854 tejus.loha 668
            loans = loans.stream().filter(x -> x.isOverdue()).collect(Collectors.toList());
32197 jai.hind 669
        }
32439 tejbeer 670
        List<Integer> fofoIds = loans.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
671
        Map<Integer, Double> fofoIdLoansMap = loans.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> x.getPendingAmount().doubleValue())));
32197 jai.hind 672
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
32528 tejbeer 673
        Map<Integer, Long> loanCountMap = loans.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
32197 jai.hind 674
        model.addAttribute("customRetailerMap", customRetailerMap);
675
        model.addAttribute("loans", loans);
676
        model.addAttribute("fofoReportingModelMap", fofoReportingModelMap);
677
        model.addAttribute("fofoIdLoansMap", fofoIdLoansMap);
32456 jai.hind 678
        model.addAttribute("loanCountMap", loanCountMap);
32197 jai.hind 679
        return "partner-wise-loan-summary";
680
    }
681
 
32052 tejbeer 682
    @RequestMapping(value = "/getLoanSummary", method = RequestMethod.GET)
683
    public String getLoanSummary(HttpServletRequest request, @RequestParam int fofoId, Model model) throws ProfitMandiBusinessException {
30929 tejbeer 684
 
32052 tejbeer 685
        SDCreditResponseOut sdCreditResponseOut = sdCreditService.sdDirectService(fofoId);
686
        CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
30929 tejbeer 687
 
32052 tejbeer 688
        model.addAttribute("customRetailer", customRetailer);
689
        model.addAttribute("loanSummary", sdCreditResponseOut.getLoans());
30929 tejbeer 690
 
32052 tejbeer 691
        return "loan-summary-detail";
31020 tejbeer 692
 
32052 tejbeer 693
    }
31020 tejbeer 694
 
32439 tejbeer 695
    @RequestMapping(value = "/getSanctionUnholdOrder", method = RequestMethod.GET)
696
    public String getSanctionUnholdOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
31020 tejbeer 697
 
32052 tejbeer 698
        List<Order> allOrders = orderRepository.selectHoldOrder();
31020 tejbeer 699
 
32439 tejbeer 700
        List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanction();
31020 tejbeer 701
 
32442 tejbeer 702
 
703
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
32052 tejbeer 704
        if (!allOrders.isEmpty()) {
705
            Map<Integer, Double> transactionAmountMap = allOrders.stream().collect(
706
                    Collectors.groupingBy(Order::getTransactionId, Collectors.summingDouble(x -> x.getTotalAmount())));
31020 tejbeer 707
 
32052 tejbeer 708
            Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream().collect(Collectors.groupingBy(Order::getTransactionId, Collectors.toList()));
31020 tejbeer 709
 
710
 
32052 tejbeer 711
            model.addAttribute("transactionAmountMap", transactionAmountMap);
31020 tejbeer 712
 
32052 tejbeer 713
            model.addAttribute("transactionOrdersMap", transactionOrdersMap);
31020 tejbeer 714
 
32439 tejbeer 715
        }
716
        model.addAttribute("sanctionRequests", sanctionRequests);
31020 tejbeer 717
 
32442 tejbeer 718
        model.addAttribute("customRetailerMap", customRetailerMap);
31020 tejbeer 719
 
32442 tejbeer 720
 
32439 tejbeer 721
        return "sanction-order-unhold";
31020 tejbeer 722
 
32439 tejbeer 723
    }
31020 tejbeer 724
 
725
 
32439 tejbeer 726
    @RequestMapping(value = "/getSanctionHoldOrder", method = RequestMethod.GET)
727
    public String getSanctionHoldOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
31020 tejbeer 728
 
32439 tejbeer 729
        List<Order> allOrders = orderRepository.selectHoldOrder();
31020 tejbeer 730
 
32439 tejbeer 731
        List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanction();
32442 tejbeer 732
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
31020 tejbeer 733
 
32439 tejbeer 734
        if (!allOrders.isEmpty()) {
735
            Map<Integer, Double> transactionAmountMap = allOrders.stream().collect(
736
                    Collectors.groupingBy(Order::getTransactionId, Collectors.summingDouble(x -> x.getTotalAmount())));
31020 tejbeer 737
 
32439 tejbeer 738
            Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream().collect(Collectors.groupingBy(Order::getTransactionId, Collectors.toList()));
739
 
740
 
741
            model.addAttribute("transactionAmountMap", transactionAmountMap);
742
 
743
            model.addAttribute("transactionOrdersMap", transactionOrdersMap);
744
 
32052 tejbeer 745
        }
32439 tejbeer 746
        model.addAttribute("sanctionRequests", sanctionRequests);
32442 tejbeer 747
        model.addAttribute("customRetailerMap", customRetailerMap);
31020 tejbeer 748
 
32439 tejbeer 749
 
32052 tejbeer 750
        return "sanction-order-hold";
31020 tejbeer 751
 
32052 tejbeer 752
    }
31020 tejbeer 753
 
32052 tejbeer 754
    @RequestMapping(value = "/unholdOrder", method = RequestMethod.POST)
755
    public String unholdOrder(HttpServletRequest request, @RequestParam int transactionId, Model model) throws Exception {
31020 tejbeer 756
 
32052 tejbeer 757
        List<Order> orders = orderRepository.selectAllByTransactionId(transactionId);
31020 tejbeer 758
 
32455 tejbeer 759
        SanctionRequest sanctionRequest = sanctionRequestRepository.selectByTransactionId(transactionId);
760
 
761
 
32052 tejbeer 762
        LOGGER.info("orders" + orders);
31020 tejbeer 763
 
32455 tejbeer 764
        if (sanctionRequest != null) {
765
            sanctionRequest.setPendingAmount(BigDecimal.ZERO);
766
        }
767
 
32052 tejbeer 768
        if (!orders.isEmpty()) {
769
            orders.forEach(x -> x.setShipmentHold(false));
770
        }
31020 tejbeer 771
 
32052 tejbeer 772
        double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
31020 tejbeer 773
 
32052 tejbeer 774
        try {
31020 tejbeer 775
 
32052 tejbeer 776
            List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
31020 tejbeer 777
 
32052 tejbeer 778
            authUserEmail.add("vinay.p@smartdukaan.com");
779
            authUserEmail.add("shivam.gupta@smartdukaan.com");
31020 tejbeer 780
 
32052 tejbeer 781
            String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
31020 tejbeer 782
 
32052 tejbeer 783
            String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
31020 tejbeer 784
 
32052 tejbeer 785
            String subject = "Dispatched " + (orders.get(0).getRetailerName());
786
            String message = String.format("Dear Team, \n" + "Kindly note the meterial for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + " is dispatched.");
31020 tejbeer 787
 
32052 tejbeer 788
            LOGGER.info("message" + message);
31020 tejbeer 789
 
32052 tejbeer 790
            Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
791
        } catch (Exception e) {
31020 tejbeer 792
 
32052 tejbeer 793
            e.printStackTrace();
31020 tejbeer 794
 
32052 tejbeer 795
        }
31020 tejbeer 796
 
32052 tejbeer 797
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31020 tejbeer 798
 
32052 tejbeer 799
        return "response";
800
 
801
    }
802
 
33851 ranu 803
 
804
//    adjusting loan for specific loan if loan is not adjusting and other loan is adjusting
805
 
33858 ranu 806
    @RequestMapping(value = "/settle-loan/{fofoId}/{loanId}", method = RequestMethod.GET)
807
    public String settleAndCreateLoanById(HttpServletRequest request, @PathVariable int loanId, @PathVariable int fofoId, Model model) throws Exception {
33852 ranu 808
        Loan loan = loanRepository.selectByLoanId(loanId);
809
        double loanAmount = loan.getPendingAmount().doubleValue();
33851 ranu 810
 
811
        if (loanAmount > 0) {
812
            sdCreditService.createLoan(fofoId, loanAmount, 0, "Amount added for loan adjustment");
33852 ranu 813
            sdCreditService.settleLoan(loan);
33851 ranu 814
        }
815
 
816
 
817
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
818
 
819
        return "response";
820
 
821
    }
822
 
34588 ranu 823
    @RequestMapping(value = "/settle-negative-wallet/{fofoId}", method = RequestMethod.GET)
824
    public String settleNegativeWalletCreateLoanById(HttpServletRequest request, @PathVariable int fofoId, Model model) throws Exception {
825
        this.sdCreditService.fundWallet(fofoId);
33851 ranu 826
 
34588 ranu 827
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
828
 
829
        return "response";
830
 
831
    }
832
 
33851 ranu 833
    private void sendUnholdEmail(List<Order> orders) throws Exception {
834
 
835
 
836
        orders.forEach(x -> x.setShipmentHold(false));
837
        orders = orders.stream().filter(x -> x.getRefundTimestamp() != null).collect(Collectors.toList());
838
        if (orders.size() > 0) {
839
 
840
            double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
841
 
842
            List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
843
            authUserEmail.add("vinay.p@smartdukaan.com");
844
            authUserEmail.add("shivam.gupta@smartdukaan.com");
845
 
846
            String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
847
 
848
            String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
849
 
850
            String subject = "Dispatch held orders of - " + (orders.get(0).getRetailerName());
851
            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.");
852
            Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
853
        }
854
 
855
 
856
    }
857
 
30859 tejbeer 858
}