Subversion Repositories SmartDukaan

Rev

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