Subversion Repositories SmartDukaan

Rev

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