Subversion Repositories SmartDukaan

Rev

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