Subversion Repositories SmartDukaan

Rev

Rev 28564 | Rev 28781 | 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;
23936 tejbeer 59
import com.spice.profitmandi.dao.entity.transaction.AddWalletRequest;
24876 tejbeer 60
import com.spice.profitmandi.dao.entity.transaction.ManualPaymentType;
24089 tejbeer 61
import com.spice.profitmandi.dao.entity.transaction.UnsettledPayment;
22551 ashik.ali 62
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
63
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
23936 tejbeer 64
import com.spice.profitmandi.dao.enumuration.transaction.AddWalletRequestStatus;
24876 tejbeer 65
import com.spice.profitmandi.dao.enumuration.transaction.TransactionType;
23936 tejbeer 66
import com.spice.profitmandi.dao.repository.catalog.AddWalletRequestRepository;
24876 tejbeer 67
import com.spice.profitmandi.dao.repository.catalog.ManualPaymentRequestRepository;
24089 tejbeer 68
import com.spice.profitmandi.dao.repository.catalog.UnsettledPaymentsRepository;
24876 tejbeer 69
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
70
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
23985 tejbeer 71
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
24942 tejbeer 72
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
28515 amit.gupta 73
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
74
import com.spice.profitmandi.dao.repository.transaction.StatementDetailModel;
24876 tejbeer 75
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
22551 ashik.ali 76
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
24523 amit.gupta 77
import com.spice.profitmandi.service.authentication.RoleManager;
23936 tejbeer 78
import com.spice.profitmandi.service.user.RetailerService;
22551 ashik.ali 79
import com.spice.profitmandi.service.wallet.WalletService;
80
import com.spice.profitmandi.web.model.LoginDetails;
81
import com.spice.profitmandi.web.util.CookiesProcessor;
23936 tejbeer 82
import com.spice.profitmandi.web.util.MVCResponseSender;
22551 ashik.ali 83
 
23936 tejbeer 84
import in.shop2020.model.v1.order.WalletReferenceType;
85
 
22551 ashik.ali 86
@Controller
25251 amit.gupta 87
@Transactional(rollbackOn = Throwable.class)
22551 ashik.ali 88
public class WalletController {
89
 
28515 amit.gupta 90
	private static final int IDX_PERIOD = 1;
91
	private static final int OPENING_BALANCE = 2;
92
	private static final int ACTIVATION_SCHEME = 4;
93
	private static final int ADVANCE_AMOUNT = 5;
94
	private static final int AUTOMATED_ADVANCE = 6;
95
	private static final int BRAND_PAYOUT = 7;
96
	private static final int INVESTMENT_PAYOUT = 8;
97
	private static final int OTHERS = 9;
98
	private static final int PREBOOKING_ORDER = 10;
99
	private static final int PRICE_DROP = 11;
100
	private static final int PURCHASE = 12;
101
	private static final int PURCHASE_BILLED = 13;
102
	private static final int PURCHASE_PENDING_BILLING = 14;
103
	private static final int PURCHASE_CANCELLED = 15;
104
	private static final int RECHARGE = 16;
105
	private static final int REFUND = 17;
106
	private static final int SCHEME_IN = 18;
107
	private static final int SCHEME_OUT = 19;
108
	private static final Map<WalletReferenceType, Integer> walletReferenceMap = new HashMap<>();
109
	static {
110
		walletReferenceMap.put(WalletReferenceType.ACTIVATION_SCHEME, ACTIVATION_SCHEME);
111
		walletReferenceMap.put(WalletReferenceType.ADVANCE_AMOUNT, ADVANCE_AMOUNT);
112
		walletReferenceMap.put(WalletReferenceType.AUTOMATED_ADVANCE, AUTOMATED_ADVANCE);
113
		walletReferenceMap.put(WalletReferenceType.BRAND_PAYOUT, BRAND_PAYOUT);
114
		walletReferenceMap.put(WalletReferenceType.INVESTMENT_PAYOUT, INVESTMENT_PAYOUT);
115
		walletReferenceMap.put(WalletReferenceType.OTHERS, OTHERS);
116
		walletReferenceMap.put(WalletReferenceType.PREBOOKING_ORDER, PREBOOKING_ORDER);
117
		walletReferenceMap.put(WalletReferenceType.PRICE_DROP, PRICE_DROP);
118
		walletReferenceMap.put(WalletReferenceType.PURCHASE, PURCHASE);
119
		walletReferenceMap.put(WalletReferenceType.RECHARGE, RECHARGE);
120
		walletReferenceMap.put(WalletReferenceType.REFUND, REFUND);
121
		walletReferenceMap.put(WalletReferenceType.SCHEME_IN, SCHEME_IN);
122
		walletReferenceMap.put(WalletReferenceType.SCHEME_OUT, SCHEME_OUT);
123
 
124
	}
125
	private static final int GRAND_TOTAL = 20;
126
 
127
	private static final int CLOSING_BALANCE = 22;
128
	private static final int PENDING_GRN = 23;
129
	private static final int ACTIVATED_IMEIS = 24;
130
 
22551 ashik.ali 131
	@Autowired
22927 ashik.ali 132
	private CookiesProcessor cookiesProcessor;
23993 tejbeer 133
 
22551 ashik.ali 134
	@Autowired
22927 ashik.ali 135
	private WalletService walletService;
23993 tejbeer 136
 
22551 ashik.ali 137
	@Autowired
22927 ashik.ali 138
	private UserWalletRepository userWalletRepository;
23993 tejbeer 139
 
23936 tejbeer 140
	@Autowired
24876 tejbeer 141
	private UserWalletHistoryRepository userWalletHistoryRepository;
142
 
143
	@Autowired
23936 tejbeer 144
	private MVCResponseSender mvcResponseSender;
23993 tejbeer 145
 
23936 tejbeer 146
	@Autowired
23985 tejbeer 147
	private UserAccountRepository userAccountRepository;
148
 
149
	@Autowired
28515 amit.gupta 150
	private OrderRepository orderRepository;
151
 
152
	@Autowired
23985 tejbeer 153
	JavaMailSender mailSender;
23993 tejbeer 154
 
23985 tejbeer 155
	@Autowired
24089 tejbeer 156
	private UnsettledPaymentsRepository unsettledPaymentsRepository;
157
 
158
	@Autowired
23936 tejbeer 159
	private RetailerService retailerService;
24876 tejbeer 160
 
24523 amit.gupta 161
	@Autowired
162
	private RoleManager roleManager;
23936 tejbeer 163
 
164
	@Autowired
24876 tejbeer 165
	private FofoStoreRepository fofoStoreRepository;
166
 
167
	@Autowired
168
	private ManualPaymentRequestRepository manualPaymentRequestRepository;
169
 
170
	@Autowired
23936 tejbeer 171
	AddWalletRequestRepository addWalletRequestRepository;
24876 tejbeer 172
 
173
	@Autowired
174
	private RetailerRepository retailerRepository;
25018 tejbeer 175
 
24942 tejbeer 176
	@Autowired
177
	private UserRepository userRepository;
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());
191
				}
192
				paymentType.setCounter(paymentType.getCounter() + 1);
193
				manualPaymentRequestRepository.persist(paymentType);
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,
214
			@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
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
 
28597 amit.gupta 649
	@RequestMapping(value = "/account/closing-statements", method = RequestMethod.GET)
650
	public ResponseEntity<?> getAccountStatement(HttpServletRequest request, @RequestParam LocalDate closingDate,
651
			Model model) throws Exception {
652
		boolean isAdmin = roleManager.isAdmin(cookiesProcessor.getCookiesObject(request).getRoleIds());
653
		if (!isAdmin) {
654
			throw new ProfitMandiBusinessException("Unauthorised access", "PartnerId", "Permission Denied");
655
		}
656
		LocalDateTime closingDateTime = closingDate.atStartOfDay().plusDays(1);
657
 
658
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
659
		Set<Integer> retailersSet = customRetailerMap.keySet();
660
 
661
		Map<Integer, Float> closingPurchaseMap = orderRepository.selectOpeningAmount(closingDateTime, retailersSet);
662
 
663
 
664
		Map<Integer, UserWallet> retailerWalletMap = walletService.getRetailerIdUserWalletMap(retailersSet);
665
		Map<Integer, Integer> walletRetailerMap = retailerWalletMap.entrySet().stream().collect(Collectors.toMap(x->x.getValue().getId(), x->x.getKey()));
666
 
667
		Set<Integer> walletSet = walletRetailerMap.keySet();
668
		Map<Integer, Float> closingBalanceMap = userWalletHistoryRepository.getSumTillDateExcludingPurchase(closingDateTime, walletSet);
669
 
670
		List<List<?>> rows = new ArrayList<>();
671
		for (Map.Entry<Integer, Float> closingWalletBalance : closingBalanceMap.entrySet()) {
672
			int walletId = closingWalletBalance.getKey();
673
			int retailerId = walletRetailerMap.get(walletId);
674
			if (!closingPurchaseMap.containsKey(retailerId)) {
675
				closingPurchaseMap.put(retailerId, closingWalletBalance.getValue());
676
			} else {
677
				closingPurchaseMap.put(retailerId,
678
						closingWalletBalance.getValue() - closingPurchaseMap.get(retailerId));
679
			}
680
			float closingValue = closingPurchaseMap.get(retailerId);
681
			CustomRetailer cr = customRetailerMap.get(retailerId);
682
 
683
			rows.add(Arrays.asList(retailerId, cr.getBusinessName(), cr.getAddress().getCity(),
684
					cr.getAddress().getState(), closingValue));
685
		}
686
 
687
		org.apache.commons.io.output.ByteArrayOutputStream byteArrayOutputStream = FileUtil
688
				.getCSVByteStream(Arrays.asList("Id", "Partner Name", "City", "State", "Closing Balance"), rows);
689
		final HttpHeaders headers = new HttpHeaders();
690
		headers.set("Content-Type", "text/csv");
691
		headers.set("Content-disposition",
692
				"inline; filename=account-statement-closing-." + StringUtils.toHyphenatedString(closingDate) + ".csv");
693
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
694
 
695
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
696
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
697
 
698
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
699
 
700
	}
701
 
28515 amit.gupta 702
	@RequestMapping(value = "/account/statement", method = RequestMethod.GET)
703
	public ResponseEntity<?> getAccountStatement(HttpServletRequest request, @RequestParam LocalDateTime startDate,
704
			@RequestParam LocalDateTime endDate, Model model, @RequestParam(defaultValue = "0") int fofoId)
705
			throws Exception {
706
		boolean isAdmin = roleManager.isAdmin(cookiesProcessor.getCookiesObject(request).getRoleIds());
707
		if (fofoId > 0) {
708
			if (!isAdmin) {
709
				throw new ProfitMandiBusinessException("Unauthorised access", "PartnerId", "Permission Denied");
710
			}
711
		} else {
712
			fofoId = cookiesProcessor.getCookiesObject(request).getFofoId();
713
		}
714
		float openingBalance = walletService.getOpeningTillExcludingPurchase(fofoId, startDate);
715
		float closingBalance = walletService.getOpeningTillExcludingPurchase(fofoId, endDate);
28538 amit.gupta 716
		UserWallet uw = walletService.getUserWallet(fofoId);
28597 amit.gupta 717
		List<UserWalletHistory> history = userWalletHistoryRepository.selectPaginatedByWalletId(uw.getId(), startDate,
718
				endDate, 0, 0);
28538 amit.gupta 719
		history = history.stream().filter(x -> !x.getReferenceType().equals(WalletReferenceType.PURCHASE))
28515 amit.gupta 720
				.collect(Collectors.toList());
721
		InputStream is = getClass().getClassLoader().getResourceAsStream("account-statement.xlsx");
722
		String partnerName = retailerService.getAllFofoRetailerIdNameMap().get(fofoId);
723
		List<StatementDetailModel> details = orderRepository.selectDetailsBetween(fofoId, startDate, endDate);
724
		float openingAmount = orderRepository.selectOpeningAmount(fofoId, startDate);
725
		float closingAmount = orderRepository.selectOpeningAmount(fofoId, endDate);
726
		LOGGER.info("Opening - {}, Closing - {}", openingAmount, closingAmount);
727
		ByteArrayOutputStream byteArrayOutputStream = this.populateData(is, openingBalance - openingAmount,
28538 amit.gupta 728
				closingBalance - closingAmount, partnerName, history, startDate, endDate, details);
28515 amit.gupta 729
 
730
		final HttpHeaders headers = new HttpHeaders();
731
		headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
732
		headers.set("Content-disposition",
733
				"inline; filename=account-statement." + StringUtils.toHyphenatedString(startDate.toLocalDate()) + "-"
734
						+ StringUtils.toHyphenatedString(endDate.toLocalDate()) + ".xlsx");
735
		headers.setContentLength(byteArrayOutputStream.toByteArray().length);
736
 
737
		final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
738
		final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
739
 
740
		return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
741
 
742
	}
743
 
744
	private ByteArrayOutputStream populateData(InputStream is, float openingBalance, float closingBalance,
28597 amit.gupta 745
			String partnerName, List<UserWalletHistory> history, LocalDateTime startDate, LocalDateTime endDate,
746
			List<StatementDetailModel> invoiceDetails) throws Exception {
28515 amit.gupta 747
		XSSFWorkbook workbook = new XSSFWorkbook(is);
748
		CreationHelper creationHelper = workbook.getCreationHelper();
749
		CellStyle style2 = workbook.createCellStyle();
28597 amit.gupta 750
		style2.setDataFormat(creationHelper.createDataFormat().getFormat("mm/dd/yyyy hh:mm:ss"));
751
 
28515 amit.gupta 752
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
753
		Sheet sheet = workbook.getSheetAt(0);
754
		sheet.getRow(0).getCell(0).setCellValue(partnerName);
755
		sheet.getRow(1).getCell(1)
756
				.setCellValue(new Date(startDate.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
757
		sheet.getRow(1).getCell(2)
758
				.setCellValue(new Date(endDate.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
759
		sheet.getRow(2).getCell(2).setCellValue(openingBalance);
760
		long grandTotalDebit = 0l;
761
		long grandTotalCredit = 0l;
762
		int row = 4;
28538 amit.gupta 763
		for (UserWalletHistory walletEntry : history) {
28555 amit.gupta 764
			Cell dateCell = sheet.createRow(row).createCell(0);
28597 amit.gupta 765
			dateCell.setCellValue(
766
					new Date(walletEntry.getTimestamp().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()));
28540 amit.gupta 767
			dateCell.setCellStyle(style2);
28555 amit.gupta 768
			sheet.getRow(row).createCell(1).setCellValue(walletEntry.getReferenceType().toString());
28597 amit.gupta 769
			if (walletEntry.getAmount() > 0) {
28540 amit.gupta 770
				sheet.getRow(row).createCell(2).setCellValue(0);
771
				sheet.getRow(row).createCell(3).setCellValue(walletEntry.getAmount());
28538 amit.gupta 772
				grandTotalCredit += walletEntry.getAmount();
773
			} else {
28540 amit.gupta 774
				sheet.getRow(row).createCell(2).setCellValue(walletEntry.getAmount());
775
				sheet.getRow(row).createCell(3).setCellValue(0);
28538 amit.gupta 776
				grandTotalDebit += walletEntry.getAmount();
777
			}
28540 amit.gupta 778
			sheet.getRow(row).createCell(4).setCellValue(walletEntry.getDescription());
779
			sheet.getRow(row).createCell(5).setCellValue(walletEntry.getReference());
28515 amit.gupta 780
			row++;
781
		}
782
		for (StatementDetailModel statementDetailModel : invoiceDetails) {
28564 amit.gupta 783
			Cell dateCell = sheet.createRow(row).createCell(0);
28540 amit.gupta 784
			dateCell.setCellValue(statementDetailModel.getOnDate());
785
			dateCell.setCellStyle(style2);
28564 amit.gupta 786
			sheet.getRow(row).createCell(1).setCellValue("BILLING");
28515 amit.gupta 787
			if (statementDetailModel.getAmount() > 0) {
28540 amit.gupta 788
				sheet.getRow(row).createCell(2).setCellValue(statementDetailModel.getAmount());
789
				sheet.getRow(row).createCell(3).setCellValue(0);
28597 amit.gupta 790
				grandTotalDebit += statementDetailModel.getAmount();
28515 amit.gupta 791
			} else {
28540 amit.gupta 792
				sheet.getRow(row).createCell(2).setCellValue(0);
793
				sheet.getRow(row).createCell(3).setCellValue(-statementDetailModel.getAmount());
28597 amit.gupta 794
				grandTotalCredit += -statementDetailModel.getAmount();
28515 amit.gupta 795
			}
28597 amit.gupta 796
 
28538 amit.gupta 797
			sheet.getRow(row).createCell(4).setCellValue(statementDetailModel.getReferenceType());
798
			sheet.getRow(row).createCell(5).setCellValue(statementDetailModel.getInvoiceNumber());
28515 amit.gupta 799
 
800
			row += 1;
801
		}
802
		sheet.createRow(row).createCell(0).setCellValue("Grand Total");
803
		sheet.getRow(row).createCell(1).setCellValue(grandTotalDebit);
804
		sheet.getRow(row).createCell(2).setCellValue(grandTotalCredit);
805
		row += 2;
806
		sheet.createRow(row).createCell(0).setCellValue("Closing Balance");
807
		sheet.getRow(row).createCell(2).setCellValue(closingBalance);
808
		row++;
809
		/*
810
		 * sheet.createRow(row).createCell(0).setCellValue("Pending Grns");
811
		 * sheet.getRow(row).createCell(2).setCellValue(closingBalance); row++;
812
		 */
813
		try {
814
			workbook.write(bos);
815
		} finally {
816
			workbook.close();
817
			bos.close();
818
		}
819
 
820
		return bos;
821
	}
822
 
24876 tejbeer 823
	@RequestMapping(value = "/manualPayment", method = RequestMethod.GET)
824
	public String ManualPayment(HttpServletRequest request, Model model) throws Exception {
825
 
826
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().map(x -> x.getId())
827
				.collect(Collectors.toList());
828
		Map<Integer, CustomRetailer> customRetailersMap = retailerService.getFofoRetailers(fofoIds);
829
		String customRetailers = JSONObject.valueToString(customRetailersMap.values());
830
		model.addAttribute("customRetailers", customRetailers);
831
 
832
		model.addAttribute("referenceTypes", WalletReferenceType.referenceType);
833
		model.addAttribute("transactionTypes", TransactionType.values());
834
		return "wallet-edit";
835
 
836
	}
837
 
838
	@RequestMapping(value = "/getWalletHistory", method = RequestMethod.GET)
839
	public String getWalletHistory(HttpServletRequest request,
840
			@RequestParam(name = "reference", defaultValue = "0") int reference,
841
			@RequestParam WalletReferenceType referenceType, Model model) throws Exception {
842
 
843
		LOGGER.info("type" + referenceType);
844
		List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository
845
				.selectAllByreferenceIdandreferenceType(reference, referenceType);
25018 tejbeer 846
 
847
		if (userWalletHistory.isEmpty()) {
848
			throw new ProfitMandiBusinessException("RefrenceId", reference, "Reference Id not found");
849
		}
850
 
851
		UserWallet userWallet = userWalletRepository.selectById(userWalletHistory.get(0).getWalletId());
852
 
853
		LOGGER.info("userWallet" + userWallet);
854
		CustomRetailer customretailer = retailerService.getFofoRetailer(userWallet.getUserId());
855
 
856
		model.addAttribute("userWallet", userWallet);
857
		model.addAttribute("customretailer", customretailer);
858
 
24876 tejbeer 859
		model.addAttribute("wallethistory", userWalletHistory);
860
 
861
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
862
		return "wallet-history";
863
 
864
	}
865
 
24905 amit.gupta 866
	@RequestMapping(value = "/getWalletHistoryByPartner", method = RequestMethod.GET)
25018 tejbeer 867
	public String getWalletHistoryByPartner(HttpServletRequest request, int fofoId,
868
			@RequestParam(name = "referenceType", required = false) WalletReferenceType referenceType,
869
			@RequestParam(name = "offset", required = false, defaultValue = "0") int offset,
870
			@RequestParam(name = "limit", required = false, defaultValue = "30") int limit, Model model)
871
			throws Exception {
872
 
24905 amit.gupta 873
		UserWallet userWallet = userWalletRepository.selectByRetailerId(fofoId);
26485 amit.gupta 874
		List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository.selectPaginatedByWalletIdReferenceType(
875
				userWallet.getId(), referenceType, SortOrder.DESCENDING, offset, limit);
25018 tejbeer 876
 
877
		CustomRetailer customretailer = retailerService.getFofoRetailer(fofoId);
878
 
879
		model.addAttribute("userWallet", userWallet);
880
		model.addAttribute("customretailer", customretailer);
24905 amit.gupta 881
		model.addAttribute("wallethistory", userWalletHistory);
25018 tejbeer 882
 
24905 amit.gupta 883
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
884
		return "wallet-history";
25018 tejbeer 885
 
24905 amit.gupta 886
	}
887
 
24876 tejbeer 888
	@RequestMapping(value = "/getPartnerName", method = RequestMethod.GET)
889
	public String getPartnerName(HttpServletRequest request,
890
			@RequestParam(name = "reference", defaultValue = "0") int reference,
891
			@RequestParam WalletReferenceType referenceType, Model model) throws Exception {
892
 
893
		List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository
894
				.selectAllByreferenceIdandreferenceType(reference, referenceType);
24905 amit.gupta 895
		if (userWalletHistory.isEmpty()) {
24876 tejbeer 896
			throw new ProfitMandiBusinessException("RefrenceId", reference, "Reference Id not found");
897
		}
898
		UserWallet userWallet = userWalletRepository.selectById(userWalletHistory.get(0).getWalletId());
24905 amit.gupta 899
 
24876 tejbeer 900
		CustomRetailer retailer = retailerService.getFofoRetailer(userWallet.getUserId());
24905 amit.gupta 901
 
24876 tejbeer 902
		model.addAttribute("response", mvcResponseSender.createResponseString(retailer));
24905 amit.gupta 903
 
24876 tejbeer 904
		return "response";
905
 
906
	}
907
 
908
	@RequestMapping(value = "/walletUpdate", method = RequestMethod.POST)
909
	public String walletUpdate(HttpServletRequest request,
28515 amit.gupta 910
			@RequestParam(name = "reference", defaultValue = "0") int reference, @RequestParam int referenceTypeValue,
911
			@RequestParam TransactionType transactiontype, @RequestParam int amount, @RequestParam String description,
912
			@RequestParam int retailerId, Model model, @RequestParam LocalDateTime businessTimestamp) throws Exception {
26517 amit.gupta 913
		WalletReferenceType referenceType = WalletReferenceType.findByValue(referenceTypeValue);
28515 amit.gupta 914
		if (reference == 0 && referenceType.getValue() >= WalletReferenceType.INCENTIVES.getValue()) {
25018 tejbeer 915
			LOGGER.error("referenceType: " + referenceType);
24876 tejbeer 916
			ManualPaymentType paymentType = manualPaymentRequestRepository.selectByReferenceType(referenceType);
917
 
918
			if (paymentType == null) {
919
				paymentType = new ManualPaymentType();
27067 amit.gupta 920
				paymentType.setReferenceType(referenceType);
24876 tejbeer 921
			}
26485 amit.gupta 922
			paymentType.setCounter(paymentType.getCounter() + 1);
24876 tejbeer 923
			manualPaymentRequestRepository.persist(paymentType);
26485 amit.gupta 924
			reference = paymentType.getCounter();
28515 amit.gupta 925
 
926
		} else if (reference == 0) {
26485 amit.gupta 927
			throw new ProfitMandiBusinessException("RefrenceId", reference,
928
					"System specific reference type cant be used manually");
929
		}
28515 amit.gupta 930
 
26485 amit.gupta 931
		List<UserWalletHistory> userWalletHistoryList = userWalletHistoryRepository
932
				.selectAllByreferenceIdandreferenceType(reference, referenceType);
933
		UserWallet userWallet = userWalletRepository.selectByRetailerId(retailerId);
934
		int walletId = userWallet.getId();
935
		int walletAmount = walletService.getWalletAmount(retailerId);
24876 tejbeer 936
 
26485 amit.gupta 937
		int returnReference = 0;
938
		UserWalletHistory newUserWalletHistory = new UserWalletHistory();
24876 tejbeer 939
 
26485 amit.gupta 940
		if (!userWalletHistoryList.isEmpty()) {
28515 amit.gupta 941
			long validRetailerEntries = userWalletHistoryList.stream().filter(x -> x.getWalletId() == walletId).count();
942
			if (validRetailerEntries == 0) {
26485 amit.gupta 943
				throw new ProfitMandiBusinessException("RefrenceId", reference,
944
						"Reference Id assign to Other  partner");
24876 tejbeer 945
			}
24942 tejbeer 946
		}
28515 amit.gupta 947
 
26485 amit.gupta 948
		if (TransactionType.DEBIT.equals(transactiontype)) {
949
			amount = -amount;
950
		}
28515 amit.gupta 951
 
26485 amit.gupta 952
		userWallet.setAmount(walletAmount + amount);
953
		newUserWalletHistory.setAmount(amount);
954
		newUserWalletHistory.setBusinessTimestamp(businessTimestamp);
955
		newUserWalletHistory.setDescription(description);
956
		newUserWalletHistory.setReference(reference);
957
		newUserWalletHistory.setWalletId(userWallet.getId());
958
		newUserWalletHistory.setReferenceType(referenceType);
959
		newUserWalletHistory.setTimestamp(LocalDateTime.now());
960
		userWalletHistoryRepository.persist(newUserWalletHistory);
961
 
26488 amit.gupta 962
		model.addAttribute("response", mvcResponseSender.createResponseString(reference));
24876 tejbeer 963
		return "response";
964
 
965
	}
25018 tejbeer 966
 
24951 tejbeer 967
	@RequestMapping(value = "/addMoney", method = RequestMethod.POST)
25018 tejbeer 968
	public String addMoney(HttpServletRequest request, @RequestParam float amount,
969
			@RequestParam String transactionReference, @RequestParam LocalDateTime referenceTime,
970
			@RequestParam String bankName, @RequestParam int fofoId, Model model) throws Exception {
971
 
24951 tejbeer 972
		AddWalletRequest addWalletRequest = new AddWalletRequest();
973
		addWalletRequest.setRetailerId(fofoId);
974
		addWalletRequest.setAmount(amount);
975
		addWalletRequest.setTransaction_reference(transactionReference);
976
		addWalletRequest.setCreateTimestamp(LocalDateTime.now());
977
		addWalletRequest.setBank_name(bankName);
978
		addWalletRequest.setReference_date(referenceTime.toLocalDate());
979
		addWalletRequest.setStatus(AddWalletRequestStatus.pending);
25018 tejbeer 980
 
981
		LOGGER.info("info" + addWalletRequest);
982
 
24951 tejbeer 983
		addWalletRequestRepository.persist(addWalletRequest);
984
		model.addAttribute("response", mvcResponseSender.createResponseString(true));
985
		return "response";
986
	}
22551 ashik.ali 987
}