Subversion Repositories SmartDukaan

Rev

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

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