Subversion Repositories SmartDukaan

Rev

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