Subversion Repositories SmartDukaan

Rev

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