Subversion Repositories SmartDukaan

Rev

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