Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
25496 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
3
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29891 tejbeer 4
import com.spice.profitmandi.common.model.CustomRetailer;
25496 tejbeer 5
import com.spice.profitmandi.dao.entity.user.Refferal;
6
import com.spice.profitmandi.dao.entity.user.RefferalMonthlyAmount;
7
import com.spice.profitmandi.dao.entity.user.User;
8
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
9
import com.spice.profitmandi.dao.model.DateRangeModel;
10
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
11
import com.spice.profitmandi.dao.repository.dtr.RefferalMonthlyAmountRepository;
12
import com.spice.profitmandi.dao.repository.dtr.RefferalRepository;
13
import com.spice.profitmandi.dao.repository.user.UserRepository;
14
import com.spice.profitmandi.service.user.RetailerService;
15
import com.spice.profitmandi.service.wallet.WalletService;
16
import com.spice.profitmandi.web.util.MVCResponseSender;
17
import in.shop2020.model.v1.order.WalletReferenceType;
31238 amit.gupta 18
import org.apache.logging.log4j.LogManager;
19
import org.apache.logging.log4j.Logger;
20
import org.springframework.beans.factory.annotation.Autowired;
21
import org.springframework.mail.javamail.JavaMailSender;
22
import org.springframework.mail.javamail.MimeMessageHelper;
23
import org.springframework.stereotype.Controller;
24
import org.springframework.transaction.annotation.Transactional;
25
import org.springframework.ui.Model;
26
import org.springframework.web.bind.annotation.RequestMapping;
27
import org.springframework.web.bind.annotation.RequestMethod;
28
import org.springframework.web.bind.annotation.RequestParam;
25496 tejbeer 29
 
31238 amit.gupta 30
import javax.mail.internet.InternetAddress;
31
import javax.mail.internet.MimeMessage;
32
import javax.servlet.http.HttpServletRequest;
36325 aman 33
import java.time.LocalDate;
31238 amit.gupta 34
import java.time.LocalDateTime;
35
import java.util.*;
36
import java.util.stream.Collectors;
37
 
25496 tejbeer 38
@Controller
39
@Transactional(rollbackFor = Throwable.class)
40
public class RefferalController {
41
 
42
	@Autowired
43
	private RefferalRepository refferalRepository;
44
 
45
	@Autowired
46
	private MVCResponseSender mvcResponseSender;
47
 
48
	@Autowired
49
	private FofoStoreRepository fofoStoreRepository;
50
 
51
	@Autowired
52
	private RetailerService retailerService;
53
 
54
	@Autowired
55
	private WalletService walletService;
56
 
57
	@Autowired
58
	private RefferalMonthlyAmountRepository refferalMonthlyAmountRepository;
59
 
60
	@Autowired
61
	private UserRepository userRepository;
62
 
26766 tejbeer 63
	@Autowired
29891 tejbeer 64
	private com.spice.profitmandi.dao.repository.user.UserRepository userUserRepository;
65
 
66
	@Autowired
36401 amit 67
	JavaMailSender gmailRelaySender;
26766 tejbeer 68
 
25496 tejbeer 69
	private static final Logger LOGGER = LogManager.getLogger(RefferalRepository.class);
70
 
36325 aman 71
	// New tier policy: 1 → 3000, 2 → 4000, 3+ → 5000 (every successful referral that month earns that rate).
72
	// Referrals approved (or created, if approved ts missing) before TIER_POLICY_EFFECTIVE_DATE keep the flat ₹2,000.
73
	private static final int LEGACY_PER_REFERRAL_EARNING = 2000;
74
	private static final LocalDate TIER_POLICY_EFFECTIVE_DATE = LocalDate.of(2026, 1, 19);
75
 
76
	private static int tierRate(long count) {
77
		if (count <= 0) return 0;
78
		if (count == 1) return 3000;
79
		if (count == 2) return 4000;
80
		return 5000;
81
	}
82
 
83
	private static boolean isLegacy(Refferal r) {
84
		LocalDateTime when = r.getApprovedTimestamp() != null ? r.getApprovedTimestamp() : r.getCreatedTimestamp();
85
		return when != null && when.toLocalDate().isBefore(TIER_POLICY_EFFECTIVE_DATE);
86
	}
87
 
88
	private static long computeEarning(List<Refferal> referrals) {
89
		long legacyCount = referrals.stream().filter(RefferalController::isLegacy).count();
90
		long newCount = referrals.size() - legacyCount;
91
		return legacyCount * LEGACY_PER_REFERRAL_EARNING + newCount * tierRate(newCount);
92
	}
93
 
25496 tejbeer 94
	@RequestMapping(value = "/getRefferalsRequest", method = RequestMethod.GET)
29891 tejbeer 95
	public String getRefferalsRequest(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
25496 tejbeer 96
 
29891 tejbeer 97
		List<Refferal> refferals = refferalRepository.selectByStatus(RefferalStatus.pending);
98
 
99
		Map<String, CustomRetailer> customerRetailerMap = new HashMap<>();
100
 
25496 tejbeer 101
		if (!refferals.isEmpty()) {
102
 
29891 tejbeer 103
			Set<String> emails = refferals.stream().map(x -> x.getRefereeEmail()).collect(Collectors.toSet());
25496 tejbeer 104
 
29891 tejbeer 105
			List<User> users = userUserRepository.selectByEmailIds(emails);
25496 tejbeer 106
 
29891 tejbeer 107
			List<Integer> fofoIds = users.stream().map(x -> x.getId()).collect(Collectors.toList());
25496 tejbeer 108
 
30426 tejbeer 109
			Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
25496 tejbeer 110
 
30426 tejbeer 111
			Map<Integer, CustomRetailer> customRetailers = fofoIds.stream().map(x -> customRetailerMap.get(x))
112
					.filter(x -> x != null).collect(Collectors.toList()).stream()
113
					.collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
114
 
29891 tejbeer 115
			customerRetailerMap = customRetailers.entrySet().stream()
116
					.collect(Collectors.toMap(x -> x.getValue().getEmail(), x -> x.getValue()));
25496 tejbeer 117
 
118
		}
29891 tejbeer 119
		model.addAttribute("customerRetailerMap", customerRetailerMap);
25496 tejbeer 120
 
29891 tejbeer 121
		model.addAttribute("rStatus", "pending");
122
 
123
		model.addAttribute("refferals", refferals);
124
 
25496 tejbeer 125
		return "refferal";
126
	}
127
 
29891 tejbeer 128
	@RequestMapping(value = "/getValidateRefferals", method = RequestMethod.GET)
129
	public String getValidateRefferals(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
25496 tejbeer 130
 
29891 tejbeer 131
		List<Refferal> refferals = refferalRepository.selectByStatus(RefferalStatus.validate);
25496 tejbeer 132
 
29891 tejbeer 133
		Map<String, CustomRetailer> customerRetailerMap = new HashMap<>();
25496 tejbeer 134
 
25587 tejbeer 135
		if (!refferals.isEmpty()) {
136
 
29891 tejbeer 137
			Set<String> emails = refferals.stream().map(x -> x.getRefereeEmail()).collect(Collectors.toSet());
25587 tejbeer 138
 
29891 tejbeer 139
			List<User> users = userUserRepository.selectByEmailIds(emails);
25587 tejbeer 140
 
29891 tejbeer 141
			List<Integer> fofoIds = users.stream().map(x -> x.getId()).collect(Collectors.toList());
25587 tejbeer 142
 
30426 tejbeer 143
			Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
25587 tejbeer 144
 
30426 tejbeer 145
			Map<Integer, CustomRetailer> customRetailers = fofoIds.stream().map(x -> customRetailerMap.get(x))
146
					.filter(x -> x != null).collect(Collectors.toList()).stream()
147
					.collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
148
 
29891 tejbeer 149
			customerRetailerMap = customRetailers.entrySet().stream()
150
					.collect(Collectors.toMap(x -> x.getValue().getEmail(), x -> x.getValue()));
25587 tejbeer 151
 
152
		}
29891 tejbeer 153
		model.addAttribute("customerRetailerMap", customerRetailerMap);
25587 tejbeer 154
 
29891 tejbeer 155
		model.addAttribute("refferals", refferals);
156
		model.addAttribute("rStatus", "validate");
157
 
25587 tejbeer 158
		return "refferal";
159
	}
160
 
161
	@RequestMapping(value = "/validateRefferal", method = RequestMethod.PUT)
162
	public String validateRefferal(HttpServletRequest request,
163
			@RequestParam(name = "refferalId", defaultValue = "0") int refferalId, Model model) throws Exception {
164
 
165
		Refferal refferal = refferalRepository.selectById(refferalId);
166
 
167
		if (refferal.getStatus().equals(RefferalStatus.pending)) {
168
			refferal.setStatus(RefferalStatus.validate);
169
			refferal.setUpdatedTimestamp(LocalDateTime.now());
170
			refferalRepository.persist(refferal);
31238 amit.gupta 171
			model.addAttribute("response1", mvcResponseSender.createResponseString(true));
25587 tejbeer 172
 
26792 tejbeer 173
			String subject = "Referral Approval Request for " + refferal.getRefereeEmail();
174
 
175
			String messageText = this.getMessageForReferral(refferal);
36401 amit 176
			MimeMessage message = gmailRelaySender.createMimeMessage();
26792 tejbeer 177
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
34211 vikas.jang 178
			String[] email = { "tarun.verma@smartdukaan.com", "vikas.jangra@smartdukaan.com",
30048 tejbeer 179
					"rakesh.sonawane@smartdukaan.com", "sm@smartdukaan.com" };
26792 tejbeer 180
			helper.setSubject(subject);
181
			helper.setText(messageText, true);
182
			helper.setTo(email);
183
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
184
			helper.setFrom(senderAddress);
36401 amit 185
			gmailRelaySender.send(message);
26792 tejbeer 186
 
25587 tejbeer 187
		} else {
31238 amit.gupta 188
			model.addAttribute("response1", mvcResponseSender.createResponseString(false));
25587 tejbeer 189
 
190
		}
191
 
192
		return "response";
193
	}
194
 
26792 tejbeer 195
	private String getMessageForReferral(Refferal referral) {
196
 
197
		StringBuilder sb = new StringBuilder();
198
		sb.append("<html><body><p>Alert</p><p> Referral Requests:-</p>"
199
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
200
		sb.append("<tbody>\n" + "	    				<tr>\n"
201
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
202
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
203
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
204
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
205
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
206
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
207
				+ "	    				</tr>");
208
 
209
		sb.append("<tr>");
210
		sb.append("<td style='border:1px solid black;padding: 5px'>" + referral.getRefereeName() + "</td>");
211
 
212
		sb.append("<td style='border:1px solid black;padding: 5px'>" + referral.getRefereeEmail() + "</td>");
213
		sb.append("<td style='border:1px solid black;padding: 5px'>" + referral.getFirstName() + "</td>");
214
		sb.append("<td style='border:1px solid black;padding: 5px'>" + referral.getMobile() + "</td>");
215
		sb.append("<td style='border:1px solid black;padding: 5px'>" + referral.getCity() + "</td>");
216
		sb.append("<td style='border:1px solid black;padding: 5px'>" + referral.getState() + "</td>");
217
 
218
		sb.append("</tr>");
219
 
220
		sb.append("</tbody></table></body></html>");
221
 
222
		return sb.toString();
223
	}
224
 
25496 tejbeer 225
	@RequestMapping(value = "/approveRefferal", method = RequestMethod.PUT)
226
	public String approveRefferal(HttpServletRequest request,
227
			@RequestParam(name = "refferalId", defaultValue = "0") int refferalId, Model model) throws Exception {
228
 
229
		Refferal refferal = refferalRepository.selectById(refferalId);
230
 
25587 tejbeer 231
		if (refferal.getStatus().equals(RefferalStatus.validate)) {
25496 tejbeer 232
			refferal.setStatus(RefferalStatus.approved);
233
			refferal.setUpdatedTimestamp(LocalDateTime.now());
234
			refferal.setApprovedTimestamp(LocalDateTime.now());
235
			refferalRepository.persist(refferal);
26766 tejbeer 236
 
26792 tejbeer 237
			String subject = "Referral Request Approved for " + refferal.getRefereeEmail();
238
			String messageText = this.getMessageForReferral(refferal);
26766 tejbeer 239
 
240
			this.sendMailWithAttachments(subject, messageText);
31238 amit.gupta 241
			model.addAttribute("response1", mvcResponseSender.createResponseString(true));
25496 tejbeer 242
 
243
		} else {
31238 amit.gupta 244
			model.addAttribute("response1", mvcResponseSender.createResponseString(false));
25496 tejbeer 245
 
246
		}
247
 
248
		return "response";
249
	}
250
 
26766 tejbeer 251
	private void sendMailWithAttachments(String subject, String messageText) throws Exception {
36401 amit 252
		MimeMessage message = gmailRelaySender.createMimeMessage();
26766 tejbeer 253
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
26792 tejbeer 254
		String[] email = { "neeraj.gupta@smartdukaan.com" };
26766 tejbeer 255
		helper.setSubject(subject);
26792 tejbeer 256
		helper.setText(messageText, true);
26766 tejbeer 257
		helper.setTo(email);
258
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
259
		helper.setFrom(senderAddress);
36401 amit 260
		gmailRelaySender.send(message);
26766 tejbeer 261
 
262
	}
263
 
25496 tejbeer 264
	@RequestMapping(value = "/rejectRefferal", method = RequestMethod.PUT)
265
	public String rejectRefferal(HttpServletRequest request,
25645 tejbeer 266
			@RequestParam(name = "refferalId", defaultValue = "0") int refferalId, @RequestParam String rejectionReason,
267
			Model model) throws Exception {
25496 tejbeer 268
		Refferal refferal = refferalRepository.selectById(refferalId);
269
 
29890 tejbeer 270
		if (refferal.getStatus().equals(RefferalStatus.pending)
271
				|| refferal.getStatus().equals(RefferalStatus.validate)) {
25496 tejbeer 272
			refferal.setStatus(RefferalStatus.rejected);
25645 tejbeer 273
			refferal.setRejectedReason(rejectionReason);
25496 tejbeer 274
			refferal.setUpdatedTimestamp(LocalDateTime.now());
275
			refferalRepository.persist(refferal);
31238 amit.gupta 276
			model.addAttribute("response1", mvcResponseSender.createResponseString(true));
25496 tejbeer 277
 
278
		} else {
31238 amit.gupta 279
			model.addAttribute("response1", mvcResponseSender.createResponseString(false));
25496 tejbeer 280
 
281
		}
282
 
283
		return "response";
284
	}
285
 
286
	@RequestMapping(value = "/approvedRefferals", method = RequestMethod.GET)
287
	public String approvedRefferals(HttpServletRequest request, Model model) throws Exception {
26766 tejbeer 288
 
26792 tejbeer 289
		Map<String, Long> pastApprovedCountMap = null;
29986 tejbeer 290
		List<Refferal> pastrefferal = new ArrayList<>();
26792 tejbeer 291
 
25496 tejbeer 292
		DateRangeModel drm = new DateRangeModel();
293
		drm.setStartDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(1));
294
		drm.setEndDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(16));
25587 tejbeer 295
 
25496 tejbeer 296
		List<Refferal> previousMonthapprovedRefferal = refferalRepository
25587 tejbeer 297
				.selectByStatusAndDateRanges(RefferalStatus.approved, drm);
298
 
25496 tejbeer 299
		drm.setStartDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(16));
300
		drm.setEndDate(LocalDateTime.now().withDayOfMonth(16));
301
		LocalDateTime currentMonthdate = LocalDateTime.now().withDayOfMonth(1);
25587 tejbeer 302
 
303
		List<Refferal> preCurrMonthapproved = refferalRepository
304
				.selectByStatusAndDateRange(RefferalStatus.approved, drm).stream()
25496 tejbeer 305
				.filter(x -> x.getCreatedTimestamp().isBefore(currentMonthdate)).collect(Collectors.toList());
25587 tejbeer 306
		preCurrMonthapproved.addAll(previousMonthapprovedRefferal);
25496 tejbeer 307
 
26792 tejbeer 308
		LOGGER.info("preCurrMonthapproved" + preCurrMonthapproved);
309
 
25587 tejbeer 310
		Map<String, Long> preApproved = preCurrMonthapproved.stream()
311
				.collect(Collectors.groupingBy(Refferal::getRefereeEmail, Collectors.counting()));
25496 tejbeer 312
 
313
		drm.setStartDate(LocalDateTime.now().minusMonths(2).withDayOfMonth(1));
314
		drm.setEndDate(LocalDateTime.now().minusMonths(2).withDayOfMonth(16));
25587 tejbeer 315
 
316
		LocalDateTime previousMonthdate = LocalDateTime.now().minusMonths(1).withDayOfMonth(1);
317
		List<Refferal> oldMonthapprovedRefferal = refferalRepository
318
				.selectByStatusAndDateRanges(RefferalStatus.approved, drm);
319
 
25496 tejbeer 320
		drm.setStartDate(LocalDateTime.now().minusMonths(2).withDayOfMonth(16));
321
		drm.setEndDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(16));
322
 
25587 tejbeer 323
		List<Refferal> oldPreMonthapproved = refferalRepository.selectByStatusAndDateRange(RefferalStatus.approved, drm)
324
				.stream().filter(x -> x.getCreatedTimestamp().isBefore(previousMonthdate)).collect(Collectors.toList());
25496 tejbeer 325
 
25587 tejbeer 326
		oldPreMonthapproved.addAll(oldMonthapprovedRefferal);
26792 tejbeer 327
		LOGGER.info("oldPreMonthapproved" + oldPreMonthapproved);
25496 tejbeer 328
 
25587 tejbeer 329
		Map<String, Long> oldApproved = oldPreMonthapproved.stream()
330
				.collect(Collectors.groupingBy(Refferal::getRefereeEmail, Collectors.counting()));
331
		LOGGER.info("preApproved" + preApproved);
332
 
26766 tejbeer 333
		if (preApproved.isEmpty() && oldApproved.isEmpty()) {
26792 tejbeer 334
 
335
			pastrefferal = refferalRepository.selectByStatus(RefferalStatus.approved);
336
			pastApprovedCountMap = pastrefferal.stream()
26766 tejbeer 337
					.collect(Collectors.groupingBy(Refferal::getRefereeEmail, Collectors.counting()));
338
		}
339
 
29891 tejbeer 340
		List<Refferal> referalslist = new ArrayList<>();
341
		referalslist.addAll(oldPreMonthapproved);
342
		referalslist.addAll(pastrefferal);
343
		referalslist.addAll(preCurrMonthapproved);
344
 
345
		Map<String, CustomRetailer> customerRetailerMap = new HashMap<>();
346
 
347
		if (!referalslist.isEmpty()) {
348
 
349
			Set<String> emails = referalslist.stream().map(x -> x.getRefereeEmail()).collect(Collectors.toSet());
350
 
351
			List<User> users = userUserRepository.selectByEmailIds(emails);
352
 
353
			List<Integer> fofoIds = users.stream().map(x -> x.getId()).collect(Collectors.toList());
354
 
30426 tejbeer 355
			Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
29891 tejbeer 356
 
30426 tejbeer 357
			Map<Integer, CustomRetailer> customRetailers = fofoIds.stream().map(x -> customRetailerMap.get(x))
358
					.filter(x -> x != null).collect(Collectors.toList()).stream()
359
					.collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
360
 
29891 tejbeer 361
			customerRetailerMap = customRetailers.entrySet().stream()
362
					.collect(Collectors.toMap(x -> x.getValue().getEmail(), x -> x.getValue()));
363
 
364
		}
365
		model.addAttribute("customerRetailerMap", customerRetailerMap);
366
 
26792 tejbeer 367
		LOGGER.info("refferal" + pastrefferal);
25587 tejbeer 368
		LOGGER.info("oldApproved" + oldApproved);
26792 tejbeer 369
		LOGGER.info("pastApproved" + pastApprovedCountMap);
25496 tejbeer 370
		model.addAttribute("oldMonth", LocalDateTime.now().minusMonths(2).getMonth());
25587 tejbeer 371
		model.addAttribute("oldApproved", oldApproved);
26792 tejbeer 372
		model.addAttribute("oldPreMonthapproved", oldPreMonthapproved);
25496 tejbeer 373
		model.addAttribute("previousMonth", LocalDateTime.now().minusMonths(1).getMonth());
26792 tejbeer 374
		model.addAttribute("pastApproved", pastApprovedCountMap);
375
		model.addAttribute("pastrefferal", pastrefferal);
25587 tejbeer 376
		model.addAttribute("preApproved", preApproved);
26792 tejbeer 377
		model.addAttribute("preCurrMonthapproved", preCurrMonthapproved);
25587 tejbeer 378
 
379
		return "refferal-approve";
25496 tejbeer 380
	}
381
 
382
	@RequestMapping(value = "/addMoneyToWallet", method = RequestMethod.POST)
383
	public String addMoneyToWallet(HttpServletRequest request, @RequestParam String refereeEmail,
384
			@RequestParam int count, @RequestParam int amount, @RequestParam String month, Model model)
385
			throws Exception {
386
 
387
		User user = userRepository.selectByEmailId(refereeEmail);
388
		if (user != null) {
389
			DateRangeModel drm = new DateRangeModel();
390
			drm.setStartDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(1));
391
			drm.setEndDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(16));
392
			List<Refferal> previousMonthapprovedRefferal = refferalRepository
25587 tejbeer 393
					.selectByEmailIdAndStatusAndDateRanges(user.getEmailId(), RefferalStatus.approved, drm);
25496 tejbeer 394
			drm.setStartDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(16));
395
			drm.setEndDate(LocalDateTime.now().withDayOfMonth(16));
396
			List<Refferal> previousAndcurrentMonthapprovedRefferal = refferalRepository
25587 tejbeer 397
					.selectByEmailIdAndStatusAndDateRange(user.getEmailId(), RefferalStatus.approved, drm);
25496 tejbeer 398
			LocalDateTime currentMonthdate = LocalDateTime.now().withDayOfMonth(1);
399
			List<Refferal> preCurrMonthapproved = previousAndcurrentMonthapprovedRefferal.stream()
400
					.filter(x -> x.getCreatedTimestamp().isBefore(currentMonthdate)).collect(Collectors.toList());
401
			List<Refferal> approvedRefferals = new ArrayList<>(previousMonthapprovedRefferal);
402
			approvedRefferals.addAll(preCurrMonthapproved);
403
 
26766 tejbeer 404
			if (approvedRefferals.isEmpty()) {
405
				List<Refferal> pastApproved = refferalRepository.selectByStatusAndEmailId(RefferalStatus.approved,
406
						user.getEmailId());
407
				approvedRefferals.addAll(pastApproved);
408
			}
36325 aman 409
 
410
			// Ignore the form-posted `amount`; recompute from the actual referrals being transferred so
411
			// admin can't (accidentally or otherwise) credit the wrong figure.
412
			int correctAmount = (int) computeEarning(approvedRefferals);
413
			int correctCount = approvedRefferals.size();
414
			LOGGER.info("addMoneyToWallet: form amount={}, form count={}, correct amount={}, correct count={}",
415
					amount, count, correctAmount, correctCount);
416
 
417
			RefferalMonthlyAmount rfm = new RefferalMonthlyAmount();
418
			rfm.setAmount(correctAmount);
419
			rfm.setCount(correctCount);
420
			rfm.setRefereeEmail(user.getEmailId());
421
			rfm.setCreatedTimstamp(LocalDateTime.now());
422
			refferalMonthlyAmountRepository.persist(rfm);
423
			walletService.addAmountToWallet(user.getId(), rfm.getId(), WalletReferenceType.REFERRAL_INCENTIVES,
424
					correctCount + "referral of" + month + "Month", correctAmount, LocalDateTime.now());
425
 
25496 tejbeer 426
			for (Refferal refferl : approvedRefferals) {
427
				refferl.setStatus(RefferalStatus.transferred);
428
				refferl.setUpdatedTimestamp(LocalDateTime.now());
429
			}
430
 
31238 amit.gupta 431
			model.addAttribute("response1", mvcResponseSender.createResponseString(true));
25496 tejbeer 432
		} else {
31238 amit.gupta 433
			model.addAttribute("response1", mvcResponseSender.createResponseString(false));
25496 tejbeer 434
		}
435
		return "response";
436
	}
437
 
438
	@RequestMapping(value = "/addMoneyToWalletPreviousMonth", method = RequestMethod.POST)
439
	public String addMoneyToWalletPrevious(HttpServletRequest request, @RequestParam String refereeEmail,
440
			@RequestParam int count, @RequestParam int amount, @RequestParam String month, Model model)
441
			throws Exception {
442
 
443
		User user = userRepository.selectByEmailId(refereeEmail);
444
		if (user != null) {
445
			DateRangeModel drm = new DateRangeModel();
446
			drm.setStartDate(LocalDateTime.now().minusMonths(2).withDayOfMonth(1));
447
			drm.setEndDate(LocalDateTime.now().minusMonths(2).withDayOfMonth(16));
448
			List<Refferal> oldMonthapprovedRefferal = refferalRepository
25587 tejbeer 449
					.selectByEmailIdAndStatusAndDateRanges(user.getEmailId(), RefferalStatus.approved, drm);
450
			LOGGER.info("oldMonthapprovedRefferal" + oldMonthapprovedRefferal);
451
 
25496 tejbeer 452
			drm.setStartDate(LocalDateTime.now().minusMonths(2).withDayOfMonth(16));
453
			drm.setEndDate(LocalDateTime.now().minusMonths(1).withDayOfMonth(16));
454
			List<Refferal> oldAndpreviousMonthapprovedRefferal = refferalRepository
25587 tejbeer 455
					.selectByEmailIdAndStatusAndDateRange(user.getEmailId(), RefferalStatus.approved, drm);
25496 tejbeer 456
			LocalDateTime previousMonthdate = LocalDateTime.now().minusMonths(1).withDayOfMonth(1);
457
			List<Refferal> oldPreMonthapproved = oldAndpreviousMonthapprovedRefferal.stream()
458
					.filter(x -> x.getCreatedTimestamp().isBefore(previousMonthdate)).collect(Collectors.toList());
459
 
25587 tejbeer 460
			oldPreMonthapproved.addAll(oldMonthapprovedRefferal);
25496 tejbeer 461
 
25587 tejbeer 462
			LOGGER.info("oldPreMonthapproved" + oldPreMonthapproved);
36325 aman 463
 
464
			int correctAmount = (int) computeEarning(oldPreMonthapproved);
465
			int correctCount = oldPreMonthapproved.size();
466
			LOGGER.info("addMoneyToWalletPreviousMonth: form amount={}, form count={}, correct amount={}, correct count={}",
467
					amount, count, correctAmount, correctCount);
468
 
469
			RefferalMonthlyAmount rfm = new RefferalMonthlyAmount();
470
			rfm.setAmount(correctAmount);
471
			rfm.setCount(correctCount);
472
			rfm.setRefereeEmail(user.getEmailId());
473
			rfm.setCreatedTimstamp(LocalDateTime.now());
474
			refferalMonthlyAmountRepository.persist(rfm);
475
			walletService.addAmountToWallet(user.getId(), rfm.getId(), WalletReferenceType.CASHBACK,
476
					correctCount + "referral of" + month + "Month", correctAmount, LocalDateTime.now());
477
 
25587 tejbeer 478
			for (Refferal refferl : oldPreMonthapproved) {
25496 tejbeer 479
				refferl.setStatus(RefferalStatus.transferred);
480
				refferl.setUpdatedTimestamp(LocalDateTime.now());
481
			}
482
 
31238 amit.gupta 483
			model.addAttribute("response1", mvcResponseSender.createResponseString(true));
25496 tejbeer 484
		} else {
31238 amit.gupta 485
			model.addAttribute("response1", mvcResponseSender.createResponseString(false));
25496 tejbeer 486
		}
487
		return "response";
488
	}
489
 
490
	@RequestMapping(value = "/getTransferredRefferals", method = RequestMethod.GET)
29891 tejbeer 491
	public String getTransferredRefferals(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
25496 tejbeer 492
 
29891 tejbeer 493
		List<Refferal> refferals = refferalRepository.selectByStatus(RefferalStatus.transferred);
494
		Map<String, CustomRetailer> customerRetailerMap = new HashMap<>();
495
 
25496 tejbeer 496
		if (!refferals.isEmpty()) {
497
 
29891 tejbeer 498
			Set<String> emails = refferals.stream().map(x -> x.getRefereeEmail()).collect(Collectors.toSet());
25496 tejbeer 499
 
29891 tejbeer 500
			List<User> users = userUserRepository.selectByEmailIds(emails);
25496 tejbeer 501
 
29891 tejbeer 502
			List<Integer> fofoIds = users.stream().map(x -> x.getId()).collect(Collectors.toList());
25496 tejbeer 503
 
30426 tejbeer 504
			Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
25496 tejbeer 505
 
30426 tejbeer 506
			Map<Integer, CustomRetailer> customRetailers = fofoIds.stream().map(x -> customRetailerMap.get(x))
507
					.filter(x -> x != null).collect(Collectors.toList()).stream()
508
					.collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
509
 
29891 tejbeer 510
			customerRetailerMap = customRetailers.entrySet().stream()
511
					.collect(Collectors.toMap(x -> x.getValue().getEmail(), x -> x.getValue()));
512
 
25496 tejbeer 513
		}
29891 tejbeer 514
		model.addAttribute("customerRetailerMap", customerRetailerMap);
25496 tejbeer 515
 
29891 tejbeer 516
		model.addAttribute("refferals", refferals);
517
 
25496 tejbeer 518
		return "refferal";
519
	}
520
 
521
	@RequestMapping(value = "/getPaginatedTransferredRefferals", method = RequestMethod.GET)
522
	public String getPaginatedTransferredRefferals(HttpServletRequest request,
523
			@RequestParam(name = "offset", defaultValue = "0") int offset,
524
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws Exception {
525
		LOGGER.info("requested offset=[{}], limit = [{}]", offset, limit);
526
		List<Refferal> refferals = null;
527
		refferals = refferalRepository.selectAllRefferalByStatus(offset, limit, RefferalStatus.transferred);
528
		LOGGER.info("refferals" + refferals);
529
		if (!refferals.isEmpty()) {
530
 
531
			model.addAttribute("refferals", refferals);
532
			model.addAttribute("url", "/getPaginatedTransferredRefferals");
533
 
534
		} else {
535
			model.addAttribute("refferals", refferals);
536
 
537
		}
538
 
539
		return "refferal-paginated";
540
	}
541
}