Subversion Repositories SmartDukaan

Rev

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

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