Subversion Repositories SmartDukaan

Rev

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