Subversion Repositories SmartDukaan

Rev

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