Subversion Repositories SmartDukaan

Rev

Rev 25312 | Rev 25315 | 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
		}
25312 amit.gupta 656
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
657
		Map<Integer, CustomRetailer> customRetailerMap = retailerService
658
				.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
24177 govind 659
 
25312 amit.gupta 660
		List<String> headers = Arrays.asList("Code", "Store Name", "Firm Name", "State Manager", "Teritory Manager",
661
				"Team Leader", "Target Name", "Target Value", "Target Achieved", "Today Achievement Percentage",
662
				"Daily target", "Today's achievement", "Remaining Target");
24177 govind 663
 
25312 amit.gupta 664
		List<List<? extends Serializable>> rows = new ArrayList<>();
665
		Map<String, List<Serializable>> partnerRowMap = new HashMap<>();
666
		for (FofoStore fofoStore : fofoStores) {
25314 amit.gupta 667
			if (!fofoStore.isActive())
668
				continue;
25312 amit.gupta 669
			CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
25314 amit.gupta 670
			if (retailer == null || storeManagerMap.get(retailer.getEmail()) == null) {
25312 amit.gupta 671
				LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
672
				continue;
24271 amit.gupta 673
			}
25312 amit.gupta 674
			Serializable code = fofoStore.getCode();
675
			Serializable storeName = "SmartDukaan-" + fofoStore.getCode().substring(5);
25314 amit.gupta 676
			Serializable businessName = retailer.getBusinessName();
25312 amit.gupta 677
			Serializable stateManager = storeManagerMap.get(retailer.getEmail()).get(2);
678
			Serializable territoryManager = storeManagerMap.get(retailer.getEmail()).get(1);
679
			Serializable teamLeader = storeManagerMap.get(retailer.getEmail()).get(0);
25314 amit.gupta 680
			List<Serializable> row = Arrays.asList(code, storeName, businessName, stateManager, territoryManager,
681
					teamLeader);
25312 amit.gupta 682
			row.addAll(0, partnerSalesTargetRowsMap.get(retailer.getEmail()));
683
			partnerRowMap.put(retailer.getEmail(), row);
684
			rows.add(row);
685
 
24177 govind 686
		}
687
 
25312 amit.gupta 688
		Map<String, Set<String>> storeGuyMap = new HashMap<>();
689
		for (Map.Entry<String, List<String>> entry : storeManagerMap.entrySet()) {
690
			String storeEmail = entry.getKey();
691
			List<String> storeGuys = entry.getValue();
692
			for (String storeGuy : storeGuys) {
693
				if (!storeGuyMap.containsKey(storeGuy)) {
694
					storeGuyMap.put(storeGuy, new HashSet<>());
695
				}
696
				storeGuyMap.get(storeGuy).add(storeEmail);
24192 govind 697
			}
25312 amit.gupta 698
		}
24240 amit.gupta 699
 
25312 amit.gupta 700
		String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
701
		for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuyMap.entrySet()) {
702
			List<List<? extends Serializable>> filteredRows = storeGuyEntry.getValue().stream()
703
					.map(x -> partnerRowMap.get(x)).collect(Collectors.toList());
704
			ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
705
			String[] sendToArray = new String[] { storeGuyEntry.getKey() };
706
			Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Target vs Sales Summary", "PFA",
707
					fileName, new ByteArrayResource(baos.toByteArray()));
708
		}
24240 amit.gupta 709
 
25312 amit.gupta 710
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
711
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
712
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Target vs Sales Summary", "PFA", fileName,
713
				new ByteArrayResource(baos.toByteArray()));
24174 govind 714
	}
24683 amit.gupta 715
 
24697 amit.gupta 716
	public void sendAgeingReport(String... sendTo) throws Exception {
24692 amit.gupta 717
 
718
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW,
719
				"itemstockageing.xml");
24708 amit.gupta 720
		InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
24754 amit.gupta 721
				"ItemwiseOverallPendingIndent.xml");
24683 amit.gupta 722
		Attachment attachment = new Attachment(
24692 amit.gupta 723
				"aeging-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
24707 amit.gupta 724
		Attachment attachment1 = new Attachment(
725
				"aeging-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
24841 govind 726
		Utils.sendMailWithAttachments(googleMailSender, sendTo, null, "Stock Aeging Report", "PFA", attachment,
727
				attachment1);
24681 amit.gupta 728
	}
24533 govind 729
 
24697 amit.gupta 730
	public void sendAgeingReport() throws Exception {
731
		sendAgeingReport("amod.sen@smartdukaan.com", "adeel.yazdani@smartdukaan.com", "kamini.sharma@smartdukaan.com",
732
				"tarun.verma@smartdukaan.com", "chaitnaya.vats@smartdukaan.com", "mohinder.mutreja@smartdukaan.com");
733
	}
734
 
24533 govind 735
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 736
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 737
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 738
			priceDropService.priceDropStatus(priceDrop.getId());
739
		}
740
	}
23929 amit.gupta 741
 
24542 amit.gupta 742
	public void walletmismatch() throws Exception {
743
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 744
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 745
		System.out.println(pdis.size());
24542 amit.gupta 746
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 747
			int fofoId = pdi.getFofoId();
24542 amit.gupta 748
			for (PartnerDailyInvestment investment : Lists
749
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 750
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 751
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 752
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 753
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
754
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 755
 
24542 amit.gupta 756
			}
24549 amit.gupta 757
		}
24542 amit.gupta 758
 
759
	}
760
 
761
	public void gst() throws Exception {
24548 amit.gupta 762
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2019, 1, 26).atStartOfDay(),
763
				LocalDate.of(2019, 1, 27).atTime(LocalTime.MAX));
764
		for (FofoOrder fofoOrder : fofoOrders) {
765
			int retailerAddressId = retailerRegisteredAddressRepository
766
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 767
 
768
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
769
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
770
			Integer stateId = null;
771
			if (customerAddress.getState().equals(retailerAddress.getState())) {
772
				try {
773
					stateId = Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
774
				} catch (Exception e) {
775
					LOGGER.error("Unable to get state rates");
776
				}
777
			}
778
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
779
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 780
 
781
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
782
			Set<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
24542 amit.gupta 783
			if (stateId != null) {
784
				itemIdStateTaxRateMap = Utils.getStateTaxRate(new ArrayList<>(itemIds), stateId);
785
			} else {
786
				itemIdIgstTaxRateMap = Utils.getIgstTaxRate(new ArrayList<>(itemIds));
787
			}
788
 
24548 amit.gupta 789
			for (FofoOrderItem foi : fofoOrderItems) {
24542 amit.gupta 790
				if (stateId == null) {
791
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
792
				} else {
793
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
794
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
795
				}
796
				fofoOrderItemRepository.persist(foi);
797
			}
798
		}
24548 amit.gupta 799
 
24542 amit.gupta 800
	}
801
 
24580 amit.gupta 802
	public void schemewalletmismatch() {
803
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 804
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 805
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 806
			// reconcileOrders(dateTime);
807
			// reconcileRecharges(dateTime);
24580 amit.gupta 808
			dateToReconcile = dateToReconcile.plusDays(1);
809
		}
810
	}
811
 
812
	private void reconcileSchemes(LocalDate date) {
813
		LocalDateTime startDate = date.atStartOfDay();
814
		LocalDateTime endDate = startDate.plusDays(1);
815
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
816
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 817
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
818
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 819
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 820
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
821
				WalletReferenceType.SCHEME_OUT);
822
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
823
				walletReferenceTypes);
824
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
825
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 826
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 827
 
828
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
829
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
830
 
831
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
832
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
833
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
834
 
835
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
836
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
837
 
838
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
839
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
840
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
841
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
842
 
843
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
844
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeMap.entrySet()) {
845
			}
846
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
847
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
848
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
849
				} else {
850
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
851
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
852
				}
853
			}
24590 amit.gupta 854
			Map<Integer, Integer> userWalletMap = userWalletRepository
855
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
856
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
857
 
24587 amit.gupta 858
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
859
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
860
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
861
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
862
				if (diff > 5) {
863
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
864
				}
865
			}
24580 amit.gupta 866
		}
24587 amit.gupta 867
 
24580 amit.gupta 868
	}
24590 amit.gupta 869
 
24592 amit.gupta 870
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 871
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
872
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
873
 
24592 amit.gupta 874
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
875
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 876
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
877
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
878
		Set<String> serialNumbersConsidered = new HashSet<>();
879
 
25096 amit.gupta 880
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 881
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
882
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
883
 
24683 amit.gupta 884
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 885
		purchases.stream().forEach(purchase -> {
886
			float amountToRollback = 0;
887
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
888
					+ purchase.getPurchaseReference();
889
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
890
					.stream().filter(ii -> ii.getSerialNumber() != null)
891
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
892
			if (inventorySerialNumberMap.size() > 0) {
893
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
894
					String serialNumber = inventorySerialNumberEntry.getValue();
895
					int inventoryItemId = inventorySerialNumberEntry.getKey();
896
					if (serialNumbersConsidered.contains(serialNumber)) {
897
						// This will rollback scheme for differenct orders for same serial
898
						List<SchemeInOut> sios = schemeInOutRepository
899
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
900
								.filter(x -> x.getRolledBackTimestamp() == null
901
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
902
								.collect(Collectors.toList());
903
						Collections.reverse(sios);
904
						for (SchemeInOut sio : sios) {
905
							sio.setRolledBackTimestamp(LocalDateTime.now());
906
							amountToRollback += sio.getAmount();
907
							// sio.setSchemeType(SchemeType.OUT);
908
							sio.setSerialNumber(serialNumber);
909
							rolledbackSios.add(sio);
910
						}
911
						description = description.concat(" " + serialNumber + " ");
912
					} else {
913
						serialNumbersConsidered.add(serialNumber);
914
						List<Integer> schemesConsidered = new ArrayList<>();
915
						List<SchemeInOut> sios = schemeInOutRepository
916
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
917
								.filter(x -> x.getRolledBackTimestamp() == null
918
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
919
								.collect(Collectors.toList());
920
						Collections.reverse(sios);
921
						for (SchemeInOut sio : sios) {
922
							if (!schemesConsidered.contains(sio.getSchemeId())) {
923
								schemesConsidered.add(sio.getSchemeId());
924
								continue;
925
							}
926
							sio.setRolledBackTimestamp(LocalDateTime.now());
927
							amountToRollback += sio.getAmount();
928
							// sio.setSchemeType(SchemeType.OUT);
929
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 930
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
931
							sio.setReference(purchase.getId());
24635 amit.gupta 932
							rolledbackSios.add(sio);
933
						}
934
					}
935
 
936
				}
937
			}
938
			if (amountToRollback > 0) {
24683 amit.gupta 939
				// Address address =
940
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 941
				UserWalletHistory uwh = new UserWalletHistory();
942
				uwh.setAmount(Math.round(amountToRollback));
943
				uwh.setDescription(description);
944
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 945
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 946
				uwh.setReference(purchase.getId());
947
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
948
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 949
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 950
				userWalletHistory.add(uwh);
951
			}
952
		});
953
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
954
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
955
						"Timestamp"),
956
				userWalletHistory.stream()
957
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
958
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
959
						.collect(Collectors.toList()));
960
 
961
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 962
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
963
						"Created", "Rolledback"),
24635 amit.gupta 964
				rolledbackSios.stream()
24681 amit.gupta 965
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 966
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
967
						.collect(Collectors.toList()));
968
 
25043 amit.gupta 969
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 970
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 971
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 972
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 973
 
25096 amit.gupta 974
		throw new Exception();
24635 amit.gupta 975
 
976
	}
977
 
978
	public void dryRunOutSchemeReco() throws Exception {
979
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
980
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 981
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
982
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 983
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
984
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 985
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 986
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 987
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
988
		// Collections.reverse(allOrders);
989
		// List<FofoOrder> allOrders =
24653 govind 990
		// List<FofoOrder> allOrders =
24631 amit.gupta 991
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 992
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 993
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 994
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 995
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 996
			float amountToRollback = 0;
24590 amit.gupta 997
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
998
			orderItems.forEach(x -> {
24606 amit.gupta 999
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1000
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1001
			});
24606 amit.gupta 1002
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1003
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1004
					String serialNumber = inventorySerialNumberEntry.getValue();
1005
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1006
					if (serialNumbersConsidered.contains(serialNumber)) {
1007
						// This will rollback scheme for differenct orders for same serial
1008
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1009
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1010
								.filter(x -> x.getRolledBackTimestamp() == null
1011
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1012
								.collect(Collectors.toList());
1013
						Collections.reverse(sios);
1014
						for (SchemeInOut sio : sios) {
1015
							sio.setRolledBackTimestamp(LocalDateTime.now());
1016
							amountToRollback += sio.getAmount();
1017
							// sio.setSchemeType(SchemeType.OUT);
1018
							sio.setSerialNumber(serialNumber);
1019
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1020
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1021
							rolledbackSios.add(sio);
24623 amit.gupta 1022
						}
24635 amit.gupta 1023
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1024
					} else {
1025
						serialNumbersConsidered.add(serialNumber);
1026
						List<Integer> schemesConsidered = new ArrayList<>();
1027
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1028
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1029
								.filter(x -> x.getRolledBackTimestamp() == null
1030
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1031
								.collect(Collectors.toList());
1032
						Collections.reverse(sios);
1033
						for (SchemeInOut sio : sios) {
1034
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1035
								schemesConsidered.add(sio.getSchemeId());
1036
								continue;
1037
							}
1038
							sio.setRolledBackTimestamp(LocalDateTime.now());
1039
							amountToRollback += sio.getAmount();
1040
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1041
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1042
							sio.setSerialNumber(serialNumber);
1043
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1044
							rolledbackSios.add(sio);
1045
						}
24615 amit.gupta 1046
					}
24631 amit.gupta 1047
 
24604 amit.gupta 1048
				}
24590 amit.gupta 1049
			}
24631 amit.gupta 1050
			if (amountToRollback > 0) {
1051
				UserWalletHistory uwh = new UserWalletHistory();
1052
				uwh.setAmount(Math.round(amountToRollback));
1053
				uwh.setDescription(description);
1054
				uwh.setTimestamp(LocalDateTime.now());
1055
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1056
				uwh.setReference(fofoOrder.getId());
1057
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1058
				uwh.setFofoId(fofoOrder.getFofoId());
1059
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1060
				userWalletHistory.add(uwh);
1061
			}
24590 amit.gupta 1062
		});
24598 amit.gupta 1063
 
24592 amit.gupta 1064
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1065
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1066
						"Timestamp"),
1067
				userWalletHistory.stream()
1068
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1069
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1070
						.collect(Collectors.toList()));
1071
 
1072
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1073
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1074
						"Rolledback"),
1075
				rolledbackSios.stream()
1076
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1077
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1078
						.collect(Collectors.toList()));
1079
 
25043 amit.gupta 1080
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1081
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1082
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1083
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1084
 
25267 amit.gupta 1085
		throw new Exception();
24590 amit.gupta 1086
	}
24615 amit.gupta 1087
 
24611 amit.gupta 1088
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1089
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1090
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1091
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1092
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1093
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1094
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1095
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1096
		references.stream().forEach(reference -> {
1097
			FofoOrder fofoOrder = null;
1098
			try {
1099
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1100
			} catch (Exception e) {
1101
 
24611 amit.gupta 1102
			}
1103
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1104
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1105
			float amountToRollback = 0;
1106
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1107
			orderItems.forEach(x -> {
1108
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1109
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1110
			});
1111
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1112
				List<SchemeInOut> sios = schemeInOutRepository
1113
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1114
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1115
						.collect(Collectors.toList());
1116
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1117
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1118
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1119
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1120
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1121
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1122
					if (outList.size() > 1) {
1123
 
24611 amit.gupta 1124
					}
1125
				}
1126
				uwh.setAmount(Math.round(amountToRollback));
1127
				uwh.setDescription(description);
1128
				uwh.setTimestamp(LocalDateTime.now());
1129
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1130
				uwh.setReference(fofoOrder.getId());
1131
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1132
				uwh.setFofoId(fofoOrder.getFofoId());
1133
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1134
				userWalletHistory.add(uwh);
1135
			}
1136
		});
24615 amit.gupta 1137
 
24611 amit.gupta 1138
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1139
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1140
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1141
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1142
						.collect(Collectors.toList()));
1143
 
24611 amit.gupta 1144
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1145
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1146
						"Rolledback"),
1147
				rolledbackSios.stream()
24615 amit.gupta 1148
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1149
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1150
						.collect(Collectors.toList()));
1151
 
24623 amit.gupta 1152
		Utils.sendMailWithAttachments(googleMailSender,
1153
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1154
				"Partner Excess Amount", "PFA",
1155
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1156
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1157
 
24628 amit.gupta 1158
		throw new Exception();
24615 amit.gupta 1159
 
24611 amit.gupta 1160
	}
24615 amit.gupta 1161
 
24855 amit.gupta 1162
	public void sendDailySalesReportNotificationToPartner(Integer fofoIdInt)
24653 govind 1163
			throws ProfitMandiBusinessException, MessagingException, IOException {
1164
		LocalDateTime now = LocalDateTime.now();
1165
		LocalDateTime from = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 00, 00);
1166
		Map<Integer, Double> salesByFofoIdMap = new HashMap<>();
24855 amit.gupta 1167
		List<Integer> fofoIds = null;
25043 amit.gupta 1168
		if (fofoIdInt == null) {
1169
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1170
					.collect(Collectors.toList());
24856 amit.gupta 1171
		} else {
24855 amit.gupta 1172
			fofoIds = Arrays.asList(fofoIdInt);
1173
		}
24653 govind 1174
		List<PartnerTargetDetails> partnerTargetDetails = partnerTargetRepository
1175
				.selectAllGeEqAndLeEqStartDateAndEndDate(now);
24683 amit.gupta 1176
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h a");
1177
 
1178
		Map<Integer, Float> dailyTarget = new HashMap<>();
24653 govind 1179
		for (Integer fofoId : fofoIds) {
24683 amit.gupta 1180
			Map<Integer, Float> dailyAverageSale = null;
24653 govind 1181
			double sale = fofoOrderRepository.selectTotalSaleSumByFofoIdBrtweenDate(fofoId, from, now);
1182
			for (PartnerTargetDetails partnerTargetDetail : partnerTargetDetails) {
1183
				Map<Integer, Float> targetValues = targetService.getTargetValueByFofoIdAndTargetId(fofoId,
1184
						partnerTargetDetail.getId());
1185
				if (targetValues.size() == 0) {
1186
					continue;
1187
				} else {
1188
					List<Integer> partnerIds = new ArrayList<>();
1189
					partnerIds.add(fofoId);
1190
					dailyAverageSale = targetService.getDailyAverageSaleForCurrentForSingleFofoIdAndBrand(partnerIds,
1191
							targetValues, partnerTargetDetail.getStartDate(), partnerTargetDetail.getEndDate(),
1192
							partnerTargetDetail.getBrandName());
1193
					dailyTarget.put(fofoId, dailyAverageSale.get(fofoId));
1194
					break;
1195
				}
1196
			}
1197
			NotificationCampaigns notification = new NotificationCampaigns();
24847 amit.gupta 1198
			notification.setName("Daily Sales");
1199
			notification.setTitle("Daily Sale Update");
24683 amit.gupta 1200
			if (dailyAverageSale != null && dailyAverageSale.get(fofoId) != null) {
24864 amit.gupta 1201
				notification.setMessage(String.format("Rs.%.0f till %s. Today's Target is Rs.%.0f", sale,
24847 amit.gupta 1202
						now.format(timeFormatter), dailyAverageSale.get(fofoId)));
24683 amit.gupta 1203
			} else {
25043 amit.gupta 1204
				notification.setMessage(String.format("Rs.%.0f till %s", sale, now.format(timeFormatter)));
24653 govind 1205
			}
24683 amit.gupta 1206
			// notification.setMessage("Your sale is "+salesbyfofoId.get(fofoId));
24989 tejbeer 1207
			notification.setType("url");
24863 govind 1208
			notification.setUrl("http://app.profitmandi.com/pages/home/notifications");
24683 amit.gupta 1209
			LOGGER.info("UserID" + userAccountRepository.selectUserIdByRetailerId(fofoId));
1210
			notification.setSql("SELECT distinct d1.user_id from devices d1 left join devices d2 on"
1211
					+ "(d1.imeinumber = d2.imeinumber and d1.created < d2.created) "
1212
					+ " where d2.id is null and d1.user_id = "
1213
					+ userAccountRepository.selectUserIdByRetailerId(fofoId));
24676 govind 1214
			LOGGER.info("SELECT distinct d1.user_id from devices d1 left join devices d2 on"
24683 amit.gupta 1215
					+ "(d1.imeinumber = d2.imeinumber and d1.created < d2.created) "
1216
					+ " where d2.id is null and d1.user_id = "
1217
					+ userAccountRepository.selectUserIdByRetailerId(fofoId));
24667 govind 1218
			notification.setExpiresat(LocalDateTime.now().plusDays(1).toEpochSecond(ZoneOffset.UTC) * 1000);
24653 govind 1219
			notification.setStatus("active");
1220
			notification.setSmsprocessed(0);
1221
			notification.setNotification_processed(0);
1222
			notification.setNotification_type("GENERAL_NOTIFICATION");
24657 govind 1223
			mongoClient.persistNotificationCmpInfo(notification);
24653 govind 1224
			salesByFofoIdMap.put(fofoId, sale);
1225
			LOGGER.info(sale);
1226
		}
24683 amit.gupta 1227
		String saleReport = this.getDailySalesReportByPartnerId(salesByFofoIdMap, dailyTarget);
24653 govind 1228
		LOGGER.info(saleReport);
1229
		String cc[] = { "Tarun.verma@smartdukaan.com", "Kamini.sharma@smartdukaan.com",
24697 amit.gupta 1230
				"chaitnaya.vats@smartdukaan.com", "adeel.yazdani@smartdukaan.com", "mohinder.mutreja@smartdukaan.com" };
24653 govind 1231
		String subject = "sale report till" + " " + now.format(timeFormatter);
24677 govind 1232
		this.sendMailOfHtmlFomat("amod.sen@smartdukaan.com", saleReport, cc, subject);
24653 govind 1233
	}
1234
 
24683 amit.gupta 1235
	public String getDailySalesReportByPartnerId(Map<Integer, Double> salesByFofoIdMap, Map<Integer, Float> dailyTarget)
24653 govind 1236
			throws ProfitMandiBusinessException {
1237
		StringBuilder sb = new StringBuilder();
1238
		sb.append("<html><body><p>Sale Report:</p><br/><table style='border:1px solid black ;padding: 5px';>");
1239
		sb.append("<tbody>\n" + "	    				<tr>\n"
1240
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner</th>\n"
1241
				+ "	    					<th style='border:1px solid black;padding: 5px'>Daily Target</th>\n"
1242
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>\n"
1243
				+ "	    				</tr>");
1244
		for (Integer fofoId : salesByFofoIdMap.keySet()) {
25043 amit.gupta 1245
			try {
1246
				String PartnerName = retailerService.getFofoRetailer(fofoId).getBusinessName();
1247
				sb.append("<tr>");
1248
				sb.append("<td style='border:1px solid black;padding: 5px'>" + PartnerName + "</td>");
1249
				if (dailyTarget != null && dailyTarget.get(fofoId) != null) {
1250
					sb.append("<td style='border:1px solid black;padding: 5px'>" + dailyTarget.get(fofoId) + "</td>");
1251
				} else {
1252
					sb.append("<td style='border:1px solid black;padding: 5px'>" + 0.0 + "</td>");
1253
				}
1254
				sb.append("<td style='border:1px solid black;padding: 5px'>" + salesByFofoIdMap.get(fofoId) + "</td>");
24653 govind 1255
 
25043 amit.gupta 1256
				sb.append("</tr>");
1257
			} catch (Exception e) {
24842 govind 1258
				e.printStackTrace();
1259
			}
25043 amit.gupta 1260
 
24653 govind 1261
		}
24683 amit.gupta 1262
 
24653 govind 1263
		sb.append("</tbody></table></body></html>");
1264
		return sb.toString();
1265
	}
24841 govind 1266
 
1267
	private void sendMailOfHtmlFomat(String email, String body, String cc[], String subject)
1268
			throws MessagingException, ProfitMandiBusinessException, IOException {
1269
		MimeMessage message = mailSender.createMimeMessage();
1270
		MimeMessageHelper helper = new MimeMessageHelper(message);
1271
		helper.setSubject(subject);
1272
		helper.setText(body, true);
1273
		helper.setTo(email);
1274
		if (cc != null) {
1275
			helper.setCc(cc);
1276
		}
1277
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
1278
		helper.setFrom(senderAddress);
1279
		mailSender.send(message);
1280
	}
25300 tejbeer 1281
 
1282
	public void sendNotification() throws IOException {
1283
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
1284
		if (!pushNotifications.isEmpty()) {
1285
			for (PushNotifications pushNotification : pushNotifications) {
1286
				Device devices = deviceRepository.selectById(pushNotification.getDeviceId());
1287
				NotificationCampaign notificationCampaign = notificationCampaignRepository
1288
						.selectById(pushNotification.getNotificationCampaignid());
1289
				Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls()
1290
						.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeJsonConverter()).create();
1291
 
1292
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
1293
						SimpleCampaignParams.class);
1294
				Campaign campaign = new SimpleCampaign(scp);
1295
				String result_url = campaign.getUrl() + "&user_id=" + devices.getUser_id();
1296
				JSONObject json = new JSONObject();
1297
				json.put("to", devices.getFcmId());
1298
				JSONObject jsonObj = new JSONObject();
1299
				jsonObj.put("message", campaign.getMessage());
1300
				jsonObj.put("title", campaign.getTitle());
1301
				jsonObj.put("type", campaign.getType());
1302
				jsonObj.put("url", result_url);
1303
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
1304
				jsonObj.put("image", campaign.getImageUrl());
1305
				jsonObj.put("largeIcon", "large_icon");
1306
				jsonObj.put("smallIcon", "small_icon");
1307
				jsonObj.put("vibrate", 1);
1308
				jsonObj.put("pid", pushNotification.getId());
1309
				jsonObj.put("sound", 1);
1310
				jsonObj.put("priority", "high");
1311
				json.put("data", jsonObj);
1312
 
1313
				CloseableHttpClient client = HttpClients.createDefault();
1314
				HttpPost httpPost = new HttpPost(FCM_URL);
1315
 
1316
				httpPost.setHeader("Content-Type", "application/json; utf-8");
1317
				httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
1318
				StringEntity entity = new StringEntity(json.toString());
1319
				httpPost.setEntity(entity);
1320
				CloseableHttpResponse response = client.execute(httpPost);
1321
				LOGGER.info("response" + response);
1322
 
1323
				if (response.getStatusLine().getStatusCode() == 200) {
1324
 
1325
					pushNotification.setSentTimestamp(LocalDateTime.now());
1326
				}
1327
 
1328
				else {
1329
 
1330
					LOGGER.info("message" + "not sent");
1331
				}
1332
 
1333
			}
1334
		}
1335
	}
1336
 
25312 amit.gupta 1337
	public static final Map<String, String> nameEmail = new HashMap<>();
1338
 
1339
	public static final Map<String, List<String>> storeManagerMap = new HashMap<>();
1340
 
1341
	static {
1342
		nameEmail.put("Amod", "amod.sen@smartdukaan.com");
1343
		nameEmail.put("Pramod", "pk957415@gmail.com");
1344
		nameEmail.put("Anis", "md.anis@smartdukaan.com");
1345
		nameEmail.put("Manoj", "mspatwal545@gmail.com");
1346
		nameEmail.put("Adeel", "adeel.yazdani@smartdukaan.com");
1347
		nameEmail.put("Mohinder", "mohinder.mutreja@smartdukaan.coms");
1348
		nameEmail.put("Dharmendar", "dharmender.verma@smartdukaan.com");
1349
		nameEmail.put("Rajat", "rajat.gupta@smartdukaan.com");
1350
		nameEmail.put("Ankit", "ankit.bhatia@smartdukaan.com");
1351
		nameEmail.put("Rajit", "rajit.alag@smartdukaan.com");
1352
		nameEmail.put("Gulshan", "gul9711251125@gmail.com");
1353
		nameEmail.put("PramodSharma", "prmdretail@gmail.com");
1354
		// nameEmail.put("Gulshan","");
1355
		storeManagerMap.put("themobileplanet03@gmail.com", Arrays.asList("Amod", "", "Adeel"));
1356
		storeManagerMap.put("mobileplanet7599@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1357
		storeManagerMap.put("robintelecom.snp@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1358
		storeManagerMap.put("smartconnect4141@gmail.com", Arrays.asList("Amod", "", "Adeel"));
1359
		storeManagerMap.put("bhimsain919@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1360
		storeManagerMap.put("babitaranirk@gmail.com", Arrays.asList("Pramod", "", "Mohinder"));
1361
		storeManagerMap.put("dharmendery079@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1362
		storeManagerMap.put("kkv.enterprises1@gmail.com", Arrays.asList("Pramod", "", "Mohinder"));
1363
		storeManagerMap.put("gulshersaifi74226@gmail.com", Arrays.asList("Amod", "", "Adeel"));
1364
		storeManagerMap.put("deepak.lalwani1985@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1365
		storeManagerMap.put("gupta.smartdukaan@gmail.com", Arrays.asList("Amod", "", "Adeel"));
1366
		storeManagerMap.put("sachinindri2006@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1367
		storeManagerMap.put("kambojanil83@gmail.com", Arrays.asList("Pramod", "", "Mohinder"));
1368
		storeManagerMap.put("uppal.neeraj82@gmail.com", Arrays.asList("", "Ankit", "Mohinder"));
1369
		storeManagerMap.put("thefonehousekarnal@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1370
		storeManagerMap.put("richa9910763006@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1371
		storeManagerMap.put("smartdukangzb@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1372
		storeManagerMap.put("lovelymobile183@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1373
		storeManagerMap.put("smartdukaan.sonepat@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1374
		storeManagerMap.put("arunmittal299@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1375
		storeManagerMap.put("gtc01100@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1376
		storeManagerMap.put("sumittyagi1975@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1377
		storeManagerMap.put("metrofurniture342@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1378
		storeManagerMap.put("suryaelectronicskaithal@gmail.com", Arrays.asList("Pramod", "", "Mohinder"));
1379
		storeManagerMap.put("mmtelecomsec16@gmail.com", Arrays.asList("Amod", "", "Adeel"));
1380
		storeManagerMap.put("omsonsindia08@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1381
		storeManagerMap.put("smartenterprisespv@gmail.com", Arrays.asList("Amod", "", "Adeel"));
1382
		storeManagerMap.put("cachaitnya@gmail.com", Arrays.asList("Amod", "", "Adeel"));
1383
		storeManagerMap.put("ajaykumarkansal03@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1384
		storeManagerMap.put("spurwar73@gmail.com", Arrays.asList("Anis", "Rajat", "Adeel"));
1385
		storeManagerMap.put("Shreemobile.ind@gmail.com", Arrays.asList("Anis", "Rajat", "Adeel"));
1386
		storeManagerMap.put("felixenterprises2017@rediffmail.com", Arrays.asList("", "Dharmendar", "Mohinder"));
1387
		storeManagerMap.put("nareandergupta@gmail.com", Arrays.asList("", "Dharmendar", "Mohinder"));
1388
		storeManagerMap.put("shreebalajielectronic2019@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1389
		storeManagerMap.put("saranshary@gmail.com", Arrays.asList("", "Dharmendar", "Mohinder"));
1390
		storeManagerMap.put("gambhirsmartphone@gmail.com", Arrays.asList("", "Gulshan", "Adeel"));
1391
		storeManagerMap.put("Priyankaenterprises9910@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1392
		storeManagerMap.put("pawan.dhimaan@gmail.com", Arrays.asList("", "Dharmendar", "Mohinder"));
1393
		storeManagerMap.put("lakshaydhulla62@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1394
		storeManagerMap.put("parastelecom.stp@gmail.com", Arrays.asList("Anis", "Rajat", "Adeel"));
1395
		storeManagerMap.put("talwarmukesh298@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1396
		storeManagerMap.put("sahilnarang0009@gmail.com", Arrays.asList("Pramod", "", "Mohinder"));
1397
		storeManagerMap.put("supertelecomjind@gmail.com", Arrays.asList("", "Ankit", "Mohinder"));
1398
		storeManagerMap.put("saketnagpal@gmail.com", Arrays.asList("", "Rajit", "Mohinder"));
1399
		storeManagerMap.put("DEEPAKGOYAL702.DG@GMAIL.COM", Arrays.asList("", "Ankit", "Mohinder"));
1400
		storeManagerMap.put("sambhav350@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1401
		storeManagerMap.put("mayankarora98133@gmail.com", Arrays.asList("", "Ankit", "Mohinder"));
1402
		storeManagerMap.put("vijaymobilityandmoew@gmail.com", Arrays.asList("Manoj", "", "Adeel"));
1403
		storeManagerMap.put("amitv70003@gmail.com", Arrays.asList("", "Ankit", "Mohinder"));
1404
		storeManagerMap.put("newagelucknow.123@gmail.com", Arrays.asList("Anis", "Rajat", "Adeel"));
1405
		storeManagerMap.put("Newagetechnologygomtinagar@gmail.com", Arrays.asList("Anis", "Rajat", "Adeel"));
1406
		storeManagerMap.put("rohitbatra106@gmail.com", Arrays.asList("Pramod", "Dharmendar", "Mohinder"));
1407
		storeManagerMap.put("sonisunil9050873061@gmail.com", Arrays.asList("", "Ankit", "Mohinder"));
1408
		storeManagerMap.put("moderncohsr@gmail.com", Arrays.asList("", "Ankit", "Mohinder"));
1409
		storeManagerMap.put("raghubir.ngh@gmail.com", Arrays.asList("", "Ankit", "Mohinder"));
1410
		storeManagerMap.put("aman007singla@gmail.com", Arrays.asList("", "Rajit", "Mohinder"));
1411
	}
24587 amit.gupta 1412
}