Subversion Repositories SmartDukaan

Rev

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

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