Subversion Repositories SmartDukaan

Rev

Rev 32456 | Rev 32681 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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