Subversion Repositories SmartDukaan

Rev

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