Subversion Repositories SmartDukaan

Rev

Rev 26344 | Rev 26408 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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