Subversion Repositories SmartDukaan

Rev

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