Subversion Repositories SmartDukaan

Rev

Rev 35458 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30859 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
3
import java.math.BigDecimal;
4
import java.time.LocalDate;
5
import java.time.LocalDateTime;
6
import java.util.ArrayList;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.Map.Entry;
10
import java.util.Set;
11
import java.util.stream.Collectors;
12
 
13
import javax.servlet.http.HttpServletRequest;
35458 amit 14
import org.springframework.transaction.annotation.Transactional;
30859 tejbeer 15
 
16
import org.apache.logging.log4j.LogManager;
17
import org.apache.logging.log4j.Logger;
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.http.MediaType;
20
import org.springframework.http.ResponseEntity;
21
import org.springframework.stereotype.Controller;
22
import org.springframework.web.bind.annotation.RequestMapping;
23
import org.springframework.web.bind.annotation.RequestMethod;
24
import org.springframework.web.bind.annotation.RequestParam;
25
 
26
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
27
import com.spice.profitmandi.common.model.CustomRetailer;
28
import com.spice.profitmandi.common.web.util.ResponseSender;
29
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30
import com.spice.profitmandi.dao.entity.dtr.CreditAccount;
31
import com.spice.profitmandi.dao.entity.transaction.Loan;
32
import com.spice.profitmandi.dao.entity.transaction.SDCreditRequirement;
33
import com.spice.profitmandi.dao.entity.transaction.SanctionRequest;
34
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
35
import com.spice.profitmandi.dao.enumuration.transaction.SanctionStatus;
36
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
37
import com.spice.profitmandi.dao.repository.cs.CsService;
38
import com.spice.profitmandi.dao.repository.dtr.CreditAccountRepository;
39
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
40
import com.spice.profitmandi.dao.repository.transaction.LoanRepository;
41
import com.spice.profitmandi.dao.repository.transaction.SDCreditRequirementRepository;
42
import com.spice.profitmandi.dao.repository.transaction.SanctionRequestRepository;
43
import com.spice.profitmandi.service.NotificationService;
44
import com.spice.profitmandi.service.transaction.SDCreditService;
45
import com.spice.profitmandi.service.user.RetailerService;
46
import com.spice.profitmandi.service.user.SDCreditModel;
47
 
48
import io.swagger.annotations.ApiImplicitParam;
49
import io.swagger.annotations.ApiImplicitParams;
50
 
51
@Controller
35458 amit 52
@Transactional(rollbackFor = Throwable.class)
30859 tejbeer 53
public class SDCreditController {
54
 
55
	@Autowired
56
	private SDCreditRequirementRepository sdCreditRequirementRepository;
57
 
58
	@Autowired
59
	private RetailerService retailerService;
60
 
61
	@Autowired
62
	private AuthRepository authRepository;
63
 
64
	@Autowired
65
	private CsService csService;
66
 
67
	@Autowired
68
	private FofoStoreRepository fofoStoreRepository;
69
 
70
	@Autowired
71
	private SanctionRequestRepository sanctionRequestRepository;
72
 
73
	@Autowired
74
	private ResponseSender<?> responseSender;
75
 
76
	@Autowired
77
	private SDCreditService sdCreditService;
78
 
79
	@Autowired
80
	private CreditAccountRepository creditAccountRepository;
81
 
82
	@Autowired
83
	private LoanRepository loanRepository;
84
 
85
	@Autowired
86
	private NotificationService notificationService;
87
 
88
	private static final Logger LOGGER = LogManager.getLogger(SDCreditController.class);
89
 
90
	@RequestMapping(value = "/getSDCreditReq", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
91
	@ApiImplicitParams({
92
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
93
	public ResponseEntity<?> getSDCreditReq(HttpServletRequest request, @RequestParam(name = "gmailId") String gmailId)
94
			throws ProfitMandiBusinessException {
95
		AuthUser authUser = authRepository.selectByGmailId(gmailId);
96
		List<SDCreditModel> partnersSDCredit = new ArrayList<>();
97
 
35630 aman 98
		if (authUser == null) {
99
			LOGGER.warn("No auth user found for gmailId: {}", gmailId);
100
			return responseSender.badRequest("No user found for the provided email");
101
		}
30859 tejbeer 102
 
35630 aman 103
		Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
104
		Set<Integer> fofoIdSet = storeGuyMap.get(authUser.getEmailId());
105
		if (fofoIdSet == null || fofoIdSet.isEmpty()) {
106
			LOGGER.info("No partner IDs found for user: {}", gmailId);
107
			return responseSender.ok(partnersSDCredit);
108
		}
109
		List<Integer> fofoIds = new ArrayList<>(fofoIdSet);
110
 
111
		if (fofoIds.size() > 0) {
112
 
30859 tejbeer 113
			List<Integer> fofoIdList = fofoStoreRepository.selectByRetailerIds(fofoIds).stream()
114
					.filter(x -> !x.isInternal()).map(x -> x.getId()).collect(Collectors.toList());
115
 
116
			Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
117
 
118
			Map<Integer, CustomRetailer> customRetailers = fofoIdList.stream().map(x -> customRetailerMap.get(x))
119
					.filter(x -> x != null).collect(Collectors.toList()).stream()
120
					.collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
121
 
122
			Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll()
123
					.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
124
 
125
			Map<Integer, SanctionRequest> sanctionRequestMap = sanctionRequestRepository.selectByDate(LocalDate.now())
126
					.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
127
 
128
			for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailers.entrySet()) {
129
 
130
				int fofoId = customRetailerEntry.getKey();
131
				CustomRetailer customRetailer = customRetailerEntry.getValue();
132
 
133
				CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fofoId,
134
						Gateway.SDDIRECT);
135
 
136
				SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
137
				SanctionRequest sanctionRequest = sanctionRequestMap.get(customRetailerEntry.getKey());
138
				SDCreditModel sdCreditModel = new SDCreditModel();
139
				sdCreditModel.setFofoId(fofoId);
140
				sdCreditModel.setBusinessName(customRetailer.getBusinessName());
141
				sdCreditModel.setMobile(customRetailer.getMobileNumber());
142
				if (sdCreditRequirement != null) {
143
					sdCreditModel.setLimit(sdCreditRequirement.getLimit());
35630 aman 144
					if (sdCreditRequirement.getSecurityCheck() > 0 && creditAccount != null && creditAccount.isActive()) {
30859 tejbeer 145
						sdCreditModel.setEligibility("yes");
146
					} else {
147
						sdCreditModel.setEligibility("no");
148
 
149
					}
150
					sdCreditModel.setInterest(sdCreditRequirement.getInterestRate());
35397 amit 151
					BigDecimal utilizationAmount = sdCreditService.getUtilizationAmount(fofoId);
30859 tejbeer 152
					sdCreditModel.setAvailability(
35397 amit 153
							sdCreditRequirement.getLimit().subtract(utilizationAmount));
30859 tejbeer 154
					sdCreditModel.setRisk(sdCreditModel.getRisk());
155
					sdCreditModel.setCreditDuration(sdCreditRequirement.getCreditDays());
156
 
157
					List<Loan> loans = loanRepository.selectActiveLoan(fofoId);
158
					sdCreditModel.setTotalOpenLoan(loans.size());
35630 aman 159
 
30913 tejbeer 160
					sdCreditModel.setLoan(loans);
30859 tejbeer 161
				}
162
				if (sanctionRequest != null) {
163
					sdCreditModel.setStatus(sanctionRequest.getStatus());
164
				}
165
				partnersSDCredit.add(sdCreditModel);
166
			}
167
 
168
		}
169
		return responseSender.ok(partnersSDCredit);
170
	}
171
 
172
	@RequestMapping(value = "/createSanctionRequest", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
173
	@ApiImplicitParams({
174
			@ApiImplicitParam(name = "Auth-Token", value = "Auth-Token", required = true, dataType = "string", paramType = "header") })
175
	public ResponseEntity<?> createSanctionRequest(HttpServletRequest request,
176
			@RequestParam(name = "gmailId") String gmailId, @RequestParam(name = "fofoId") int fofoId,
177
			@RequestParam(name = "requestedlimit") int requestedlimit) throws ProfitMandiBusinessException {
178
 
179
		SDCreditRequirement sdCreditReq = sdCreditRequirementRepository.selectByFofoId(fofoId);
180
		if (sdCreditReq != null) {
181
			AuthUser authUser = authRepository.selectByGmailId(gmailId);
182
 
183
			SanctionRequest sanctionRequest = new SanctionRequest();
184
			sanctionRequest.setAuthId(authUser.getId());
185
			sanctionRequest.setFofoId(fofoId);
186
			sanctionRequest.setRequestedAmount(BigDecimal.valueOf(requestedlimit));
187
			sanctionRequest.setApprovalAmount(BigDecimal.valueOf(requestedlimit));
188
			sanctionRequest.setCreatedTimestamp(LocalDateTime.now());
189
			sanctionRequest.setStatus(SanctionStatus.PENDING);
190
			sanctionRequest.setFreeDays(sdCreditReq.getFreeDays());
34356 ranu 191
			sanctionRequest.setRbmL2ApprovalStatus(SanctionStatus.PENDING);
30859 tejbeer 192
			sanctionRequestRepository.persist(sanctionRequest);
193
 
194
			return responseSender.ok(true);
195
 
196
		} else {
197
 
198
			return responseSender.ok(false);
199
		}
200
 
201
	}
202
}