Subversion Repositories SmartDukaan

Rev

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