Subversion Repositories SmartDukaan

Rev

Rev 29813 | Rev 29962 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
22551 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
28515 amit.gupta 3
import java.io.ByteArrayInputStream;
4
import java.io.ByteArrayOutputStream;
5
import java.io.InputStream;
23985 tejbeer 6
import java.text.MessageFormat;
28597 amit.gupta 7
import java.time.LocalDate;
22551 ashik.ali 8
import java.time.LocalDateTime;
28515 amit.gupta 9
import java.time.ZoneId;
22551 ashik.ali 10
import java.util.ArrayList;
28597 amit.gupta 11
import java.util.Arrays;
24511 amit.gupta 12
import java.util.Collections;
28515 amit.gupta 13
import java.util.Date;
14
import java.util.HashMap;
22551 ashik.ali 15
import java.util.List;
23936 tejbeer 16
import java.util.Map;
28597 amit.gupta 17
import java.util.Set;
24876 tejbeer 18
import java.util.stream.Collectors;
22551 ashik.ali 19
 
23985 tejbeer 20
import javax.mail.internet.InternetAddress;
21
import javax.mail.internet.MimeMessage;
22551 ashik.ali 22
import javax.servlet.http.HttpServletRequest;
25506 amit.gupta 23
import javax.swing.SortOrder;
25250 amit.gupta 24
import javax.transaction.Transactional;
22551 ashik.ali 25
 
23985 tejbeer 26
import org.apache.logging.log4j.LogManager;
23568 govind 27
import org.apache.logging.log4j.Logger;
28515 amit.gupta 28
import org.apache.poi.ss.usermodel.Cell;
29
import org.apache.poi.ss.usermodel.CellStyle;
30
import org.apache.poi.ss.usermodel.CreationHelper;
31
import org.apache.poi.ss.usermodel.Sheet;
32
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
24876 tejbeer 33
import org.json.JSONObject;
22551 ashik.ali 34
import org.springframework.beans.factory.annotation.Autowired;
28515 amit.gupta 35
import org.springframework.core.io.InputStreamResource;
36
import org.springframework.http.HttpHeaders;
37
import org.springframework.http.HttpStatus;
38
import org.springframework.http.ResponseEntity;
23985 tejbeer 39
import org.springframework.mail.javamail.JavaMailSender;
40
import org.springframework.mail.javamail.MimeMessageHelper;
22551 ashik.ali 41
import org.springframework.stereotype.Controller;
42
import org.springframework.ui.Model;
27067 amit.gupta 43
import org.springframework.web.bind.annotation.PostMapping;
24089 tejbeer 44
import org.springframework.web.bind.annotation.RequestBody;
22551 ashik.ali 45
import org.springframework.web.bind.annotation.RequestMapping;
46
import org.springframework.web.bind.annotation.RequestMethod;
47
import org.springframework.web.bind.annotation.RequestParam;
27067 amit.gupta 48
import org.springframework.web.bind.annotation.RequestPart;
49
import org.springframework.web.multipart.MultipartFile;
22551 ashik.ali 50
 
51
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
23936 tejbeer 52
import com.spice.profitmandi.common.model.CustomRetailer;
22551 ashik.ali 53
import com.spice.profitmandi.common.model.ProfitMandiConstants;
24089 tejbeer 54
import com.spice.profitmandi.common.model.UnsettledPaymentModel;
27067 amit.gupta 55
import com.spice.profitmandi.common.util.ExcelUtils;
28597 amit.gupta 56
import com.spice.profitmandi.common.util.FileUtil;
22551 ashik.ali 57
import com.spice.profitmandi.common.util.StringUtils;
27067 amit.gupta 58
import com.spice.profitmandi.common.util.WalletHistoryModel;
29811 tejbeer 59
import com.spice.profitmandi.dao.entity.dtr.CreditAccount;
23936 tejbeer 60
import com.spice.profitmandi.dao.entity.transaction.AddWalletRequest;
24876 tejbeer 61
import com.spice.profitmandi.dao.entity.transaction.ManualPaymentType;
24089 tejbeer 62
import com.spice.profitmandi.dao.entity.transaction.UnsettledPayment;
22551 ashik.ali 63
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
64
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
23936 tejbeer 65
import com.spice.profitmandi.dao.enumuration.transaction.AddWalletRequestStatus;
24876 tejbeer 66
import com.spice.profitmandi.dao.enumuration.transaction.TransactionType;
23936 tejbeer 67
import com.spice.profitmandi.dao.repository.catalog.AddWalletRequestRepository;
24876 tejbeer 68
import com.spice.profitmandi.dao.repository.catalog.ManualPaymentRequestRepository;
24089 tejbeer 69
import com.spice.profitmandi.dao.repository.catalog.UnsettledPaymentsRepository;
29811 tejbeer 70
import com.spice.profitmandi.dao.repository.dtr.CreditAccountRepository;
24876 tejbeer 71
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
72
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
23985 tejbeer 73
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
24942 tejbeer 74
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
28515 amit.gupta 75
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
76
import com.spice.profitmandi.dao.repository.transaction.StatementDetailModel;
24876 tejbeer 77
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
22551 ashik.ali 78
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
24523 amit.gupta 79
import com.spice.profitmandi.service.authentication.RoleManager;
29070 amit.gupta 80
import com.spice.profitmandi.service.transaction.TransactionService;
23936 tejbeer 81
import com.spice.profitmandi.service.user.RetailerService;
22551 ashik.ali 82
import com.spice.profitmandi.service.wallet.WalletService;
83
import com.spice.profitmandi.web.model.LoginDetails;
84
import com.spice.profitmandi.web.util.CookiesProcessor;
23936 tejbeer 85
import com.spice.profitmandi.web.util.MVCResponseSender;
22551 ashik.ali 86
 
23936 tejbeer 87
import in.shop2020.model.v1.order.WalletReferenceType;
88
 
22551 ashik.ali 89
@Controller
25251 amit.gupta 90
@Transactional(rollbackOn = Throwable.class)
22551 ashik.ali 91
public class WalletController {
92
 
28515 amit.gupta 93
	private static final int IDX_PERIOD = 1;
94
	private static final int OPENING_BALANCE = 2;
95
	private static final int ACTIVATION_SCHEME = 4;
96
	private static final int ADVANCE_AMOUNT = 5;
97
	private static final int AUTOMATED_ADVANCE = 6;
98
	private static final int BRAND_PAYOUT = 7;
99
	private static final int INVESTMENT_PAYOUT = 8;
100
	private static final int OTHERS = 9;
101
	private static final int PREBOOKING_ORDER = 10;
102
	private static final int PRICE_DROP = 11;
103
	private static final int PURCHASE = 12;
104
	private static final int PURCHASE_BILLED = 13;
105
	private static final int PURCHASE_PENDING_BILLING = 14;
106
	private static final int PURCHASE_CANCELLED = 15;
107
	private static final int RECHARGE = 16;
108
	private static final int REFUND = 17;
109
	private static final int SCHEME_IN = 18;
110
	private static final int SCHEME_OUT = 19;
111
	private static final Map<WalletReferenceType, Integer> walletReferenceMap = new HashMap<>();
112
	static {
113
		walletReferenceMap.put(WalletReferenceType.ACTIVATION_SCHEME, ACTIVATION_SCHEME);
114
		walletReferenceMap.put(WalletReferenceType.ADVANCE_AMOUNT, ADVANCE_AMOUNT);
115
		walletReferenceMap.put(WalletReferenceType.AUTOMATED_ADVANCE, AUTOMATED_ADVANCE);
116
		walletReferenceMap.put(WalletReferenceType.BRAND_PAYOUT, BRAND_PAYOUT);
117
		walletReferenceMap.put(WalletReferenceType.INVESTMENT_PAYOUT, INVESTMENT_PAYOUT);
118
		walletReferenceMap.put(WalletReferenceType.OTHERS, OTHERS);
119
		walletReferenceMap.put(WalletReferenceType.PREBOOKING_ORDER, PREBOOKING_ORDER);
120
		walletReferenceMap.put(WalletReferenceType.PRICE_DROP, PRICE_DROP);
121
		walletReferenceMap.put(WalletReferenceType.PURCHASE, PURCHASE);
122
		walletReferenceMap.put(WalletReferenceType.RECHARGE, RECHARGE);
123
		walletReferenceMap.put(WalletReferenceType.REFUND, REFUND);
124
		walletReferenceMap.put(WalletReferenceType.SCHEME_IN, SCHEME_IN);
125
		walletReferenceMap.put(WalletReferenceType.SCHEME_OUT, SCHEME_OUT);
126
 
127
	}
128
	private static final int GRAND_TOTAL = 20;
129
 
130
	private static final int CLOSING_BALANCE = 22;
131
	private static final int PENDING_GRN = 23;
132
	private static final int ACTIVATED_IMEIS = 24;
133
 
22551 ashik.ali 134
	@Autowired
22927 ashik.ali 135
	private CookiesProcessor cookiesProcessor;
23993 tejbeer 136
 
22551 ashik.ali 137
	@Autowired
22927 ashik.ali 138
	private WalletService walletService;
23993 tejbeer 139
 
22551 ashik.ali 140
	@Autowired
22927 ashik.ali 141
	private UserWalletRepository userWalletRepository;
23993 tejbeer 142
 
23936 tejbeer 143
	@Autowired
24876 tejbeer 144
	private UserWalletHistoryRepository userWalletHistoryRepository;
145
 
146
	@Autowired
23936 tejbeer 147
	private MVCResponseSender mvcResponseSender;
23993 tejbeer 148
 
23936 tejbeer 149
	@Autowired
23985 tejbeer 150
	private UserAccountRepository userAccountRepository;
151
 
152
	@Autowired
28515 amit.gupta 153
	private OrderRepository orderRepository;
154
 
155
	@Autowired
23985 tejbeer 156
	JavaMailSender mailSender;
23993 tejbeer 157
 
23985 tejbeer 158
	@Autowired
24089 tejbeer 159
	private UnsettledPaymentsRepository unsettledPaymentsRepository;
160
 
161
	@Autowired
23936 tejbeer 162
	private RetailerService retailerService;
24876 tejbeer 163
 
24523 amit.gupta 164
	@Autowired
165
	private RoleManager roleManager;
23936 tejbeer 166
 
167
	@Autowired
24876 tejbeer 168
	private FofoStoreRepository fofoStoreRepository;
169
 
170
	@Autowired
171
	private ManualPaymentRequestRepository manualPaymentRequestRepository;
172
 
173
	@Autowired
23936 tejbeer 174
	AddWalletRequestRepository addWalletRequestRepository;
24876 tejbeer 175
 
176
	@Autowired
29811 tejbeer 177
	private CreditAccountRepository creditAccountRepository;
23568 govind 178
	private static final Logger LOGGER = LogManager.getLogger(WalletController.class);
28515 amit.gupta 179
 
27067 amit.gupta 180
	@PostMapping(value = "/wallet/upload")
27345 amit.gupta 181
	public String uploadWalletBulk(HttpServletRequest request, @RequestPart("file") MultipartFile file, Model model)
27067 amit.gupta 182
			throws Exception {
183
		List<WalletHistoryModel> walletHistoryModelList = ExcelUtils.parseWalletBulkCredit(file.getInputStream());
28515 amit.gupta 184
		for (WalletHistoryModel walletHistoryModel : walletHistoryModelList) {
185
			if (walletHistoryModel.getReference() == 0) {
186
				ManualPaymentType paymentType = manualPaymentRequestRepository
187
						.selectByReferenceType(walletHistoryModel.getWalletReferenceType());
27344 amit.gupta 188
				if (paymentType == null) {
189
					paymentType = new ManualPaymentType();
190
					paymentType.setReferenceType(walletHistoryModel.getWalletReferenceType());
28781 amit.gupta 191
					manualPaymentRequestRepository.persist(paymentType);
27344 amit.gupta 192
				}
193
				paymentType.setCounter(paymentType.getCounter() + 1);
194
				int reference = paymentType.getCounter();
28515 amit.gupta 195
				walletService.addAmountToWallet(walletHistoryModel.getFofoId(), reference,
196
						walletHistoryModel.getWalletReferenceType(), walletHistoryModel.getDescription(),
197
						(float) walletHistoryModel.getAmount(), walletHistoryModel.getBusinessDate());
198
			} else {
199
				walletService.addAmountToWallet(walletHistoryModel.getFofoId(), walletHistoryModel.getReference(),
200
						walletHistoryModel.getWalletReferenceType(), walletHistoryModel.getDescription(),
201
						(float) walletHistoryModel.getAmount(), walletHistoryModel.getBusinessDate());
27067 amit.gupta 202
			}
203
		}
23993 tejbeer 204
 
27067 amit.gupta 205
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
206
		return "response";
207
	}
208
 
22551 ashik.ali 209
	@RequestMapping(value = "/walletDetails", method = RequestMethod.GET)
23993 tejbeer 210
	public String dashboard(HttpServletRequest request,
211
			@RequestParam(name = ProfitMandiConstants.START_TIME, required = false) String startTimeString,
212
			@RequestParam(name = ProfitMandiConstants.END_TIME, required = false) String endTimeString,
213
			@RequestParam(name = "offset", defaultValue = "0") int offset,
29888 amit.gupta 214
			@RequestParam(name = "limit", defaultValue = "100") int limit, Model model)
23993 tejbeer 215
			throws ProfitMandiBusinessException {
24876 tejbeer 216
		/*
217
		 * boolean underMaintainance = true; if(underMaintainance) { throw new
218
		 * ProfitMandiBusinessException("Wallet", "Wallet",
219
		 * "Wallet is under Maintenance"); }
220
		 */
22927 ashik.ali 221
		LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
24523 amit.gupta 222
		boolean isAdmin = roleManager.isAdmin(fofoDetails.getRoleIds());
25250 amit.gupta 223
		UserWallet userWallet = walletService.getUserWallet(fofoDetails.getFofoId());
23993 tejbeer 224
 
22551 ashik.ali 225
		LocalDateTime startDateTime = StringUtils.toDateTime(startTimeString);
226
		LocalDateTime endDateTime = StringUtils.toDateTime(endTimeString);
23993 tejbeer 227
 
22551 ashik.ali 228
		List<UserWalletHistory> userWalletHistories = new ArrayList<>();
23993 tejbeer 229
		try {
230
			userWalletHistories = walletService.getPaginatedUserWalletHistoryByRetailerId(fofoDetails.getFofoId(),
231
					startDateTime, endDateTime, offset, limit);
232
		} catch (ProfitMandiBusinessException profitMandiBusinessException) {
22551 ashik.ali 233
			LOGGER.error("UserWallet History not found : ", profitMandiBusinessException);
234
		}
23993 tejbeer 235
 
22551 ashik.ali 236
		long countItems = 0;
23993 tejbeer 237
		try {
22551 ashik.ali 238
			countItems = walletService.getSizeByRetailerId(fofoDetails.getFofoId(), startDateTime, endDateTime);
23993 tejbeer 239
		} catch (ProfitMandiBusinessException profitMandiBusinessException) {
240
			LOGGER.error("UserWallet not found : ", profitMandiBusinessException);
22551 ashik.ali 241
		}
242
		model.addAttribute("userWallet", userWallet);
243
		model.addAttribute("walletHistories", userWalletHistories);
244
		model.addAttribute("start", offset + 1);
23993 tejbeer 245
		model.addAttribute("size", countItems);
24523 amit.gupta 246
		model.addAttribute("isAdmin", isAdmin);
22551 ashik.ali 247
		model.addAttribute(ProfitMandiConstants.START_TIME, startTimeString);
248
		model.addAttribute(ProfitMandiConstants.END_TIME, endTimeString);
23993 tejbeer 249
		if (userWalletHistories.size() < limit) {
22551 ashik.ali 250
			model.addAttribute("end", offset + userWalletHistories.size());
23993 tejbeer 251
		} else {
22551 ashik.ali 252
			model.addAttribute("end", offset + limit);
253
		}
254
		return "wallet-details";
255
	}
23993 tejbeer 256
 
22551 ashik.ali 257
	@RequestMapping(value = "/getPaginatedWalletHistory")
23993 tejbeer 258
	public String getSaleHistoryPaginated(HttpServletRequest request,
259
			@RequestParam(name = ProfitMandiConstants.START_TIME, required = false) String startTimeString,
260
			@RequestParam(name = ProfitMandiConstants.END_TIME, required = false) String endTimeString,
261
			@RequestParam(name = "offset", defaultValue = "0") int offset,
262
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
263
			throws ProfitMandiBusinessException {
22927 ashik.ali 264
		LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23993 tejbeer 265
 
22551 ashik.ali 266
		LocalDateTime startDateTime = StringUtils.toDateTime(startTimeString);
267
		LocalDateTime endDateTime = StringUtils.toDateTime(endTimeString);
268
 
269
		List<UserWalletHistory> userWalletHistories = new ArrayList<>();
23993 tejbeer 270
		try {
271
			userWalletHistories = walletService.getPaginatedUserWalletHistoryByRetailerId(loginDetails.getFofoId(),
272
					startDateTime, endDateTime, offset, limit);
273
		} catch (ProfitMandiBusinessException profitMandiBusinessException) {
22551 ashik.ali 274
			LOGGER.error("UserWallet History not found : ", profitMandiBusinessException);
275
		}
23993 tejbeer 276
 
22551 ashik.ali 277
		model.addAttribute("walletHistories", userWalletHistories);
278
		return "wallet-history-paginated";
279
	}
23993 tejbeer 280
 
23936 tejbeer 281
	@RequestMapping(value = "/getAddWalletRequest", method = RequestMethod.GET)
282
	public String getAddwalletRequest(HttpServletRequest request,
283
			@RequestParam(name = "offset", defaultValue = "0") int offset,
23993 tejbeer 284
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws Exception {
23936 tejbeer 285
		List<AddWalletRequest> walletRequest = null;
286
		long size = 0;
23993 tejbeer 287
		walletRequest = addWalletRequestRepository.selectAllByStatus(offset, limit, AddWalletRequestStatus.pending);
288
		LOGGER.info("walletRequest" + walletRequest);
23936 tejbeer 289
		size = addWalletRequestRepository.selectCountByStatus(AddWalletRequestStatus.pending);
23993 tejbeer 290
		if (!walletRequest.isEmpty()) {
291
			List<Integer> fofoIds = this.getFofoIdsFromWalletRequest(walletRequest);
292
			Map<Integer, CustomRetailer> fofoIdsAndRetailerName = retailerService.getFofoRetailers(fofoIds);
23936 tejbeer 293
 
23993 tejbeer 294
			model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
295
			model.addAttribute("walletRequest", walletRequest);
296
			model.addAttribute("rStatus", "pending");
297
			model.addAttribute("start", offset + 1);
298
			model.addAttribute("size", size);
299
			model.addAttribute("url", "/getPaginatedWalletRequest");
300
 
301
			if (walletRequest.size() < limit) {
302
				model.addAttribute("end", offset + walletRequest.size());
303
			} else {
304
				model.addAttribute("end", offset + limit);
305
			}
306
 
23936 tejbeer 307
		} else {
23993 tejbeer 308
 
309
			model.addAttribute("walletRequest", walletRequest);
310
			model.addAttribute("size", size);
311
 
23936 tejbeer 312
		}
313
		return "add-wallet-request";
314
	}
315
 
316
	@RequestMapping(value = "/getPaginatedWalletRequest", method = RequestMethod.GET)
317
	public String getPaginatedWalletRequest(HttpServletRequest request,
318
			@RequestParam(name = "offset", defaultValue = "0") int offset,
23993 tejbeer 319
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws Exception {
320
		LOGGER.info("requested offset=[{}], limit = [{}]", offset, limit);
23936 tejbeer 321
		List<AddWalletRequest> walletRequest = null;
23993 tejbeer 322
		walletRequest = addWalletRequestRepository.selectAllByStatus(offset, limit, AddWalletRequestStatus.pending);
23936 tejbeer 323
		LOGGER.info("walletRequest" + walletRequest);
23993 tejbeer 324
		if (!walletRequest.isEmpty()) {
325
			List<Integer> fofoIds = this.getFofoIdsFromWalletRequest(walletRequest);
326
			Map<Integer, CustomRetailer> fofoIdsAndRetailerName = retailerService.getFofoRetailers(fofoIds);
23936 tejbeer 327
 
23993 tejbeer 328
			model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
329
			model.addAttribute("walletRequest", walletRequest);
330
			model.addAttribute("rStatus", "pending");
331
			model.addAttribute("url", "/getPaginatedWalletRequest");
332
 
333
		} else {
334
			model.addAttribute("walletRequest", walletRequest);
335
 
336
		}
337
 
23936 tejbeer 338
		return "add-wallet-request-paginated";
339
	}
23993 tejbeer 340
 
23936 tejbeer 341
	@RequestMapping(value = "/getAddWalletApproved", method = RequestMethod.GET)
342
	public String getAddwalletRequestApproved(HttpServletRequest request,
343
			@RequestParam(name = "offset", defaultValue = "0") int offset,
344
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
345
			throws ProfitMandiBusinessException {
346
		List<AddWalletRequest> walletRequest = null;
23993 tejbeer 347
 
23936 tejbeer 348
		long size = 0;
23993 tejbeer 349
		walletRequest = addWalletRequestRepository.selectAllByStatus(offset, limit, AddWalletRequestStatus.approved);
23936 tejbeer 350
		size = addWalletRequestRepository.selectCountByStatus(AddWalletRequestStatus.approved);
351
		LOGGER.info("walletRequest" + walletRequest);
23993 tejbeer 352
		if (!walletRequest.isEmpty()) {
353
			List<Integer> fofoIds = this.getFofoIdsFromWalletRequest(walletRequest);
354
			Map<Integer, CustomRetailer> fofoIdsAndRetailerName = retailerService.getFofoRetailers(fofoIds);
23936 tejbeer 355
 
23993 tejbeer 356
			model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
357
			model.addAttribute("walletRequest", walletRequest);
358
			model.addAttribute("start", offset + 1);
359
			model.addAttribute("size", size);
360
			model.addAttribute("url", "/getPaginatedWalletApproved");
361
 
362
			if (walletRequest.size() < limit) {
363
				model.addAttribute("end", offset + walletRequest.size());
364
			} else {
365
				model.addAttribute("end", offset + limit);
366
			}
23936 tejbeer 367
		} else {
23993 tejbeer 368
 
369
			model.addAttribute("walletRequest", walletRequest);
370
			model.addAttribute("size", size);
371
 
23936 tejbeer 372
		}
373
		return "add-wallet-request";
374
	}
375
 
376
	@RequestMapping(value = "/getPaginatedWalletApproved", method = RequestMethod.GET)
377
	public String getPaginatedWalletApproved(HttpServletRequest request,
378
			@RequestParam(name = "offset", defaultValue = "0") int offset,
379
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
380
			throws ProfitMandiBusinessException {
23993 tejbeer 381
		LOGGER.info("requested offset=[{}], limit = [{}]", offset, limit);
23936 tejbeer 382
		List<AddWalletRequest> walletRequest = null;
383
		walletRequest = addWalletRequestRepository.selectAllByStatus(offset, limit, AddWalletRequestStatus.approved);
384
		LOGGER.info("walletRequest" + walletRequest);
23993 tejbeer 385
		if (!walletRequest.isEmpty()) {
386
			List<Integer> fofoIds = this.getFofoIdsFromWalletRequest(walletRequest);
387
			Map<Integer, CustomRetailer> fofoIdsAndRetailerName = retailerService.getFofoRetailers(fofoIds);
23936 tejbeer 388
 
23993 tejbeer 389
			model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
390
			model.addAttribute("walletRequest", walletRequest);
391
			model.addAttribute("url", "/getPaginatedWalletApproved");
392
		} else {
393
			model.addAttribute("walletRequest", walletRequest);
394
 
395
		}
23936 tejbeer 396
		return "add-wallet-request-paginated";
397
	}
23993 tejbeer 398
 
23985 tejbeer 399
	@RequestMapping(value = "/getAddWalletRequestRejected", method = RequestMethod.GET)
400
	public String getAddwalletRequestRejected(HttpServletRequest request,
401
			@RequestParam(name = "offset", defaultValue = "0") int offset,
402
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
403
			throws ProfitMandiBusinessException {
404
		List<AddWalletRequest> walletRequest = null;
23993 tejbeer 405
 
23985 tejbeer 406
		long size = 0;
23993 tejbeer 407
		walletRequest = addWalletRequestRepository.selectAllByStatus(offset, limit, AddWalletRequestStatus.rejected);
23985 tejbeer 408
		size = addWalletRequestRepository.selectCountByStatus(AddWalletRequestStatus.rejected);
409
		LOGGER.info("walletRequest" + walletRequest);
23993 tejbeer 410
		if (!walletRequest.isEmpty()) {
411
			List<Integer> fofoIds = this.getFofoIdsFromWalletRequest(walletRequest);
412
			Map<Integer, CustomRetailer> fofoIdsAndRetailerName = retailerService.getFofoRetailers(fofoIds);
23985 tejbeer 413
 
23993 tejbeer 414
			model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
415
			model.addAttribute("walletRequest", walletRequest);
416
			model.addAttribute("start", offset + 1);
417
			model.addAttribute("size", size);
418
			model.addAttribute("url", "/getPaginatedWalletRequestRejected");
419
 
420
			if (walletRequest.size() < limit) {
421
				model.addAttribute("end", offset + walletRequest.size());
422
			} else {
423
				model.addAttribute("end", offset + limit);
424
			}
23985 tejbeer 425
		} else {
23993 tejbeer 426
			model.addAttribute("walletRequest", walletRequest);
427
			model.addAttribute("size", size);
23985 tejbeer 428
		}
429
 
430
		return "add-wallet-request";
431
	}
23993 tejbeer 432
 
23985 tejbeer 433
	@RequestMapping(value = "/getPaginatedWalletRequestRejected", method = RequestMethod.GET)
434
	public String getPaginatedWalletRequestRejected(HttpServletRequest request,
435
			@RequestParam(name = "offset", defaultValue = "0") int offset,
436
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
437
			throws ProfitMandiBusinessException {
23993 tejbeer 438
		LOGGER.info("requested offset=[{}], limit = [{}]", offset, limit);
23985 tejbeer 439
		List<AddWalletRequest> walletRequest = null;
440
		walletRequest = addWalletRequestRepository.selectAllByStatus(offset, limit, AddWalletRequestStatus.rejected);
441
		LOGGER.info("walletRequest" + walletRequest);
23993 tejbeer 442
		if (!walletRequest.isEmpty()) {
443
			List<Integer> fofoIds = this.getFofoIdsFromWalletRequest(walletRequest);
444
			Map<Integer, CustomRetailer> fofoIdsAndRetailerName = retailerService.getFofoRetailers(fofoIds);
23985 tejbeer 445
 
23993 tejbeer 446
			model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
447
			model.addAttribute("walletRequest", walletRequest);
448
			model.addAttribute("url", "/getPaginatedWalletRequestRejected");
449
		} else {
450
			model.addAttribute("walletRequest", walletRequest);
451
 
452
		}
453
 
23985 tejbeer 454
		return "add-wallet-request-paginated";
455
	}
23993 tejbeer 456
 
23936 tejbeer 457
	@RequestMapping(value = "/addAmountToWallet", method = RequestMethod.PUT)
23993 tejbeer 458
	public String addAmountToWallet(HttpServletRequest request, @RequestParam(name = "id", defaultValue = "0") int id,
24089 tejbeer 459
			@RequestParam(name = "walletRequestid", defaultValue = "0") int walletRequestid, Model model)
460
			throws Exception {
23993 tejbeer 461
 
24089 tejbeer 462
		AddWalletRequest addWalletRequest = addWalletRequestRepository.selectById(walletRequestid);
23993 tejbeer 463
		if (addWalletRequest.getStatus().equals(AddWalletRequestStatus.pending)) {
24089 tejbeer 464
			walletService.addAmountToWallet(addWalletRequest.getRetailerId(), walletRequestid,
28515 amit.gupta 465
					WalletReferenceType.ADVANCE_AMOUNT, "ntfs/rgfs", addWalletRequest.getAmount(),
466
					addWalletRequest.getCreateTimestamp());
23993 tejbeer 467
			addWalletRequest.setStatus(AddWalletRequestStatus.approved);
468
			addWalletRequest.setUpdateTimestamp(LocalDateTime.now());
469
			addWalletRequestRepository.persist(addWalletRequest);
24089 tejbeer 470
			unsettledPaymentsRepository.deleteById(id);
23993 tejbeer 471
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
472
			CustomRetailer customRetailer = retailerService.getFofoRetailer(addWalletRequest.getRetailerId());
473
			String subject = "Request Approved for " + customRetailer.getBusinessName() + " of Rs."
474
					+ addWalletRequest.getAmount();
475
			String messageText = MessageFormat.format(
476
					"User Id - {0}\n Name -{1}\n Email -{2}\n mobile -{3}\n Reference - {4}\n Amount - Rs.{5}",
477
					new Integer(addWalletRequest.getRetailerId()), customRetailer.getBusinessName(),
478
					customRetailer.getEmail(), customRetailer.getMobileNumber(),
479
					addWalletRequest.getTransaction_reference(), new Float(addWalletRequest.getAmount()));
480
 
481
			this.sendMailWithAttachments(subject, messageText);
482
			return "response";
483
		} else {
484
			model.addAttribute("response", mvcResponseSender.createResponseString(false));
485
			return "response";
486
		}
23936 tejbeer 487
	}
23993 tejbeer 488
 
23985 tejbeer 489
	@RequestMapping(value = "/addAmountToWalletRequestRejected", method = RequestMethod.PUT)
23993 tejbeer 490
	public String addAmountToWalletRequestRejected(HttpServletRequest request,
491
			@RequestParam(name = "id", defaultValue = "0") int id, Model model) throws Exception {
492
 
493
		AddWalletRequest addWalletRequest = addWalletRequestRepository.selectById(id);
494
		if (addWalletRequest.getStatus().equals(AddWalletRequestStatus.pending)) {
495
			addWalletRequest.setStatus(AddWalletRequestStatus.rejected);
496
			addWalletRequest.setUpdateTimestamp(LocalDateTime.now());
497
			addWalletRequestRepository.persist(addWalletRequest);
498
			model.addAttribute("response", mvcResponseSender.createResponseString(true));
499
			CustomRetailer customRetailer = retailerService.getFofoRetailer(addWalletRequest.getRetailerId());
500
			String subject = "Request Rejected for " + customRetailer.getBusinessName() + " of Rs."
501
					+ addWalletRequest.getAmount();
502
			String messageText = MessageFormat.format(
503
					"User Id - {0}\n Name -{1}\n Email -{2}\n mobile -{3}\n Reference - {4}\n Amount - Rs.{5}",
504
					new Integer(addWalletRequest.getRetailerId()), customRetailer.getBusinessName(),
505
					customRetailer.getEmail(), customRetailer.getMobileNumber(),
506
					addWalletRequest.getTransaction_reference(), new Float(addWalletRequest.getAmount()));
507
 
508
			this.sendMailWithAttachments(subject, messageText);
509
			return "response";
510
		} else {
511
			model.addAttribute("response", mvcResponseSender.createResponseString(false));
512
			return "response";
513
		}
23985 tejbeer 514
	}
23993 tejbeer 515
 
23985 tejbeer 516
	private void sendMailWithAttachments(String subject, String messageText) throws Exception {
517
		MimeMessage message = mailSender.createMimeMessage();
518
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
24089 tejbeer 519
		String[] email = { "neerajgupta2021@gmail.com", "adeel.yazdani@smartdukaan.com",
520
				"kamini.sharma@smartdukaan.com", "care@smartdukaan.com", "mohinder.mutreja@smartdukaan.com" };
23985 tejbeer 521
		helper.setSubject(subject);
522
		helper.setText(messageText);
523
		helper.setTo(email);
26041 amit.gupta 524
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
23985 tejbeer 525
		helper.setFrom(senderAddress);
526
		mailSender.send(message);
527
 
528
	}
23993 tejbeer 529
 
530
	private List<Integer> getFofoIdsFromWalletRequest(List<AddWalletRequest> walletRequest) {
23936 tejbeer 531
		List<Integer> fofoIds = new ArrayList<>();
23993 tejbeer 532
		for (AddWalletRequest walletdetail : walletRequest) {
23936 tejbeer 533
			fofoIds.add(walletdetail.getRetailerId());
534
		}
535
		return fofoIds;
23993 tejbeer 536
	}
23936 tejbeer 537
 
24089 tejbeer 538
	@RequestMapping(value = "/getcreateUnsettledPayments", method = RequestMethod.GET)
539
	public String getcreateUnsettledPayment(HttpServletRequest request,
540
			@RequestParam(name = "offset", defaultValue = "0") int offset,
541
			@RequestParam(name = "limit", defaultValue = "15") int limit, Model model) throws Exception {
542
		List<UnsettledPayment> up = null;
543
 
544
		long size = 0;
545
		up = unsettledPaymentsRepository.selectAllById(offset, limit);
546
 
547
		size = unsettledPaymentsRepository.selectAllCount();
548
		if (!up.isEmpty()) {
549
			model.addAttribute("unsettledPayment", up);
550
			model.addAttribute("start", offset + 1);
551
			model.addAttribute("size", size);
552
			model.addAttribute("url", "/getPaginatedUnsettledPayments");
553
 
554
			if (up.size() < limit) {
555
				model.addAttribute("end", offset + up.size());
556
			} else {
557
				model.addAttribute("end", offset + limit);
558
			}
559
		} else {
560
			model.addAttribute("unsettledPayment", up);
561
			model.addAttribute("size", size);
562
		}
563
 
564
		LOGGER.info("unsettledPaymentList" + up);
565
		return "unsettled-payments";
566
	}
567
 
568
	@RequestMapping(value = "/getUnsettledPaymentsByAmount", method = RequestMethod.GET)
569
	public String getUnsettledPaymentByAmount(HttpServletRequest request,
570
			@RequestParam(name = "amount", defaultValue = "0") float amount,
571
			@RequestParam(name = "offset", defaultValue = "0") int offset,
572
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws Exception {
573
		List<UnsettledPayment> up = null;
574
 
575
		long size = 0;
576
		up = unsettledPaymentsRepository.selectAllByAmount(amount, offset, limit);
577
 
578
		size = unsettledPaymentsRepository.selectAllCount();
579
		if (!up.isEmpty()) {
580
			model.addAttribute("unsettledPayment", up);
581
			model.addAttribute("start", offset + 1);
582
			model.addAttribute("size", size);
583
			model.addAttribute("url", "/getPaginatedUnsettledPayments");
584
 
585
			if (up.size() < limit) {
586
				model.addAttribute("end", offset + up.size());
587
			} else {
588
				model.addAttribute("end", offset + limit);
589
			}
590
			return "unsettle-payment-modal";
591
		} else {
592
			model.addAttribute("unsettledPayment", up);
593
			model.addAttribute("size", size);
594
		}
595
 
596
		return "unsettle-payment-modal";
597
	}
598
 
599
	@RequestMapping(value = "/createUnsettledPaymentsEntries", method = RequestMethod.POST)
600
	public String createUnsettledPaymentsEntries(HttpServletRequest request,
601
			@RequestBody UnsettledPaymentModel unsettledPaymentModel, Model model) throws Exception {
602
 
603
		UnsettledPayment up = new UnsettledPayment();
604
		up.setTransaction_reference(unsettledPaymentModel.getTransactionReference());
605
		up.setAmount(unsettledPaymentModel.getAmount());
606
		up.setDescription(unsettledPaymentModel.getDescription());
607
		up.setReference_date(unsettledPaymentModel.getReferenceDate());
608
		LOGGER.info("uppaynments" + up);
609
		unsettledPaymentsRepository.persist(up);
610
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
611
		return "response";
612
	}
613
 
614
	@RequestMapping(value = "/removeUnsettledPaymentsEntries", method = RequestMethod.DELETE)
615
	public String removeUnsettledPaymentsEntries(HttpServletRequest request,
616
			@RequestParam(name = "id", defaultValue = "0") int id, Model model) throws Exception {
617
 
618
		unsettledPaymentsRepository.deleteById(id);
619
 
620
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
621
		return "response";
622
	}
623
 
24509 amit.gupta 624
	@RequestMapping(value = "/wallet/statement", method = RequestMethod.GET)
24523 amit.gupta 625
	public String getWalletStatement(HttpServletRequest request, @RequestParam LocalDateTime startDate,
24876 tejbeer 626
			@RequestParam LocalDateTime endDate, Model model, @RequestParam(defaultValue = "0") int fofoId)
627
			throws Exception {
24523 amit.gupta 628
		boolean isAdmin = roleManager.isAdmin(cookiesProcessor.getCookiesObject(request).getRoleIds());
24876 tejbeer 629
		if (fofoId > 0) {
630
			if (!isAdmin) {
24523 amit.gupta 631
				throw new ProfitMandiBusinessException("Unauthorised access", "PartnerId", "Permission Denied");
632
			}
633
		} else {
634
			fofoId = cookiesProcessor.getCookiesObject(request).getFofoId();
635
		}
636
		float openingBalance = walletService.getOpeningTill(fofoId, startDate);
637
		float closingBalance = walletService.getOpeningTill(fofoId, endDate);
24876 tejbeer 638
		List<UserWalletHistory> uwhList = walletService.getPaginatedUserWalletHistoryByRetailerId(fofoId, startDate,
639
				endDate, 0, 0);
24511 amit.gupta 640
		Collections.reverse(uwhList);
24509 amit.gupta 641
		model.addAttribute("opening", openingBalance);
642
		model.addAttribute("closing", closingBalance);
643
		model.addAttribute("history", uwhList);
644
		model.addAttribute("startDate", startDate);
645
		model.addAttribute("endDate", endDate);
646
		return "walletStatement";
647
	}
648
 
29070 amit.gupta 649
	@Autowired
650
	TransactionService transactionService;
29811 tejbeer 651
 
29070 amit.gupta 652
	@RequestMapping(value = "/account/reco", method = RequestMethod.GET)
29811 tejbeer 653
	public ResponseEntity<?> accountReco(HttpServletRequest request, @RequestParam LocalDate closingDate, Model model)
654
			throws Exception {
29070 amit.gupta 655
		boolean isAdmin = roleManager.isAdmin(cookiesProcessor.getCookiesObject(request).getRoleIds());
656
		if (!isAdmin) {
657
			throw new ProfitMandiBusinessException("Unauthorised access", "PartnerId", "Permission Denied");
658
		}
659
		LocalDateTime closingDateTime = LocalDate.now().atStartOfDay().plusDays(1);
660
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
661
		Set<Integer> retailersSet = customRetailerMap.keySet();
662
 
663
		Map<Integer, Float> closingPurchaseMap = orderRepository.selectOpeningAmount(closingDateTime, retailersSet);
664
 
665
		Map<Integer, UserWallet> retailerWalletMap = walletService.getRetailerIdUserWalletMap(retailersSet);
29811 tejbeer 666
		Map<Integer, Integer> walletRetailerMap = retailerWalletMap.entrySet().stream()
667
				.collect(Collectors.toMap(x -> x.getValue().getId(), x -> x.getKey()));
668
 
29070 amit.gupta 669
		Set<Integer> walletSet = walletRetailerMap.keySet();
29811 tejbeer 670
		Map<Integer, Float> closingBalanceMap = userWalletHistoryRepository
671
				.getSumTillDateExcludingPurchase(closingDateTime, walletSet);
29070 amit.gupta 672
		Map<Integer, Float> closingWalletMap = userWalletHistoryRepository.getSumTillDate(closingDateTime, walletSet);
29083 amit.gupta 673
		Map<Integer, Float> peindingIndentMap = transactionService.getPendingIndentValueMap();
29811 tejbeer 674
 
29070 amit.gupta 675
		List<List<?>> rows = new ArrayList<>();
676
		for (Map.Entry<Integer, Float> closingBalance : closingBalanceMap.entrySet()) {
677
			int walletId = closingBalance.getKey();
678
			int retailerId = walletRetailerMap.get(walletId);
29811 tejbeer 679
 
29070 amit.gupta 680
			float accountClosing = 0f;
681
			if (!closingPurchaseMap.containsKey(retailerId)) {
682
				accountClosing = closingBalance.getValue();
683
			} else {
684
				accountClosing = closingBalance.getValue() - closingPurchaseMap.get(retailerId);
685
			}
29811 tejbeer 686
 
29070 amit.gupta 687
			CustomRetailer cr = customRetailerMap.get(retailerId);
688
 
689
			rows.add(Arrays.asList(retailerId, cr.getBusinessName(), cr.getAddress().getCity(),
29811 tejbeer 690
					cr.getAddress().getState(), accountClosing, closingWalletMap.get(walletId),
691
					peindingIndentMap.get(retailerId)));
29070 amit.gupta 692
		}
693
 
29811 tejbeer 694
		org.apache.commons.io.output.ByteArrayOutputStream byteArrayOutputStream = FileUtil.getCSVByteStream(
695
				Arrays.asList("Id", "Partner Name", "City", "State", "Closing Balance", "Closing Wallet", "In Transit"),
696
				rows);
29070 amit.gupta 697
		final HttpHeaders headers = new HttpHeaders();
698
		headers.set("Content-Type", "text/csv");
699
		headers.set("Content-disposition",
700
				"inline; filename=account-statement-closing-." + StringUtils.toHyphenatedString(closingDate) + ".csv");
701
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
702
 
703
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
704
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
705
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
706
	}
707
 
28597 amit.gupta 708
	@RequestMapping(value = "/account/closing-statements", method = RequestMethod.GET)
709
	public ResponseEntity<?> getAccountStatement(HttpServletRequest request, @RequestParam LocalDate closingDate,
710
			Model model) throws Exception {
711
		boolean isAdmin = roleManager.isAdmin(cookiesProcessor.getCookiesObject(request).getRoleIds());
712
		if (!isAdmin) {
713
			throw new ProfitMandiBusinessException("Unauthorised access", "PartnerId", "Permission Denied");
714
		}
715
		LocalDateTime closingDateTime = closingDate.atStartOfDay().plusDays(1);
29811 tejbeer 716
 
28597 amit.gupta 717
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
718
		Set<Integer> retailersSet = customRetailerMap.keySet();
719
 
720
		Map<Integer, Float> closingPurchaseMap = orderRepository.selectOpeningAmount(closingDateTime, retailersSet);
721
 
722
		Map<Integer, UserWallet> retailerWalletMap = walletService.getRetailerIdUserWalletMap(retailersSet);
29811 tejbeer 723
		Map<Integer, Integer> walletRetailerMap = retailerWalletMap.entrySet().stream()
724
				.collect(Collectors.toMap(x -> x.getValue().getId(), x -> x.getKey()));
725
 
28597 amit.gupta 726
		Set<Integer> walletSet = walletRetailerMap.keySet();
29811 tejbeer 727
		Map<Integer, Float> closingBalanceMap = userWalletHistoryRepository
728
				.getSumTillDateExcludingPurchase(closingDateTime, walletSet);
729
 
28597 amit.gupta 730
		List<List<?>> rows = new ArrayList<>();
731
		for (Map.Entry<Integer, Float> closingWalletBalance : closingBalanceMap.entrySet()) {
732
			int walletId = closingWalletBalance.getKey();
733
			int retailerId = walletRetailerMap.get(walletId);
734
			if (!closingPurchaseMap.containsKey(retailerId)) {
735
				closingPurchaseMap.put(retailerId, closingWalletBalance.getValue());
736
			} else {
737
				closingPurchaseMap.put(retailerId,
738
						closingWalletBalance.getValue() - closingPurchaseMap.get(retailerId));
739
			}
740
			float closingValue = closingPurchaseMap.get(retailerId);
741
			CustomRetailer cr = customRetailerMap.get(retailerId);
742
 
743
			rows.add(Arrays.asList(retailerId, cr.getBusinessName(), cr.getAddress().getCity(),
744
					cr.getAddress().getState(), closingValue));
745
		}
746
 
747
		org.apache.commons.io.output.ByteArrayOutputStream byteArrayOutputStream = FileUtil
748
				.getCSVByteStream(Arrays.asList("Id", "Partner Name", "City", "State", "Closing Balance"), rows);
749
		final HttpHeaders headers = new HttpHeaders();
750
		headers.set("Content-Type", "text/csv");
751
		headers.set("Content-disposition",
752
				"inline; filename=account-statement-closing-." + StringUtils.toHyphenatedString(closingDate) + ".csv");
753
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
754
 
755
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
756
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
757
 
758
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
759
 
760
	}
761
 
28515 amit.gupta 762
	@RequestMapping(value = "/account/statement", method = RequestMethod.GET)
763
	public ResponseEntity<?> getAccountStatement(HttpServletRequest request, @RequestParam LocalDateTime startDate,
764
			@RequestParam LocalDateTime endDate, Model model, @RequestParam(defaultValue = "0") int fofoId)
765
			throws Exception {
766
		boolean isAdmin = roleManager.isAdmin(cookiesProcessor.getCookiesObject(request).getRoleIds());
767
		if (fofoId > 0) {
768
			if (!isAdmin) {
769
				throw new ProfitMandiBusinessException("Unauthorised access", "PartnerId", "Permission Denied");
770
			}
771
		} else {
772
			fofoId = cookiesProcessor.getCookiesObject(request).getFofoId();
773
		}
774
		float openingBalance = walletService.getOpeningTillExcludingPurchase(fofoId, startDate);
775
		float closingBalance = walletService.getOpeningTillExcludingPurchase(fofoId, endDate);
28538 amit.gupta 776
		UserWallet uw = walletService.getUserWallet(fofoId);
28597 amit.gupta 777
		List<UserWalletHistory> history = userWalletHistoryRepository.selectPaginatedByWalletId(uw.getId(), startDate,
778
				endDate, 0, 0);
28538 amit.gupta 779
		history = history.stream().filter(x -> !x.getReferenceType().equals(WalletReferenceType.PURCHASE))
28515 amit.gupta 780
				.collect(Collectors.toList());
781
		InputStream is = getClass().getClassLoader().getResourceAsStream("account-statement.xlsx");
782
		String partnerName = retailerService.getAllFofoRetailerIdNameMap().get(fofoId);
783
		List<StatementDetailModel> details = orderRepository.selectDetailsBetween(fofoId, startDate, endDate);
784
		float openingAmount = orderRepository.selectOpeningAmount(fofoId, startDate);
785
		float closingAmount = orderRepository.selectOpeningAmount(fofoId, endDate);
786
		LOGGER.info("Opening - {}, Closing - {}", openingAmount, closingAmount);
787
		ByteArrayOutputStream byteArrayOutputStream = this.populateData(is, openingBalance - openingAmount,
28538 amit.gupta 788
				closingBalance - closingAmount, partnerName, history, startDate, endDate, details);
28515 amit.gupta 789
 
790
		final HttpHeaders headers = new HttpHeaders();
791
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
792
		headers.set("Content-disposition",
793
				"inline; filename=account-statement." + StringUtils.toHyphenatedString(startDate.toLocalDate()) + "-"
794
						+ StringUtils.toHyphenatedString(endDate.toLocalDate()) + ".xlsx");
795
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
796
 
797
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
798
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
799
 
800
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
801
 
802
	}
803
 
804
	private ByteArrayOutputStream populateData(InputStream is, float openingBalance, float closingBalance,
28597 amit.gupta 805
			String partnerName, List<UserWalletHistory> history, LocalDateTime startDate, LocalDateTime endDate,
806
			List<StatementDetailModel> invoiceDetails) throws Exception {
28515 amit.gupta 807
		XSSFWorkbook workbook = new XSSFWorkbook(is);
808
		CreationHelper creationHelper = workbook.getCreationHelper();
809
		CellStyle style2 = workbook.createCellStyle();
28597 amit.gupta 810
		style2.setDataFormat(creationHelper.createDataFormat().getFormat("mm/dd/yyyy hh:mm:ss"));
811
 
28515 amit.gupta 812
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
813
		Sheet sheet = workbook.getSheetAt(0);
814
		sheet.getRow(0).getCell(0).setCellValue(partnerName);
815
		sheet.getRow(1).getCell(1)
816
				.setCellValue(new Date(startDate.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
817
		sheet.getRow(1).getCell(2)
818
				.setCellValue(new Date(endDate.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
819
		sheet.getRow(2).getCell(2).setCellValue(openingBalance);
820
		long grandTotalDebit = 0l;
821
		long grandTotalCredit = 0l;
822
		int row = 4;
28538 amit.gupta 823
		for (UserWalletHistory walletEntry : history) {
28555 amit.gupta 824
			Cell dateCell = sheet.createRow(row).createCell(0);
28597 amit.gupta 825
			dateCell.setCellValue(
826
					new Date(walletEntry.getTimestamp().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
28540 amit.gupta 827
			dateCell.setCellStyle(style2);
28555 amit.gupta 828
			sheet.getRow(row).createCell(1).setCellValue(walletEntry.getReferenceType().toString());
28597 amit.gupta 829
			if (walletEntry.getAmount() > 0) {
28540 amit.gupta 830
				sheet.getRow(row).createCell(2).setCellValue(0);
831
				sheet.getRow(row).createCell(3).setCellValue(walletEntry.getAmount());
28538 amit.gupta 832
				grandTotalCredit += walletEntry.getAmount();
833
			} else {
28781 amit.gupta 834
				sheet.getRow(row).createCell(2).setCellValue(-walletEntry.getAmount());
28540 amit.gupta 835
				sheet.getRow(row).createCell(3).setCellValue(0);
29005 amit.gupta 836
				grandTotalDebit -= walletEntry.getAmount();
28538 amit.gupta 837
			}
28540 amit.gupta 838
			sheet.getRow(row).createCell(4).setCellValue(walletEntry.getDescription());
839
			sheet.getRow(row).createCell(5).setCellValue(walletEntry.getReference());
28515 amit.gupta 840
			row++;
841
		}
842
		for (StatementDetailModel statementDetailModel : invoiceDetails) {
28564 amit.gupta 843
			Cell dateCell = sheet.createRow(row).createCell(0);
28540 amit.gupta 844
			dateCell.setCellValue(statementDetailModel.getOnDate());
845
			dateCell.setCellStyle(style2);
28564 amit.gupta 846
			sheet.getRow(row).createCell(1).setCellValue("BILLING");
28515 amit.gupta 847
			if (statementDetailModel.getAmount() > 0) {
28540 amit.gupta 848
				sheet.getRow(row).createCell(2).setCellValue(statementDetailModel.getAmount());
849
				sheet.getRow(row).createCell(3).setCellValue(0);
28597 amit.gupta 850
				grandTotalDebit += statementDetailModel.getAmount();
28515 amit.gupta 851
			} else {
28540 amit.gupta 852
				sheet.getRow(row).createCell(2).setCellValue(0);
853
				sheet.getRow(row).createCell(3).setCellValue(-statementDetailModel.getAmount());
28597 amit.gupta 854
				grandTotalCredit += -statementDetailModel.getAmount();
28515 amit.gupta 855
			}
28597 amit.gupta 856
 
28538 amit.gupta 857
			sheet.getRow(row).createCell(4).setCellValue(statementDetailModel.getReferenceType());
858
			sheet.getRow(row).createCell(5).setCellValue(statementDetailModel.getInvoiceNumber());
28515 amit.gupta 859
 
860
			row += 1;
861
		}
862
		sheet.createRow(row).createCell(0).setCellValue("Grand Total");
29006 amit.gupta 863
		sheet.getRow(row).createCell(2).setCellValue(grandTotalDebit);
864
		sheet.getRow(row).createCell(3).setCellValue(grandTotalCredit);
28515 amit.gupta 865
		row += 2;
866
		sheet.createRow(row).createCell(0).setCellValue("Closing Balance");
29006 amit.gupta 867
		sheet.getRow(row).createCell(3).setCellValue(closingBalance);
28515 amit.gupta 868
		row++;
869
		/*
870
		 * sheet.createRow(row).createCell(0).setCellValue("Pending Grns");
871
		 * sheet.getRow(row).createCell(2).setCellValue(closingBalance); row++;
872
		 */
873
		try {
874
			workbook.write(bos);
875
		} finally {
876
			workbook.close();
877
			bos.close();
878
		}
879
 
880
		return bos;
881
	}
882
 
24876 tejbeer 883
	@RequestMapping(value = "/manualPayment", method = RequestMethod.GET)
884
	public String ManualPayment(HttpServletRequest request, Model model) throws Exception {
885
 
886
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().map(x -> x.getId())
887
				.collect(Collectors.toList());
888
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(fofoIds);
889
		String customRetailers = JSONObject.valueToString(customRetailersMap.values());
890
		model.addAttribute("customRetailers", customRetailers);
891
 
892
		model.addAttribute("referenceTypes", WalletReferenceType.referenceType);
893
		model.addAttribute("transactionTypes", TransactionType.values());
894
		return "wallet-edit";
895
 
896
	}
897
 
898
	@RequestMapping(value = "/getWalletHistory", method = RequestMethod.GET)
899
	public String getWalletHistory(HttpServletRequest request,
900
			@RequestParam(name = "reference", defaultValue = "0") int reference,
901
			@RequestParam WalletReferenceType referenceType, Model model) throws Exception {
902
 
903
		LOGGER.info("type" + referenceType);
904
		List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository
905
				.selectAllByreferenceIdandreferenceType(reference, referenceType);
25018 tejbeer 906
 
907
		if (userWalletHistory.isEmpty()) {
908
			throw new ProfitMandiBusinessException("RefrenceId", reference, "Reference Id not found");
909
		}
910
 
911
		UserWallet userWallet = userWalletRepository.selectById(userWalletHistory.get(0).getWalletId());
912
 
913
		LOGGER.info("userWallet" + userWallet);
914
		CustomRetailer customretailer = retailerService.getFofoRetailer(userWallet.getUserId());
915
 
916
		model.addAttribute("userWallet", userWallet);
917
		model.addAttribute("customretailer", customretailer);
918
 
24876 tejbeer 919
		model.addAttribute("wallethistory", userWalletHistory);
920
 
921
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
922
		return "wallet-history";
923
 
924
	}
925
 
24905 amit.gupta 926
	@RequestMapping(value = "/getWalletHistoryByPartner", method = RequestMethod.GET)
25018 tejbeer 927
	public String getWalletHistoryByPartner(HttpServletRequest request, int fofoId,
928
			@RequestParam(name = "referenceType", required = false) WalletReferenceType referenceType,
929
			@RequestParam(name = "offset", required = false, defaultValue = "0") int offset,
930
			@RequestParam(name = "limit", required = false, defaultValue = "30") int limit, Model model)
931
			throws Exception {
932
 
24905 amit.gupta 933
		UserWallet userWallet = userWalletRepository.selectByRetailerId(fofoId);
26485 amit.gupta 934
		List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository.selectPaginatedByWalletIdReferenceType(
935
				userWallet.getId(), referenceType, SortOrder.DESCENDING, offset, limit);
25018 tejbeer 936
 
937
		CustomRetailer customretailer = retailerService.getFofoRetailer(fofoId);
938
 
939
		model.addAttribute("userWallet", userWallet);
940
		model.addAttribute("customretailer", customretailer);
24905 amit.gupta 941
		model.addAttribute("wallethistory", userWalletHistory);
25018 tejbeer 942
 
24905 amit.gupta 943
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
944
		return "wallet-history";
25018 tejbeer 945
 
24905 amit.gupta 946
	}
947
 
24876 tejbeer 948
	@RequestMapping(value = "/getPartnerName", method = RequestMethod.GET)
949
	public String getPartnerName(HttpServletRequest request,
950
			@RequestParam(name = "reference", defaultValue = "0") int reference,
951
			@RequestParam WalletReferenceType referenceType, Model model) throws Exception {
952
 
953
		List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository
954
				.selectAllByreferenceIdandreferenceType(reference, referenceType);
24905 amit.gupta 955
		if (userWalletHistory.isEmpty()) {
24876 tejbeer 956
			throw new ProfitMandiBusinessException("RefrenceId", reference, "Reference Id not found");
957
		}
958
		UserWallet userWallet = userWalletRepository.selectById(userWalletHistory.get(0).getWalletId());
24905 amit.gupta 959
 
24876 tejbeer 960
		CustomRetailer retailer = retailerService.getFofoRetailer(userWallet.getUserId());
24905 amit.gupta 961
 
24876 tejbeer 962
		model.addAttribute("response", mvcResponseSender.createResponseString(retailer));
24905 amit.gupta 963
 
24876 tejbeer 964
		return "response";
965
 
966
	}
967
 
968
	@RequestMapping(value = "/walletUpdate", method = RequestMethod.POST)
969
	public String walletUpdate(HttpServletRequest request,
28515 amit.gupta 970
			@RequestParam(name = "reference", defaultValue = "0") int reference, @RequestParam int referenceTypeValue,
971
			@RequestParam TransactionType transactiontype, @RequestParam int amount, @RequestParam String description,
972
			@RequestParam int retailerId, Model model, @RequestParam LocalDateTime businessTimestamp) throws Exception {
26517 amit.gupta 973
		WalletReferenceType referenceType = WalletReferenceType.findByValue(referenceTypeValue);
28515 amit.gupta 974
		if (reference == 0 && referenceType.getValue() >= WalletReferenceType.INCENTIVES.getValue()) {
25018 tejbeer 975
			LOGGER.error("referenceType: " + referenceType);
24876 tejbeer 976
			ManualPaymentType paymentType = manualPaymentRequestRepository.selectByReferenceType(referenceType);
977
 
978
			if (paymentType == null) {
979
				paymentType = new ManualPaymentType();
27067 amit.gupta 980
				paymentType.setReferenceType(referenceType);
24876 tejbeer 981
			}
26485 amit.gupta 982
			paymentType.setCounter(paymentType.getCounter() + 1);
24876 tejbeer 983
			manualPaymentRequestRepository.persist(paymentType);
26485 amit.gupta 984
			reference = paymentType.getCounter();
28515 amit.gupta 985
 
986
		} else if (reference == 0) {
26485 amit.gupta 987
			throw new ProfitMandiBusinessException("RefrenceId", reference,
988
					"System specific reference type cant be used manually");
989
		}
28515 amit.gupta 990
 
26485 amit.gupta 991
		List<UserWalletHistory> userWalletHistoryList = userWalletHistoryRepository
992
				.selectAllByreferenceIdandreferenceType(reference, referenceType);
993
		UserWallet userWallet = userWalletRepository.selectByRetailerId(retailerId);
994
		int walletId = userWallet.getId();
995
		int walletAmount = walletService.getWalletAmount(retailerId);
24876 tejbeer 996
 
26485 amit.gupta 997
		int returnReference = 0;
998
		UserWalletHistory newUserWalletHistory = new UserWalletHistory();
24876 tejbeer 999
 
26485 amit.gupta 1000
		if (!userWalletHistoryList.isEmpty()) {
28515 amit.gupta 1001
			long validRetailerEntries = userWalletHistoryList.stream().filter(x -> x.getWalletId() == walletId).count();
1002
			if (validRetailerEntries == 0) {
26485 amit.gupta 1003
				throw new ProfitMandiBusinessException("RefrenceId", reference,
1004
						"Reference Id assign to Other  partner");
24876 tejbeer 1005
			}
24942 tejbeer 1006
		}
28515 amit.gupta 1007
 
26485 amit.gupta 1008
		if (TransactionType.DEBIT.equals(transactiontype)) {
1009
			amount = -amount;
1010
		}
28515 amit.gupta 1011
 
26485 amit.gupta 1012
		userWallet.setAmount(walletAmount + amount);
1013
		newUserWalletHistory.setAmount(amount);
1014
		newUserWalletHistory.setBusinessTimestamp(businessTimestamp);
1015
		newUserWalletHistory.setDescription(description);
1016
		newUserWalletHistory.setReference(reference);
1017
		newUserWalletHistory.setWalletId(userWallet.getId());
1018
		newUserWalletHistory.setReferenceType(referenceType);
1019
		newUserWalletHistory.setTimestamp(LocalDateTime.now());
1020
		userWalletHistoryRepository.persist(newUserWalletHistory);
1021
 
26488 amit.gupta 1022
		model.addAttribute("response", mvcResponseSender.createResponseString(reference));
24876 tejbeer 1023
		return "response";
1024
 
1025
	}
25018 tejbeer 1026
 
24951 tejbeer 1027
	@RequestMapping(value = "/addMoney", method = RequestMethod.POST)
25018 tejbeer 1028
	public String addMoney(HttpServletRequest request, @RequestParam float amount,
1029
			@RequestParam String transactionReference, @RequestParam LocalDateTime referenceTime,
1030
			@RequestParam String bankName, @RequestParam int fofoId, Model model) throws Exception {
1031
 
24951 tejbeer 1032
		AddWalletRequest addWalletRequest = new AddWalletRequest();
1033
		addWalletRequest.setRetailerId(fofoId);
1034
		addWalletRequest.setAmount(amount);
1035
		addWalletRequest.setTransaction_reference(transactionReference);
1036
		addWalletRequest.setCreateTimestamp(LocalDateTime.now());
1037
		addWalletRequest.setBank_name(bankName);
1038
		addWalletRequest.setReference_date(referenceTime.toLocalDate());
1039
		addWalletRequest.setStatus(AddWalletRequestStatus.pending);
25018 tejbeer 1040
 
1041
		LOGGER.info("info" + addWalletRequest);
1042
 
24951 tejbeer 1043
		addWalletRequestRepository.persist(addWalletRequest);
1044
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
1045
		return "response";
1046
	}
29811 tejbeer 1047
 
1048
	@RequestMapping(value = "/getCreditDetail", method = RequestMethod.GET)
1049
	public String getCreditDetail(HttpServletRequest request, Model model) throws Exception {
1050
		List<CreditAccount> creditAccounts = creditAccountRepository.selectAll();
1051
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
1052
 
1053
		model.addAttribute("creditAccounts", creditAccounts);
1054
		model.addAttribute("customRetailers", customRetailers);
1055
		return "partner-credit-detail";
1056
	}
1057
 
1058
	@RequestMapping(value = "/activateKred", method = RequestMethod.POST)
29813 tejbeer 1059
	public String activateKred(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
1060
		CreditAccount creditAccount = creditAccountRepository.selectById(id);
29811 tejbeer 1061
 
1062
		creditAccount.setActive(true);
1063
 
1064
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
1065
 
1066
		model.addAttribute("creditAccount", creditAccount);
1067
		model.addAttribute("customRetailers", customRetailers);
1068
		return "partner-credit-detail-row";
1069
	}
1070
 
1071
	@RequestMapping(value = "/deactivateKred", method = RequestMethod.POST)
29813 tejbeer 1072
	public String deactivateKred(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
1073
		CreditAccount creditAccount = creditAccountRepository.selectById(id);
29811 tejbeer 1074
 
1075
		creditAccount.setActive(false);
1076
 
1077
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
1078
 
1079
		model.addAttribute("creditAccount", creditAccount);
1080
		model.addAttribute("customRetailers", customRetailers);
1081
		return "partner-credit-detail-row";
1082
	}
1083
 
22551 ashik.ali 1084
}