Subversion Repositories SmartDukaan

Rev

Rev 30909 | Rev 30913 | 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
 
3
import java.math.BigDecimal;
4
import java.math.RoundingMode;
5
import java.time.LocalDate;
6
import java.time.LocalDateTime;
7
import java.util.Arrays;
8
import java.util.HashMap;
9
import java.util.List;
10
import java.util.Map;
11
import java.util.Map.Entry;
12
import java.util.stream.Collectors;
13
 
14
import javax.servlet.http.HttpServletRequest;
15
import javax.transaction.Transactional;
16
 
17
import org.apache.logging.log4j.LogManager;
18
import org.apache.logging.log4j.Logger;
19
import org.springframework.beans.factory.annotation.Autowired;
20
import org.springframework.stereotype.Controller;
21
import org.springframework.ui.Model;
22
import org.springframework.web.bind.annotation.RequestBody;
23
import org.springframework.web.bind.annotation.RequestMapping;
24
import org.springframework.web.bind.annotation.RequestMethod;
25
 
26
import com.spice.profitmandi.common.enumuration.MessageType;
27
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
28
import com.spice.profitmandi.common.model.CustomRetailer;
29
import com.spice.profitmandi.common.model.SendNotificationModel;
30
import com.spice.profitmandi.dao.entity.auth.AuthUser;
31
import com.spice.profitmandi.dao.entity.dtr.CreditAccount;
32
import com.spice.profitmandi.dao.entity.dtr.CreditStatus;
33
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
34
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
35
import com.spice.profitmandi.dao.entity.transaction.SDCreditRequirement;
36
import com.spice.profitmandi.dao.entity.transaction.SanctionRequest;
37
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
38
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
39
import com.spice.profitmandi.dao.enumuration.transaction.SanctionStatus;
40
import com.spice.profitmandi.dao.model.SanctionRequestModel;
41
import com.spice.profitmandi.dao.model.SdCreditRequirementModel;
42
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
43
import com.spice.profitmandi.dao.repository.dtr.CreditAccountRepository;
44
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
45
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
46
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
47
import com.spice.profitmandi.dao.repository.transaction.SDCreditRequirementRepository;
48
import com.spice.profitmandi.dao.repository.transaction.SanctionRequestRepository;
49
import com.spice.profitmandi.service.NotificationService;
50
import com.spice.profitmandi.service.transaction.SDCreditService;
51
import com.spice.profitmandi.service.user.RetailerService;
52
 
53
@Controller
54
@Transactional(rollbackOn = Throwable.class)
55
public class SDCreditController {
56
 
57
	@Autowired
58
	private RetailerService retailerService;
59
 
60
	@Autowired
61
	SDCreditRequirementRepository sdCreditRequirementRepository;
62
 
63
	@Autowired
64
	SanctionRequestRepository sanctionRequestRepository;
65
 
66
	@Autowired
67
	PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
68
 
69
	@Autowired
70
	private FofoStoreRepository fofoStoreRepository;
71
 
72
	@Autowired
73
	private CreditAccountRepository creditAccountRepository;
74
 
75
	@Autowired
76
	private SDCreditService sdCreditService;
77
 
78
	@Autowired
79
	private NotificationService notificationService;
80
 
81
	@Autowired
82
	private AuthRepository authRepository;
83
 
84
	@Autowired
85
	private UserRepository userRepository;
86
 
87
	private static final Logger LOGGER = LogManager.getLogger(SDCreditController.class);
88
 
89
	@RequestMapping(value = "/getSDCreditReq", method = RequestMethod.GET)
90
	public String getSDCreditReq(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
91
 
92
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
93
 
94
		Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream()
95
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
96
 
97
		for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
98
			int fofoId = customRetailerEntry.getKey();
99
 
100
			SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
101
			FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
102
			BigDecimal suggestedAmount = BigDecimal.valueOf(fofoStore.getMinimumInvestment() * 0.1);
103
 
104
			LOGGER.info("suggestedAmount {} ", suggestedAmount);
105
 
106
			if (sdCreditRequirement == null) {
107
				sdCreditRequirement = new SDCreditRequirement();
108
				sdCreditRequirement.setFofoId(fofoId);
109
				sdCreditRequirement.setRisk(CreditRisk.NO_RISK);
110
				sdCreditRequirement.setCreditDays(15);
111
				sdCreditRequirement.setInterestRate(BigDecimal.valueOf(0.05));
112
				sdCreditRequirement.setSuggestedLimit(suggestedAmount);
113
				sdCreditRequirement.setLimit(suggestedAmount);
114
				sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
115
				sdCreditRequirement.setAvailableLimit(suggestedAmount);
116
				sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
117
				sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
118
				sdCreditRequirementRepository.persist(sdCreditRequirement);
119
			} else {
120
				sdCreditRequirement.setSuggestedLimit(suggestedAmount);
30910 tejbeer 121
				sdCreditRequirement.setLimit(suggestedAmount);
122
				BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
123
 
124
				BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
125
 
126
				LOGGER.info("utilizedLimit {} ", utilizedLimit);
127
 
128
				LOGGER.info("availableLimit {} ", availableLimit);
129
 
130
				sdCreditRequirement.setUtilizedAmount(utilizedLimit);
131
 
132
				sdCreditRequirement.setAvailableLimit(availableLimit);
133
 
30859 tejbeer 134
				sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
135
			}
136
 
137
		}
138
 
139
		model.addAttribute("customRetailerMap", customRetailerMap);
140
		model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
141
		return "sd-credit";
142
	}
143
 
144
	@RequestMapping(value = "/creditRequirement", method = RequestMethod.POST)
145
	public String sdCredit(HttpServletRequest request, @RequestBody SdCreditRequirementModel sdCreditRequirementModel,
146
			Model model) throws Exception {
147
 
148
		LOGGER.info("sdCreditRequirementModel {} ", sdCreditRequirementModel);
149
 
150
		int fofoId = sdCreditRequirementModel.getFofoId();
151
 
152
		SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository
153
				.selectByFofoId(sdCreditRequirementModel.getFofoId());
154
 
155
		FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(sdCreditRequirementModel.getFofoId());
156
		BigDecimal suggestedAmount = new BigDecimal((fofoStore.getMinimumInvestment() * 0.1));
157
 
158
		LOGGER.info("sdCreditRequirement {} ", sdCreditRequirement);
159
 
160
		sdCreditRequirement.setSecurityCheck(sdCreditRequirementModel.getSecurityCheck());
161
		// sdCreditRequirement.setSecurityCheck(2);
162
 
163
		sdCreditRequirement.setInterestRate(sdCreditRequirementModel.getInterest());
164
		sdCreditRequirement.setFreeDays(sdCreditRequirementModel.getFreeDays());
165
		sdCreditRequirement.setLimit(sdCreditRequirementModel.getLimit());
166
		sdCreditRequirement.setSuggestedLimit(suggestedAmount);
30865 tejbeer 167
		BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
168
 
169
		BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
170
 
30909 tejbeer 171
		LOGGER.info("utilizedLimit {} ", utilizedLimit);
172
 
173
		LOGGER.info("availableLimit {} ", availableLimit);
174
 
30859 tejbeer 175
		sdCreditRequirement.setUtilizedAmount(utilizedLimit);
176
 
177
		sdCreditRequirement.setAvailableLimit(availableLimit);
178
		sdCreditRequirement.setCreditDays(15);
179
		sdCreditRequirement.setRisk(CreditRisk.NO_RISK);
180
 
181
		sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
182
 
183
		if (sdCreditRequirement.getSecurityCheck() > 0) {
184
 
185
			CreditAccount creditAccount = creditAccountRepository
186
					.selectByFofoIdAndGateway(sdCreditRequirementModel.getFofoId(), Gateway.SDDIRECT);
187
			if (creditAccount == null) {
188
				creditAccount = new CreditAccount();
189
				creditAccount.setFofoId(sdCreditRequirementModel.getFofoId());
190
				creditAccount.setGateway(Gateway.SDDIRECT);
191
				creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
192
				creditAccount.setActive(false);
193
 
194
				creditAccount.setUpdatedOn(LocalDateTime.now());
195
 
196
				creditAccountRepository.persist(creditAccount);
197
			}
198
 
199
			creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
200
			creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
201
			creditAccount.setAvailableAmount(availableLimit.floatValue());
202
			creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
203
			creditAccount.setUpdatedOn(LocalDateTime.now());
204
 
205
		}
206
		LOGGER.info("sdCreditRequirement {} ", sdCreditRequirement);
207
 
208
		CustomRetailer customRetailer = retailerService.getFofoRetailer(sdCreditRequirementModel.getFofoId());
209
 
30865 tejbeer 210
		sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(sdCreditRequirementModel.getFofoId());
211
 
30859 tejbeer 212
		Map<Integer, SDCreditRequirement> sdCreditRequirementMap = new HashMap<>();
213
		sdCreditRequirementMap.put(sdCreditRequirement.getFofoId(), sdCreditRequirement);
214
		model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
215
		model.addAttribute("customRetailer", customRetailer);
216
 
217
		return "sd-credit-requirement-row";
218
 
219
	}
220
 
221
	@RequestMapping(value = "/getSanctionRequest", method = RequestMethod.GET)
222
	public String getSanctionRequest(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
223
 
224
		List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectByDate(LocalDate.now());
225
 
226
		List<Integer> fofoIds = sanctionRequests.stream().map(x -> x.getFofoId()).collect(Collectors.toList());
227
 
228
		Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream()
229
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
230
 
231
		if (!sanctionRequests.isEmpty()) {
232
 
233
			Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
234
			Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository
235
					.selectAll(fofoIds, LocalDate.now().minusDays(90)).stream()
236
					.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
237
 
238
			model.addAttribute("customRetailerMap", customRetailerMap);
239
 
240
			model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
241
 
242
		}
243
 
244
		model.addAttribute("sanctionRequests", sanctionRequests);
245
 
246
		model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
247
 
248
		model.addAttribute("sanctionStatus", SanctionStatus.values());
249
		return "sanction-request";
250
 
251
	}
252
 
253
	@RequestMapping(value = "/sanctionRequest", method = RequestMethod.POST)
254
	public String sanctionRequest(HttpServletRequest request, @RequestBody SanctionRequestModel sanctionRequestModel,
255
			Model model) throws Exception {
256
 
257
		LOGGER.info("sanctionRequestModel {} ", sanctionRequestModel);
258
		Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream()
259
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
260
 
261
		SanctionRequest sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
262
		List<Integer> fofoIds = sanctionRequestRepository.selectByDate(LocalDate.now()).stream().map(x -> x.getFofoId())
263
				.collect(Collectors.toList());
264
 
265
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoIds);
266
 
267
		LOGGER.info("freeDays {} ", sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays());
268
 
269
		if (sanctionRequestModel.getStatus().equals(SanctionStatus.APPROVED)) {
270
			CustomRetailer customRetailer = customRetailerMap.get(sanctionRequest.getFofoId());
271
			sanctionRequest.setApprovalTimestamp(LocalDateTime.now());
272
			BigDecimal availableAmount = sdCreditService.getAvailableAmount(sanctionRequest.getFofoId());
273
 
274
			String title = "Sanction Request Approved";
275
			String url = "http://app.smartdukaan.com/pages/home/credit";
276
			String message = "congratulations! Your credit limit is increased for today Rs."
277
					+ sanctionRequest.getApprovalAmount().setScale(2, RoundingMode.HALF_UP)
278
					+ " your total available limit is Rs." + availableAmount.setScale(2, RoundingMode.HALF_UP);
279
			notificationService.sendNotification(sanctionRequest.getFofoId(), title, MessageType.notification, title,
280
					message, url);
281
 
282
			AuthUser authUser = authRepository.selectById(sanctionRequest.getAuthId());
283
 
284
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
285
			sendNotificationModel.setCampaignName("Loan");
286
			sendNotificationModel.setTitle("Sanction Request Approved");
287
			sendNotificationModel.setMessage("congratulations! Your Partner  " + customRetailer.getBusinessName()
288
					+ "credit limit is increased for today Rs."
289
					+ sanctionRequest.getApprovalAmount().setScale(2, RoundingMode.HALF_UP)
290
					+ " your total available limit is Rs." + availableAmount.setScale(2, RoundingMode.HALF_UP));
291
			sendNotificationModel.setType("url");
292
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/credit");
293
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
294
			sendNotificationModel.setMessageType(MessageType.notification);
295
			sendNotificationModel
296
					.setUserIds(Arrays.asList(userRepository.selectByEmailId(authUser.getEmailId()).getId()));
297
			System.out.println(sendNotificationModel);
298
			notificationService.sendNotification(sendNotificationModel);
299
 
300
		}
301
 
302
		if (sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays() >= sanctionRequestModel
303
				.getFreeDays()) {
304
			sanctionRequest.setFreeDays(sanctionRequestModel.getFreeDays());
305
		} else {
306
			throw new ProfitMandiBusinessException("Free Days", "Free Days", "Free Days is not more than "
307
					+ sdCreditRequirementMap.get(sanctionRequest.getFofoId()).getFreeDays() + " days ");
308
		}
309
 
310
		sanctionRequest.setApprovalAmount(sanctionRequestModel.getApprovalAmount());
311
		sanctionRequest.setStatus(sanctionRequestModel.getStatus());
312
 
313
		Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = partnerDailyInvestmentRepository
314
				.selectAll(fofoIds, LocalDate.now().minusDays(90)).stream()
315
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
316
		sanctionRequest = sanctionRequestRepository.selectById(sanctionRequestModel.getId());
317
		model.addAttribute("customRetailerMap", customRetailerMap);
318
		model.addAttribute("sanctionRequest", sanctionRequest);
319
		model.addAttribute("partnerDailyInvestmentMap", partnerDailyInvestmentMap);
320
		model.addAttribute("sdCreditRequirementMap", sdCreditRequirementMap);
321
 
322
		model.addAttribute("sanctionStatus", SanctionStatus.values());
323
 
324
		return "sanction-request-row";
325
 
326
	}
327
 
328
}