Subversion Repositories SmartDukaan

Rev

Rev 25759 | Rev 25800 | 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;
25598 amit.gupta 28
import org.apache.commons.lang.StringUtils;
25300 tejbeer 29
import org.apache.http.client.methods.CloseableHttpResponse;
30
import org.apache.http.client.methods.HttpPost;
31
import org.apache.http.entity.StringEntity;
32
import org.apache.http.impl.client.CloseableHttpClient;
33
import org.apache.http.impl.client.HttpClients;
23755 amit.gupta 34
import org.apache.logging.log4j.LogManager;
35
import org.apache.logging.log4j.Logger;
25300 tejbeer 36
import org.json.JSONObject;
23723 amit.gupta 37
import org.springframework.beans.factory.annotation.Autowired;
23933 amit.gupta 38
import org.springframework.beans.factory.annotation.Qualifier;
23724 amit.gupta 39
import org.springframework.beans.factory.annotation.Value;
23929 amit.gupta 40
import org.springframework.core.io.ByteArrayResource;
24692 amit.gupta 41
import org.springframework.core.io.InputStreamSource;
23929 amit.gupta 42
import org.springframework.mail.javamail.JavaMailSender;
24121 govind 43
import org.springframework.mail.javamail.MimeMessageHelper;
23723 amit.gupta 44
import org.springframework.stereotype.Component;
23724 amit.gupta 45
import org.springframework.transaction.annotation.Transactional;
23723 amit.gupta 46
 
24542 amit.gupta 47
import com.google.common.collect.Lists;
25300 tejbeer 48
import com.google.gson.Gson;
49
import com.google.gson.GsonBuilder;
25721 tejbeer 50
import com.spice.profitmandi.common.enumuration.MessageType;
23724 amit.gupta 51
import com.spice.profitmandi.common.enumuration.RechargeStatus;
24681 amit.gupta 52
import com.spice.profitmandi.common.enumuration.ReporticoProject;
24121 govind 53
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
23929 amit.gupta 54
import com.spice.profitmandi.common.model.CustomRetailer;
25721 tejbeer 55
import com.spice.profitmandi.common.model.FocusedModelShortageModel;
24542 amit.gupta 56
import com.spice.profitmandi.common.model.GstRate;
25590 amit.gupta 57
import com.spice.profitmandi.common.model.ProfitMandiConstants;
23724 amit.gupta 58
import com.spice.profitmandi.common.model.RechargeCredential;
24681 amit.gupta 59
import com.spice.profitmandi.common.services.ReporticoService;
24002 amit.gupta 60
import com.spice.profitmandi.common.util.FileUtil;
23929 amit.gupta 61
import com.spice.profitmandi.common.util.FormattingUtils;
62
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 63
import com.spice.profitmandi.common.util.Utils.Attachment;
25300 tejbeer 64
import com.spice.profitmandi.dao.Interface.Campaign;
65
import com.spice.profitmandi.dao.convertor.LocalDateTimeJsonConverter;
25590 amit.gupta 66
import com.spice.profitmandi.dao.entity.auth.AuthUser;
25609 amit.gupta 67
import com.spice.profitmandi.dao.entity.catalog.Item;
24590 amit.gupta 68
import com.spice.profitmandi.dao.entity.catalog.Scheme;
25590 amit.gupta 69
import com.spice.profitmandi.dao.entity.cs.Position;
23724 amit.gupta 70
import com.spice.profitmandi.dao.entity.dtr.DailyRecharge;
25300 tejbeer 71
import com.spice.profitmandi.dao.entity.dtr.NotificationCampaign;
24653 govind 72
import com.spice.profitmandi.dao.entity.dtr.NotificationCampaigns;
25300 tejbeer 73
import com.spice.profitmandi.dao.entity.dtr.PushNotifications;
23724 amit.gupta 74
import com.spice.profitmandi.dao.entity.dtr.RechargeProvider;
75
import com.spice.profitmandi.dao.entity.dtr.RechargeProviderCreditWalletHistory;
76
import com.spice.profitmandi.dao.entity.dtr.RechargeTransaction;
25721 tejbeer 77
import com.spice.profitmandi.dao.entity.dtr.UserCampaign;
24542 amit.gupta 78
import com.spice.profitmandi.dao.entity.fofo.CustomerAddress;
24590 amit.gupta 79
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
23724 amit.gupta 80
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
24542 amit.gupta 81
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
23929 amit.gupta 82
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24249 amit.gupta 83
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
24277 amit.gupta 84
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
24174 govind 85
import com.spice.profitmandi.dao.entity.fofo.PartnerTargetDetails;
23724 amit.gupta 86
import com.spice.profitmandi.dao.entity.fofo.Purchase;
24242 amit.gupta 87
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
24241 amit.gupta 88
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
24431 amit.gupta 89
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
25609 amit.gupta 90
import com.spice.profitmandi.dao.entity.transaction.PriceDropIMEI;
24587 amit.gupta 91
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
24580 amit.gupta 92
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
24542 amit.gupta 93
import com.spice.profitmandi.dao.entity.user.Address;
25300 tejbeer 94
import com.spice.profitmandi.dao.entity.user.Device;
24250 amit.gupta 95
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
25598 amit.gupta 96
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
24242 amit.gupta 97
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
25609 amit.gupta 98
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
25300 tejbeer 99
import com.spice.profitmandi.dao.model.SimpleCampaign;
100
import com.spice.profitmandi.dao.model.SimpleCampaignParams;
25590 amit.gupta 101
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
25300 tejbeer 102
import com.spice.profitmandi.dao.repository.catalog.DeviceRepository;
25721 tejbeer 103
import com.spice.profitmandi.dao.repository.catalog.FocusedModelRepository;
24249 amit.gupta 104
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
24241 amit.gupta 105
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
25590 amit.gupta 106
import com.spice.profitmandi.dao.repository.cs.CsService;
107
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
23724 amit.gupta 108
import com.spice.profitmandi.dao.repository.dtr.DailyRechargeRepository;
23929 amit.gupta 109
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24653 govind 110
import com.spice.profitmandi.dao.repository.dtr.Mongo;
25300 tejbeer 111
import com.spice.profitmandi.dao.repository.dtr.NotificationCampaignRepository;
112
import com.spice.profitmandi.dao.repository.dtr.PushNotificationRepository;
23724 amit.gupta 113
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderCreditWalletHistoryRepository;
114
import com.spice.profitmandi.dao.repository.dtr.RechargeProviderRepository;
115
import com.spice.profitmandi.dao.repository.dtr.RechargeTransactionRepository;
24542 amit.gupta 116
import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;
24669 govind 117
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
25721 tejbeer 118
import com.spice.profitmandi.dao.repository.dtr.UserCampaignRepository;
119
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
24542 amit.gupta 120
import com.spice.profitmandi.dao.repository.fofo.CustomerAddressRepository;
24590 amit.gupta 121
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
24542 amit.gupta 122
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
23724 amit.gupta 123
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
24249 amit.gupta 124
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
24277 amit.gupta 125
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
24174 govind 126
import com.spice.profitmandi.dao.repository.fofo.PartnerTargetRepository;
25503 amit.gupta 127
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;
23724 amit.gupta 128
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
24242 amit.gupta 129
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
24241 amit.gupta 130
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
23929 amit.gupta 131
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
25609 amit.gupta 132
import com.spice.profitmandi.dao.repository.transaction.PriceDropIMEIRepository;
24431 amit.gupta 133
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
24580 amit.gupta 134
import com.spice.profitmandi.dao.repository.transaction.UserWalletHistoryRepository;
24587 amit.gupta 135
import com.spice.profitmandi.dao.repository.transaction.UserWalletRepository;
24542 amit.gupta 136
import com.spice.profitmandi.dao.repository.user.AddressRepository;
25721 tejbeer 137
import com.spice.profitmandi.dao.repository.user.UserRepository;
24337 amit.gupta 138
import com.spice.profitmandi.service.PartnerInvestmentService;
25694 amit.gupta 139
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
25778 amit.gupta 140
import com.spice.profitmandi.service.integrations.toffee.model.PremiumCalculationRequestModel;
23929 amit.gupta 141
import com.spice.profitmandi.service.inventory.InventoryService;
25335 amit.gupta 142
import com.spice.profitmandi.service.order.OrderService;
24431 amit.gupta 143
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 144
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
145
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
146
import com.spice.profitmandi.service.scheme.SchemeService;
24121 govind 147
import com.spice.profitmandi.service.slab.TargetSlabService;
23929 amit.gupta 148
import com.spice.profitmandi.service.transaction.TransactionService;
149
import com.spice.profitmandi.service.user.RetailerService;
23739 amit.gupta 150
import com.spice.profitmandi.service.wallet.WalletService;
23723 amit.gupta 151
 
25721 tejbeer 152
import in.shop2020.model.v1.order.OrderStatus;
25778 amit.gupta 153
import in.shop2020.model.v1.order.WalletReferenceType;;
23739 amit.gupta 154
 
23723 amit.gupta 155
@Component
23724 amit.gupta 156
@Transactional(rollbackFor = Throwable.class)
23723 amit.gupta 157
public class ScheduledTasks {
158
 
23724 amit.gupta 159
	@Value("${oxigen.recharge.transaction.url}")
160
	private String oxigenRechargeTransactionUrl;
23723 amit.gupta 161
 
23724 amit.gupta 162
	@Value("${oxigen.recharge.enquiry.url}")
163
	private String oxigenRechargeEnquiryUrl;
24533 govind 164
 
24431 amit.gupta 165
	@Autowired
25503 amit.gupta 166
	private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 167
 
25590 amit.gupta 168
	@Autowired
169
	private AuthRepository authRepository;
25503 amit.gupta 170
 
171
	@Autowired
24431 amit.gupta 172
	private PriceDropService priceDropService;
25598 amit.gupta 173
 
25590 amit.gupta 174
	@Autowired
175
	private CsService csService;
23723 amit.gupta 176
 
25694 amit.gupta 177
	@Autowired
178
	private ToffeeService toffeeService;
179
 
23724 amit.gupta 180
	@Value("${oxigen.recharge.auth.key}")
181
	private String oxigenRechargeAuthKey;
182
 
183
	@Value("${oxigen.recharge.validation.url}")
184
	private String oxigenRechargeValidationUrl;
185
 
186
	@Value("${oxigen.recharge.validation.auth.key}")
187
	private String oxigenRechargeValidationAuthKey;
188
 
189
	@Value("${think.walnut.digital.recharge.transaction.mobile.url}")
190
	private String thinkWalnutDigitalRechargeTransactionMobileUrl;
191
 
192
	@Value("${think.walnut.digital.recharge.transaction.dth.url}")
193
	private String thinkWalnutDigitalRechargeTransactionDthUrl;
194
 
195
	@Value("${think.walnut.digital.recharge.enquiry.url}")
196
	private String thinkWalnutDigitalRechargeEnquiryUrl;
197
 
198
	@Value("${think.walnut.digital.recharge.balance.url}")
199
	private String thinkWalnutDigitalRechargeBalanceUrl;
200
 
201
	@Value("${think.walnut.digital.recharge.username}")
202
	private String thinkWalnutDigitalRechargeUserName;
203
 
204
	@Value("${think.walnut.digital.recharge.password}")
205
	private String thinkWalnutDigitalRechargePassword;
206
 
207
	@Value("${think.walnut.digital.recharge.auth.key}")
208
	private String thinkWalnutDigitalRechargeAuthKey;
209
 
23723 amit.gupta 210
	@Autowired
23724 amit.gupta 211
	private PurchaseRepository purchaseRepository;
212
 
213
	@Autowired
25609 amit.gupta 214
	private PriceDropIMEIRepository priceDropIMEIRepository;
215
 
216
	@Autowired
217
	PriceDropRepository priceDropRepository;
218
 
219
	@Autowired
23724 amit.gupta 220
	private SchemeService schemeService;
24683 amit.gupta 221
 
25609 amit.gupta 222
	private static final String[] STOCK_AGEING_MAIL_LIST = new String[] { "amod.sen@smartdukaan.com",
223
			"adeel.yazdani@smartdukaan.com", "manoj.singh@smartdukaan.com", "kamini.sharma@smartdukaan.com",
224
			"mohinder.mutreja@smartdukaan.com", "	ankit.bhatia@smartdukaan.com", "tarun.verma@smartdukaan.com",
225
			"chaitnaya.vats@smartdukaan.com", "kuldeep.kumar@smartdukaan.com" };
226
 
227
	private static final String[] ITEMWISE_PENDING_INDENT_MAIL_LIST = new String[] { "kamini.sharma@smartdukaan.com",
228
			"tarun.verma@smartdukaan.com", "chaitnaya.vats@smartdukaan.com", "kuldeep.kumar@smartdukaan.com" };
229
 
25721 tejbeer 230
	private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
231
 
24681 amit.gupta 232
	@Autowired
233
	private ReporticoService reporticoService;
23724 amit.gupta 234
 
235
	@Autowired
24337 amit.gupta 236
	private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 237
 
25590 amit.gupta 238
	@Autowired
239
	private PositionRepository positionRepository;
24337 amit.gupta 240
 
241
	@Autowired
24542 amit.gupta 242
	private FofoOrderItemRepository fofoOrderItemRepository;
243
 
244
	@Autowired
24277 amit.gupta 245
	private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
246
 
247
	@Autowired
24241 amit.gupta 248
	private SchemeInOutRepository schemeInOutRepository;
249
 
250
	@Autowired
23724 amit.gupta 251
	private RechargeTransactionRepository rechargeTransactionRepository;
252
 
253
	@Autowired
24542 amit.gupta 254
	private CustomerAddressRepository customerAddressRepository;
255
 
256
	@Autowired
23724 amit.gupta 257
	private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
258
 
259
	@Autowired
24590 amit.gupta 260
	private FofoLineItemRepository fofoLineItemRepository;
261
 
262
	@Autowired
23724 amit.gupta 263
	private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 264
 
24580 amit.gupta 265
	@Autowired
266
	private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 267
 
24249 amit.gupta 268
	@Autowired
24587 amit.gupta 269
	private UserWalletRepository userWalletRepository;
270
 
271
	@Autowired
24249 amit.gupta 272
	private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 273
 
23739 amit.gupta 274
	@Autowired
275
	private WalletService walletService;
23724 amit.gupta 276
 
277
	@Autowired
278
	private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
279
 
280
	@Autowired
281
	private OxigenRechargeProviderService oxigenRechargeProviderService;
282
 
283
	@Autowired
284
	private RechargeProviderRepository rechargeProviderRepository;
285
 
286
	@Autowired
24242 amit.gupta 287
	private ScanRecordRepository scanRecordRepository;
288
 
289
	@Autowired
23724 amit.gupta 290
	private DailyRechargeRepository dailyRechargeRepository;
291
 
23929 amit.gupta 292
	@Autowired
293
	private FofoStoreRepository fofoStoreRepository;
24177 govind 294
 
24121 govind 295
	@Autowired
296
	private TargetSlabService targetService;
23929 amit.gupta 297
 
23724 amit.gupta 298
	@Value("${prod}")
299
	private boolean prod;
300
 
23929 amit.gupta 301
	@Autowired
302
	private RetailerService retailerService;
303
 
304
	@Autowired
305
	private TransactionService transactionService;
24250 amit.gupta 306
 
24249 amit.gupta 307
	@Autowired
308
	private ItemRepository itemRepository;
23929 amit.gupta 309
 
310
	@Autowired
311
	private OrderRepository orderRepository;
25351 tejbeer 312
 
25335 amit.gupta 313
	@Autowired
314
	private OrderService orderService;
23929 amit.gupta 315
 
316
	@Autowired
24241 amit.gupta 317
	private SchemeRepository schemeRepository;
318
 
319
	@Autowired
23929 amit.gupta 320
	private JavaMailSender mailSender;
24177 govind 321
 
24174 govind 322
	@Autowired
323
	private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 324
 
325
	@Autowired
326
	@Qualifier(value = "googleMailSender")
23932 amit.gupta 327
	private JavaMailSender googleMailSender;
23929 amit.gupta 328
 
329
	@Autowired
330
	private InventoryService inventoryService;
331
 
24533 govind 332
	@Autowired
24542 amit.gupta 333
	private AddressRepository addressRepository;
334
 
335
	@Autowired
336
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
337
 
24653 govind 338
	@Autowired
339
	private Mongo mongoClient;
24683 amit.gupta 340
 
24669 govind 341
	@Autowired
25300 tejbeer 342
	private DeviceRepository deviceRepository;
343
 
344
	@Autowired
345
	private PushNotificationRepository pushNotificationRepository;
346
 
347
	@Autowired
348
	private NotificationCampaignRepository notificationCampaignRepository;
349
 
350
	@Autowired
25721 tejbeer 351
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
352
 
353
	@Autowired
354
	private FocusedModelRepository focusedModelRepository;
355
 
356
	@Autowired
24669 govind 357
	private UserAccountRepository userAccountRepository;
24653 govind 358
 
25721 tejbeer 359
	@Autowired
360
	private UserRepository userRepository;
361
 
362
	@Autowired
363
	private UserCampaignRepository userCampaignRepository;
364
 
365
	@Autowired
366
	private Gson gson;
367
 
23755 amit.gupta 368
	private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
23724 amit.gupta 369
 
25300 tejbeer 370
	private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
371
	private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
372
 
23724 amit.gupta 373
	public void generateDailyRecharge() {
374
		List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository
375
				.selectAll(0, 2000);
376
		List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
377
		rechargeProviders.stream().forEach(x -> x.setAmount(0));
378
 
379
		rechargeProviders.stream().forEach(x -> {
380
			Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory
381
					.stream().filter(z -> z.getProviderId() == x.getId())
382
					.collect(Collectors.groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
383
 
384
			LOGGER.info("dateWiseProviderCreditsMap -- {}", dateWiseProviderCreditsMap);
385
			LocalDate endDate = LocalDate.now().plusDays(1);
386
			float previousDayClosing = 0;
387
			LocalDate date = LocalDate.of(2018, 4, 6);
388
			while (date.isBefore(endDate)) {
389
				List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository
390
						.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(),
391
								date.plusDays(1).atStartOfDay());
392
 
393
				List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream()
394
						.filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
395
 
396
				float dailyAmount = 0;
397
				float totalCommission = 0;
398
				for (RechargeTransaction rechargeTransaction : successfulTransactions) {
399
					if (rechargeTransaction.getProviderId() == x.getId()) {
400
						dailyAmount += rechargeTransaction.getAmount();
401
						totalCommission += rechargeTransaction.getCommission();
402
					}
403
				}
404
 
405
				List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
406
				float dailyWalletRecharge = 0;
407
				if (rechargeHistoryList != null) {
408
					for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
409
						if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
410
							dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
411
						}
412
					}
413
				}
414
				if (dailyAmount > 0 || dailyWalletRecharge > 0) {
415
					DailyRecharge dailyRecharge = null;
416
					try {
417
						dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
418
					} catch (Exception e) {
419
						LOGGER.info("Could not find Recharge entry");
420
					}
421
					if (dailyRecharge == null) {
422
						dailyRecharge = new DailyRecharge();
423
						dailyRecharge.setCreateDate(date);
424
					}
425
					dailyRecharge.setOpeningBalance(previousDayClosing);
426
					dailyRecharge.setProviderId(x.getId());
427
					dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
428
					dailyRecharge.setTotalAmount(dailyAmount);
429
					dailyRecharge.setTotalCommission(totalCommission);
430
					float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
431
					dailyRecharge.setClosingBalance(closingBalance);
432
					dailyRechargeRepository.persist(dailyRecharge);
433
					x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
434
					previousDayClosing = dailyRecharge.getClosingBalance();
435
				}
436
				date = date.plusDays(1);
437
			}
438
			rechargeProviderRepository.persist(x);
439
		});
23761 amit.gupta 440
		LOGGER.info("finished generating daily recharge");
23724 amit.gupta 441
	}
442
 
23738 amit.gupta 443
	public void reconcileRecharge() throws Exception {
23724 amit.gupta 444
		LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
445
		LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
446
		List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
447
		LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
448
		nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
449
		nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
450
		RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
451
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
452
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
453
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
454
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
455
		Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
456
		List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
457
				.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
458
		for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
459
			try {
460
				int providerId = rechargeTransaction.getProviderId();
461
				if (providerId == 1) {
462
					oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey,
463
							rechargeTransaction);
464
				} else if (providerId == 2) {
465
					thinkWalnutDigitalRechargeProviderService
466
							.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
467
				}
468
				if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS)
469
						|| rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
470
					requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(),
471
							rechargeTransaction.getStatus());
472
				}
473
			} catch (Exception e) {
474
				LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
475
			}
476
		}
23738 amit.gupta 477
		LOGGER.info("Reconcile recharge ran successfully");
23724 amit.gupta 478
	}
24240 amit.gupta 479
 
480
	// TemporaryMethod
24237 amit.gupta 481
	public void migrateInvoice() {
482
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
483
		Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
24241 amit.gupta 484
		partnerOrdersMap = fofoOrders.stream()
485
				.collect(Collectors.groupingBy(FofoOrder::getFofoId, Collectors.toList()));
24237 amit.gupta 486
		for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
24240 amit.gupta 487
			int sequence = 0;
488
			String prefix = "";
24241 amit.gupta 489
			List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId())
490
					.collect(Collectors.toList());
491
			for (FofoOrder order : sortedList) {
492
 
24240 amit.gupta 493
				LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
24241 amit.gupta 494
				if (!order.getInvoiceNumber().contains("SEC")) {
24240 amit.gupta 495
					sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
496
					prefix = order.getInvoiceNumber().split("/")[0];
497
				} else {
498
					sequence += 1;
24241 amit.gupta 499
					String invoiceNumber = prefix + "/" + sequence;
24240 amit.gupta 500
					order.setInvoiceNumber(invoiceNumber);
501
					fofoOrderRepository.persist(order);
502
				}
503
			}
24241 amit.gupta 504
 
24237 amit.gupta 505
		}
506
	}
23724 amit.gupta 507
 
24241 amit.gupta 508
	// Temporary Method
24252 amit.gupta 509
	public void evaluateExcessSchemeOut() throws Exception {
24244 amit.gupta 510
		Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
511
		Map<Integer, Float> userAmountMap = new HashMap<>();
24252 amit.gupta 512
 
24807 amit.gupta 513
		List<List<? extends Serializable>> rows = new ArrayList<>();
24271 amit.gupta 514
		List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number",
515
				"Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
24241 amit.gupta 516
		schemeRepository.selectAll().stream().forEach(x -> {
24250 amit.gupta 517
			if (x.getType().equals(SchemeType.OUT)) {
518
				List<SchemeInOut> sioList = schemeInOutRepository
519
						.selectBySchemeIds(new HashSet<>(Arrays.asList(x.getId())));
520
				if (x.getActiveTimestamp() != null) {
521
					LocalDateTime endDateTime = x.getEndDateTime();
522
					if (x.getExpireTimestamp() != null && x.getExpireTimestamp().isBefore(x.getEndDateTime())) {
523
						endDateTime = x.getExpireTimestamp();
24249 amit.gupta 524
					}
24250 amit.gupta 525
					for (SchemeInOut sio : sioList) {
526
						InventoryItem inventoryItem = null;
24266 amit.gupta 527
						inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
24271 amit.gupta 528
						FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
529
								inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
24250 amit.gupta 530
						Optional<ScanRecord> record = scanRecordRepository
531
								.selectByInventoryItemId(sio.getInventoryItemId()).stream()
532
								.filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
533
						if (record.isPresent()) {
534
							int fofoId = record.get().getFofoId();
535
							if (record.get().getCreateTimestamp().isAfter(endDateTime)
536
									|| record.get().getCreateTimestamp().isBefore(x.getStartDateTime())) {
537
								if (!userAmountMap.containsKey(fofoId)) {
538
									userAmountMap.put(fofoId, 0f);
539
								}
540
								userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
541
								try {
24252 amit.gupta 542
									rows.add(Arrays.asList(x.getDescription(),
24250 amit.gupta 543
											itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(),
24252 amit.gupta 544
											userNameMap.get(fofoId), sio.getAmount(),
24253 amit.gupta 545
											FormattingUtils.formatDate(sio.getCreateTimestamp()),
546
											fofoOrder.getInvoiceNumber(),
547
											FormattingUtils.formatDate(record.get().getCreateTimestamp()),
548
											FormattingUtils.formatDate(x.getStartDateTime()),
549
											FormattingUtils.formatDate(x.getEndDateTime()),
550
											FormattingUtils.formatDate(x.getActiveTimestamp()),
551
											FormattingUtils.formatDate(x.getExpireTimestamp())));
24250 amit.gupta 552
								} catch (Exception e) {
553
									e.printStackTrace();
554
								}
24242 amit.gupta 555
							}
24241 amit.gupta 556
						}
557
					}
558
				}
559
			}
560
		});
24246 amit.gupta 561
		userAmountMap.entrySet().stream()
562
				.forEach(x -> LOGGER.info("{} to be deducted from {}({}) for wrongly disbursed due to technical error.",
563
						x.getValue(), userNameMap.get(x.getKey())));
24241 amit.gupta 564
 
24252 amit.gupta 565
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
24271 amit.gupta 566
		Utils.sendMailWithAttachment(googleMailSender,
567
				new String[] { "amit.gupta@shop2020.in", "adeel.yazdani@smartdukaan.com" }, null,
568
				"Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
24252 amit.gupta 569
 
24241 amit.gupta 570
	}
24271 amit.gupta 571
 
25584 amit.gupta 572
	public void processScheme(int offset, boolean dryRun) throws Exception {
24462 amit.gupta 573
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24259 amit.gupta 574
		LocalDateTime endDate = startDate.plusDays(30);
25584 amit.gupta 575
		processScheme(startDate, endDate, dryRun);
24256 amit.gupta 576
	}
24533 govind 577
 
25584 amit.gupta 578
	public void processScheme(int offset, int durationDays, boolean dryRun) throws Exception {
24462 amit.gupta 579
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24461 amit.gupta 580
		LocalDateTime endDate = startDate.plusDays(durationDays);
25584 amit.gupta 581
		processScheme(startDate, endDate, dryRun);
24461 amit.gupta 582
	}
24271 amit.gupta 583
 
25584 amit.gupta 584
	public void processScheme(boolean dryRun) throws Exception {
24256 amit.gupta 585
		LocalDateTime fromDate = LocalDateTime.now().minusDays(30);
25584 amit.gupta 586
		processScheme(fromDate, LocalDateTime.now(), dryRun);
24256 amit.gupta 587
	}
24271 amit.gupta 588
 
25584 amit.gupta 589
	public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
23724 amit.gupta 590
		LOGGER.info("Started execution at {}", LocalDateTime.now());
25312 amit.gupta 591
		System.out.println(
592
				"InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
24561 amit.gupta 593
		try {
24587 amit.gupta 594
			List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
595
			for (Purchase purchase : purchases) {
596
				schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
597
			}
24271 amit.gupta 598
 
24587 amit.gupta 599
			List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
600
			for (FofoOrder fofoOrder : fofoOrders) {
601
				schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
602
			}
603
		} catch (Exception e) {
24561 amit.gupta 604
			e.printStackTrace();
24565 amit.gupta 605
			throw e;
24561 amit.gupta 606
		}
25312 amit.gupta 607
		List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
608
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
25043 amit.gupta 609
		System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
25312 amit.gupta 610
		for (UserWalletHistory uwh : uwhs) {
611
			System.out.println(String.format("%d\t%d\t%s\t%s\t%s", uwh.getAmount(), uwh.getReference(),
612
					uwh.getReferenceType(), uwh.getTimestamp().toString(), uwh.getDescription()));
25043 amit.gupta 613
		}
23724 amit.gupta 614
		LOGGER.info("Schemes process successfully.");
25598 amit.gupta 615
		if (dryRun) {
25584 amit.gupta 616
			throw new Exception();
617
		}
23724 amit.gupta 618
	}
23929 amit.gupta 619
 
23739 amit.gupta 620
	public void processRechargeCashback() throws Throwable {
23761 amit.gupta 621
		LocalDateTime cashbackTime = LocalDateTime.now();
23929 amit.gupta 622
		int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
623
		List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository
624
				.getPendingCashBackRehargeTransactions();
625
		Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
626
				Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
627
		for (Map.Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
628
			int retailerId = (Integer) totalRetailerCashback.getKey();
23739 amit.gupta 629
			float amount = totalRetailerCashback.getValue().floatValue();
23929 amit.gupta 630
			if (Math.round(amount) > 0) {
631
				walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK,
632
						"Recharge Cashback", Math.round(amount));
23762 amit.gupta 633
			}
23739 amit.gupta 634
		}
23929 amit.gupta 635
		for (RechargeTransaction rt : pendingTransactions) {
23761 amit.gupta 636
			rt.setCashbackTimestamp(cashbackTime);
637
			rt.setCashbackReference(referenceId);
638
			rechargeTransactionRepository.persist(rt);
639
		}
23739 amit.gupta 640
		LOGGER.info("Cashbacks for Recharge processed Successfully");
641
	}
23724 amit.gupta 642
 
25598 amit.gupta 643
	private class SaleRoles {
644
 
645
		private List<String> l1;
646
		private List<String> l2;
647
 
648
		public SaleRoles() {
649
			l1 = new ArrayList<>();
650
			l2 = new ArrayList<>();
651
		}
652
 
653
		public List<String> getL1() {
654
			return l1;
655
		}
656
 
657
		public void setL1(List<String> l1) {
658
			this.l1 = l1;
659
		}
660
 
661
		public List<String> getL2() {
662
			return l2;
663
		}
664
 
665
		public void setL2(List<String> l2) {
666
			this.l2 = l2;
667
		}
668
 
669
	}
670
 
24271 amit.gupta 671
	public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
25312 amit.gupta 672
		if (sendTo == null) {
25341 amit.gupta 673
			sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com",
25509 tejbeer 674
					"amit.gupta@shop2020.in", "amod.sen@smartdukaan.com");
25312 amit.gupta 675
		}
24277 amit.gupta 676
		LocalDate yesterDay = LocalDate.now().minusDays(1);
25267 amit.gupta 677
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
23929 amit.gupta 678
		Map<Integer, CustomRetailer> customRetailerMap = retailerService
679
				.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25351 tejbeer 680
 
25598 amit.gupta 681
		List<String> headers = Arrays.asList("Code", "Firm Name", "Store Name", "State Manager", "Teritory/Team Lead",
682
				"Wallet Amount", "In Stock Amount", "Return In Transit Stock", "Unbilled Amount", "Grn Pending Amount",
683
				"Min Investment", "Investment Amount", "Investment Short", "Unbilled Qty");
24807 amit.gupta 684
		List<List<? extends Serializable>> rows = new ArrayList<>();
25312 amit.gupta 685
		Map<String, List<? extends Serializable>> partnerRow = new HashMap<>();
25598 amit.gupta 686
 
687
		Map<String, SaleRoles> partnerEmailSalesMap = this.getPartnerEmailSalesMap();
688
 
24002 amit.gupta 689
		for (FofoStore fofoStore : fofoStores) {
25598 amit.gupta 690
			PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoStore.getId(),
691
					1);
692
			partnerDailyInvestment.setDate(yesterDay);
693
			try {
694
				partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
695
			} catch (Exception e) {
696
				// ignore the exceptions during persist
697
			}
698
 
24002 amit.gupta 699
			CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
25598 amit.gupta 700
			if (retailer == null || partnerEmailSalesMap.get(retailer.getEmail()) == null) {
24002 amit.gupta 701
				LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
702
				continue;
703
			}
24533 govind 704
 
25351 tejbeer 705
			List<? extends Serializable> row = Arrays.asList(fofoStore.getCode(), retailer.getBusinessName(),
706
					"SmartDukaan-" + fofoStore.getCode().replaceAll("[a-zA-Z]+", ""),
25598 amit.gupta 707
					StringUtils.join(partnerEmailSalesMap.get(retailer.getEmail()).getL2(), ", "),
25605 amit.gupta 708
					StringUtils.join(partnerEmailSalesMap.get(retailer.getEmail()).getL1(), ", "),
25598 amit.gupta 709
					partnerDailyInvestment.getWalletAmount(), partnerDailyInvestment.getInStockAmount(), 0,
710
					partnerDailyInvestment.getUnbilledAmount(), partnerDailyInvestment.getGrnPendingAmount(),
711
					partnerDailyInvestment.getMinInvestment(), partnerDailyInvestment.getTotalInvestment(),
712
					partnerDailyInvestment.getShortInvestment(), partnerDailyInvestment.getUnbilledQty());
25312 amit.gupta 713
			partnerRow.put(retailer.getEmail(), row);
24002 amit.gupta 714
			rows.add(row);
715
 
23929 amit.gupta 716
		}
25312 amit.gupta 717
 
24271 amit.gupta 718
		String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25598 amit.gupta 719
 
720
		for (Map.Entry<String, Set<String>> storeGuyEntry : csService.getAuthUserPartnerEmailMapping().entrySet()) {
25604 amit.gupta 721
			List<List<? extends Serializable>> filteredRows = storeGuyEntry.getValue().stream()
722
					.map(x -> partnerRow.get(x)).filter(x -> x != null).collect(Collectors.toList());
25312 amit.gupta 723
			ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
25609 amit.gupta 724
			String[] sendToArray = new String[] { storeGuyEntry.getKey() };
725
			Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
25604 amit.gupta 726
					fileName, new ByteArrayResource(baos.toByteArray()));
25341 amit.gupta 727
		}
25312 amit.gupta 728
 
25604 amit.gupta 729
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
730
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
25609 amit.gupta 731
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
732
				fileName, new ByteArrayResource(baos.toByteArray()));
24271 amit.gupta 733
 
23929 amit.gupta 734
	}
24177 govind 735
 
25598 amit.gupta 736
	private Map<String, SaleRoles> getPartnerEmailSalesMap() {
737
		Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
738
 
739
		List<Position> positions = positionRepository
740
				.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
741
		Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream()
742
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
743
		Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
744
		for (Position position : positions) {
745
			List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
25609 amit.gupta 746
			if (crList == null)
747
				continue;
25598 amit.gupta 748
			for (CustomRetailer cr : crList) {
749
				if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
750
					partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
751
				}
752
				SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
753
				AuthUser authUser = authUsersMap.get(position.getAuthUserId());
754
				String name = authUser.getFirstName() + " " + authUser.getLastName();
755
				if (position.getEscalationType().equals(EscalationType.L1)) {
756
					saleRoles.getL1().add(name);
757
				} else if (position.getEscalationType().equals(EscalationType.L2)) {
758
					saleRoles.getL2().add(name);
759
				}
760
			}
761
		}
762
		return partnerEmailSalesMap;
763
	}
764
 
24271 amit.gupta 765
	public void sendPartnerInvestmentDetails() throws Exception {
25565 amit.gupta 766
		this.sendPartnerInvestmentDetails(null);
24271 amit.gupta 767
 
768
	}
769
 
25312 amit.gupta 770
	public void sendTargetVsSalesReport(List<String> sendTo) throws Exception {
24177 govind 771
 
25312 amit.gupta 772
		if (sendTo == null) {
25341 amit.gupta 773
			sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com",
25509 tejbeer 774
					"amit.gupta@shop2020.in", "amod.sen@smartdukaan.com");
25312 amit.gupta 775
		}
24177 govind 776
		List<PartnerTargetDetails> partnerTargetDetails = partnerTargetRepository
25373 amit.gupta 777
				.selectAllGeEqAndLeEqStartDateAndEndDate(LocalDateTime.now().minusDays(1));
25312 amit.gupta 778
		Map<String, List<? extends Serializable>> partnerSalesTargetRowsMap = new HashMap<>();
24177 govind 779
		for (PartnerTargetDetails partnerTargetDetail : partnerTargetDetails) {
25312 amit.gupta 780
			partnerSalesTargetRowsMap.putAll(targetService.getDailySaleReportVsTarget(partnerTargetDetail));
24174 govind 781
		}
25315 amit.gupta 782
		Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream()
783
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
784
 
25312 amit.gupta 785
		Map<Integer, CustomRetailer> customRetailerMap = retailerService
25315 amit.gupta 786
				.getFofoRetailers(new ArrayList<>(fofoStoresMap.keySet()));
24177 govind 787
 
25315 amit.gupta 788
		Map<String, CustomRetailer> customRetailerEmailMap = customRetailerMap.values().stream()
789
				.collect(Collectors.toMap(x -> x.getEmail(), x -> x));
25609 amit.gupta 790
 
25598 amit.gupta 791
		Map<String, SaleRoles> partnerEmailSalesMap = this.getPartnerEmailSalesMap();
25315 amit.gupta 792
 
25598 amit.gupta 793
		List<String> headers = Arrays.asList("Code", "Firm Name", "Store Name", "Current Category", "State Manager",
794
				"Teritory Manager", "Team Leader", "Targeted Category", "Targeted Value", "Target Achieved",
795
				"Achived Percentage", "Remaining Target", "Today's Target", "Today's achievement");
24177 govind 796
 
25312 amit.gupta 797
		List<List<? extends Serializable>> rows = new ArrayList<>();
798
		Map<String, List<Serializable>> partnerRowMap = new HashMap<>();
25315 amit.gupta 799
		for (Map.Entry<String, List<? extends Serializable>> partnerSalesTargetRowEntry : partnerSalesTargetRowsMap
800
				.entrySet()) {
801
			CustomRetailer retailer = customRetailerEmailMap.get(partnerSalesTargetRowEntry.getKey());
802
			FofoStore fofoStore = fofoStoresMap.get(retailer.getPartnerId());
25312 amit.gupta 803
			Serializable code = fofoStore.getCode();
25345 amit.gupta 804
			Serializable storeName = "SmartDukaan-" + fofoStore.getCode().replaceAll("[a-zA-Z]", "");
25314 amit.gupta 805
			Serializable businessName = retailer.getBusinessName();
25317 amit.gupta 806
			try {
25609 amit.gupta 807
				Serializable stateManager = StringUtils.join(partnerEmailSalesMap.get(retailer.getEmail()).getL2(),
808
						", ");
809
				Serializable territoryManager = StringUtils.join(partnerEmailSalesMap.get(retailer.getEmail()).getL1(),
810
						", ");
25317 amit.gupta 811
				List<Serializable> row = new ArrayList<>(
25598 amit.gupta 812
						Arrays.asList(code, businessName, storeName, stateManager, territoryManager));
25317 amit.gupta 813
				if (partnerSalesTargetRowsMap.get(retailer.getEmail()) != null) {
25323 amit.gupta 814
					row.addAll(partnerSalesTargetRowsMap.get(retailer.getEmail()));
25317 amit.gupta 815
					partnerRowMap.put(retailer.getEmail(), row);
816
					rows.add(row);
817
				}
25351 tejbeer 818
			} catch (Exception e) {
25317 amit.gupta 819
				LOGGER.warn("Could not find partner with email - {}", retailer.getEmail());
25315 amit.gupta 820
			}
25312 amit.gupta 821
 
24177 govind 822
		}
25503 amit.gupta 823
 
25318 amit.gupta 824
		String fileName = "TargetVsSales-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25597 amit.gupta 825
		for (Map.Entry<String, Set<String>> storeGuyEntry : csService.getAuthUserPartnerEmailMapping().entrySet()) {
25312 amit.gupta 826
			List<List<? extends Serializable>> filteredRows = storeGuyEntry.getValue().stream()
25351 tejbeer 827
					.map(x -> partnerRowMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
25312 amit.gupta 828
			ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
25595 amit.gupta 829
			String[] sendToArray = new String[] { storeGuyEntry.getKey() };
25312 amit.gupta 830
			Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Target vs Sales Summary", "PFA",
831
					fileName, new ByteArrayResource(baos.toByteArray()));
25341 amit.gupta 832
		}
24240 amit.gupta 833
 
25312 amit.gupta 834
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
835
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
836
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Target vs Sales Summary", "PFA", fileName,
837
				new ByteArrayResource(baos.toByteArray()));
24174 govind 838
	}
24683 amit.gupta 839
 
24697 amit.gupta 840
	public void sendAgeingReport(String... sendTo) throws Exception {
24692 amit.gupta 841
 
842
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW,
843
				"itemstockageing.xml");
24708 amit.gupta 844
		InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
24754 amit.gupta 845
				"ItemwiseOverallPendingIndent.xml");
24683 amit.gupta 846
		Attachment attachment = new Attachment(
25445 amit.gupta 847
				"ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
24707 amit.gupta 848
		Attachment attachment1 = new Attachment(
25445 amit.gupta 849
				"pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
25418 amit.gupta 850
 
25609 amit.gupta 851
		Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA",
852
				attachment);
853
		Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null,
854
				"Itemwise Pending indent", "PFA", attachment1);
855
 
25598 amit.gupta 856
		// Reports to be sent to mapped partners
25597 amit.gupta 857
		Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
25503 amit.gupta 858
 
859
		for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
25418 amit.gupta 860
			Map<String, String> params = new HashMap<>();
25503 amit.gupta 861
			if (storeGuyEntry.getValue().size() == 0)
862
				continue;
25418 amit.gupta 863
			params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
864
			InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
865
					"focostockreport.xml", params);
866
			Attachment attache = new Attachment(
25609 amit.gupta 867
					"Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
25584 amit.gupta 868
			System.out.println(storeGuyEntry.getValue());
25609 amit.gupta 869
			Utils.sendMailWithAttachments(googleMailSender, new String[] { storeGuyEntry.getKey() }, null,
870
					"Franchise Stock Report", "PFA", attache);
25418 amit.gupta 871
		}
25503 amit.gupta 872
 
24681 amit.gupta 873
	}
24533 govind 874
 
24697 amit.gupta 875
	public void sendAgeingReport() throws Exception {
25503 amit.gupta 876
		sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
25609 amit.gupta 877
				"chaitnaya.vats@smartdukaan.com");
24697 amit.gupta 878
	}
879
 
24533 govind 880
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 881
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 882
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 883
			priceDropService.priceDropStatus(priceDrop.getId());
884
		}
885
	}
23929 amit.gupta 886
 
24542 amit.gupta 887
	public void walletmismatch() throws Exception {
888
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 889
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 890
		System.out.println(pdis.size());
24542 amit.gupta 891
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 892
			int fofoId = pdi.getFofoId();
24542 amit.gupta 893
			for (PartnerDailyInvestment investment : Lists
894
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 895
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 896
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 897
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 898
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
899
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 900
 
24542 amit.gupta 901
			}
24549 amit.gupta 902
		}
24542 amit.gupta 903
 
904
	}
905
 
906
	public void gst() throws Exception {
24548 amit.gupta 907
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2019, 1, 26).atStartOfDay(),
908
				LocalDate.of(2019, 1, 27).atTime(LocalTime.MAX));
909
		for (FofoOrder fofoOrder : fofoOrders) {
910
			int retailerAddressId = retailerRegisteredAddressRepository
911
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 912
 
913
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
914
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
915
			Integer stateId = null;
916
			if (customerAddress.getState().equals(retailerAddress.getState())) {
917
				try {
918
					stateId = Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
919
				} catch (Exception e) {
920
					LOGGER.error("Unable to get state rates");
921
				}
922
			}
923
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
924
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 925
 
926
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
927
			Set<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
24542 amit.gupta 928
			if (stateId != null) {
929
				itemIdStateTaxRateMap = Utils.getStateTaxRate(new ArrayList<>(itemIds), stateId);
930
			} else {
931
				itemIdIgstTaxRateMap = Utils.getIgstTaxRate(new ArrayList<>(itemIds));
932
			}
933
 
24548 amit.gupta 934
			for (FofoOrderItem foi : fofoOrderItems) {
24542 amit.gupta 935
				if (stateId == null) {
936
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
937
				} else {
938
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
939
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
940
				}
941
				fofoOrderItemRepository.persist(foi);
942
			}
943
		}
24548 amit.gupta 944
 
24542 amit.gupta 945
	}
946
 
24580 amit.gupta 947
	public void schemewalletmismatch() {
948
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 949
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 950
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 951
			// reconcileOrders(dateTime);
952
			// reconcileRecharges(dateTime);
24580 amit.gupta 953
			dateToReconcile = dateToReconcile.plusDays(1);
954
		}
955
	}
956
 
957
	private void reconcileSchemes(LocalDate date) {
958
		LocalDateTime startDate = date.atStartOfDay();
959
		LocalDateTime endDate = startDate.plusDays(1);
960
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
961
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 962
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
963
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 964
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 965
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
966
				WalletReferenceType.SCHEME_OUT);
967
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
968
				walletReferenceTypes);
969
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
970
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 971
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 972
 
973
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
974
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
975
 
976
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
977
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
978
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
979
 
980
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
981
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
982
 
983
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
984
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
985
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
986
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
987
 
988
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
989
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeMap.entrySet()) {
990
			}
991
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
992
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
993
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
994
				} else {
995
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
996
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
997
				}
998
			}
24590 amit.gupta 999
			Map<Integer, Integer> userWalletMap = userWalletRepository
1000
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1001
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1002
 
24587 amit.gupta 1003
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1004
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1005
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1006
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1007
				if (diff > 5) {
1008
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1009
				}
1010
			}
24580 amit.gupta 1011
		}
24587 amit.gupta 1012
 
24580 amit.gupta 1013
	}
24590 amit.gupta 1014
 
24592 amit.gupta 1015
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1016
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1017
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1018
 
24592 amit.gupta 1019
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1020
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1021
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1022
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1023
		Set<String> serialNumbersConsidered = new HashSet<>();
1024
 
25096 amit.gupta 1025
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1026
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1027
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1028
 
24683 amit.gupta 1029
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1030
		purchases.stream().forEach(purchase -> {
1031
			float amountToRollback = 0;
1032
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1033
					+ purchase.getPurchaseReference();
1034
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1035
					.stream().filter(ii -> ii.getSerialNumber() != null)
1036
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1037
			if (inventorySerialNumberMap.size() > 0) {
1038
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1039
					String serialNumber = inventorySerialNumberEntry.getValue();
1040
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1041
					if (serialNumbersConsidered.contains(serialNumber)) {
1042
						// This will rollback scheme for differenct orders for same serial
1043
						List<SchemeInOut> sios = schemeInOutRepository
1044
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1045
								.filter(x -> x.getRolledBackTimestamp() == null
1046
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1047
								.collect(Collectors.toList());
1048
						Collections.reverse(sios);
1049
						for (SchemeInOut sio : sios) {
1050
							sio.setRolledBackTimestamp(LocalDateTime.now());
1051
							amountToRollback += sio.getAmount();
1052
							// sio.setSchemeType(SchemeType.OUT);
1053
							sio.setSerialNumber(serialNumber);
1054
							rolledbackSios.add(sio);
1055
						}
1056
						description = description.concat(" " + serialNumber + " ");
1057
					} else {
1058
						serialNumbersConsidered.add(serialNumber);
1059
						List<Integer> schemesConsidered = new ArrayList<>();
1060
						List<SchemeInOut> sios = schemeInOutRepository
1061
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1062
								.filter(x -> x.getRolledBackTimestamp() == null
1063
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1064
								.collect(Collectors.toList());
1065
						Collections.reverse(sios);
1066
						for (SchemeInOut sio : sios) {
1067
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1068
								schemesConsidered.add(sio.getSchemeId());
1069
								continue;
1070
							}
1071
							sio.setRolledBackTimestamp(LocalDateTime.now());
1072
							amountToRollback += sio.getAmount();
1073
							// sio.setSchemeType(SchemeType.OUT);
1074
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1075
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1076
							sio.setReference(purchase.getId());
24635 amit.gupta 1077
							rolledbackSios.add(sio);
1078
						}
1079
					}
1080
 
1081
				}
1082
			}
1083
			if (amountToRollback > 0) {
24683 amit.gupta 1084
				// Address address =
1085
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1086
				UserWalletHistory uwh = new UserWalletHistory();
1087
				uwh.setAmount(Math.round(amountToRollback));
1088
				uwh.setDescription(description);
1089
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1090
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1091
				uwh.setReference(purchase.getId());
1092
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1093
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1094
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1095
				userWalletHistory.add(uwh);
1096
			}
1097
		});
1098
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1099
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1100
						"Timestamp"),
1101
				userWalletHistory.stream()
1102
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1103
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1104
						.collect(Collectors.toList()));
1105
 
1106
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1107
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1108
						"Created", "Rolledback"),
24635 amit.gupta 1109
				rolledbackSios.stream()
24681 amit.gupta 1110
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1111
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1112
						.collect(Collectors.toList()));
1113
 
25043 amit.gupta 1114
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1115
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 1116
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 1117
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1118
 
25096 amit.gupta 1119
		throw new Exception();
24635 amit.gupta 1120
 
1121
	}
1122
 
1123
	public void dryRunOutSchemeReco() throws Exception {
1124
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1125
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1126
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1127
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1128
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1129
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1130
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1131
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1132
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1133
		// Collections.reverse(allOrders);
1134
		// List<FofoOrder> allOrders =
24653 govind 1135
		// List<FofoOrder> allOrders =
24631 amit.gupta 1136
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1137
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1138
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1139
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1140
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1141
			float amountToRollback = 0;
24590 amit.gupta 1142
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1143
			orderItems.forEach(x -> {
24606 amit.gupta 1144
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1145
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1146
			});
24606 amit.gupta 1147
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1148
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1149
					String serialNumber = inventorySerialNumberEntry.getValue();
1150
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1151
					if (serialNumbersConsidered.contains(serialNumber)) {
1152
						// This will rollback scheme for differenct orders for same serial
1153
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1154
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1155
								.filter(x -> x.getRolledBackTimestamp() == null
1156
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1157
								.collect(Collectors.toList());
1158
						Collections.reverse(sios);
1159
						for (SchemeInOut sio : sios) {
1160
							sio.setRolledBackTimestamp(LocalDateTime.now());
1161
							amountToRollback += sio.getAmount();
1162
							// sio.setSchemeType(SchemeType.OUT);
1163
							sio.setSerialNumber(serialNumber);
1164
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1165
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1166
							rolledbackSios.add(sio);
24623 amit.gupta 1167
						}
24635 amit.gupta 1168
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1169
					} else {
1170
						serialNumbersConsidered.add(serialNumber);
1171
						List<Integer> schemesConsidered = new ArrayList<>();
1172
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1173
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1174
								.filter(x -> x.getRolledBackTimestamp() == null
1175
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1176
								.collect(Collectors.toList());
1177
						Collections.reverse(sios);
1178
						for (SchemeInOut sio : sios) {
1179
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1180
								schemesConsidered.add(sio.getSchemeId());
1181
								continue;
1182
							}
1183
							sio.setRolledBackTimestamp(LocalDateTime.now());
1184
							amountToRollback += sio.getAmount();
1185
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1186
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1187
							sio.setSerialNumber(serialNumber);
1188
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1189
							rolledbackSios.add(sio);
1190
						}
24615 amit.gupta 1191
					}
24631 amit.gupta 1192
 
24604 amit.gupta 1193
				}
24590 amit.gupta 1194
			}
24631 amit.gupta 1195
			if (amountToRollback > 0) {
1196
				UserWalletHistory uwh = new UserWalletHistory();
1197
				uwh.setAmount(Math.round(amountToRollback));
1198
				uwh.setDescription(description);
1199
				uwh.setTimestamp(LocalDateTime.now());
1200
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1201
				uwh.setReference(fofoOrder.getId());
1202
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1203
				uwh.setFofoId(fofoOrder.getFofoId());
1204
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1205
				userWalletHistory.add(uwh);
1206
			}
24590 amit.gupta 1207
		});
24598 amit.gupta 1208
 
24592 amit.gupta 1209
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1210
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1211
						"Timestamp"),
1212
				userWalletHistory.stream()
1213
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1214
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1215
						.collect(Collectors.toList()));
1216
 
1217
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1218
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1219
						"Rolledback"),
1220
				rolledbackSios.stream()
1221
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1222
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1223
						.collect(Collectors.toList()));
1224
 
25043 amit.gupta 1225
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1226
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1227
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1228
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1229
 
25267 amit.gupta 1230
		throw new Exception();
24590 amit.gupta 1231
	}
24615 amit.gupta 1232
 
24611 amit.gupta 1233
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1234
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1235
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1236
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1237
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1238
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1239
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1240
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1241
		references.stream().forEach(reference -> {
1242
			FofoOrder fofoOrder = null;
1243
			try {
1244
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1245
			} catch (Exception e) {
1246
 
24611 amit.gupta 1247
			}
1248
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1249
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1250
			float amountToRollback = 0;
1251
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1252
			orderItems.forEach(x -> {
1253
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1254
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1255
			});
1256
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1257
				List<SchemeInOut> sios = schemeInOutRepository
1258
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1259
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1260
						.collect(Collectors.toList());
1261
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1262
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1263
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1264
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1265
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1266
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1267
					if (outList.size() > 1) {
1268
 
24611 amit.gupta 1269
					}
1270
				}
1271
				uwh.setAmount(Math.round(amountToRollback));
1272
				uwh.setDescription(description);
1273
				uwh.setTimestamp(LocalDateTime.now());
1274
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1275
				uwh.setReference(fofoOrder.getId());
1276
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1277
				uwh.setFofoId(fofoOrder.getFofoId());
1278
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1279
				userWalletHistory.add(uwh);
1280
			}
1281
		});
24615 amit.gupta 1282
 
24611 amit.gupta 1283
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1284
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1285
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1286
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1287
						.collect(Collectors.toList()));
1288
 
24611 amit.gupta 1289
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1290
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1291
						"Rolledback"),
1292
				rolledbackSios.stream()
24615 amit.gupta 1293
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1294
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1295
						.collect(Collectors.toList()));
1296
 
24623 amit.gupta 1297
		Utils.sendMailWithAttachments(googleMailSender,
1298
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1299
				"Partner Excess Amount", "PFA",
1300
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1301
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1302
 
24628 amit.gupta 1303
		throw new Exception();
24615 amit.gupta 1304
 
24611 amit.gupta 1305
	}
24615 amit.gupta 1306
 
24855 amit.gupta 1307
	public void sendDailySalesReportNotificationToPartner(Integer fofoIdInt)
24653 govind 1308
			throws ProfitMandiBusinessException, MessagingException, IOException {
1309
		LocalDateTime now = LocalDateTime.now();
1310
		LocalDateTime from = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), 00, 00);
1311
		Map<Integer, Double> salesByFofoIdMap = new HashMap<>();
24855 amit.gupta 1312
		List<Integer> fofoIds = null;
25043 amit.gupta 1313
		if (fofoIdInt == null) {
1314
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1315
					.collect(Collectors.toList());
24856 amit.gupta 1316
		} else {
24855 amit.gupta 1317
			fofoIds = Arrays.asList(fofoIdInt);
1318
		}
24653 govind 1319
		List<PartnerTargetDetails> partnerTargetDetails = partnerTargetRepository
1320
				.selectAllGeEqAndLeEqStartDateAndEndDate(now);
24683 amit.gupta 1321
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h a");
1322
 
1323
		Map<Integer, Float> dailyTarget = new HashMap<>();
24653 govind 1324
		for (Integer fofoId : fofoIds) {
24683 amit.gupta 1325
			Map<Integer, Float> dailyAverageSale = null;
24653 govind 1326
			double sale = fofoOrderRepository.selectTotalSaleSumByFofoIdBrtweenDate(fofoId, from, now);
1327
			for (PartnerTargetDetails partnerTargetDetail : partnerTargetDetails) {
1328
				Map<Integer, Float> targetValues = targetService.getTargetValueByFofoIdAndTargetId(fofoId,
1329
						partnerTargetDetail.getId());
1330
				if (targetValues.size() == 0) {
1331
					continue;
1332
				} else {
1333
					List<Integer> partnerIds = new ArrayList<>();
1334
					partnerIds.add(fofoId);
1335
					dailyAverageSale = targetService.getDailyAverageSaleForCurrentForSingleFofoIdAndBrand(partnerIds,
1336
							targetValues, partnerTargetDetail.getStartDate(), partnerTargetDetail.getEndDate(),
1337
							partnerTargetDetail.getBrandName());
1338
					dailyTarget.put(fofoId, dailyAverageSale.get(fofoId));
1339
					break;
1340
				}
1341
			}
1342
			NotificationCampaigns notification = new NotificationCampaigns();
24847 amit.gupta 1343
			notification.setName("Daily Sales");
1344
			notification.setTitle("Daily Sale Update");
24683 amit.gupta 1345
			if (dailyAverageSale != null && dailyAverageSale.get(fofoId) != null) {
24864 amit.gupta 1346
				notification.setMessage(String.format("Rs.%.0f till %s. Today's Target is Rs.%.0f", sale,
24847 amit.gupta 1347
						now.format(timeFormatter), dailyAverageSale.get(fofoId)));
24683 amit.gupta 1348
			} else {
25043 amit.gupta 1349
				notification.setMessage(String.format("Rs.%.0f till %s", sale, now.format(timeFormatter)));
24653 govind 1350
			}
24683 amit.gupta 1351
			// notification.setMessage("Your sale is "+salesbyfofoId.get(fofoId));
24989 tejbeer 1352
			notification.setType("url");
24863 govind 1353
			notification.setUrl("http://app.profitmandi.com/pages/home/notifications");
24683 amit.gupta 1354
			LOGGER.info("UserID" + userAccountRepository.selectUserIdByRetailerId(fofoId));
1355
			notification.setSql("SELECT distinct d1.user_id from devices d1 left join devices d2 on"
1356
					+ "(d1.imeinumber = d2.imeinumber and d1.created < d2.created) "
1357
					+ " where d2.id is null and d1.user_id = "
1358
					+ userAccountRepository.selectUserIdByRetailerId(fofoId));
24676 govind 1359
			LOGGER.info("SELECT distinct d1.user_id from devices d1 left join devices d2 on"
24683 amit.gupta 1360
					+ "(d1.imeinumber = d2.imeinumber and d1.created < d2.created) "
1361
					+ " where d2.id is null and d1.user_id = "
1362
					+ userAccountRepository.selectUserIdByRetailerId(fofoId));
24667 govind 1363
			notification.setExpiresat(LocalDateTime.now().plusDays(1).toEpochSecond(ZoneOffset.UTC) * 1000);
24653 govind 1364
			notification.setStatus("active");
1365
			notification.setSmsprocessed(0);
1366
			notification.setNotification_processed(0);
1367
			notification.setNotification_type("GENERAL_NOTIFICATION");
24657 govind 1368
			mongoClient.persistNotificationCmpInfo(notification);
24653 govind 1369
			salesByFofoIdMap.put(fofoId, sale);
1370
			LOGGER.info(sale);
1371
		}
24683 amit.gupta 1372
		String saleReport = this.getDailySalesReportByPartnerId(salesByFofoIdMap, dailyTarget);
24653 govind 1373
		LOGGER.info(saleReport);
1374
		String cc[] = { "Tarun.verma@smartdukaan.com", "Kamini.sharma@smartdukaan.com",
24697 amit.gupta 1375
				"chaitnaya.vats@smartdukaan.com", "adeel.yazdani@smartdukaan.com", "mohinder.mutreja@smartdukaan.com" };
24653 govind 1376
		String subject = "sale report till" + " " + now.format(timeFormatter);
24677 govind 1377
		this.sendMailOfHtmlFomat("amod.sen@smartdukaan.com", saleReport, cc, subject);
24653 govind 1378
	}
1379
 
24683 amit.gupta 1380
	public String getDailySalesReportByPartnerId(Map<Integer, Double> salesByFofoIdMap, Map<Integer, Float> dailyTarget)
24653 govind 1381
			throws ProfitMandiBusinessException {
1382
		StringBuilder sb = new StringBuilder();
1383
		sb.append("<html><body><p>Sale Report:</p><br/><table style='border:1px solid black ;padding: 5px';>");
1384
		sb.append("<tbody>\n" + "	    				<tr>\n"
1385
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner</th>\n"
1386
				+ "	    					<th style='border:1px solid black;padding: 5px'>Daily Target</th>\n"
1387
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>\n"
1388
				+ "	    				</tr>");
1389
		for (Integer fofoId : salesByFofoIdMap.keySet()) {
25043 amit.gupta 1390
			try {
1391
				String PartnerName = retailerService.getFofoRetailer(fofoId).getBusinessName();
1392
				sb.append("<tr>");
1393
				sb.append("<td style='border:1px solid black;padding: 5px'>" + PartnerName + "</td>");
1394
				if (dailyTarget != null && dailyTarget.get(fofoId) != null) {
1395
					sb.append("<td style='border:1px solid black;padding: 5px'>" + dailyTarget.get(fofoId) + "</td>");
1396
				} else {
1397
					sb.append("<td style='border:1px solid black;padding: 5px'>" + 0.0 + "</td>");
1398
				}
1399
				sb.append("<td style='border:1px solid black;padding: 5px'>" + salesByFofoIdMap.get(fofoId) + "</td>");
24653 govind 1400
 
25043 amit.gupta 1401
				sb.append("</tr>");
1402
			} catch (Exception e) {
24842 govind 1403
				e.printStackTrace();
1404
			}
25043 amit.gupta 1405
 
24653 govind 1406
		}
24683 amit.gupta 1407
 
24653 govind 1408
		sb.append("</tbody></table></body></html>");
1409
		return sb.toString();
1410
	}
24841 govind 1411
 
1412
	private void sendMailOfHtmlFomat(String email, String body, String cc[], String subject)
1413
			throws MessagingException, ProfitMandiBusinessException, IOException {
1414
		MimeMessage message = mailSender.createMimeMessage();
1415
		MimeMessageHelper helper = new MimeMessageHelper(message);
1416
		helper.setSubject(subject);
1417
		helper.setText(body, true);
1418
		helper.setTo(email);
1419
		if (cc != null) {
1420
			helper.setCc(cc);
1421
		}
1422
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
1423
		helper.setFrom(senderAddress);
1424
		mailSender.send(message);
1425
	}
25300 tejbeer 1426
 
25351 tejbeer 1427
	public void sendNotification() throws Exception {
25300 tejbeer 1428
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
1429
		if (!pushNotifications.isEmpty()) {
1430
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 1431
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 1432
				NotificationCampaign notificationCampaign = notificationCampaignRepository
1433
						.selectById(pushNotification.getNotificationCampaignid());
1434
				Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls()
1435
						.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeJsonConverter()).create();
1436
 
1437
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
1438
						SimpleCampaignParams.class);
1439
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 1440
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 1441
				JSONObject json = new JSONObject();
25351 tejbeer 1442
				json.put("to", device.getFcmId());
25300 tejbeer 1443
				JSONObject jsonObj = new JSONObject();
1444
				jsonObj.put("message", campaign.getMessage());
1445
				jsonObj.put("title", campaign.getTitle());
1446
				jsonObj.put("type", campaign.getType());
1447
				jsonObj.put("url", result_url);
1448
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
1449
				jsonObj.put("image", campaign.getImageUrl());
1450
				jsonObj.put("largeIcon", "large_icon");
1451
				jsonObj.put("smallIcon", "small_icon");
1452
				jsonObj.put("vibrate", 1);
1453
				jsonObj.put("pid", pushNotification.getId());
1454
				jsonObj.put("sound", 1);
1455
				jsonObj.put("priority", "high");
1456
				json.put("data", jsonObj);
25351 tejbeer 1457
				try {
1458
					CloseableHttpClient client = HttpClients.createDefault();
1459
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 1460
 
25351 tejbeer 1461
					httpPost.setHeader("Content-Type", "application/json; utf-8");
1462
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
1463
					StringEntity entity = new StringEntity(json.toString());
1464
					httpPost.setEntity(entity);
1465
					CloseableHttpResponse response = client.execute(httpPost);
1466
					LOGGER.info("response" + response);
25300 tejbeer 1467
 
25351 tejbeer 1468
					if (response.getStatusLine().getStatusCode() == 200) {
1469
						pushNotification.setSentTimestamp(LocalDateTime.now());
1470
					} else {
25356 tejbeer 1471
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 1472
						LOGGER.info("message" + "not sent");
25351 tejbeer 1473
					}
25300 tejbeer 1474
 
25351 tejbeer 1475
				} catch (Exception e) {
1476
					e.printStackTrace();
25300 tejbeer 1477
					LOGGER.info("message" + "not sent");
1478
				}
1479
			}
1480
		}
1481
	}
1482
 
25553 amit.gupta 1483
	public void grouping() throws Exception {
25609 amit.gupta 1484
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
1485
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
1486
		System.out.println(String.join("\t",
1487
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 1488
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
25609 amit.gupta 1489
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers();
1490
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 1491
			if (priceDropIMEI.getPartnerId() == 0)
1492
				continue;
25609 amit.gupta 1493
			HashSet<String> imeis = new HashSet<>();
1494
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
1495
			imeis.add(priceDropIMEI.getImei());
1496
			List<InventoryItem> inventoryItems = inventoryItemRepository
1497
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 1498
			if (inventoryItems.size() == 0) {
1499
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 1500
				continue;
25612 amit.gupta 1501
			}
25609 amit.gupta 1502
			InventoryItem inventoryItem = inventoryItems.get(0);
1503
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
1504
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
1505
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
1506
				// check if pricedrop has been rolled out
1507
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
1508
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
1509
				if (uwh.size() > 0) {
25615 amit.gupta 1510
					Item item = itemRepository.selectById(inventoryItem.getItemId());
25609 amit.gupta 1511
					System.out.println(String.join("\t",
1512
							Arrays.asList(priceDropIMEI.getImei(), inventoryItem.getItemId() + "", item.getBrand(),
1513
									item.getModelName(), item.getModelNumber(), inventoryItem.getFofoId() + "",
1514
									customRetailer.getBusinessName(), inventoryItem.getCreateTimestamp().format(dtf),
1515
									priceDrop.getAffectedOn().format(dtf),
1516
									priceDropIMEI.getUpdateTimestamp().format(dtf),
25694 amit.gupta 1517
									inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getPartnerPayout() + "",
25609 amit.gupta 1518
									inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
1519
				}
1520
			}
1521
		}
25598 amit.gupta 1522
		/*
1523
		 * for (FofoStore fofoStore : fofoStoreRepository.selectAll()) {
1524
		 * LOGGER.info("{}, {}", fofoStore.getId(),
1525
		 * partnerTypeChangeService.getTypeOnDate(fofoStore.getId(),
1526
		 * LocalDate.now().plusDays(1))); UserWallet userWallet =
1527
		 * userWalletRepository.selectByRetailerId(fofoStore.getId());
1528
		 * if(userWallet==null) continue;
1529
		 * System.out.printf("Store Code %s, Wallet amount %d, Sum amount %f%n",
1530
		 * fofoStore.getCode(), userWallet.getAmount(),
1531
		 * walletService.getWalletAmount(fofoStore.getId())); }
1532
		 */
25609 amit.gupta 1533
 
1534
		/*
1535
		 * for (Map.Entry<String, Set<String>> storeGuyEntry :
1536
		 * csService.getAuthUserPartnerEmailMapping().entrySet()) {
1537
		 * System.out.println(storeGuyEntry.getKey() + " = " +
1538
		 * storeGuyEntry.getValue()); }
1539
		 */
25503 amit.gupta 1540
	}
25694 amit.gupta 1541
 
1542
	public void testToffee() throws Exception {
25778 amit.gupta 1543
		//LOGGER.info("{}", toffeeService.getAuthToken());
25694 amit.gupta 1544
		LOGGER.info("{}", toffeeService.getProducts());
25778 amit.gupta 1545
		//LOGGER.info("{}", toffeeService.getPincodes("36103000PR"));
1546
		PremiumCalculationRequestModel pcrm = new PremiumCalculationRequestModel();
1547
		pcrm.setProductDetails("36103000PR");
1548
		//pcrm.setProductDetails("36103000PR");
1549
		pcrm.setDurations(Arrays.asList("3 Months", "6 Months", "1 Year"));
1550
		pcrm.setSumInsured("15000");
1551
		System.out.println(toffeeService.getPremiumCalculation(pcrm));
25694 amit.gupta 1552
	}
1553
 
1554
	public void schemeRollback(List<String> schemeIds) throws Exception {
1555
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 1556
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 1557
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1558
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
1559
		for (SchemeInOut sio : schemeInOuts) {
1560
			Scheme scheme = schemesMap.get(sio.getSchemeId());
1561
			if (scheme.getType().equals(SchemeType.IN)) {
1562
 
1563
			} else if (scheme.getType().equals(SchemeType.OUT)) {
1564
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
1565
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
1566
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
1567
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
1568
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
1569
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
1570
					sio.setRolledBackTimestamp(LocalDateTime.now());
1571
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 1572
					String rollbackReason = "Scheme reversed for "
1573
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 1574
							+ fofoOrder.getInvoiceNumber();
1575
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
1576
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason);
1577
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
1578
							rollbackReason);
1579
				}
1580
			}
1581
		}
25721 tejbeer 1582
		// throw new Exception();
25694 amit.gupta 1583
	}
25721 tejbeer 1584
 
1585
	public void checkfocusedModelInPartnerStock() throws Exception {
1586
 
1587
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1588
				.collect(Collectors.toList());
1589
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
1590
		for (Integer fofoId : fofoIds) {
1591
			if (!focusedModelShortageReportMap.containsKey(fofoId)) {
1592
				focusedModelShortageReportMap.put(fofoId, new ArrayList<>());
1593
			}
1594
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
1595
			Map<Integer, Integer> processingOrderMap = null;
1596
			Map<Integer, Integer> catalogIdAndQtyMap = null;
1597
			Map<Integer, Integer> grnPendingOrdersMap = null;
1598
 
1599
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
1600
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
1601
 
1602
			if (!currentInventorySnapshot.isEmpty()) {
1603
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
1604
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1605
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
1606
 
1607
			}
1608
 
1609
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
1610
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1611
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1612
			if (!grnPendingOrders.isEmpty()) {
1613
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
1614
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1615
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
1616
 
1617
			}
1618
 
1619
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
1620
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1621
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1622
			if (!processingOrder.isEmpty()) {
1623
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
1624
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1625
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
1626
 
1627
			}
1628
 
1629
			Map<Integer, Integer> focusedCatalogIdAndQtyMap = focusedModelRepository.selectAll().stream()
1630
					.collect(Collectors.toMap(x -> x.getCatalogId(), x -> x.getMinimumQty()));
1631
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
1632
 
1633
			for (Map.Entry<Integer, Integer> entry : focusedCatalogIdAndQtyMap.entrySet()) {
1634
				int inStockQty = 0;
1635
				int processingQty = 0;
1636
				int grnPendingQty = 0;
1637
				if (processingOrderMap != null) {
1638
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
1639
							: processingOrderMap.get(entry.getKey());
1640
 
1641
				}
1642
				if (grnPendingOrdersMap != null) {
1643
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
1644
							: grnPendingOrdersMap.get(entry.getKey());
1645
 
1646
				}
1647
				if (catalogIdAndQtyMap != null) {
1648
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
1649
							: catalogIdAndQtyMap.get(entry.getKey());
1650
 
1651
				}
1652
				int totalQty = processingQty + grnPendingQty + inStockQty;
1653
 
1654
				if (totalQty < entry.getValue()) {
1655
 
1656
					int shortageQty = entry.getValue() - totalQty;
1657
					List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
1658
 
1659
					FocusedModelShortageModel fm = new FocusedModelShortageModel();
1660
					fm.setFofoId(fofoId);
1661
					fm.setStoreName(customRetailer.getBusinessName());
1662
 
1663
					fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
1664
					fm.setShortageQty(shortageQty);
1665
 
1666
					focusedModelShortageReportMap.get(fofoId).add(fm);
1667
				}
1668
 
1669
			}
1670
			List<FocusedModelShortageModel> focusedModelShortageModel = focusedModelShortageReportMap.get(fofoId);
1671
 
1672
			if (!focusedModelShortageModel.isEmpty()) {
1673
				String subject = "Stock Alert";
1674
				String messageText = this.getMessage(focusedModelShortageModel);
1675
 
25732 tejbeer 1676
				this.sendMailWithAttachments(subject, messageText, customRetailer.getEmail());
25721 tejbeer 1677
				String notificationMessage = this.getNotificationMessage(focusedModelShortageModel);
1678
 
1679
				LOGGER.info("notificationMessage" + notificationMessage);
1680
				SimpleCampaignParams scp = new SimpleCampaignParams();
1681
 
1682
				scp.setTitle("Alert");
1683
				scp.setType("url");
25759 tejbeer 1684
				scp.setUrl("http://app.smartdukaan.com/pages/home/notifications");
25721 tejbeer 1685
				scp.setMessage(notificationMessage);
1686
				scp.setExpireTimestamp(LocalDateTime.now().plusDays(2));
1687
				SimpleCampaign sc = new SimpleCampaign(scp);
1688
				sc.setSimpleCampaignParams(scp);
1689
				LOGGER.info("scp" + scp);
1690
				NotificationCampaign nc = new NotificationCampaign();
1691
				nc.setName("Stock Alert");
1692
				nc.setImplementationType("SimpleCampaign");
1693
				nc.setImplementationParams(gson.toJson(scp));
1694
				nc.setCreatedTimestamp(LocalDateTime.now());
1695
				nc.setMessageType(MessageType.notification);
1696
				notificationCampaignRepository.persist(nc);
1697
				LOGGER.info("nc" + nc);
1698
				LOGGER.info("fofoID" + fofoId);
25732 tejbeer 1699
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
25721 tejbeer 1700
				LOGGER.info("userId" + userId);
1701
 
1702
				UserCampaign uc = new UserCampaign();
1703
				uc.setCampaignId(nc.getId());
1704
				uc.setUserId(userId);
1705
				uc.setPushTimestamp(LocalDateTime.now());
1706
				userCampaignRepository.persist(uc);
1707
				List<Device> devices = deviceRepository.selectByUserIdAndModifiedTimestamp(userId,
1708
						LocalDateTime.now().minusMonths(3), LocalDateTime.now());
1709
				pushNotification(nc.getId(), devices);
1710
 
1711
			}
25732 tejbeer 1712
 
25721 tejbeer 1713
		}
25733 tejbeer 1714
	    if(!focusedModelShortageReportMap.isEmpty()) {
25721 tejbeer 1715
		String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
1716
		Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
1717
		Map<String, List<List<? extends Serializable>>> emailRowsMap = new HashMap<>();
1718
 
1719
		focusedModelShortageReportMap.entrySet().forEach(x -> {
1720
			storeGuyMap.entrySet().forEach(y -> {
1721
 
1722
				if (y.getValue().contains(x.getKey())) {
1723
					if (!emailRowsMap.containsKey(y.getKey())) {
1724
						emailRowsMap.put(y.getKey(), new ArrayList<>());
1725
					}
1726
					List<List<? extends Serializable>> fms = x.getValue().stream().map(
1727
							r -> Arrays.asList(r.getFofoId(), r.getStoreName(), r.getItemName(), r.getShortageQty()))
1728
							.collect(Collectors.toList());
1729
					emailRowsMap.get(y.getKey()).addAll(fms);
1730
 
1731
				}
1732
 
1733
			});
1734
 
1735
		});
1736
 
1737
		List<String> headers = Arrays.asList("Partner Id", "Partner Name", "Model Name", "Shortage Qty");
1738
		emailRowsMap.entrySet().forEach(e -> {
1739
 
1740
			ByteArrayOutputStream baos = null;
1741
			try {
1742
				baos = FileUtil.getCSVByteStream(headers, e.getValue());
1743
			} catch (Exception e2) {
1744
				// TODO Auto-generated catch block
1745
				e2.printStackTrace();
1746
			}
25732 tejbeer 1747
			String[] sendToArray = new String[] { e.getKey() };
25721 tejbeer 1748
			try {
1749
 
1750
				LOGGER.info("email" + e.getKey());
1751
				LOGGER.info("list" + e.getValue());
1752
 
1753
				Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
1754
						new ByteArrayResource(baos.toByteArray()));
1755
			} catch (Exception e1) {
1756
				// TODO Auto-generated catch block
1757
				e1.printStackTrace();
1758
			}
1759
 
1760
		});
25733 tejbeer 1761
	    }
25721 tejbeer 1762
 
1763
	}
1764
 
1765
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
1766
		StringBuilder sb = new StringBuilder();
1767
		sb.append("Focused Model Shortage in Your Stock : \n");
1768
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
1769
 
1770
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
1771
			sb.append(String.format("%n", ""));
1772
		}
1773
		return sb.toString();
1774
	}
1775
 
1776
	public void pushNotification(int cid, List<Device> devices) {
1777
		for (Device device : devices) {
1778
			PushNotifications pn = new PushNotifications();
1779
			pn.setNotificationCampaignid(cid);
1780
			pn.setDeviceId(device.getId());
1781
			pn.setUserId(device.getUser_id());
1782
			pushNotificationRepository.persist(pn);
1783
		}
1784
 
1785
	}
1786
 
1787
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
1788
		MimeMessage message = mailSender.createMimeMessage();
1789
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
1790
 
1791
		helper.setSubject(subject);
1792
		helper.setText(messageText, true);
1793
		helper.setTo(email);
1794
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "ProfitMandi Admin");
1795
		helper.setFrom(senderAddress);
1796
		mailSender.send(message);
1797
 
1798
	}
1799
 
1800
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
1801
		StringBuilder sb = new StringBuilder();
1802
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
1803
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
1804
		sb.append("<tbody>\n" + "	    				<tr>\n"
1805
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
1806
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
1807
				+ "	    				</tr>");
1808
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
1809
 
1810
			sb.append("<tr>");
1811
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
1812
 
1813
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
1814
 
1815
			sb.append("</tr>");
1816
 
1817
		}
1818
 
1819
		sb.append("</tbody></table></body></html>");
1820
 
1821
		return sb.toString();
1822
	}
1823
 
1824
}