Subversion Repositories SmartDukaan

Rev

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