Subversion Repositories SmartDukaan

Rev

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