Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
23724 amit.gupta 1
package com.smartdukaan.cron.scheduled;
23723 amit.gupta 2
 
24121 govind 3
import java.io.IOException;
4
import java.io.InputStream;
24807 amit.gupta 5
import java.io.Serializable;
23739 amit.gupta 6
import java.sql.Timestamp;
24174 govind 7
import java.text.MessageFormat;
23724 amit.gupta 8
import java.time.LocalDate;
9
import java.time.LocalDateTime;
24256 amit.gupta 10
import java.time.LocalTime;
24653 govind 11
import java.time.ZoneOffset;
12
import java.time.format.DateTimeFormatter;
23724 amit.gupta 13
import java.time.temporal.ChronoUnit;
14
import java.util.ArrayList;
15
import java.util.Arrays;
24627 amit.gupta 16
import java.util.Collections;
23723 amit.gupta 17
import java.util.HashMap;
24241 amit.gupta 18
import java.util.HashSet;
23724 amit.gupta 19
import java.util.List;
23723 amit.gupta 20
import java.util.Map;
24242 amit.gupta 21
import java.util.Optional;
24542 amit.gupta 22
import java.util.Set;
23724 amit.gupta 23
import java.util.stream.Collectors;
23723 amit.gupta 24
 
24121 govind 25
import javax.mail.MessagingException;
26
import javax.mail.internet.InternetAddress;
27
import javax.mail.internet.MimeMessage;
25300 tejbeer 28
import javax.servlet.http.HttpServletRequest;
24121 govind 29
 
30
import org.apache.commons.codec.CharEncoding;
31
import org.apache.commons.io.IOUtils;
23929 amit.gupta 32
import org.apache.commons.io.output.ByteArrayOutputStream;
25300 tejbeer 33
import org.apache.http.client.methods.CloseableHttpResponse;
34
import org.apache.http.client.methods.HttpPost;
35
import org.apache.http.entity.StringEntity;
36
import org.apache.http.impl.client.CloseableHttpClient;
37
import org.apache.http.impl.client.HttpClients;
23755 amit.gupta 38
import org.apache.logging.log4j.LogManager;
39
import org.apache.logging.log4j.Logger;
24184 govind 40
import org.apache.poi.EncryptedDocumentException;
41
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
25300 tejbeer 42
import org.json.JSONObject;
23723 amit.gupta 43
import org.springframework.beans.factory.annotation.Autowired;
23933 amit.gupta 44
import org.springframework.beans.factory.annotation.Qualifier;
23724 amit.gupta 45
import org.springframework.beans.factory.annotation.Value;
23929 amit.gupta 46
import org.springframework.core.io.ByteArrayResource;
24692 amit.gupta 47
import org.springframework.core.io.InputStreamSource;
23929 amit.gupta 48
import org.springframework.mail.javamail.JavaMailSender;
24121 govind 49
import org.springframework.mail.javamail.MimeMessageHelper;
23723 amit.gupta 50
import org.springframework.stereotype.Component;
23724 amit.gupta 51
import org.springframework.transaction.annotation.Transactional;
25300 tejbeer 52
import org.springframework.ui.Model;
53
import org.springframework.web.bind.annotation.RequestMapping;
54
import org.springframework.web.bind.annotation.RequestMethod;
23723 amit.gupta 55
 
24542 amit.gupta 56
import com.google.common.collect.Lists;
25300 tejbeer 57
import com.google.gson.Gson;
58
import com.google.gson.GsonBuilder;
23724 amit.gupta 59
import com.spice.profitmandi.common.enumuration.RechargeStatus;
24681 amit.gupta 60
import com.spice.profitmandi.common.enumuration.ReporticoProject;
24121 govind 61
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
23929 amit.gupta 62
import com.spice.profitmandi.common.model.CustomRetailer;
24542 amit.gupta 63
import com.spice.profitmandi.common.model.GstRate;
23724 amit.gupta 64
import com.spice.profitmandi.common.model.RechargeCredential;
24681 amit.gupta 65
import com.spice.profitmandi.common.services.ReporticoService;
24002 amit.gupta 66
import com.spice.profitmandi.common.util.FileUtil;
23929 amit.gupta 67
import com.spice.profitmandi.common.util.FormattingUtils;
68
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 69
import com.spice.profitmandi.common.util.Utils.Attachment;
25300 tejbeer 70
import com.spice.profitmandi.dao.Interface.Campaign;
71
import com.spice.profitmandi.dao.convertor.LocalDateTimeJsonConverter;
24590 amit.gupta 72
import com.spice.profitmandi.dao.entity.catalog.Scheme;
23724 amit.gupta 73
import com.spice.profitmandi.dao.entity.dtr.DailyRecharge;
25300 tejbeer 74
import com.spice.profitmandi.dao.entity.dtr.NotificationCampaign;
24653 govind 75
import com.spice.profitmandi.dao.entity.dtr.NotificationCampaigns;
25300 tejbeer 76
import com.spice.profitmandi.dao.entity.dtr.PushNotifications;
23724 amit.gupta 77
import com.spice.profitmandi.dao.entity.dtr.RechargeProvider;
78
import com.spice.profitmandi.dao.entity.dtr.RechargeProviderCreditWalletHistory;
79
import com.spice.profitmandi.dao.entity.dtr.RechargeTransaction;
24542 amit.gupta 80
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
24590 amit.gupta 81
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
23724 amit.gupta 82
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
24542 amit.gupta 83
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
23929 amit.gupta 84
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24249 amit.gupta 85
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
24277 amit.gupta 86
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
24174 govind 87
import com.spice.profitmandi.dao.entity.fofo.PartnerTargetDetails;
23724 amit.gupta 88
import com.spice.profitmandi.dao.entity.fofo.Purchase;
24174 govind 89
import com.spice.profitmandi.dao.entity.fofo.SaleHeadDetails;
24242 amit.gupta 90
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
24241 amit.gupta 91
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
24431 amit.gupta 92
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
24587 amit.gupta 93
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
24580 amit.gupta 94
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
24542 amit.gupta 95
import com.spice.profitmandi.dao.entity.user.Address;
25300 tejbeer 96
import com.spice.profitmandi.dao.entity.user.Device;
24250 amit.gupta 97
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
24242 amit.gupta 98
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
25300 tejbeer 99
import com.spice.profitmandi.dao.model.SimpleCampaign;
100
import com.spice.profitmandi.dao.model.SimpleCampaignParams;
101
import com.spice.profitmandi.dao.repository.catalog.DeviceRepository;
24249 amit.gupta 102
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
24241 amit.gupta 103
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
23724 amit.gupta 104
import com.spice.profitmandi.dao.repository.dtr.DailyRechargeRepository;
23929 amit.gupta 105
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24653 govind 106
import com.spice.profitmandi.dao.repository.dtr.Mongo;
25300 tejbeer 107
import com.spice.profitmandi.dao.repository.dtr.NotificationCampaignRepository;
108
import com.spice.profitmandi.dao.repository.dtr.PushNotificationRepository;
23724 amit.gupta 109
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderCreditWalletHistoryRepository;
110
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderRepository;
111
import com.spice.profitmandi.dao.repository.dtr.RechargeTransactionRepository;
24542 amit.gupta 112
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
24669 govind 113
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
24542 amit.gupta 114
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
24590 amit.gupta 115
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
24542 amit.gupta 116
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
23724 amit.gupta 117
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
24249 amit.gupta 118
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
24277 amit.gupta 119
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
24174 govind 120
import com.spice.profitmandi.dao.repository.fofo.PartnerTargetRepository;
23724 amit.gupta 121
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
24242 amit.gupta 122
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
24241 amit.gupta 123
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
23929 amit.gupta 124
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
24431 amit.gupta 125
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
24580 amit.gupta 126
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
24587 amit.gupta 127
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
24542 amit.gupta 128
import com.spice.profitmandi.dao.repository.user.AddressRepository;
24337 amit.gupta 129
import com.spice.profitmandi.service.PartnerInvestmentService;
23929 amit.gupta 130
import com.spice.profitmandi.service.inventory.InventoryService;
24431 amit.gupta 131
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 132
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
133
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
134
import com.spice.profitmandi.service.scheme.SchemeService;
24121 govind 135
import com.spice.profitmandi.service.slab.TargetSlabService;
23929 amit.gupta 136
import com.spice.profitmandi.service.transaction.TransactionService;
137
import com.spice.profitmandi.service.user.RetailerService;
23739 amit.gupta 138
import com.spice.profitmandi.service.wallet.WalletService;
23723 amit.gupta 139
 
24197 amit.gupta 140
import in.shop2020.model.v1.order.WalletReferenceType;;
23739 amit.gupta 141
 
23723 amit.gupta 142
@Component
23724 amit.gupta 143
@Transactional(rollbackFor = Throwable.class)
23723 amit.gupta 144
public class ScheduledTasks {
145
 
23724 amit.gupta 146
	@Value("${oxigen.recharge.transaction.url}")
147
	private String oxigenRechargeTransactionUrl;
23723 amit.gupta 148
 
23724 amit.gupta 149
	@Value("${oxigen.recharge.enquiry.url}")
150
	private String oxigenRechargeEnquiryUrl;
24533 govind 151
 
24431 amit.gupta 152
	@Autowired
153
	private PriceDropService priceDropService;
23723 amit.gupta 154
 
23724 amit.gupta 155
	@Value("${oxigen.recharge.auth.key}")
156
	private String oxigenRechargeAuthKey;
157
 
158
	@Value("${oxigen.recharge.validation.url}")
159
	private String oxigenRechargeValidationUrl;
160
 
161
	@Value("${oxigen.recharge.validation.auth.key}")
162
	private String oxigenRechargeValidationAuthKey;
163
 
164
	@Value("${think.walnut.digital.recharge.transaction.mobile.url}")
165
	private String thinkWalnutDigitalRechargeTransactionMobileUrl;
166
 
167
	@Value("${think.walnut.digital.recharge.transaction.dth.url}")
168
	private String thinkWalnutDigitalRechargeTransactionDthUrl;
169
 
170
	@Value("${think.walnut.digital.recharge.enquiry.url}")
171
	private String thinkWalnutDigitalRechargeEnquiryUrl;
172
 
173
	@Value("${think.walnut.digital.recharge.balance.url}")
174
	private String thinkWalnutDigitalRechargeBalanceUrl;
175
 
176
	@Value("${think.walnut.digital.recharge.username}")
177
	private String thinkWalnutDigitalRechargeUserName;
178
 
179
	@Value("${think.walnut.digital.recharge.password}")
180
	private String thinkWalnutDigitalRechargePassword;
181
 
182
	@Value("${think.walnut.digital.recharge.auth.key}")
183
	private String thinkWalnutDigitalRechargeAuthKey;
184
 
23723 amit.gupta 185
	@Autowired
23724 amit.gupta 186
	private PurchaseRepository purchaseRepository;
187
 
188
	@Autowired
189
	private SchemeService schemeService;
24683 amit.gupta 190
 
24681 amit.gupta 191
	@Autowired
192
	private ReporticoService reporticoService;
23724 amit.gupta 193
 
194
	@Autowired
24337 amit.gupta 195
	private PartnerInvestmentService partnerInvestmentService;
196
 
197
	@Autowired
24542 amit.gupta 198
	private FofoOrderItemRepository fofoOrderItemRepository;
199
 
200
	@Autowired
24277 amit.gupta 201
	private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
202
 
203
	@Autowired
24241 amit.gupta 204
	private SchemeInOutRepository schemeInOutRepository;
205
 
206
	@Autowired
23724 amit.gupta 207
	private RechargeTransactionRepository rechargeTransactionRepository;
208
 
209
	@Autowired
24542 amit.gupta 210
	private CustomerAddressRepository customerAddressRepository;
211
 
212
	@Autowired
23724 amit.gupta 213
	private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
214
 
215
	@Autowired
24590 amit.gupta 216
	private FofoLineItemRepository fofoLineItemRepository;
217
 
218
	@Autowired
23724 amit.gupta 219
	private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 220
 
24580 amit.gupta 221
	@Autowired
222
	private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 223
 
24249 amit.gupta 224
	@Autowired
24587 amit.gupta 225
	private UserWalletRepository userWalletRepository;
226
 
227
	@Autowired
24249 amit.gupta 228
	private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 229
 
23739 amit.gupta 230
	@Autowired
231
	private WalletService walletService;
23724 amit.gupta 232
 
233
	@Autowired
234
	private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
235
 
236
	@Autowired
237
	private OxigenRechargeProviderService oxigenRechargeProviderService;
238
 
239
	@Autowired
240
	private RechargeProviderRepository rechargeProviderRepository;
241
 
242
	@Autowired
24242 amit.gupta 243
	private ScanRecordRepository scanRecordRepository;
244
 
245
	@Autowired
23724 amit.gupta 246
	private DailyRechargeRepository dailyRechargeRepository;
247
 
23929 amit.gupta 248
	@Autowired
249
	private FofoStoreRepository fofoStoreRepository;
24177 govind 250
 
24121 govind 251
	@Autowired
252
	private TargetSlabService targetService;
23929 amit.gupta 253
 
23724 amit.gupta 254
	@Value("${prod}")
255
	private boolean prod;
256
 
23929 amit.gupta 257
	@Autowired
258
	private RetailerService retailerService;
259
 
260
	@Autowired
261
	private TransactionService transactionService;
24250 amit.gupta 262
 
24249 amit.gupta 263
	@Autowired
264
	private ItemRepository itemRepository;
23929 amit.gupta 265
 
266
	@Autowired
267
	private OrderRepository orderRepository;
268
 
269
	@Autowired
24241 amit.gupta 270
	private SchemeRepository schemeRepository;
271
 
272
	@Autowired
23929 amit.gupta 273
	private JavaMailSender mailSender;
24177 govind 274
 
24174 govind 275
	@Autowired
24431 amit.gupta 276
	private PriceDropRepository priceDropRepository;
277
 
278
	@Autowired
24174 govind 279
	private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 280
 
281
	@Autowired
282
	@Qualifier(value = "googleMailSender")
23932 amit.gupta 283
	private JavaMailSender googleMailSender;
23929 amit.gupta 284
 
285
	@Autowired
286
	private InventoryService inventoryService;
287
 
24533 govind 288
	@Autowired
24542 amit.gupta 289
	private AddressRepository addressRepository;
290
 
291
	@Autowired
292
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
293
 
24653 govind 294
	@Autowired
295
	private Mongo mongoClient;
24683 amit.gupta 296
 
24669 govind 297
	@Autowired
25300 tejbeer 298
	private DeviceRepository deviceRepository;
299
 
300
	@Autowired
301
	private PushNotificationRepository pushNotificationRepository;
302
 
303
	@Autowired
304
	private NotificationCampaignRepository notificationCampaignRepository;
305
 
306
	@Autowired
24669 govind 307
	private UserAccountRepository userAccountRepository;
24653 govind 308
 
23755 amit.gupta 309
	private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
23724 amit.gupta 310
 
25300 tejbeer 311
	private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
312
	private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
313
 
23724 amit.gupta 314
	public void generateDailyRecharge() {
315
		List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository
316
				.selectAll(0, 2000);
317
		List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
318
		rechargeProviders.stream().forEach(x -> x.setAmount(0));
319
 
320
		rechargeProviders.stream().forEach(x -> {
321
			Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory
322
					.stream().filter(z -> z.getProviderId() == x.getId())
323
					.collect(Collectors.groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
324
 
325
			LOGGER.info("dateWiseProviderCreditsMap -- {}", dateWiseProviderCreditsMap);
326
			LocalDate endDate = LocalDate.now().plusDays(1);
327
			float previousDayClosing = 0;
328
			LocalDate date = LocalDate.of(2018, 4, 6);
329
			while (date.isBefore(endDate)) {
330
				List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository
331
						.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(),
332
								date.plusDays(1).atStartOfDay());
333
 
334
				List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream()
335
						.filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
336
 
337
				float dailyAmount = 0;
338
				float totalCommission = 0;
339
				for (RechargeTransaction rechargeTransaction : successfulTransactions) {
340
					if (rechargeTransaction.getProviderId() == x.getId()) {
341
						dailyAmount += rechargeTransaction.getAmount();
342
						totalCommission += rechargeTransaction.getCommission();
343
					}
344
				}
345
 
346
				List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
347
				float dailyWalletRecharge = 0;
348
				if (rechargeHistoryList != null) {
349
					for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
350
						if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
351
							dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
352
						}
353
					}
354
				}
355
				if (dailyAmount > 0 || dailyWalletRecharge > 0) {
356
					DailyRecharge dailyRecharge = null;
357
					try {
358
						dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
359
					} catch (Exception e) {
360
						LOGGER.info("Could not find Recharge entry");
361
					}
362
					if (dailyRecharge == null) {
363
						dailyRecharge = new DailyRecharge();
364
						dailyRecharge.setCreateDate(date);
365
					}
366
					dailyRecharge.setOpeningBalance(previousDayClosing);
367
					dailyRecharge.setProviderId(x.getId());
368
					dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
369
					dailyRecharge.setTotalAmount(dailyAmount);
370
					dailyRecharge.setTotalCommission(totalCommission);
371
					float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
372
					dailyRecharge.setClosingBalance(closingBalance);
373
					dailyRechargeRepository.persist(dailyRecharge);
374
					x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
375
					previousDayClosing = dailyRecharge.getClosingBalance();
376
				}
377
				date = date.plusDays(1);
378
			}
379
			rechargeProviderRepository.persist(x);
380
		});
23761 amit.gupta 381
		LOGGER.info("finished generating daily recharge");
23724 amit.gupta 382
	}
383
 
23738 amit.gupta 384
	public void reconcileRecharge() throws Exception {
23724 amit.gupta 385
		LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
386
		LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
387
		List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
388
		LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
389
		nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
390
		nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
391
		RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
392
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
393
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
394
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
395
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
396
		Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
397
		List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
398
				.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
399
		for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
400
			try {
401
				int providerId = rechargeTransaction.getProviderId();
402
				if (providerId == 1) {
403
					oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey,
404
							rechargeTransaction);
405
				} else if (providerId == 2) {
406
					thinkWalnutDigitalRechargeProviderService
407
							.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
408
				}
409
				if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS)
410
						|| rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
411
					requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(),
412
							rechargeTransaction.getStatus());
413
				}
414
			} catch (Exception e) {
415
				LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
416
			}
417
		}
23738 amit.gupta 418
		LOGGER.info("Reconcile recharge ran successfully");
23724 amit.gupta 419
	}
24240 amit.gupta 420
 
421
	// TemporaryMethod
24237 amit.gupta 422
	public void migrateInvoice() {
423
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
424
		Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
24241 amit.gupta 425
		partnerOrdersMap = fofoOrders.stream()
426
				.collect(Collectors.groupingBy(FofoOrder::getFofoId, Collectors.toList()));
24237 amit.gupta 427
		for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
24240 amit.gupta 428
			int sequence = 0;
429
			String prefix = "";
24241 amit.gupta 430
			List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId())
431
					.collect(Collectors.toList());
432
			for (FofoOrder order : sortedList) {
433
 
24240 amit.gupta 434
				LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
24241 amit.gupta 435
				if (!order.getInvoiceNumber().contains("SEC")) {
24240 amit.gupta 436
					sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
437
					prefix = order.getInvoiceNumber().split("/")[0];
438
				} else {
439
					sequence += 1;
24241 amit.gupta 440
					String invoiceNumber = prefix + "/" + sequence;
24240 amit.gupta 441
					order.setInvoiceNumber(invoiceNumber);
442
					fofoOrderRepository.persist(order);
443
				}
444
			}
24241 amit.gupta 445
 
24237 amit.gupta 446
		}
447
	}
23724 amit.gupta 448
 
24241 amit.gupta 449
	// Temporary Method
24252 amit.gupta 450
	public void evaluateExcessSchemeOut() throws Exception {
24244 amit.gupta 451
		Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
452
		Map<Integer, Float> userAmountMap = new HashMap<>();
24252 amit.gupta 453
 
24807 amit.gupta 454
		List<List<? extends Serializable>> rows = new ArrayList<>();
24271 amit.gupta 455
		List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number",
456
				"Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
24241 amit.gupta 457
		schemeRepository.selectAll().stream().forEach(x -> {
24250 amit.gupta 458
			if (x.getType().equals(SchemeType.OUT)) {
459
				List<SchemeInOut> sioList = schemeInOutRepository
460
						.selectBySchemeIds(new HashSet<>(Arrays.asList(x.getId())));
461
				if (x.getActiveTimestamp() != null) {
462
					LocalDateTime endDateTime = x.getEndDateTime();
463
					if (x.getExpireTimestamp() != null && x.getExpireTimestamp().isBefore(x.getEndDateTime())) {
464
						endDateTime = x.getExpireTimestamp();
24249 amit.gupta 465
					}
24250 amit.gupta 466
					for (SchemeInOut sio : sioList) {
467
						InventoryItem inventoryItem = null;
24266 amit.gupta 468
						inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
24271 amit.gupta 469
						FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
470
								inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
24250 amit.gupta 471
						Optional<ScanRecord> record = scanRecordRepository
472
								.selectByInventoryItemId(sio.getInventoryItemId()).stream()
473
								.filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
474
						if (record.isPresent()) {
475
							int fofoId = record.get().getFofoId();
476
							if (record.get().getCreateTimestamp().isAfter(endDateTime)
477
									|| record.get().getCreateTimestamp().isBefore(x.getStartDateTime())) {
478
								if (!userAmountMap.containsKey(fofoId)) {
479
									userAmountMap.put(fofoId, 0f);
480
								}
481
								userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
482
								try {
24252 amit.gupta 483
									rows.add(Arrays.asList(x.getDescription(),
24250 amit.gupta 484
											itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(),
24252 amit.gupta 485
											userNameMap.get(fofoId), sio.getAmount(),
24253 amit.gupta 486
											FormattingUtils.formatDate(sio.getCreateTimestamp()),
487
											fofoOrder.getInvoiceNumber(),
488
											FormattingUtils.formatDate(record.get().getCreateTimestamp()),
489
											FormattingUtils.formatDate(x.getStartDateTime()),
490
											FormattingUtils.formatDate(x.getEndDateTime()),
491
											FormattingUtils.formatDate(x.getActiveTimestamp()),
492
											FormattingUtils.formatDate(x.getExpireTimestamp())));
24250 amit.gupta 493
								} catch (Exception e) {
494
									e.printStackTrace();
495
								}
24242 amit.gupta 496
							}
24241 amit.gupta 497
						}
498
					}
499
				}
500
			}
501
		});
24246 amit.gupta 502
		userAmountMap.entrySet().stream()
503
				.forEach(x -> LOGGER.info("{} to be deducted from {}({}) for wrongly disbursed due to technical error.",
504
						x.getValue(), userNameMap.get(x.getKey())));
24241 amit.gupta 505
 
24252 amit.gupta 506
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
24271 amit.gupta 507
		Utils.sendMailWithAttachment(googleMailSender,
508
				new String[] { "amit.gupta@shop2020.in", "adeel.yazdani@smartdukaan.com" }, null,
509
				"Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
24252 amit.gupta 510
 
24241 amit.gupta 511
	}
24271 amit.gupta 512
 
24256 amit.gupta 513
	public void processScheme(int offset) throws Exception {
24462 amit.gupta 514
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24259 amit.gupta 515
		LocalDateTime endDate = startDate.plusDays(30);
24258 amit.gupta 516
		processScheme(startDate, endDate);
24256 amit.gupta 517
	}
24533 govind 518
 
24461 amit.gupta 519
	public void processScheme(int offset, int durationDays) throws Exception {
24462 amit.gupta 520
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24461 amit.gupta 521
		LocalDateTime endDate = startDate.plusDays(durationDays);
522
		processScheme(startDate, endDate);
523
	}
24271 amit.gupta 524
 
23738 amit.gupta 525
	public void processScheme() throws Exception {
24256 amit.gupta 526
		LocalDateTime fromDate = LocalDateTime.now().minusDays(30);
527
		processScheme(fromDate, LocalDateTime.now());
528
	}
24271 amit.gupta 529
 
24256 amit.gupta 530
	public void processScheme(LocalDateTime startDate, LocalDateTime endDate) throws Exception {
23724 amit.gupta 531
		LOGGER.info("Started execution at {}", LocalDateTime.now());
25053 amit.gupta 532
		System.out.println("InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
24561 amit.gupta 533
		try {
24587 amit.gupta 534
			List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
535
			for (Purchase purchase : purchases) {
536
				schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
537
			}
24271 amit.gupta 538
 
24587 amit.gupta 539
			List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
540
			for (FofoOrder fofoOrder : fofoOrders) {
541
				schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
542
			}
543
		} catch (Exception e) {
24561 amit.gupta 544
			e.printStackTrace();
24565 amit.gupta 545
			throw e;
24561 amit.gupta 546
		}
25043 amit.gupta 547
		List<UserWalletHistory> uwhs =userWalletHistoryRepository.selectAllByDateType(startDate, endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
548
		System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
549
		for(UserWalletHistory uwh : uwhs) {
25045 amit.gupta 550
			System.out.println(String.format("%d\t%d\t%s\t%s\t%s", uwh.getAmount(), uwh.getReference(), uwh.getReferenceType(), uwh.getTimestamp().toString(), uwh.getDescription()));
25043 amit.gupta 551
		}
23724 amit.gupta 552
		LOGGER.info("Schemes process successfully.");
25056 amit.gupta 553
		//throw new Exception();
23724 amit.gupta 554
	}
23929 amit.gupta 555
 
23739 amit.gupta 556
	public void processRechargeCashback() throws Throwable {
23761 amit.gupta 557
		LocalDateTime cashbackTime = LocalDateTime.now();
23929 amit.gupta 558
		int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
559
		List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository
560
				.getPendingCashBackRehargeTransactions();
561
		Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
562
				Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
563
		for (Map.Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
564
			int retailerId = (Integer) totalRetailerCashback.getKey();
23739 amit.gupta 565
			float amount = totalRetailerCashback.getValue().floatValue();
23929 amit.gupta 566
			if (Math.round(amount) > 0) {
567
				walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK,
568
						"Recharge Cashback", Math.round(amount));
23762 amit.gupta 569
			}
23739 amit.gupta 570
		}
23929 amit.gupta 571
		for (RechargeTransaction rt : pendingTransactions) {
23761 amit.gupta 572
			rt.setCashbackTimestamp(cashbackTime);
573
			rt.setCashbackReference(referenceId);
574
			rechargeTransactionRepository.persist(rt);
575
		}
23739 amit.gupta 576
		LOGGER.info("Cashbacks for Recharge processed Successfully");
577
	}
23724 amit.gupta 578
 
24271 amit.gupta 579
	public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
24277 amit.gupta 580
		LocalDate yesterDay = LocalDate.now().minusDays(1);
25267 amit.gupta 581
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
23929 amit.gupta 582
		Map<Integer, CustomRetailer> customRetailerMap = retailerService
583
				.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
584
 
24271 amit.gupta 585
		List<String> headers = Arrays.asList("Code", "StoreName", "Email", "Mobile", "Wallet Amount",
586
				"Yesterday's Sale", "In Stock Amount", "Return In Transit Stock", "Unbilled Amount",
587
				"Grn Pending Amount", "Min Investment", "Investment Amount", "Investment Short");
24807 amit.gupta 588
		List<List<? extends Serializable>> rows = new ArrayList<>();
24002 amit.gupta 589
		for (FofoStore fofoStore : fofoStores) {
590
			CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
591
			if (retailer == null) {
592
				LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
593
				continue;
594
			}
24533 govind 595
			PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoStore.getId(),
596
					1);
24337 amit.gupta 597
			partnerDailyInvestment.setDate(yesterDay);
598
			partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
24533 govind 599
 
24841 govind 600
			List<? extends Serializable> row = Arrays.asList(fofoStore.getCode(), retailer.getBusinessName(),
601
					retailer.getEmail(), retailer.getMobileNumber(), partnerDailyInvestment.getWalletAmount(),
24337 amit.gupta 602
					partnerDailyInvestment.getSalesAmount(), partnerDailyInvestment.getInStockAmount(), 0,
24415 amit.gupta 603
					partnerDailyInvestment.getUnbilledAmount(), partnerDailyInvestment.getGrnPendingAmount(),
24533 govind 604
					partnerDailyInvestment.getMinInvestment(), partnerDailyInvestment.getTotalInvestment(),
605
					partnerDailyInvestment.getShortInvestment());
24002 amit.gupta 606
			rows.add(row);
607
 
23929 amit.gupta 608
		}
24271 amit.gupta 609
		String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
24002 amit.gupta 610
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
24271 amit.gupta 611
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
612
 
613
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Partner Investment Summary", "PFA", fileName,
614
				new ByteArrayResource(baos.toByteArray()));
615
 
23929 amit.gupta 616
	}
24177 govind 617
 
24271 amit.gupta 618
	public void sendPartnerInvestmentDetails() throws Exception {
619
		List<String> sendTo = Arrays.asList("adeel.yazdani@smartdukaan.com", "amandeep.singh@smartdukaan.com",
620
				"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "dhruv.kathpal@smartdukaan.com",
621
				"neeraj.gupta@smartdukaan.com");
622
		this.sendPartnerInvestmentDetails(sendTo);
623
 
624
	}
625
 
24177 govind 626
	private void sendMailWithAttachments(String[] email, String[] ccEmails, String body, String subject,
24187 govind 627
			Map<String, InputStream> inputStreams)
24177 govind 628
			throws MessagingException, ProfitMandiBusinessException, IOException {
24121 govind 629
		MimeMessage message = mailSender.createMimeMessage();
24177 govind 630
		MimeMessageHelper helper = new MimeMessageHelper(message, true, CharEncoding.UTF_8);
631
		helper.setSubject(subject);
632
		helper.setText(body);
633
		if (ccEmails != null) {
634
			helper.setCc(ccEmails);
635
		}
24240 amit.gupta 636
		for (String attachment : inputStreams.keySet()) {
637
			helper.addAttachment(attachment + "_" + LocalDate.now() + ".xls",
638
					new ByteArrayResource(IOUtils.toByteArray(inputStreams.get(attachment))));
24187 govind 639
		}
24177 govind 640
		helper.setTo(email);
24195 govind 641
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
24177 govind 642
		helper.setFrom(senderAddress);
643
		mailSender.send(message);
24135 govind 644
	}
24240 amit.gupta 645
 
646
	private void sendMailWithAttachmentsForPartners(String email, String body, String subject, InputStream is)
24184 govind 647
			throws MessagingException, ProfitMandiBusinessException, IOException {
648
		MimeMessage message = mailSender.createMimeMessage();
649
		MimeMessageHelper helper = new MimeMessageHelper(message, true, CharEncoding.UTF_8);
650
		helper.setSubject(subject);
651
		helper.setText(body);
24240 amit.gupta 652
		helper.addAttachment("DailySaleTargetReports_" + LocalDate.now() + ".xls",
653
				new ByteArrayResource(IOUtils.toByteArray(is)));
24184 govind 654
		helper.setTo(email);
24195 govind 655
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
24184 govind 656
		helper.setFrom(senderAddress);
657
		mailSender.send(message);
658
	}
24177 govind 659
 
660
	public void sendMailToSalesHeadAboutTargetAndSales(SaleHeadDetails salesHeadDetail)
661
			throws MessagingException, ProfitMandiBusinessException, IOException {
662
		List<PartnerTargetDetails> partnerTargetDetails = partnerTargetRepository
663
				.selectAllGeEqAndLeEqStartDateAndEndDate(LocalDateTime.now());
664
		Map<String, InputStream> inputStreams = new HashMap<>();
665
		for (PartnerTargetDetails partnerTargetDetail : partnerTargetDetails) {
666
			InputStream is = targetService.getDailySaleReportVsTargetForSaleHead(partnerTargetDetail,
667
					salesHeadDetail.getName());
24240 amit.gupta 668
 
24177 govind 669
			inputStreams.put(partnerTargetDetail.getTargetName(), is);
670
 
24174 govind 671
		}
24240 amit.gupta 672
		// String[] ccEmails = null;
24271 amit.gupta 673
		if (partnerTargetDetails.size() > 0) {
24254 govind 674
			String[] ccEmails = { "Tarun.verma@smartdukaan.com", "Kamini.sharma@smartdukaan.com",
25296 amit.gupta 675
					"chaitnaya.vats@smartdukaan.com", "amit.gupta@shop2020.in" };
24254 govind 676
			String subject = "Daily Sales Report ";
677
			String message = MessageFormat.format("Sale Target summary for {0}", LocalDate.now());
678
			LOGGER.info("message" + message);
679
			if (salesHeadDetail.getName().equals("Kamal")) {
680
				LOGGER.info("salesHeadDetail.getName()" + salesHeadDetail.getName());
681
				String[] to = { salesHeadDetail.getEmail(), "mohinder.mutreja@smartdukaan.com" };
24177 govind 682
 
24271 amit.gupta 683
				this.sendMailWithAttachments(to, ccEmails, message, subject, inputStreams);
24177 govind 684
 
24271 amit.gupta 685
			} else {
686
				LOGGER.info("salesHeadDetail.getName()" + salesHeadDetail.getName());
687
				String[] to = { salesHeadDetail.getEmail() };
688
				this.sendMailWithAttachments(to, ccEmails, message, subject, inputStreams);
689
			}
24177 govind 690
		}
24121 govind 691
	}
24177 govind 692
 
24240 amit.gupta 693
	public void sendMailToPartnerAboutTargetAndSales() throws ProfitMandiBusinessException, MessagingException,
694
			IOException, EncryptedDocumentException, InvalidFormatException {
24177 govind 695
		List<Integer> fofoIds = targetService.getfofoIdsFromfofoStore();
696
		Map<Integer, CustomRetailer> fofoIdsAndCustomRetailer = retailerService
697
				.getFofoRetailers(new ArrayList<>(fofoIds));
698
		List<PartnerTargetDetails> partnerTargetDetails = partnerTargetRepository
699
				.selectAllGeEqAndLeEqStartDateAndEndDate(LocalDateTime.now());
700
		for (Integer fofoId : fofoIds) {
24240 amit.gupta 701
			InputStream is = targetService.getDailySaleReportVsTargetForPartner(fofoId, partnerTargetDetails);
702
			LOGGER.info("is" + is);
703
			if (is == null) {
24192 govind 704
				continue;
705
			}
24240 amit.gupta 706
			LOGGER.info("fofoId" + fofoId);
707
 
24177 govind 708
			LOGGER.info(fofoIdsAndCustomRetailer.get(fofoId).getEmail());
24240 amit.gupta 709
			String subject = "Daily Sales Report";
710
			String message = MessageFormat.format("Sale Target summary for {0}", LocalDate.now());
24177 govind 711
			LOGGER.info(message);
24240 amit.gupta 712
			this.sendMailWithAttachmentsForPartners(fofoIdsAndCustomRetailer.get(fofoId).getEmail(), message, subject,
713
					is);
714
 
24174 govind 715
		}
716
	}
24683 amit.gupta 717
 
24697 amit.gupta 718
	public void sendAgeingReport(String... sendTo) throws Exception {
24692 amit.gupta 719
 
720
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW,
721
				"itemstockageing.xml");
24708 amit.gupta 722
		InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
24754 amit.gupta 723
				"ItemwiseOverallPendingIndent.xml");
24683 amit.gupta 724
		Attachment attachment = new Attachment(
24692 amit.gupta 725
				"aeging-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
24707 amit.gupta 726
		Attachment attachment1 = new Attachment(
727
				"aeging-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
24841 govind 728
		Utils.sendMailWithAttachments(googleMailSender, sendTo, null, "Stock Aeging Report", "PFA", attachment,
729
				attachment1);
24681 amit.gupta 730
	}
24533 govind 731
 
24697 amit.gupta 732
	public void sendAgeingReport() throws Exception {
733
		sendAgeingReport("amod.sen@smartdukaan.com", "adeel.yazdani@smartdukaan.com", "kamini.sharma@smartdukaan.com",
734
				"tarun.verma@smartdukaan.com", "chaitnaya.vats@smartdukaan.com", "mohinder.mutreja@smartdukaan.com");
735
	}
736
 
24533 govind 737
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 738
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 739
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 740
			priceDropService.priceDropStatus(priceDrop.getId());
741
		}
742
	}
23929 amit.gupta 743
 
24542 amit.gupta 744
	public void walletmismatch() throws Exception {
745
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 746
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 747
		System.out.println(pdis.size());
24542 amit.gupta 748
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 749
			int fofoId = pdi.getFofoId();
24542 amit.gupta 750
			for (PartnerDailyInvestment investment : Lists
751
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 752
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 753
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 754
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 755
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
756
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 757
 
24542 amit.gupta 758
			}
24549 amit.gupta 759
		}
24542 amit.gupta 760
 
761
	}
762
 
763
	public void gst() throws Exception {
24548 amit.gupta 764
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2019, 1, 26).atStartOfDay(),
765
				LocalDate.of(2019, 1, 27).atTime(LocalTime.MAX));
766
		for (FofoOrder fofoOrder : fofoOrders) {
767
			int retailerAddressId = retailerRegisteredAddressRepository
768
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 769
 
770
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
771
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
772
			Integer stateId = null;
773
			if (customerAddress.getState().equals(retailerAddress.getState())) {
774
				try {
775
					stateId = Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
776
				} catch (Exception e) {
777
					LOGGER.error("Unable to get state rates");
778
				}
779
			}
780
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
781
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 782
 
783
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
784
			Set<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
24542 amit.gupta 785
			if (stateId != null) {
786
				itemIdStateTaxRateMap = Utils.getStateTaxRate(new ArrayList<>(itemIds), stateId);
787
			} else {
788
				itemIdIgstTaxRateMap = Utils.getIgstTaxRate(new ArrayList<>(itemIds));
789
			}
790
 
24548 amit.gupta 791
			for (FofoOrderItem foi : fofoOrderItems) {
24542 amit.gupta 792
				if (stateId == null) {
793
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
794
				} else {
795
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
796
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
797
				}
798
				fofoOrderItemRepository.persist(foi);
799
			}
800
		}
24548 amit.gupta 801
 
24542 amit.gupta 802
	}
803
 
24580 amit.gupta 804
	public void schemewalletmismatch() {
805
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 806
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 807
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 808
			// reconcileOrders(dateTime);
809
			// reconcileRecharges(dateTime);
24580 amit.gupta 810
			dateToReconcile = dateToReconcile.plusDays(1);
811
		}
812
	}
813
 
814
	private void reconcileSchemes(LocalDate date) {
815
		LocalDateTime startDate = date.atStartOfDay();
816
		LocalDateTime endDate = startDate.plusDays(1);
817
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
818
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 819
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
820
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 821
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 822
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
823
				WalletReferenceType.SCHEME_OUT);
824
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
825
				walletReferenceTypes);
826
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
827
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 828
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 829
 
830
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
831
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
832
 
833
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
834
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
835
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
836
 
837
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
838
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
839
 
840
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
841
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
842
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
843
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
844
 
845
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
846
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeMap.entrySet()) {
847
			}
848
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
849
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
850
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
851
				} else {
852
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
853
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
854
				}
855
			}
24590 amit.gupta 856
			Map<Integer, Integer> userWalletMap = userWalletRepository
857
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
858
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
859
 
24587 amit.gupta 860
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
861
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
862
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
863
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
864
				if (diff > 5) {
865
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
866
				}
867
			}
24580 amit.gupta 868
		}
24587 amit.gupta 869
 
24580 amit.gupta 870
	}
24590 amit.gupta 871
 
24592 amit.gupta 872
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 873
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
874
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
875
 
24592 amit.gupta 876
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
877
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 878
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
879
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
880
		Set<String> serialNumbersConsidered = new HashSet<>();
881
 
25096 amit.gupta 882
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 883
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
884
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
885
 
24683 amit.gupta 886
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 887
		purchases.stream().forEach(purchase -> {
888
			float amountToRollback = 0;
889
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
890
					+ purchase.getPurchaseReference();
891
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
892
					.stream().filter(ii -> ii.getSerialNumber() != null)
893
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
894
			if (inventorySerialNumberMap.size() > 0) {
895
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
896
					String serialNumber = inventorySerialNumberEntry.getValue();
897
					int inventoryItemId = inventorySerialNumberEntry.getKey();
898
					if (serialNumbersConsidered.contains(serialNumber)) {
899
						// This will rollback scheme for differenct orders for same serial
900
						List<SchemeInOut> sios = schemeInOutRepository
901
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
902
								.filter(x -> x.getRolledBackTimestamp() == null
903
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
904
								.collect(Collectors.toList());
905
						Collections.reverse(sios);
906
						for (SchemeInOut sio : sios) {
907
							sio.setRolledBackTimestamp(LocalDateTime.now());
908
							amountToRollback += sio.getAmount();
909
							// sio.setSchemeType(SchemeType.OUT);
910
							sio.setSerialNumber(serialNumber);
911
							rolledbackSios.add(sio);
912
						}
913
						description = description.concat(" " + serialNumber + " ");
914
					} else {
915
						serialNumbersConsidered.add(serialNumber);
916
						List<Integer> schemesConsidered = new ArrayList<>();
917
						List<SchemeInOut> sios = schemeInOutRepository
918
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
919
								.filter(x -> x.getRolledBackTimestamp() == null
920
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
921
								.collect(Collectors.toList());
922
						Collections.reverse(sios);
923
						for (SchemeInOut sio : sios) {
924
							if (!schemesConsidered.contains(sio.getSchemeId())) {
925
								schemesConsidered.add(sio.getSchemeId());
926
								continue;
927
							}
928
							sio.setRolledBackTimestamp(LocalDateTime.now());
929
							amountToRollback += sio.getAmount();
930
							// sio.setSchemeType(SchemeType.OUT);
931
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 932
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
933
							sio.setReference(purchase.getId());
24635 amit.gupta 934
							rolledbackSios.add(sio);
935
						}
936
					}
937
 
938
				}
939
			}
940
			if (amountToRollback > 0) {
24683 amit.gupta 941
				// Address address =
942
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 943
				UserWalletHistory uwh = new UserWalletHistory();
944
				uwh.setAmount(Math.round(amountToRollback));
945
				uwh.setDescription(description);
946
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 947
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 948
				uwh.setReference(purchase.getId());
949
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
950
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 951
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 952
				userWalletHistory.add(uwh);
953
			}
954
		});
955
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
956
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
957
						"Timestamp"),
958
				userWalletHistory.stream()
959
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
960
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
961
						.collect(Collectors.toList()));
962
 
963
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 964
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
965
						"Created", "Rolledback"),
24635 amit.gupta 966
				rolledbackSios.stream()
24681 amit.gupta 967
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 968
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
969
						.collect(Collectors.toList()));
970
 
25043 amit.gupta 971
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 972
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 973
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 974
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 975
 
25096 amit.gupta 976
		throw new Exception();
24635 amit.gupta 977
 
978
	}
979
 
980
	public void dryRunOutSchemeReco() throws Exception {
981
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
982
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 983
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
984
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 985
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
986
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 987
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 988
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 989
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
990
		// Collections.reverse(allOrders);
991
		// List<FofoOrder> allOrders =
24653 govind 992
		// List<FofoOrder> allOrders =
24631 amit.gupta 993
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 994
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 995
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 996
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 997
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 998
			float amountToRollback = 0;
24590 amit.gupta 999
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1000
			orderItems.forEach(x -> {
24606 amit.gupta 1001
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1002
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1003
			});
24606 amit.gupta 1004
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1005
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1006
					String serialNumber = inventorySerialNumberEntry.getValue();
1007
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1008
					if (serialNumbersConsidered.contains(serialNumber)) {
1009
						// This will rollback scheme for differenct orders for same serial
1010
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1011
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1012
								.filter(x -> x.getRolledBackTimestamp() == null
1013
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1014
								.collect(Collectors.toList());
1015
						Collections.reverse(sios);
1016
						for (SchemeInOut sio : sios) {
1017
							sio.setRolledBackTimestamp(LocalDateTime.now());
1018
							amountToRollback += sio.getAmount();
1019
							// sio.setSchemeType(SchemeType.OUT);
1020
							sio.setSerialNumber(serialNumber);
1021
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1022
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1023
							rolledbackSios.add(sio);
24623 amit.gupta 1024
						}
24635 amit.gupta 1025
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1026
					} else {
1027
						serialNumbersConsidered.add(serialNumber);
1028
						List<Integer> schemesConsidered = new ArrayList<>();
1029
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1030
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1031
								.filter(x -> x.getRolledBackTimestamp() == null
1032
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1033
								.collect(Collectors.toList());
1034
						Collections.reverse(sios);
1035
						for (SchemeInOut sio : sios) {
1036
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1037
								schemesConsidered.add(sio.getSchemeId());
1038
								continue;
1039
							}
1040
							sio.setRolledBackTimestamp(LocalDateTime.now());
1041
							amountToRollback += sio.getAmount();
1042
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1043
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1044
							sio.setSerialNumber(serialNumber);
1045
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1046
							rolledbackSios.add(sio);
1047
						}
24615 amit.gupta 1048
					}
24631 amit.gupta 1049
 
24604 amit.gupta 1050
				}
24590 amit.gupta 1051
			}
24631 amit.gupta 1052
			if (amountToRollback > 0) {
1053
				UserWalletHistory uwh = new UserWalletHistory();
1054
				uwh.setAmount(Math.round(amountToRollback));
1055
				uwh.setDescription(description);
1056
				uwh.setTimestamp(LocalDateTime.now());
1057
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1058
				uwh.setReference(fofoOrder.getId());
1059
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1060
				uwh.setFofoId(fofoOrder.getFofoId());
1061
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1062
				userWalletHistory.add(uwh);
1063
			}
24590 amit.gupta 1064
		});
24598 amit.gupta 1065
 
24592 amit.gupta 1066
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1067
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1068
						"Timestamp"),
1069
				userWalletHistory.stream()
1070
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1071
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1072
						.collect(Collectors.toList()));
1073
 
1074
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1075
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1076
						"Rolledback"),
1077
				rolledbackSios.stream()
1078
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1079
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1080
						.collect(Collectors.toList()));
1081
 
25043 amit.gupta 1082
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1083
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1084
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1085
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1086
 
25267 amit.gupta 1087
		throw new Exception();
24590 amit.gupta 1088
	}
24615 amit.gupta 1089
 
24611 amit.gupta 1090
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1091
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1092
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1093
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1094
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1095
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1096
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1097
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1098
		references.stream().forEach(reference -> {
1099
			FofoOrder fofoOrder = null;
1100
			try {
1101
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1102
			} catch (Exception e) {
1103
 
24611 amit.gupta 1104
			}
1105
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1106
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1107
			float amountToRollback = 0;
1108
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1109
			orderItems.forEach(x -> {
1110
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1111
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1112
			});
1113
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1114
				List<SchemeInOut> sios = schemeInOutRepository
1115
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1116
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1117
						.collect(Collectors.toList());
1118
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1119
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1120
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1121
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1122
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1123
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1124
					if (outList.size() > 1) {
1125
 
24611 amit.gupta 1126
					}
1127
				}
1128
				uwh.setAmount(Math.round(amountToRollback));
1129
				uwh.setDescription(description);
1130
				uwh.setTimestamp(LocalDateTime.now());
1131
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1132
				uwh.setReference(fofoOrder.getId());
1133
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1134
				uwh.setFofoId(fofoOrder.getFofoId());
1135
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1136
				userWalletHistory.add(uwh);
1137
			}
1138
		});
24615 amit.gupta 1139
 
24611 amit.gupta 1140
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1141
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1142
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1143
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1144
						.collect(Collectors.toList()));
1145
 
24611 amit.gupta 1146
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1147
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1148
						"Rolledback"),
1149
				rolledbackSios.stream()
24615 amit.gupta 1150
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1151
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1152
						.collect(Collectors.toList()));
1153
 
24623 amit.gupta 1154
		Utils.sendMailWithAttachments(googleMailSender,
1155
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1156
				"Partner Excess Amount", "PFA",
1157
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1158
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1159
 
24628 amit.gupta 1160
		throw new Exception();
24615 amit.gupta 1161
 
24611 amit.gupta 1162
	}
24615 amit.gupta 1163
 
24855 amit.gupta 1164
	public void sendDailySalesReportNotificationToPartner(Integer fofoIdInt)
24653 govind 1165
			throws ProfitMandiBusinessException, MessagingException, IOException {
1166
		LocalDateTime now = LocalDateTime.now();
1167
		LocalDateTime from = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 00, 00);
1168
		Map<Integer, Double> salesByFofoIdMap = new HashMap<>();
24855 amit.gupta 1169
		List<Integer> fofoIds = null;
25043 amit.gupta 1170
		if (fofoIdInt == null) {
1171
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1172
					.collect(Collectors.toList());
24856 amit.gupta 1173
		} else {
24855 amit.gupta 1174
			fofoIds = Arrays.asList(fofoIdInt);
1175
		}
24653 govind 1176
		List<PartnerTargetDetails> partnerTargetDetails = partnerTargetRepository
1177
				.selectAllGeEqAndLeEqStartDateAndEndDate(now);
24683 amit.gupta 1178
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h a");
1179
 
1180
		Map<Integer, Float> dailyTarget = new HashMap<>();
24653 govind 1181
		for (Integer fofoId : fofoIds) {
24683 amit.gupta 1182
			Map<Integer, Float> dailyAverageSale = null;
24653 govind 1183
			double sale = fofoOrderRepository.selectTotalSaleSumByFofoIdBrtweenDate(fofoId, from, now);
1184
			for (PartnerTargetDetails partnerTargetDetail : partnerTargetDetails) {
1185
				Map<Integer, Float> targetValues = targetService.getTargetValueByFofoIdAndTargetId(fofoId,
1186
						partnerTargetDetail.getId());
1187
				if (targetValues.size() == 0) {
1188
					continue;
1189
				} else {
1190
					List<Integer> partnerIds = new ArrayList<>();
1191
					partnerIds.add(fofoId);
1192
					dailyAverageSale = targetService.getDailyAverageSaleForCurrentForSingleFofoIdAndBrand(partnerIds,
1193
							targetValues, partnerTargetDetail.getStartDate(), partnerTargetDetail.getEndDate(),
1194
							partnerTargetDetail.getBrandName());
1195
					dailyTarget.put(fofoId, dailyAverageSale.get(fofoId));
1196
					break;
1197
				}
1198
			}
1199
			NotificationCampaigns notification = new NotificationCampaigns();
24847 amit.gupta 1200
			notification.setName("Daily Sales");
1201
			notification.setTitle("Daily Sale Update");
24683 amit.gupta 1202
			if (dailyAverageSale != null && dailyAverageSale.get(fofoId) != null) {
24864 amit.gupta 1203
				notification.setMessage(String.format("Rs.%.0f till %s. Today's Target is Rs.%.0f", sale,
24847 amit.gupta 1204
						now.format(timeFormatter), dailyAverageSale.get(fofoId)));
24683 amit.gupta 1205
			} else {
25043 amit.gupta 1206
				notification.setMessage(String.format("Rs.%.0f till %s", sale, now.format(timeFormatter)));
24653 govind 1207
			}
24683 amit.gupta 1208
			// notification.setMessage("Your sale is "+salesbyfofoId.get(fofoId));
24989 tejbeer 1209
			notification.setType("url");
24863 govind 1210
			notification.setUrl("http://app.profitmandi.com/pages/home/notifications");
24683 amit.gupta 1211
			LOGGER.info("UserID" + userAccountRepository.selectUserIdByRetailerId(fofoId));
1212
			notification.setSql("SELECT distinct d1.user_id from devices d1 left join devices d2 on"
1213
					+ "(d1.imeinumber = d2.imeinumber and d1.created < d2.created) "
1214
					+ " where d2.id is null and d1.user_id = "
1215
					+ userAccountRepository.selectUserIdByRetailerId(fofoId));
24676 govind 1216
			LOGGER.info("SELECT distinct d1.user_id from devices d1 left join devices d2 on"
24683 amit.gupta 1217
					+ "(d1.imeinumber = d2.imeinumber and d1.created < d2.created) "
1218
					+ " where d2.id is null and d1.user_id = "
1219
					+ userAccountRepository.selectUserIdByRetailerId(fofoId));
24667 govind 1220
			notification.setExpiresat(LocalDateTime.now().plusDays(1).toEpochSecond(ZoneOffset.UTC) * 1000);
24653 govind 1221
			notification.setStatus("active");
1222
			notification.setSmsprocessed(0);
1223
			notification.setNotification_processed(0);
1224
			notification.setNotification_type("GENERAL_NOTIFICATION");
24657 govind 1225
			mongoClient.persistNotificationCmpInfo(notification);
24653 govind 1226
			salesByFofoIdMap.put(fofoId, sale);
1227
			LOGGER.info(sale);
1228
		}
24683 amit.gupta 1229
		String saleReport = this.getDailySalesReportByPartnerId(salesByFofoIdMap, dailyTarget);
24653 govind 1230
		LOGGER.info(saleReport);
1231
		String cc[] = { "Tarun.verma@smartdukaan.com", "Kamini.sharma@smartdukaan.com",
24697 amit.gupta 1232
				"chaitnaya.vats@smartdukaan.com", "adeel.yazdani@smartdukaan.com", "mohinder.mutreja@smartdukaan.com" };
24653 govind 1233
		String subject = "sale report till" + " " + now.format(timeFormatter);
24677 govind 1234
		this.sendMailOfHtmlFomat("amod.sen@smartdukaan.com", saleReport, cc, subject);
24653 govind 1235
	}
1236
 
24683 amit.gupta 1237
	public String getDailySalesReportByPartnerId(Map<Integer, Double> salesByFofoIdMap, Map<Integer, Float> dailyTarget)
24653 govind 1238
			throws ProfitMandiBusinessException {
1239
		StringBuilder sb = new StringBuilder();
1240
		sb.append("<html><body><p>Sale Report:</p><br/><table style='border:1px solid black ;padding: 5px';>");
1241
		sb.append("<tbody>\n" + "	    				<tr>\n"
1242
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner</th>\n"
1243
				+ "	    					<th style='border:1px solid black;padding: 5px'>Daily Target</th>\n"
1244
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>\n"
1245
				+ "	    				</tr>");
1246
		for (Integer fofoId : salesByFofoIdMap.keySet()) {
25043 amit.gupta 1247
			try {
1248
				String PartnerName = retailerService.getFofoRetailer(fofoId).getBusinessName();
1249
				sb.append("<tr>");
1250
				sb.append("<td style='border:1px solid black;padding: 5px'>" + PartnerName + "</td>");
1251
				if (dailyTarget != null && dailyTarget.get(fofoId) != null) {
1252
					sb.append("<td style='border:1px solid black;padding: 5px'>" + dailyTarget.get(fofoId) + "</td>");
1253
				} else {
1254
					sb.append("<td style='border:1px solid black;padding: 5px'>" + 0.0 + "</td>");
1255
				}
1256
				sb.append("<td style='border:1px solid black;padding: 5px'>" + salesByFofoIdMap.get(fofoId) + "</td>");
24653 govind 1257
 
25043 amit.gupta 1258
				sb.append("</tr>");
1259
			} catch (Exception e) {
24842 govind 1260
				e.printStackTrace();
1261
			}
25043 amit.gupta 1262
 
24653 govind 1263
		}
24683 amit.gupta 1264
 
24653 govind 1265
		sb.append("</tbody></table></body></html>");
1266
		return sb.toString();
1267
	}
24841 govind 1268
 
1269
	private void sendMailOfHtmlFomat(String email, String body, String cc[], String subject)
1270
			throws MessagingException, ProfitMandiBusinessException, IOException {
1271
		MimeMessage message = mailSender.createMimeMessage();
1272
		MimeMessageHelper helper = new MimeMessageHelper(message);
1273
		helper.setSubject(subject);
1274
		helper.setText(body, true);
1275
		helper.setTo(email);
1276
		if (cc != null) {
1277
			helper.setCc(cc);
1278
		}
1279
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
1280
		helper.setFrom(senderAddress);
1281
		mailSender.send(message);
1282
	}
25300 tejbeer 1283
 
1284
	public void sendNotification() throws IOException {
1285
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
1286
		if (!pushNotifications.isEmpty()) {
1287
			for (PushNotifications pushNotification : pushNotifications) {
1288
				Device devices = deviceRepository.selectById(pushNotification.getDeviceId());
1289
				NotificationCampaign notificationCampaign = notificationCampaignRepository
1290
						.selectById(pushNotification.getNotificationCampaignid());
1291
				Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls()
1292
						.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeJsonConverter()).create();
1293
 
1294
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
1295
						SimpleCampaignParams.class);
1296
				Campaign campaign = new SimpleCampaign(scp);
1297
				String result_url = campaign.getUrl() + "&user_id=" + devices.getUser_id();
1298
				JSONObject json = new JSONObject();
1299
				json.put("to", devices.getFcmId());
1300
				JSONObject jsonObj = new JSONObject();
1301
				jsonObj.put("message", campaign.getMessage());
1302
				jsonObj.put("title", campaign.getTitle());
1303
				jsonObj.put("type", campaign.getType());
1304
				jsonObj.put("url", result_url);
1305
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
1306
				jsonObj.put("image", campaign.getImageUrl());
1307
				jsonObj.put("largeIcon", "large_icon");
1308
				jsonObj.put("smallIcon", "small_icon");
1309
				jsonObj.put("vibrate", 1);
1310
				jsonObj.put("pid", pushNotification.getId());
1311
				jsonObj.put("sound", 1);
1312
				jsonObj.put("priority", "high");
1313
				json.put("data", jsonObj);
1314
 
1315
				CloseableHttpClient client = HttpClients.createDefault();
1316
				HttpPost httpPost = new HttpPost(FCM_URL);
1317
 
1318
				httpPost.setHeader("Content-Type", "application/json; utf-8");
1319
				httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
1320
				StringEntity entity = new StringEntity(json.toString());
1321
				httpPost.setEntity(entity);
1322
				CloseableHttpResponse response = client.execute(httpPost);
1323
				LOGGER.info("response" + response);
1324
 
1325
				if (response.getStatusLine().getStatusCode() == 200) {
1326
 
1327
					pushNotification.setSentTimestamp(LocalDateTime.now());
1328
				}
1329
 
1330
				else {
1331
 
1332
					LOGGER.info("message" + "not sent");
1333
				}
1334
 
1335
			}
1336
		}
1337
	}
1338
 
24587 amit.gupta 1339
}