Subversion Repositories SmartDukaan

Rev

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

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