Rev 30955 | Rev 30989 | Go to most recent revision | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | RSS feed
package com.spice.profitmandi.web.controller;import java.math.BigDecimal;import java.math.RoundingMode;import java.time.LocalDate;import java.time.LocalDateTime;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import java.util.stream.Collectors;import javax.servlet.http.HttpServletRequest;import javax.transaction.Transactional;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import com.spice.profitmandi.common.enumuration.MessageType;import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;import com.spice.profitmandi.common.model.CustomRetailer;import com.spice.profitmandi.common.model.SendNotificationModel;import com.spice.profitmandi.dao.entity.auth.AuthUser;import com.spice.profitmandi.dao.entity.dtr.CreditAccount;import com.spice.profitmandi.dao.entity.dtr.CreditStatus;import com.spice.profitmandi.dao.entity.fofo.CurrentPartnerDailyInvestment;import com.spice.profitmandi.dao.entity.fofo.FofoStore;import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;import com.spice.profitmandi.dao.entity.transaction.Loan;import com.spice.profitmandi.dao.entity.transaction.SDCreditRequirement;import com.spice.profitmandi.dao.entity.transaction.SanctionRequest;import com.spice.profitmandi.dao.entity.transaction.UserWallet;import com.spice.profitmandi.dao.enumuration.fofo.Gateway;import com.spice.profitmandi.dao.enumuration.transaction.SanctionStatus;import com.spice.profitmandi.dao.model.SDCreditResponseOut;import com.spice.profitmandi.dao.model.SanctionRequestModel;import com.spice.profitmandi.dao.model.SdCreditRequirementModel;import com.spice.profitmandi.dao.repository.auth.AuthRepository;import com.spice.profitmandi.dao.repository.cs.CsService;import com.spice.profitmandi.dao.repository.dtr.CreditAccountRepository;import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;import com.spice.profitmandi.dao.repository.dtr.UserRepository;import com.spice.profitmandi.dao.repository.fofo.CurrentPartnerDailyInvestmentRepository;import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;import com.spice.profitmandi.dao.repository.transaction.LoanRepository;import com.spice.profitmandi.dao.repository.transaction.SDCreditRequirementRepository;import com.spice.profitmandi.dao.repository.transaction.SanctionRequestRepository;import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;import com.spice.profitmandi.service.NotificationService;import com.spice.profitmandi.service.transaction.SDCreditService;import com.spice.profitmandi.service.user.RetailerService;import com.spice.profitmandi.web.model.LoginDetails;import com.spice.profitmandi.web.util.CookiesProcessor;@Controller@Transactional(rollbackOn = Throwable.class)public class SDCreditController {@Autowiredprivate RetailerService retailerService;@AutowiredSDCreditRequirementRepository sdCreditRequirementRepository;@AutowiredSanctionRequestRepository sanctionRequestRepository;@AutowiredPartnerDailyInvestmentRepository partnerDailyInvestmentRepository;@Autowiredprivate FofoStoreRepository fofoStoreRepository;@Autowiredprivate CreditAccountRepository creditAccountRepository;@Autowiredprivate SDCreditService sdCreditService;@Autowiredprivate NotificationService notificationService;@Autowiredprivate AuthRepository authRepository;@Autowiredprivate UserRepository userRepository;@Autowiredprivate CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;@Autowiredprivate UserWalletRepository userWalletRepository;@AutowiredLoanRepository loanRepository;@Autowiredprivate CookiesProcessor cookiesProcessor;@Autowiredprivate CsService csService;private static final Logger LOGGER = LogManager.getLogger(SDCreditController.class);@RequestMapping(value = "/getSDCreditReq", method = RequestMethod.GET)public String getSDCreditReq(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {int fofoId = customRetailerEntry.getKey();SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());if (sdCreditRequirement != null) {BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);LOGGER.info("utilizedLimit {} ", utilizedLimit);LOGGER.info("availableLimit {} ", availableLimit);sdCreditRequirement.setUtilizedAmount(utilizedLimit);sdCreditRequirement.setAvailableLimit(availableLimit);sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());}}model.addAttribute("customRetailerMap", customRetailerMap);model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);return "sd-credit";}@RequestMapping(value = "/creditRequirement", method = RequestMethod.POST)public String sdCredit(HttpServletRequest request, @RequestBody SdCreditRequirementModel sdCreditRequirementModel,Model model) throws Exception {LOGGER.info("sdCreditRequirementModel {} ", sdCreditRequirementModel);int fofoId = sdCreditRequirementModel.getFofoId();SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(sdCreditRequirementModel.getFofoId());FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(sdCreditRequirementModel.getFofoId());sdCreditRequirement.setSecurityCheck(sdCreditRequirementModel.getSecurityCheck());// sdCreditRequirement.setSecurityCheck(2);sdCreditRequirement.setInterestRate(sdCreditRequirementModel.getInterest());sdCreditRequirement.setFreeDays(sdCreditRequirementModel.getFreeDays());sdCreditRequirement.setLimit(sdCreditRequirementModel.getLimit());BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);LOGGER.info("utilizedLimit {} ", utilizedLimit);LOGGER.info("availableLimit {} ", availableLimit);sdCreditRequirement.setUtilizedAmount(utilizedLimit);sdCreditRequirement.setAvailableLimit(availableLimit);sdCreditRequirement.setCreditDays(15);sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());if (sdCreditRequirement.getSecurityCheck() > 0) {CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(sdCreditRequirementModel.getFofoId(), Gateway.SDDIRECT);if (creditAccount == null) {creditAccount = new CreditAccount();creditAccount.setFofoId(sdCreditRequirementModel.getFofoId());creditAccount.setGateway(Gateway.SDDIRECT);creditAccount.setCreditStatus(CreditStatus.SANCTIONED);creditAccount.setActive(false);creditAccount.setUpdatedOn(LocalDateTime.now());creditAccountRepository.persist(creditAccount);}creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());creditAccount.setAvailableAmount(availableLimit.floatValue());creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());creditAccount.setUpdatedOn(LocalDateTime.now());}LOGGER.info("sdCreditRequirement {} ", sdCreditRequirement);CustomRetailer customRetailer = retailerService.getFofoRetailer(sdCreditRequirementModel.getFofoId());sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(sdCreditRequirementModel.getFofoId());Map<Integer, SDCreditRequirement> sdCreditRequirementMap = new HashMap<>();sdCreditRequirementMap.put(sdCreditRequirement.getFofoId(), sdCreditRequirement);model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);model.addAttribute("customRetailer", customRetailer);return "sd-credit-requirement-row";}@RequestMapping(value = "/getSanctionRequest", method = RequestMethod.GET)public String getSanctionRequest(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectByDate(LocalDate.now());List<Integer> fofoIds = sanctionRequests.stream().map(x -> x.getFofoId()).collect(Collectors.toList());Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));if (!sanctionRequests.isEmpty()) {Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));model.addAttribute("customRetailerMap", customRetailerMap);model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);}model.addAttribute("sanctionRequests", sanctionRequests);model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);model.addAttribute("userWalletMap", userWalletMap);model.addAttribute("sanctionStatus", SanctionStatus.values());return "sanction-request";}@RequestMapping(value = "/sanctionRequest", method = RequestMethod.POST)public String sanctionRequest(HttpServletRequest request, @RequestBody SanctionRequestModel sanctionRequestModel,Model model) throws Exception {LOGGER.info("sanctionRequestModel {} ", sanctionRequestModel);Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));SanctionRequest sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());List<Integer> fofoIds = sanctionRequestRepository.selectByDate(LocalDate.now()).stream().map(x -> x.getFofoId()).collect(Collectors.toList());Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);LOGGER.info("freeDays {} ", sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays());if (sanctionRequestModel.getStatus().equals(SanctionStatus.APPROVED)) {CustomRetailer customRetailer = customRetailerMap.get(sanctionRequest.getFofoId());sanctionRequest.setApprovalTimestamp(LocalDateTime.now());BigDecimal availableAmount = sdCreditService.getAvailableAmount(sanctionRequest.getFofoId());String title = "Sanction Request Approved";String url = "http://app.smartdukaan.com/pages/home/credit";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);notificationService.sendNotification(sanctionRequest.getFofoId(), title, MessageType.notification, title,message, url);AuthUser authUser = authRepository.selectById(sanctionRequest.getAuthId());SendNotificationModel sendNotificationModel = new SendNotificationModel();sendNotificationModel.setCampaignName("Loan");sendNotificationModel.setTitle("Sanction Request Approved");sendNotificationModel.setMessage("congratulations! Your Partner " + customRetailer.getBusinessName()+ "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));sendNotificationModel.setType("url");sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/credit");sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));sendNotificationModel.setMessageType(MessageType.notification);sendNotificationModel.setUserIds(Arrays.asList(userRepository.selectByEmailId(authUser.getEmailId()).getId()));System.out.println(sendNotificationModel);notificationService.sendNotification(sendNotificationModel);}if (sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays() >= sanctionRequestModel.getFreeDays()) {sanctionRequest.setFreeDays(sanctionRequestModel.getFreeDays());} else {throw new ProfitMandiBusinessException("Free Days", "Free Days", "Free Days is not more than "+ sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays() + " days ");}sanctionRequest.setApprovalAmount(sanctionRequestModel.getApprovalAmount());sanctionRequest.setStatus(sanctionRequestModel.getStatus());Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository.selectAll(fofoIds, LocalDate.now().minusDays(1)).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(new HashSet<>(fofoIds)).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());model.addAttribute("customRetailerMap", customRetailerMap);model.addAttribute("sanctionRequest", sanctionRequest);model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);model.addAttribute("userWalletMap", userWalletMap);model.addAttribute("sanctionStatus", SanctionStatus.values());return "sanction-request-row";}List<String> emails = Arrays.asList("kamini.sharma@smartdukaan.com", "neeraj.gupta@smartdukaan.com","amit.gupta@smartdukaan.com");@RequestMapping(value = "/getLoans", method = RequestMethod.GET)public String getLoans(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);String email = loginDetails.getEmailId();AuthUser authUser = authRepository.selectByEmailOrMobile(email);Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();Set<Integer> fofoIds = storeGuyMap.get(authUser.getEmailId());if (emails.contains(authUser.getEmailId())) {fofoIds = storeGuyMap.get("tarun.verma@smartdukaan.com");LOGGER.info("fofoIds" + fofoIds);}LOGGER.info("fofoIds" + fofoIds);if (fofoIds == null) {throw new ProfitMandiBusinessException("you are not authorized", "", "you are not authorized" + " " + "");}List<Loan> loans = loanRepository.selectAllLoans(new ArrayList<>(fofoIds));List<Integer> loanFofoIds = loans.stream().map(x -> x.getFofoId()).collect(Collectors.toList());List<SDCreditRequirement> sdCreditRequirements = sdCreditRequirementRepository.selectByFofoIds(new ArrayList<>(loanFofoIds));Map<Integer, Long> loanCountMap = loans.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));Map<Integer, UserWallet> userWalletMap = userWalletRepository.selectByRetailerIds(fofoIds).stream().collect(Collectors.toMap(x -> x.getUserId(), x -> x));Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));model.addAttribute("userWalletMap", userWalletMap);model.addAttribute("currentPartnerDailyInvestmentMap", currentPartnerDailyInvestmentMap);Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(new ArrayList<>(fofoIds));model.addAttribute("sdCreditRequirements", sdCreditRequirements);model.addAttribute("loanCountMap", loanCountMap);model.addAttribute("customRetailerMap", customRetailerMap);return "loan-summary";}@RequestMapping(value = "/getLoanSummary", method = RequestMethod.GET)public String getLoanSummary(HttpServletRequest request, @RequestParam int fofoId, Model model)throws ProfitMandiBusinessException {SDCreditResponseOut sdCreditResponseOut = sdCreditService.sdDirectService(fofoId);CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);model.addAttribute("customRetailer", customRetailer);model.addAttribute("loanSummary", sdCreditResponseOut.getLoans());return "loan-summary-detail";}}