Subversion Repositories SmartDukaan

Rev

Rev 24276 | Rev 30248 | 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.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.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
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.ProviderBalanceFrom;
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
import com.spice.profitmandi.common.model.OperatorType;
import com.spice.profitmandi.common.model.ProfitMandiConstants;
import com.spice.profitmandi.common.model.RechargeCommissionRequest;
import com.spice.profitmandi.common.model.RechargeCredential;
import com.spice.profitmandi.common.model.RechargeRequest;
import com.spice.profitmandi.common.web.util.ResponseSender;
import com.spice.profitmandi.dao.entity.dtr.DailyRecharge;
import com.spice.profitmandi.dao.entity.dtr.RechargeCommission;
import com.spice.profitmandi.dao.entity.dtr.RechargeOperator;
import com.spice.profitmandi.dao.entity.dtr.RechargeProvider;
import com.spice.profitmandi.dao.entity.dtr.RechargeProviderCreditWalletHistory;
import com.spice.profitmandi.dao.entity.dtr.RechargeTransaction;
import com.spice.profitmandi.dao.entity.fofo.PaymentOption;
import com.spice.profitmandi.dao.enumuration.dtr.RechargeType;
import com.spice.profitmandi.dao.repository.dtr.DailyRechargeRepository;
import com.spice.profitmandi.dao.repository.dtr.RechargeCommissionRepository;
import com.spice.profitmandi.dao.repository.dtr.RechargeOperatorRepository;
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderCreditWalletHistoryRepository;
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderRepository;
import com.spice.profitmandi.dao.repository.dtr.RechargeTransactionRepository;
import com.spice.profitmandi.dao.repository.fofo.FofoPartnerPaymentOptionRepository;
import com.spice.profitmandi.dao.repository.fofo.PaymentOptionRepository;
import com.spice.profitmandi.service.recharge.RechargeService;
import com.spice.profitmandi.web.model.LoginDetails;
import com.spice.profitmandi.web.util.CookiesProcessor;

@Controller
@Transactional(rollbackFor = Throwable.class)
public class RechargeController {

        private static final Logger LOGGER = LogManager.getLogger(RechargeController.class);

        private List<String> blockedRecharge = Arrays.asList();

        @Value("${think.walnut.digital.recharge.transaction.mobile.url}")
        private String thinkWalnutDigitalRechargeTransactionMobileUrl;

        @Value("${think.walnut.digital.recharge.transaction.dth.url}")
        private String thinkWalnutDigitalRechargeTransactionDthUrl;

        @Value("${think.walnut.digital.recharge.enquiry.url}")
        private String thinkWalnutDigitalRechargeEnquiryUrl;

        @Value("${think.walnut.digital.recharge.balance.url}")
        private String thinkWalnutDigitalRechargeBalanceUrl;

        @Value("${think.walnut.digital.recharge.username}")
        private String thinkWalnutDigitalRechargeUserName;

        @Value("${think.walnut.digital.recharge.password}")
        private String thinkWalnutDigitalRechargePassword;

        @Value("${think.walnut.digital.recharge.auth.key}")
        private String thinkWalnutDigitalRechargeAuthKey;

        @Autowired
        private RechargeService rechargeService;

        @Autowired
        private RechargeOperatorRepository rechargeOperatorRepository;

        @Autowired
        private RechargeProviderRepository rechargeProviderRepository;

        @Autowired
        private RechargeTransactionRepository rechargeTransactionRepository;

        @Autowired
        private RechargeCommissionRepository rechargeCommissionRepository;

        @Autowired
        private PaymentOptionRepository paymentOptionRepository;

        @Autowired
        private FofoPartnerPaymentOptionRepository fofoPartnerPaymentOptionRepository;

        @Autowired
        private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;

        @Autowired
        private DailyRechargeRepository dailyRechargeRepository;

        @Autowired
        private CookiesProcessor cookiesProcessor;

        @Autowired
        private ResponseSender<?> responseSender;

        @RequestMapping(value = "/createRecharge", method = RequestMethod.GET)
        public String createRecharge(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.RECHARGE_TYPE) String rechargeTypeString, Model model)
                        throws ProfitMandiBusinessException {
                LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
                RechargeType rechargeType = RechargeType.valueOf(rechargeTypeString);
                List<RechargeOperator> rechargeOperators = null;
                if (rechargeType == RechargeType.MOBILE) {
                        model.addAttribute("operatorTypes", OperatorType.values());
                        rechargeOperators = rechargeOperatorRepository.selectAllByOperatorType(OperatorType.PREPAID);
                } else {
                        rechargeOperators = rechargeOperatorRepository.selectAllByRechargeType(rechargeType);
                }

                List<Integer> paymentOptionIds = fofoPartnerPaymentOptionRepository
                                .selectPaymentOptionIdsByFofoId(loginDetails.getFofoId());
                List<PaymentOption> paymentOptions = paymentOptionRepository.selectByIds(new HashSet<>(paymentOptionIds));
                model.addAttribute("paymentOptions", paymentOptions);
                model.addAttribute("rechargeOperators", rechargeOperators);
                return "create-recharge";
        }

        private Map<Integer, String> rechargeTransactionsToRechargeOperatorIdNameMap(
                        List<RechargeTransaction> rechargeTransactions) {
                Map<Integer, String> rechargeOperatorIdrechargeOperatorNameMap = new HashMap<>();
                if (rechargeTransactions.isEmpty()) {
                        return rechargeOperatorIdrechargeOperatorNameMap;
                }
                Set<Integer> operatorIds = new HashSet<>();
                for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
                        operatorIds.add(rechargeTransaction.getOperatorId());
                }

                List<RechargeOperator> rechargeOperators = rechargeOperatorRepository.selectAllByIds(operatorIds);
                for (RechargeOperator rechargeOperator : rechargeOperators) {
                        rechargeOperatorIdrechargeOperatorNameMap.put(rechargeOperator.getId(), rechargeOperator.getName());
                }
                return rechargeOperatorIdrechargeOperatorNameMap;
        }

        private Map<Integer, RechargeOperator> rechargeCommissionsOperatorIdRechargeOperatorMap(
                        List<RechargeCommission> rechargeCommissions) {
                Map<Integer, RechargeOperator> rechargeOperatorIdNameMap = new HashMap<>();
                if (rechargeCommissions.isEmpty()) {
                        return rechargeOperatorIdNameMap;
                }
                Set<Integer> operatorIds = new HashSet<>();
                for (RechargeCommission rechargeCommission : rechargeCommissions) {
                        operatorIds.add(rechargeCommission.getOperatorId());
                }

                List<RechargeOperator> rechargeOperators = rechargeOperatorRepository.selectAllByIds(operatorIds);
                for (RechargeOperator rechargeOperator : rechargeOperators) {
                        rechargeOperatorIdNameMap.put(rechargeOperator.getId(), rechargeOperator);
                }
                return rechargeOperatorIdNameMap;
        }

        private Map<Integer, String> rechargeCommissionsProviderIdNameMap(List<RechargeCommission> rechargeCommissions) {
                if (rechargeCommissions.isEmpty()) {
                        return new HashMap<>();
                }
                Set<Integer> providerIds = new HashSet<>();
                for (RechargeCommission rechargeCommission : rechargeCommissions) {
                        providerIds.add(rechargeCommission.getProviderId());
                }
                return providerIdNameMap(providerIds);
        }

        private Map<Integer, String> providerIdNameMap(Set<Integer> providerIds) {
                Map<Integer, String> rechargeProviderIdNameMap = new HashMap<>();
                List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAllByIds(providerIds);
                for (RechargeProvider rechargeProvider : rechargeProviders) {
                        rechargeProviderIdNameMap.put(rechargeProvider.getId(), rechargeProvider.getName());
                }
                return rechargeProviderIdNameMap;
        }

        private Map<Integer, String> rechargeProviderCreditWalletHistoriesProviderIdNameMap(
                        List<RechargeProviderCreditWalletHistory> rechargeProviderCreditWalletHistories) {
                if (rechargeProviderCreditWalletHistories.isEmpty()) {
                        return new HashMap<>();
                }
                Set<Integer> providerIds = new HashSet<>();
                for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeProviderCreditWalletHistories) {
                        providerIds.add(rechargeProviderCreditWalletHistory.getProviderId());
                }
                return this.providerIdNameMap(providerIds);
        }

        private Map<Integer, String> dailyRechargesProviderIdNameMap(List<DailyRecharge> dailyRecharges) {
                if (dailyRecharges.isEmpty()) {
                        return new HashMap<>();
                }
                Set<Integer> providerIds = new HashSet<>();
                for (DailyRecharge dailyRecharge : dailyRecharges) {
                        providerIds.add(dailyRecharge.getProviderId());
                }
                return this.providerIdNameMap(providerIds);
        }

        @RequestMapping(value = "/createRecharge", method = RequestMethod.POST)
        public String createRecharge(HttpServletRequest request, @RequestBody RechargeRequest rechargeRequest,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                LOGGER.info("Recharge request body {}", rechargeRequest);
                LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);

                RechargeCredential rechargeTransactionMobileCredential = new RechargeCredential();
                rechargeTransactionMobileCredential.setRechargeUrl(thinkWalnutDigitalRechargeTransactionMobileUrl);
                rechargeTransactionMobileCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
                rechargeTransactionMobileCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
                rechargeTransactionMobileCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);

                RechargeCredential rechargeTransactionDthCredential = new RechargeCredential();
                rechargeTransactionDthCredential.setRechargeUrl(thinkWalnutDigitalRechargeTransactionDthUrl);
                rechargeTransactionDthCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
                rechargeTransactionDthCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
                rechargeTransactionDthCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);

                if (blockedRecharge.contains(loginDetails.getEmailId())) {
                        throw new ProfitMandiBusinessException("Recharge Provider", rechargeRequest.getOperatorId(),
                                        "We are experiencing some problem right now.");
                }

                rechargeService.doRecharge(rechargeTransactionMobileCredential, rechargeTransactionDthCredential,
                                loginDetails.getFofoId(), rechargeRequest);
                RechargeType rechargeType = RechargeType.valueOf(rechargeRequest.getRechargeType());
                List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
                                .selectAllByRetailerIdAndType(loginDetails.getFofoId(), rechargeType, offset, limit);
                long size = rechargeTransactionRepository.selectCountByRetailerIdAndType(loginDetails.getFofoId(),
                                rechargeType);
                Map<Integer, String> rechargeOperatorIdRechargeOperatorNameMap = this
                                .rechargeTransactionsToRechargeOperatorIdNameMap(rechargeTransactions);
                model.addAttribute("rechargeTransactions", rechargeTransactions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorNameMap", rechargeOperatorIdRechargeOperatorNameMap);
                model.addAttribute("start", offset + 1);
                model.addAttribute("size", size);
                if (rechargeTransactions.size() < limit) {
                        model.addAttribute("end", offset + rechargeTransactions.size());
                } else {
                        model.addAttribute("end", offset + limit);
                }
                if (RechargeType.valueOf(rechargeRequest.getRechargeType()) == RechargeType.MOBILE) {
                        return "mobile-recharges";
                } else {
                        return "dth-recharges";
                }
        }

        @RequestMapping(value = "/checkStatus", method = RequestMethod.GET)
        public String checkStatus(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.REQUEST_ID) String requestId,
                        @RequestParam(name = ProfitMandiConstants.RECHARGE_TYPE) String rechargeTypeString,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                LOGGER.info("RequestId [{}], rechargeType [{}]", requestId, rechargeTypeString);
                LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
                RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
                thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
                thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
                thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
                thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
                rechargeService.checkStatus(thinkWalnutDigitalRechargeEnquiryCredential, loginDetails.getFofoId(), requestId);
                RechargeType rechargeType = RechargeType.valueOf(rechargeTypeString);
                List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
                                .selectAllByRetailerIdAndType(loginDetails.getFofoId(), rechargeType, offset, limit);
                // long size =
                // rechargeTransactionRepository.selectCountByRetailerId(loginDetails.getFofoId());
                Map<Integer, String> rechargeOperatorIdRechargeOperatorNameMap = this
                                .rechargeTransactionsToRechargeOperatorIdNameMap(rechargeTransactions);
                model.addAttribute("rechargeTransactions", rechargeTransactions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorNameMap", rechargeOperatorIdRechargeOperatorNameMap);

                if (RechargeType.valueOf(rechargeTypeString) == RechargeType.MOBILE) {
                        return "mobile-recharges-paginated";
                } else {
                        return "dth-recharges-paginated";
                }
        }

        @RequestMapping(value = "/getRecharges", method = RequestMethod.GET)
        public String getRecharges(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.RECHARGE_TYPE) String rechargeTypeString,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
                RechargeType rechargeType = RechargeType.valueOf(rechargeTypeString);
                List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
                                .selectAllByRetailerIdAndType(loginDetails.getFofoId(), rechargeType, offset, limit);
                long size = rechargeTransactionRepository.selectCountByRetailerIdAndType(loginDetails.getFofoId(),
                                rechargeType);
                Map<Integer, String> rechargeOperatorIdRechargeOperatorNameMap = this
                                .rechargeTransactionsToRechargeOperatorIdNameMap(rechargeTransactions);
                model.addAttribute("rechargeTransactions", rechargeTransactions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorNameMap", rechargeOperatorIdRechargeOperatorNameMap);
                model.addAttribute("start", offset + 1);
                model.addAttribute("size", size);
                if (rechargeTransactions.size() < limit) {
                        model.addAttribute("end", offset + rechargeTransactions.size());
                } else {
                        model.addAttribute("end", offset + limit);
                }
                if (RechargeType.valueOf(rechargeTypeString) == RechargeType.MOBILE) {
                        return "mobile-recharges";
                } else {
                        return "dth-recharges";
                }
        }

        @RequestMapping(value = "/getPaginatedRecharges", method = RequestMethod.GET)
        public String getPaginatedRecharges(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.RECHARGE_TYPE) String rechargeTypeString,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
                RechargeType rechargeType = RechargeType.valueOf(rechargeTypeString);
                List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
                                .selectAllByRetailerIdAndType(loginDetails.getFofoId(), rechargeType, offset, limit);
                Map<Integer, String> rechargeOperatorIdRechargeOperatorNameMap = this
                                .rechargeTransactionsToRechargeOperatorIdNameMap(rechargeTransactions);
                model.addAttribute("rechargeTransactions", rechargeTransactions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorNameMap", rechargeOperatorIdRechargeOperatorNameMap);
                if (RechargeType.valueOf(rechargeTypeString) == RechargeType.MOBILE) {
                        return "mobile-recharges-paginated";
                } else {
                        return "dth-recharges-paginated";
                }
        }

        @RequestMapping(value = "/getRechargeOperators", method = RequestMethod.GET)
        public String getRechargeOperators(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.OPERATOR_TYPE) String operatorTypeString, Model model) {
                // model.addAttribute("rechargeOperators",
                // rechargeOperatorRepository.selectAllByRechargeType(RechargeType.MOBILE));
                // model.addAttribute("rechargeTypes", RechargeType.values());
                OperatorType operatorType = OperatorType.valueOf(operatorTypeString);
                List<RechargeOperator> rechargeOperators = rechargeOperatorRepository.selectAllByOperatorType(operatorType);
                model.addAttribute("rechargeOperators", rechargeOperators);
                return "recharge-operators";
        }

        @RequestMapping(value = "/getRechargeCommissionOperators", method = RequestMethod.GET)
        public String getRechargeCommissionOperators(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.OPERATOR_TYPE) String operatorTypeString, Model model)
                        throws ProfitMandiBusinessException {
                // model.addAttribute("rechargeOperators",
                // rechargeOperatorRepository.selectAllByRechargeType(RechargeType.MOBILE));
                // model.addAttribute("rechargeTypes", RechargeType.values());
                OperatorType operatorType = OperatorType.valueOf(operatorTypeString);
                List<RechargeOperator> rechargeOperators = rechargeOperatorRepository.selectAllByOperatorType(operatorType);
                List<Integer> rechargeOperatorIds = rechargeCommissionRepository.selectAllOperatorIds();
                if (!rechargeOperatorIds.isEmpty()) {
                        rechargeOperators = this.filterRechargeOperators(rechargeOperators, rechargeOperatorIds);
                        if (rechargeOperators.isEmpty()) {
                                throw new ProfitMandiBusinessException(ProfitMandiConstants.OPERATOR_TYPE, operatorType, "RCHRG_1003");
                        }
                }
                model.addAttribute("rechargeOperators", rechargeOperators);
                return "recharge-operators";
        }

        @RequestMapping(value = "/createRechargeCommission", method = RequestMethod.GET)
        public String createRechargeCommission(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.RECHARGE_TYPE) String rechargeTypeString, Model model)
                        throws ProfitMandiBusinessException {
                // model.addAttribute("rechargeOperators",
                // rechargeOperatorRepository.selectAllByRechargeType(RechargeType.MOBILE));
                // model.addAttribute("rechargeTypes", RechargeType.values());

                RechargeType rechargeType = RechargeType.valueOf(rechargeTypeString);
                List<RechargeOperator> rechargeOperators = null;
                if (rechargeType == RechargeType.MOBILE) {
                        model.addAttribute("operatorTypes", OperatorType.values());
                        rechargeOperators = rechargeOperatorRepository.selectAllByOperatorType(OperatorType.PREPAID);
                } else {
                        rechargeOperators = rechargeOperatorRepository.selectAllByRechargeType(rechargeType);
                }
                List<Integer> rechargeOperatorIds = rechargeCommissionRepository.selectAllOperatorIds();
                if (!rechargeOperatorIds.isEmpty()) {
                        rechargeOperators = this.filterRechargeOperators(rechargeOperators, rechargeOperatorIds);
                        if (rechargeOperators.isEmpty()) {
                                throw new ProfitMandiBusinessException(ProfitMandiConstants.RECHARGE_TYPE, rechargeType, "RCHRG_1003");
                        }
                }
                model.addAttribute("rechargeOperators", rechargeOperators);
                return "create-recharge-commission";
        }

        private List<RechargeOperator> filterRechargeOperators(List<RechargeOperator> rechargeOperators,
                        List<Integer> rechargeOperatorIds) {
                List<RechargeOperator> filteredRechargeOperators = new ArrayList<>();
                for (RechargeOperator rechargeOperator : rechargeOperators) {
                        if (!rechargeOperatorIds.contains(rechargeOperator.getId())) {
                                filteredRechargeOperators.add(rechargeOperator);
                        }
                }
                return filteredRechargeOperators;
        }

        @RequestMapping(value = "/createRechargeCommission", method = RequestMethod.POST)
        public String createRechargeCommission(HttpServletRequest request,
                        @RequestBody RechargeCommissionRequest rechargeCommissionRequest,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                rechargeService.createRechargeCommission(rechargeCommissionRequest);
                List<RechargeCommission> rechargeCommissions = rechargeCommissionRepository.selectAllPaginated(offset, limit);
                long size = rechargeCommissionRepository.selectAllCount();
                Map<Integer, RechargeOperator> rechargeOperatorIdRechargeOperatorMap = this
                                .rechargeCommissionsOperatorIdRechargeOperatorMap(rechargeCommissions);
                Map<Integer, String> rechargeProviderIdNameMap = this.rechargeCommissionsProviderIdNameMap(rechargeCommissions);
                model.addAttribute("rechargeCommissions", rechargeCommissions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorMap", rechargeOperatorIdRechargeOperatorMap);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                model.addAttribute("start", offset + 1);
                model.addAttribute("size", size);
                if (rechargeCommissions.size() < limit) {
                        model.addAttribute("end", offset + rechargeCommissions.size());
                } else {
                        model.addAttribute("end", offset + limit);
                }
                return "recharge-commissions";
        }

        @RequestMapping(value = "/getRechargeCommissions", method = RequestMethod.GET)
        public String getRechargeCommissions(HttpServletRequest request,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                // LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
                // RechargeType rechargeType = RechargeType.valueOf(rechargeTypeString);
                List<RechargeCommission> rechargeCommissions = rechargeCommissionRepository.selectAllPaginated(offset, limit);
                long size = rechargeCommissionRepository.selectAllCount();
                Map<Integer, RechargeOperator> rechargeOperatorIdRechargeOperatorMap = this
                                .rechargeCommissionsOperatorIdRechargeOperatorMap(rechargeCommissions);
                Map<Integer, String> rechargeProviderIdNameMap = this.rechargeCommissionsProviderIdNameMap(rechargeCommissions);
                model.addAttribute("rechargeCommissions", rechargeCommissions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorMap", rechargeOperatorIdRechargeOperatorMap);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                model.addAttribute("start", offset + 1);
                model.addAttribute("size", size);
                if (rechargeCommissions.size() < limit) {
                        model.addAttribute("end", offset + rechargeCommissions.size());
                } else {
                        model.addAttribute("end", offset + limit);
                }
                return "recharge-commissions";
        }

        @RequestMapping(value = "/getPaginatedRechargeCommissions", method = RequestMethod.GET)
        public String getPaginatedRechargeCommissions(HttpServletRequest request,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                // LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
                // RechargeType rechargeType = RechargeType.valueOf(rechargeTypeString);
                List<RechargeCommission> rechargeCommissions = rechargeCommissionRepository.selectAllPaginated(offset, limit);
                Map<Integer, RechargeOperator> rechargeOperatorIdRechargeOperatorMap = this
                                .rechargeCommissionsOperatorIdRechargeOperatorMap(rechargeCommissions);
                Map<Integer, String> rechargeProviderIdNameMap = this.rechargeCommissionsProviderIdNameMap(rechargeCommissions);
                model.addAttribute("rechargeCommissions", rechargeCommissions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorMap", rechargeOperatorIdRechargeOperatorMap);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                return "recharge-commissions-paginated";
        }

        @RequestMapping(value = "/getRechargeCommissionByOperatorId", method = RequestMethod.GET)
        public String getRechargeCommissionByOperatorId(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.OPERATOR_ID) int operatorId,
                        @RequestParam(name = ProfitMandiConstants.PROVIDER_ID) int providerId, Model model)
                        throws ProfitMandiBusinessException {
                RechargeOperator rechargeOperator = rechargeOperatorRepository.selectById(operatorId);
                RechargeCommission rechargeCommission = rechargeCommissionRepository.selectByOperatorIdAndProviderId(operatorId,
                                providerId);
                model.addAttribute("rechargeCommission", rechargeCommission);
                model.addAttribute("rechargeOperator", rechargeOperator);
                return "recharge-commission-details";
        }

        @RequestMapping(value = "/updateRechargeCommission", method = RequestMethod.PUT)
        public String updateRechargeCommission(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.OPERATOR_ID) int operatorId,
                        @RequestParam(name = ProfitMandiConstants.PROVIDER_ID) int providerId,
                        @RequestParam(name = ProfitMandiConstants.AMOUNT_TYPE) String amountTypeString,
                        @RequestParam(name = ProfitMandiConstants.AMOUNT) float amount,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                rechargeService.updateRechargeCommission(operatorId, providerId, amountTypeString, amount);
                List<RechargeCommission> rechargeCommissions = rechargeCommissionRepository.selectAllPaginated(offset, limit);
                Map<Integer, RechargeOperator> rechargeOperatorIdRechargeOperatorMap = this
                                .rechargeCommissionsOperatorIdRechargeOperatorMap(rechargeCommissions);
                Map<Integer, String> rechargeProviderIdNameMap = this.rechargeCommissionsProviderIdNameMap(rechargeCommissions);
                model.addAttribute("rechargeCommissions", rechargeCommissions);
                model.addAttribute("rechargeOperatorIdRechargeOperatorMap", rechargeOperatorIdRechargeOperatorMap);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                return "recharge-commissions-paginated";
        }

        @RequestMapping(value = "/getRechargeProviderBalance", method = RequestMethod.GET)
        public String getRechargeProviderBalance(HttpServletRequest request, Model model)
                        throws ProfitMandiBusinessException {
                List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
                model.addAttribute("rechargeProviders", rechargeProviders);
                model.addAttribute("providerBalanceFroms", ProviderBalanceFrom.values());
                RechargeCredential thinkWalnutDigitalRechargeCredential = new RechargeCredential();
                thinkWalnutDigitalRechargeCredential.setRechargeUrl(thinkWalnutDigitalRechargeBalanceUrl);
                thinkWalnutDigitalRechargeCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
                thinkWalnutDigitalRechargeCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
                thinkWalnutDigitalRechargeCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
                model.addAttribute("rechargeProviderBalanceMaps",
                                rechargeService.getRechargeProvidersBalance(thinkWalnutDigitalRechargeCredential));
                return "recharge-provider-balance";
        }

        @RequestMapping(value = "/getRechargeProviderWalletAddMoney", method = RequestMethod.GET)
        public String getRechargeProviderWalletAddMoney(HttpServletRequest request, Model model)
                        throws ProfitMandiBusinessException {
                List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
                model.addAttribute("rechargeProviders", rechargeProviders);
                return "recharge-provider-wallet-add-money";
        }

        @RequestMapping(value = "/addMoneyToRechargeProviderWallet", method = RequestMethod.POST)
        public String createRechargeProviderWalletAddMoney(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.PROVIDER_ID) int providerId,
                        @RequestParam(name = ProfitMandiConstants.AMOUNT) float amount, @RequestParam LocalDateTime receiveDateTime,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                rechargeService.createRechargeProviderCreditWallet(providerId, amount, receiveDateTime);
                List<RechargeProviderCreditWalletHistory> rechargeProviderCreditWalletHistories = rechargeProviderCreditWalletHistoryRepository
                                .selectAll(offset, limit);
                long size = rechargeProviderCreditWalletHistoryRepository.selectAllCount();
                Map<Integer, String> rechargeProviderIdNameMap = this
                                .rechargeProviderCreditWalletHistoriesProviderIdNameMap(rechargeProviderCreditWalletHistories);
                model.addAttribute("rechargeProviderCreditWalletHistories", rechargeProviderCreditWalletHistories);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                model.addAttribute("start", offset + 1);
                model.addAttribute("size", size);
                if (rechargeProviderCreditWalletHistories.size() < limit) {
                        model.addAttribute("end", offset + rechargeProviderCreditWalletHistories.size());
                } else {
                        model.addAttribute("end", offset + limit);
                }
                return "recharge-provider-wallet-add-moneys";
        }

        @RequestMapping(value = "/getRechargeProviderWalletAddMoneys", method = RequestMethod.GET)
        public String getRechargeProviderWalletAddMoney(HttpServletRequest request,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                List<RechargeProviderCreditWalletHistory> rechargeProviderCreditWalletHistories = rechargeProviderCreditWalletHistoryRepository
                                .selectAll(offset, limit);
                long size = rechargeProviderCreditWalletHistoryRepository.selectAllCount();
                Map<Integer, String> rechargeProviderIdNameMap = this
                                .rechargeProviderCreditWalletHistoriesProviderIdNameMap(rechargeProviderCreditWalletHistories);
                model.addAttribute("rechargeProviderCreditWalletHistories", rechargeProviderCreditWalletHistories);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                model.addAttribute("start", offset + 1);
                model.addAttribute("size", size);
                if (rechargeProviderCreditWalletHistories.size() < limit) {
                        model.addAttribute("end", offset + rechargeProviderCreditWalletHistories.size());
                } else {
                        model.addAttribute("end", offset + limit);
                }
                return "recharge-provider-wallet-add-moneys";
        }

        @RequestMapping(value = "/getPaginatedRechargeProviderWalletAddMoneys", method = RequestMethod.GET)
        public String getPaginatedRechargeProviderWalletAddMoney(HttpServletRequest request,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                List<RechargeProviderCreditWalletHistory> rechargeProviderCreditWalletHistories = rechargeProviderCreditWalletHistoryRepository
                                .selectAll(offset, limit);
                Map<Integer, String> rechargeProviderIdNameMap = this
                                .rechargeProviderCreditWalletHistoriesProviderIdNameMap(rechargeProviderCreditWalletHistories);
                model.addAttribute("rechargeProviderCreditWalletHistories", rechargeProviderCreditWalletHistories);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                return "recharge-provider-wallet-add-moneys-paginated";
        }

        @RequestMapping(value = "/getDailyRecharges", method = RequestMethod.GET)
        public String getDailyRecharges(HttpServletRequest request,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                List<DailyRecharge> dailyRecharges = dailyRechargeRepository.selectAll(offset, limit);
                long size = dailyRechargeRepository.selectAllCount();
                Map<Integer, String> rechargeProviderIdNameMap = this.dailyRechargesProviderIdNameMap(dailyRecharges);
                model.addAttribute("dailyRecharges", dailyRecharges);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                model.addAttribute("start", offset + 1);
                model.addAttribute("size", size);
                if (dailyRecharges.size() < limit) {
                        model.addAttribute("end", offset + dailyRecharges.size());
                } else {
                        model.addAttribute("end", offset + limit);
                }
                return "daily-recharges";
        }

        @RequestMapping(value = "/getPaginatedDailyRecharges", method = RequestMethod.GET)
        public String getPaginatedDailyRecharges(HttpServletRequest request,
                        @RequestParam(name = "offset", defaultValue = "0") int offset,
                        @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
                        throws ProfitMandiBusinessException {
                List<DailyRecharge> dailyRecharges = dailyRechargeRepository.selectAll(offset, limit);
                Map<Integer, String> rechargeProviderIdNameMap = this.dailyRechargesProviderIdNameMap(dailyRecharges);
                model.addAttribute("dailyRecharges", dailyRecharges);
                model.addAttribute("rechargeProviderIdNameMap", rechargeProviderIdNameMap);
                return "daily-recharges-paginated";
        }

        @RequestMapping(value = "/getBalanceByProviderId", method = RequestMethod.GET)
        public ResponseEntity<?> getBalanceByProviderId(HttpServletRequest request,
                        @RequestParam(name = ProfitMandiConstants.PROVIDER_ID) int providerId,
                        @RequestParam(name = ProfitMandiConstants.PROVIDER_BALANCE_FROM) ProviderBalanceFrom providerBalanceFrom)
                        throws ProfitMandiBusinessException {
                RechargeCredential thinkWalnutDigitalRechargeCredential = new RechargeCredential();
                thinkWalnutDigitalRechargeCredential.setRechargeUrl(thinkWalnutDigitalRechargeBalanceUrl);
                thinkWalnutDigitalRechargeCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
                thinkWalnutDigitalRechargeCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
                thinkWalnutDigitalRechargeCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
                return responseSender.ok(
                                rechargeService.checkBalance(thinkWalnutDigitalRechargeCredential, providerId, providerBalanceFrom));
        }
}