Subversion Repositories SmartDukaan

Rev

Rev 27686 | Rev 27789 | 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) {
27750 amit.gupta 863
			LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
26376 amit.gupta 864
			int fofoId = fofoStore.getId();
26945 amit.gupta 865
			PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
25598 amit.gupta 866
			partnerDailyInvestment.setDate(yesterDay);
26945 amit.gupta 867
 
25598 amit.gupta 868
			try {
869
				partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
26945 amit.gupta 870
				shortDaysMap.put(fofoId,
871
						shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
25598 amit.gupta 872
			} catch (Exception e) {
873
				// ignore the exceptions during persist
874
			}
875
 
24002 amit.gupta 876
			CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
25837 amit.gupta 877
			if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
24002 amit.gupta 878
				LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
879
				continue;
880
			}
26945 amit.gupta 881
			FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
882
			List<Serializable> row = new ArrayList<>();
883
			row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(),
884
					reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
25927 amit.gupta 885
			row.addAll(
886
					Arrays.asList(partnerDailyInvestment.getWalletAmount(), partnerDailyInvestment.getInStockAmount(),
26945 amit.gupta 887
							partnerDailyInvestment.getActivatedStockAmount() == 0 ? "-"
888
									: "(" + partnerDailyInvestment.getActivatedStockAmount() + ")",
25927 amit.gupta 889
							0, partnerDailyInvestment.getUnbilledAmount(), partnerDailyInvestment.getGrnPendingAmount(),
890
							partnerDailyInvestment.getMinInvestment(), partnerDailyInvestment.getTotalInvestment(),
26945 amit.gupta 891
							partnerDailyInvestment.getShortInvestment(), partnerDailyInvestment.getUnbilledQty(),
892
							shortDaysMap.get(fofoId)));
25837 amit.gupta 893
			partnerRowsMap.put(fofoStore.getId(), row);
24002 amit.gupta 894
			rows.add(row);
895
 
23929 amit.gupta 896
		}
25312 amit.gupta 897
 
24271 amit.gupta 898
		String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25598 amit.gupta 899
 
25927 amit.gupta 900
		if (sendTo == null) {
25895 amit.gupta 901
			for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
902
				List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x))
903
						.filter(x -> x != null).collect(Collectors.toList());
904
				ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
905
				String[] sendToArray = new String[] { storeGuyEntry.getKey() };
906
				Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
907
						fileName, new ByteArrayResource(baos.toByteArray()));
908
			}
27210 tejbeer 909
			sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com",
27504 tejbeer 910
					"hemant.kaura@smartdukaan.com", "neeraj.gupta@smartdukaan.com", "amit.gupta@shop2020.in",
27210 tejbeer 911
					"manish.gupta@smartdukaan.com", "niranjan.kala@smartdukaan.com");
25341 amit.gupta 912
		}
25312 amit.gupta 913
 
25604 amit.gupta 914
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
915
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
25609 amit.gupta 916
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
917
				fileName, new ByteArrayResource(baos.toByteArray()));
24271 amit.gupta 918
 
23929 amit.gupta 919
	}
24177 govind 920
 
26945 amit.gupta 921
	private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() {
25598 amit.gupta 922
		Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
923
 
924
		List<Position> positions = positionRepository
925
				.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
926
		Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream()
927
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
928
		Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
929
		for (Position position : positions) {
930
			List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
25609 amit.gupta 931
			if (crList == null)
932
				continue;
25598 amit.gupta 933
			for (CustomRetailer cr : crList) {
934
				if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
935
					partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
936
				}
937
				SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
938
				AuthUser authUser = authUsersMap.get(position.getAuthUserId());
26945 amit.gupta 939
				if (authUser == null) {
26059 amit.gupta 940
					continue;
941
				}
25598 amit.gupta 942
				String name = authUser.getFirstName() + " " + authUser.getLastName();
943
				if (position.getEscalationType().equals(EscalationType.L1)) {
944
					saleRoles.getL1().add(name);
945
				} else if (position.getEscalationType().equals(EscalationType.L2)) {
946
					saleRoles.getL2().add(name);
947
				}
948
			}
949
		}
25837 amit.gupta 950
 
951
		Set<CustomRetailer> allCrList = new HashSet<>();
952
		for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
953
			allCrList.addAll(cr);
954
		}
955
 
956
		Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream()
957
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
958
 
26945 amit.gupta 959
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25837 amit.gupta 960
 
961
		for (CustomRetailer cr : allCrList) {
962
			FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
25927 amit.gupta 963
			if (fofoStore == null) {
25870 amit.gupta 964
				LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
965
				continue;
966
			}
26945 amit.gupta 967
			String code = fofoStore.getCode();
968
			// String storeName = "SmartDukaan-" +
969
			// fofoStore.getCode().replaceAll("[a-zA-Z]", "");
25837 amit.gupta 970
			String businessName = cr.getBusinessName();
971
			try {
972
				String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
973
				String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
26945 amit.gupta 974
				FofoReportingModel reportingModel = new FofoReportingModel();
975
				reportingModel.setBusinessName(businessName);
976
				reportingModel.setCode(code);
977
				reportingModel.setFofoId(fofoStore.getId());
978
				reportingModel.setRegionalManager(stateManager);
979
				reportingModel.setTerritoryManager(territoryManager);
980
				partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
25837 amit.gupta 981
			} catch (Exception e) {
982
				LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
983
			}
984
		}
985
		return partnerIdSalesHeadersMap;
986
 
25598 amit.gupta 987
	}
988
 
24271 amit.gupta 989
	public void sendPartnerInvestmentDetails() throws Exception {
25565 amit.gupta 990
		this.sendPartnerInvestmentDetails(null);
24271 amit.gupta 991
	}
992
 
24697 amit.gupta 993
	public void sendAgeingReport(String... sendTo) throws Exception {
24692 amit.gupta 994
 
995
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW,
996
				"itemstockageing.xml");
24708 amit.gupta 997
		InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
24754 amit.gupta 998
				"ItemwiseOverallPendingIndent.xml");
24683 amit.gupta 999
		Attachment attachment = new Attachment(
25445 amit.gupta 1000
				"ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
24707 amit.gupta 1001
		Attachment attachment1 = new Attachment(
25445 amit.gupta 1002
				"pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
25418 amit.gupta 1003
 
25609 amit.gupta 1004
		Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA",
1005
				attachment);
1006
		Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null,
1007
				"Itemwise Pending indent", "PFA", attachment1);
1008
 
25598 amit.gupta 1009
		// Reports to be sent to mapped partners
25597 amit.gupta 1010
		Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
25503 amit.gupta 1011
 
1012
		for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
25418 amit.gupta 1013
			Map<String, String> params = new HashMap<>();
25503 amit.gupta 1014
			if (storeGuyEntry.getValue().size() == 0)
1015
				continue;
25418 amit.gupta 1016
			params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
1017
			InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1018
					"focostockreport.xml", params);
1019
			Attachment attache = new Attachment(
25609 amit.gupta 1020
					"Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
25584 amit.gupta 1021
			System.out.println(storeGuyEntry.getValue());
25609 amit.gupta 1022
			Utils.sendMailWithAttachments(googleMailSender, new String[] { storeGuyEntry.getKey() }, null,
1023
					"Franchise Stock Report", "PFA", attache);
25418 amit.gupta 1024
		}
25503 amit.gupta 1025
 
24681 amit.gupta 1026
	}
24533 govind 1027
 
24697 amit.gupta 1028
	public void sendAgeingReport() throws Exception {
27210 tejbeer 1029
		sendAgeingReport("kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com", "tarun.verma@smartdukaan.com",
27131 amit.gupta 1030
				"niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com",
26862 amit.gupta 1031
				"hemant.kaura@smartdukaan.com");
24697 amit.gupta 1032
	}
1033
 
24533 govind 1034
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 1035
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 1036
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 1037
			priceDropService.priceDropStatus(priceDrop.getId());
1038
		}
1039
	}
23929 amit.gupta 1040
 
24542 amit.gupta 1041
	public void walletmismatch() throws Exception {
1042
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 1043
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 1044
		System.out.println(pdis.size());
24542 amit.gupta 1045
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 1046
			int fofoId = pdi.getFofoId();
24542 amit.gupta 1047
			for (PartnerDailyInvestment investment : Lists
1048
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 1049
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 1050
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 1051
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 1052
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
1053
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 1054
 
24542 amit.gupta 1055
			}
24549 amit.gupta 1056
		}
24542 amit.gupta 1057
 
1058
	}
1059
 
1060
	public void gst() throws Exception {
24548 amit.gupta 1061
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2019, 1, 26).atStartOfDay(),
1062
				LocalDate.of(2019, 1, 27).atTime(LocalTime.MAX));
1063
		for (FofoOrder fofoOrder : fofoOrders) {
1064
			int retailerAddressId = retailerRegisteredAddressRepository
1065
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 1066
 
1067
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
1068
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1069
			Integer stateId = null;
1070
			if (customerAddress.getState().equals(retailerAddress.getState())) {
1071
				try {
1072
					stateId = Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
1073
				} catch (Exception e) {
1074
					LOGGER.error("Unable to get state rates");
1075
				}
1076
			}
1077
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1078
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 1079
 
1080
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
26929 amit.gupta 1081
			List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
24542 amit.gupta 1082
			if (stateId != null) {
26929 amit.gupta 1083
				itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
24542 amit.gupta 1084
			} else {
26929 amit.gupta 1085
				itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
24542 amit.gupta 1086
			}
1087
 
24548 amit.gupta 1088
			for (FofoOrderItem foi : fofoOrderItems) {
24542 amit.gupta 1089
				if (stateId == null) {
1090
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
1091
				} else {
1092
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1093
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1094
				}
1095
				fofoOrderItemRepository.persist(foi);
1096
			}
1097
		}
24548 amit.gupta 1098
 
24542 amit.gupta 1099
	}
1100
 
24580 amit.gupta 1101
	public void schemewalletmismatch() {
1102
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 1103
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 1104
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 1105
			// reconcileOrders(dateTime);
1106
			// reconcileRecharges(dateTime);
24580 amit.gupta 1107
			dateToReconcile = dateToReconcile.plusDays(1);
1108
		}
1109
	}
1110
 
1111
	private void reconcileSchemes(LocalDate date) {
1112
		LocalDateTime startDate = date.atStartOfDay();
1113
		LocalDateTime endDate = startDate.plusDays(1);
1114
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1115
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 1116
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1117
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 1118
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 1119
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
1120
				WalletReferenceType.SCHEME_OUT);
1121
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
1122
				walletReferenceTypes);
1123
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1124
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 1125
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 1126
 
1127
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
1128
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1129
 
1130
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
1131
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1132
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
1133
 
1134
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
1135
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1136
 
1137
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
1138
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
1139
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
1140
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
1141
 
1142
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
26092 amit.gupta 1143
 
24587 amit.gupta 1144
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1145
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1146
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1147
				} else {
1148
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
1149
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
1150
				}
1151
			}
24590 amit.gupta 1152
			Map<Integer, Integer> userWalletMap = userWalletRepository
1153
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1154
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1155
 
24587 amit.gupta 1156
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1157
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1158
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1159
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1160
				if (diff > 5) {
1161
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1162
				}
1163
			}
24580 amit.gupta 1164
		}
24587 amit.gupta 1165
 
24580 amit.gupta 1166
	}
24590 amit.gupta 1167
 
24592 amit.gupta 1168
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1169
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1170
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1171
 
24592 amit.gupta 1172
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1173
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1174
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1175
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1176
		Set<String> serialNumbersConsidered = new HashSet<>();
1177
 
25096 amit.gupta 1178
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1179
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1180
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1181
 
24683 amit.gupta 1182
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1183
		purchases.stream().forEach(purchase -> {
1184
			float amountToRollback = 0;
1185
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1186
					+ purchase.getPurchaseReference();
1187
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1188
					.stream().filter(ii -> ii.getSerialNumber() != null)
1189
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1190
			if (inventorySerialNumberMap.size() > 0) {
1191
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1192
					String serialNumber = inventorySerialNumberEntry.getValue();
1193
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1194
					if (serialNumbersConsidered.contains(serialNumber)) {
1195
						// This will rollback scheme for differenct orders for same serial
1196
						List<SchemeInOut> sios = schemeInOutRepository
1197
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1198
								.filter(x -> x.getRolledBackTimestamp() == null
1199
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1200
								.collect(Collectors.toList());
1201
						Collections.reverse(sios);
1202
						for (SchemeInOut sio : sios) {
1203
							sio.setRolledBackTimestamp(LocalDateTime.now());
1204
							amountToRollback += sio.getAmount();
1205
							// sio.setSchemeType(SchemeType.OUT);
1206
							sio.setSerialNumber(serialNumber);
1207
							rolledbackSios.add(sio);
1208
						}
1209
						description = description.concat(" " + serialNumber + " ");
1210
					} else {
1211
						serialNumbersConsidered.add(serialNumber);
1212
						List<Integer> schemesConsidered = new ArrayList<>();
1213
						List<SchemeInOut> sios = schemeInOutRepository
1214
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1215
								.filter(x -> x.getRolledBackTimestamp() == null
1216
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1217
								.collect(Collectors.toList());
1218
						Collections.reverse(sios);
1219
						for (SchemeInOut sio : sios) {
1220
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1221
								schemesConsidered.add(sio.getSchemeId());
1222
								continue;
1223
							}
1224
							sio.setRolledBackTimestamp(LocalDateTime.now());
1225
							amountToRollback += sio.getAmount();
1226
							// sio.setSchemeType(SchemeType.OUT);
1227
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1228
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1229
							sio.setReference(purchase.getId());
24635 amit.gupta 1230
							rolledbackSios.add(sio);
1231
						}
1232
					}
1233
 
1234
				}
1235
			}
1236
			if (amountToRollback > 0) {
24683 amit.gupta 1237
				// Address address =
1238
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1239
				UserWalletHistory uwh = new UserWalletHistory();
1240
				uwh.setAmount(Math.round(amountToRollback));
1241
				uwh.setDescription(description);
1242
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1243
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1244
				uwh.setReference(purchase.getId());
1245
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1246
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1247
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1248
				userWalletHistory.add(uwh);
1249
			}
1250
		});
1251
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1252
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1253
						"Timestamp"),
1254
				userWalletHistory.stream()
1255
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1256
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1257
						.collect(Collectors.toList()));
1258
 
1259
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1260
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1261
						"Created", "Rolledback"),
24635 amit.gupta 1262
				rolledbackSios.stream()
24681 amit.gupta 1263
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1264
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1265
						.collect(Collectors.toList()));
1266
 
25043 amit.gupta 1267
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1268
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 1269
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 1270
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1271
 
25096 amit.gupta 1272
		throw new Exception();
24635 amit.gupta 1273
 
1274
	}
1275
 
1276
	public void dryRunOutSchemeReco() throws Exception {
1277
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1278
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1279
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1280
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1281
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1282
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1283
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1284
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1285
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1286
		// Collections.reverse(allOrders);
1287
		// List<FofoOrder> allOrders =
24653 govind 1288
		// List<FofoOrder> allOrders =
24631 amit.gupta 1289
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1290
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1291
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1292
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1293
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1294
			float amountToRollback = 0;
24590 amit.gupta 1295
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1296
			orderItems.forEach(x -> {
24606 amit.gupta 1297
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1298
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1299
			});
24606 amit.gupta 1300
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1301
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1302
					String serialNumber = inventorySerialNumberEntry.getValue();
1303
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1304
					if (serialNumbersConsidered.contains(serialNumber)) {
1305
						// This will rollback scheme for differenct orders for same serial
1306
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1307
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1308
								.filter(x -> x.getRolledBackTimestamp() == null
1309
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1310
								.collect(Collectors.toList());
1311
						Collections.reverse(sios);
1312
						for (SchemeInOut sio : sios) {
1313
							sio.setRolledBackTimestamp(LocalDateTime.now());
1314
							amountToRollback += sio.getAmount();
1315
							// sio.setSchemeType(SchemeType.OUT);
1316
							sio.setSerialNumber(serialNumber);
1317
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1318
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1319
							rolledbackSios.add(sio);
24623 amit.gupta 1320
						}
24635 amit.gupta 1321
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1322
					} else {
1323
						serialNumbersConsidered.add(serialNumber);
1324
						List<Integer> schemesConsidered = new ArrayList<>();
1325
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1326
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1327
								.filter(x -> x.getRolledBackTimestamp() == null
1328
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1329
								.collect(Collectors.toList());
1330
						Collections.reverse(sios);
1331
						for (SchemeInOut sio : sios) {
1332
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1333
								schemesConsidered.add(sio.getSchemeId());
1334
								continue;
1335
							}
1336
							sio.setRolledBackTimestamp(LocalDateTime.now());
1337
							amountToRollback += sio.getAmount();
1338
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1339
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1340
							sio.setSerialNumber(serialNumber);
1341
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1342
							rolledbackSios.add(sio);
1343
						}
24615 amit.gupta 1344
					}
24631 amit.gupta 1345
 
24604 amit.gupta 1346
				}
24590 amit.gupta 1347
			}
24631 amit.gupta 1348
			if (amountToRollback > 0) {
1349
				UserWalletHistory uwh = new UserWalletHistory();
1350
				uwh.setAmount(Math.round(amountToRollback));
1351
				uwh.setDescription(description);
1352
				uwh.setTimestamp(LocalDateTime.now());
1353
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1354
				uwh.setReference(fofoOrder.getId());
1355
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1356
				uwh.setFofoId(fofoOrder.getFofoId());
1357
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1358
				userWalletHistory.add(uwh);
1359
			}
24590 amit.gupta 1360
		});
24598 amit.gupta 1361
 
24592 amit.gupta 1362
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1363
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1364
						"Timestamp"),
1365
				userWalletHistory.stream()
1366
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1367
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1368
						.collect(Collectors.toList()));
1369
 
1370
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1371
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1372
						"Rolledback"),
1373
				rolledbackSios.stream()
1374
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1375
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1376
						.collect(Collectors.toList()));
1377
 
25043 amit.gupta 1378
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1379
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1380
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1381
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1382
 
25267 amit.gupta 1383
		throw new Exception();
24590 amit.gupta 1384
	}
24615 amit.gupta 1385
 
24611 amit.gupta 1386
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1387
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1388
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1389
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1390
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1391
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1392
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1393
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1394
		references.stream().forEach(reference -> {
1395
			FofoOrder fofoOrder = null;
1396
			try {
1397
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1398
			} catch (Exception e) {
1399
 
24611 amit.gupta 1400
			}
1401
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1402
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1403
			float amountToRollback = 0;
1404
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1405
			orderItems.forEach(x -> {
1406
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1407
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1408
			});
1409
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1410
				List<SchemeInOut> sios = schemeInOutRepository
1411
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1412
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1413
						.collect(Collectors.toList());
1414
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1415
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1416
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1417
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1418
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1419
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1420
					if (outList.size() > 1) {
1421
 
24611 amit.gupta 1422
					}
1423
				}
1424
				uwh.setAmount(Math.round(amountToRollback));
1425
				uwh.setDescription(description);
1426
				uwh.setTimestamp(LocalDateTime.now());
1427
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1428
				uwh.setReference(fofoOrder.getId());
1429
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1430
				uwh.setFofoId(fofoOrder.getFofoId());
1431
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1432
				userWalletHistory.add(uwh);
1433
			}
1434
		});
24615 amit.gupta 1435
 
24611 amit.gupta 1436
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1437
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1438
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1439
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1440
						.collect(Collectors.toList()));
1441
 
24611 amit.gupta 1442
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1443
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1444
						"Rolledback"),
1445
				rolledbackSios.stream()
24615 amit.gupta 1446
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1447
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1448
						.collect(Collectors.toList()));
1449
 
24623 amit.gupta 1450
		Utils.sendMailWithAttachments(googleMailSender,
1451
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1452
				"Partner Excess Amount", "PFA",
1453
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1454
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1455
 
24628 amit.gupta 1456
		throw new Exception();
24615 amit.gupta 1457
 
24611 amit.gupta 1458
	}
24615 amit.gupta 1459
 
26945 amit.gupta 1460
	public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
25927 amit.gupta 1461
 
24653 govind 1462
		LocalDateTime now = LocalDateTime.now();
25837 amit.gupta 1463
		LocalDateTime from = now.with(LocalTime.MIN);
25925 amit.gupta 1464
		String timeString = "Today %s";
25927 amit.gupta 1465
		// Send yesterday's report
27007 amit.gupta 1466
		/*
1467
		 * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1468
		 * now.minusDays(1).; now = from.with(LocalTime.MAX);
1469
		 * 
1470
		 * }
1471
		 */
24855 amit.gupta 1472
		List<Integer> fofoIds = null;
25043 amit.gupta 1473
		if (fofoIdInt == null) {
1474
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1475
					.collect(Collectors.toList());
24856 amit.gupta 1476
		} else {
24855 amit.gupta 1477
			fofoIds = Arrays.asList(fofoIdInt);
1478
		}
25912 amit.gupta 1479
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
24683 amit.gupta 1480
 
25865 amit.gupta 1481
		Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now,
1482
				null);
1483
		Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
26945 amit.gupta 1484
 
1485
		Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1486
				true);
1487
 
1488
		Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository
1489
				.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
26941 amit.gupta 1490
		Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
1491
 
26945 amit.gupta 1492
		Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1493
				false);
26941 amit.gupta 1494
		Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
26945 amit.gupta 1495
 
25865 amit.gupta 1496
		Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1497
		for (int fofoId : fofoIds) {
1498
			SaleTargetReportModel model = new SaleTargetReportModel();
25927 amit.gupta 1499
			model.setInsuranceSale(
1500
					partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
25865 amit.gupta 1501
			model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
26941 amit.gupta 1502
			model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1503
			model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1504
			model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1505
			model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
26945 amit.gupta 1506
			model.setPast3daysSale(
1507
					spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
25880 amit.gupta 1508
			model.setFofoId(fofoId);
25865 amit.gupta 1509
			saleTargetReportModelMap.put(fofoId, model);
1510
		}
25880 amit.gupta 1511
 
26945 amit.gupta 1512
		Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
24653 govind 1513
		for (Integer fofoId : fofoIds) {
25865 amit.gupta 1514
			SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
25821 amit.gupta 1515
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1516
			sendNotificationModel.setCampaignName("Sales update alert");
25884 tejbeer 1517
			sendNotificationModel.setTitle("Sale Update");
25927 amit.gupta 1518
			sendNotificationModel
1519
					.setMessage(String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1520
							model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1521
							String.format(timeString, now.format(timeFormatter))));
25821 amit.gupta 1522
			sendNotificationModel.setType("url");
27206 tejbeer 1523
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1524
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1525
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1526
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1527
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1528
			notificationService.sendNotification(sendNotificationModel);
24653 govind 1529
		}
26945 amit.gupta 1530
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1531
		// saleTargetReportModelMap);
1532
		String statewiseSaleReport = this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
27116 amit.gupta 1533
		String cc[] = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com",
26945 amit.gupta 1534
				"niranjan.kala@smartdukaan.com", "up.singh@smartdukaan.com", "sm@smartdukaan.com" };
25837 amit.gupta 1535
 
25912 amit.gupta 1536
		String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
26945 amit.gupta 1537
		// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
1538
		// subject);
1539
		this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com", statewiseSaleReport, cc, "Statewise" + subject);
24653 govind 1540
	}
1541
 
25865 amit.gupta 1542
	public static class SaleTargetReportModel {
1543
		private double totalSale;
26941 amit.gupta 1544
		private long totalQty;
26945 amit.gupta 1545
		private double past3daysSale;
25880 amit.gupta 1546
		private int fofoId;
1547
 
1548
		public int getFofoId() {
1549
			return fofoId;
1550
		}
1551
 
1552
		public void setFofoId(int fofoId) {
1553
			this.fofoId = fofoId;
1554
		}
1555
 
25865 amit.gupta 1556
		private double smartphoneSale;
1557
		private long smartphoneQty;
1558
		private double insuranceSale;
1559
		private long insruanceQty;
1560
 
26941 amit.gupta 1561
		public long getTotalQty() {
1562
			return totalQty;
1563
		}
1564
 
1565
		public void setTotalQty(long totalQty) {
1566
			this.totalQty = totalQty;
1567
		}
1568
 
26945 amit.gupta 1569
		public double getPast3daysSale() {
1570
			return past3daysSale;
1571
		}
1572
 
1573
		public void setPast3daysSale(double past3daysSale) {
1574
			this.past3daysSale = past3daysSale;
1575
		}
1576
 
25865 amit.gupta 1577
		@Override
1578
		public int hashCode() {
1579
			final int prime = 31;
1580
			int result = 1;
25880 amit.gupta 1581
			result = prime * result + fofoId;
25865 amit.gupta 1582
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1583
			long temp;
1584
			temp = Double.doubleToLongBits(insuranceSale);
1585
			result = prime * result + (int) (temp ^ (temp >>> 32));
1586
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1587
			temp = Double.doubleToLongBits(smartphoneSale);
1588
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1589
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 1590
			temp = Double.doubleToLongBits(totalSale);
1591
			result = prime * result + (int) (temp ^ (temp >>> 32));
1592
			return result;
1593
		}
1594
 
1595
		@Override
1596
		public boolean equals(Object obj) {
1597
			if (this == obj)
1598
				return true;
1599
			if (obj == null)
1600
				return false;
1601
			if (getClass() != obj.getClass())
1602
				return false;
1603
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 1604
			if (fofoId != other.fofoId)
1605
				return false;
25865 amit.gupta 1606
			if (insruanceQty != other.insruanceQty)
1607
				return false;
1608
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
1609
				return false;
1610
			if (smartphoneQty != other.smartphoneQty)
1611
				return false;
1612
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
1613
				return false;
26941 amit.gupta 1614
			if (totalQty != other.totalQty)
1615
				return false;
25865 amit.gupta 1616
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
1617
				return false;
1618
			return true;
1619
		}
1620
 
1621
		public double getTotalSale() {
1622
			return totalSale;
1623
		}
1624
 
1625
		public void setTotalSale(double totalSale) {
1626
			this.totalSale = totalSale;
1627
		}
1628
 
1629
		public double getSmartphoneSale() {
1630
			return smartphoneSale;
1631
		}
1632
 
1633
		public void setSmartphoneSale(double smartphoneSale) {
1634
			this.smartphoneSale = smartphoneSale;
1635
		}
1636
 
1637
		public long getSmartphoneQty() {
1638
			return smartphoneQty;
1639
		}
1640
 
1641
		public void setSmartphoneQty(long smartphoneQty) {
1642
			this.smartphoneQty = smartphoneQty;
1643
		}
1644
 
1645
		public double getInsuranceSale() {
1646
			return insuranceSale;
1647
		}
1648
 
1649
		public void setInsuranceSale(double insuranceSale) {
1650
			this.insuranceSale = insuranceSale;
1651
		}
1652
 
1653
		public long getInsruanceQty() {
1654
			return insruanceQty;
1655
		}
1656
 
1657
		public void setInsruanceQty(long insruanceQty) {
1658
			this.insruanceQty = insruanceQty;
1659
		}
1660
 
1661
		@Override
1662
		public String toString() {
26945 amit.gupta 1663
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
1664
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
1665
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 1666
		}
1667
 
1668
	}
1669
 
26945 amit.gupta 1670
	private String getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
1671
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
26940 amit.gupta 1672
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
26945 amit.gupta 1673
		Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors
1674
				.groupingBy(x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
26940 amit.gupta 1675
		List<List<Serializable>> stateWiseSales = new ArrayList<>();
1676
		for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
26945 amit.gupta 1677
			long totalQty = stateMapEntry.getValue().stream()
1678
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
1679
			double totalSale = stateMapEntry.getValue().stream()
1680
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
1681
			long smartPhoneQty = stateMapEntry.getValue().stream()
1682
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
1683
			double smartPhoneSale = stateMapEntry.getValue().stream()
1684
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
1685
			stateWiseSales
1686
					.add(Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
26940 amit.gupta 1687
		}
1688
		StringBuilder sb = new StringBuilder();
26945 amit.gupta 1689
		sb.append("<html><body>");
1690
		sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
26940 amit.gupta 1691
		sb.append("<tbody>\n" + "	    <tr>"
1692
				+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
26941 amit.gupta 1693
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
1694
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
1695
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
1696
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
26940 amit.gupta 1697
				+ "	    				</tr>");
1698
		for (List<Serializable> stateSale : stateWiseSales) {
1699
			sb.append("<tr>");
1700
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
1701
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
1702
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
26941 amit.gupta 1703
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
1704
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
26940 amit.gupta 1705
			sb.append("</tr>");
1706
		}
26945 amit.gupta 1707
		sb.append("</tbody></table><br><br>");
25872 tejbeer 1708
 
26945 amit.gupta 1709
		sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
24653 govind 1710
		sb.append("<tbody>\n" + "	    				<tr>\n"
26945 amit.gupta 1711
				+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
1712
				+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
1713
				+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
1714
				+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
1715
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
1716
				+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
1717
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
24653 govind 1718
				+ "	    				</tr>");
26945 amit.gupta 1719
 
1720
		List<Integer> sortedPartnerSalesHeaders = partnerSalesHeadersMap.values().stream()
26947 amit.gupta 1721
				.sorted(Comparator.comparing(FofoReportingModel::getCode)
1722
						.thenComparing(FofoReportingModel::getRegionalManager)
26948 amit.gupta 1723
						.thenComparing(FofoReportingModel::getTerritoryManager))
26945 amit.gupta 1724
				.map(FofoReportingModel::getFofoId).collect(Collectors.toList());
25927 amit.gupta 1725
		for (Integer fofoId : sortedPartnerSalesHeaders) {
27007 amit.gupta 1726
			if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
26947 amit.gupta 1727
				sb.append("<tr style='background-color:red'>");
1728
			} else {
26945 amit.gupta 1729
				sb.append("<tr>");
1730
			}
1731
			sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode()
25880 amit.gupta 1732
					+ "</td>");
1733
			sb.append("<td style='border:1px solid black;padding: 5px'>"
27007 amit.gupta 1734
					+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
1735
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1736
					+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
1737
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1738
					+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
1739
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1740
					+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
25880 amit.gupta 1741
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1742
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
25880 amit.gupta 1743
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1744
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
25865 amit.gupta 1745
			sb.append("</tr>");
24653 govind 1746
		}
24683 amit.gupta 1747
 
26945 amit.gupta 1748
		sb.append("</tr>");
1749
 
1750
		sb.append("</body></html>");
1751
 
1752
		return sb.toString();
24653 govind 1753
	}
24841 govind 1754
 
26945 amit.gupta 1755
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 1756
			throws MessagingException, ProfitMandiBusinessException, IOException {
1757
		MimeMessage message = mailSender.createMimeMessage();
1758
		MimeMessageHelper helper = new MimeMessageHelper(message);
1759
		helper.setSubject(subject);
1760
		helper.setText(body, true);
1761
		helper.setTo(email);
1762
		if (cc != null) {
1763
			helper.setCc(cc);
1764
		}
1765
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
1766
		helper.setFrom(senderAddress);
1767
		mailSender.send(message);
1768
	}
25300 tejbeer 1769
 
25351 tejbeer 1770
	public void sendNotification() throws Exception {
25300 tejbeer 1771
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
1772
		if (!pushNotifications.isEmpty()) {
1773
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 1774
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 1775
				NotificationCampaign notificationCampaign = notificationCampaignRepository
1776
						.selectById(pushNotification.getNotificationCampaignid());
1777
				Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls()
1778
						.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeJsonConverter()).create();
1779
 
1780
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
1781
						SimpleCampaignParams.class);
1782
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 1783
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 1784
				JSONObject json = new JSONObject();
25351 tejbeer 1785
				json.put("to", device.getFcmId());
25300 tejbeer 1786
				JSONObject jsonObj = new JSONObject();
1787
				jsonObj.put("message", campaign.getMessage());
1788
				jsonObj.put("title", campaign.getTitle());
1789
				jsonObj.put("type", campaign.getType());
1790
				jsonObj.put("url", result_url);
1791
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
1792
				jsonObj.put("image", campaign.getImageUrl());
1793
				jsonObj.put("largeIcon", "large_icon");
1794
				jsonObj.put("smallIcon", "small_icon");
1795
				jsonObj.put("vibrate", 1);
1796
				jsonObj.put("pid", pushNotification.getId());
1797
				jsonObj.put("sound", 1);
1798
				jsonObj.put("priority", "high");
1799
				json.put("data", jsonObj);
25351 tejbeer 1800
				try {
1801
					CloseableHttpClient client = HttpClients.createDefault();
1802
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 1803
 
25351 tejbeer 1804
					httpPost.setHeader("Content-Type", "application/json; utf-8");
1805
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
1806
					StringEntity entity = new StringEntity(json.toString());
1807
					httpPost.setEntity(entity);
1808
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 1809
 
25351 tejbeer 1810
					if (response.getStatusLine().getStatusCode() == 200) {
1811
						pushNotification.setSentTimestamp(LocalDateTime.now());
1812
					} else {
25356 tejbeer 1813
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 1814
						LOGGER.info("message" + "not sent");
26945 amit.gupta 1815
						response.toString();
25351 tejbeer 1816
					}
25300 tejbeer 1817
 
25351 tejbeer 1818
				} catch (Exception e) {
1819
					e.printStackTrace();
26443 amit.gupta 1820
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 1821
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 1822
				}
1823
			}
1824
		}
1825
	}
1826
 
25553 amit.gupta 1827
	public void grouping() throws Exception {
25609 amit.gupta 1828
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
1829
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
1830
		System.out.println(String.join("\t",
1831
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 1832
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 1833
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 1834
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 1835
			if (priceDropIMEI.getPartnerId() == 0)
1836
				continue;
25609 amit.gupta 1837
			HashSet<String> imeis = new HashSet<>();
1838
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
1839
			imeis.add(priceDropIMEI.getImei());
1840
			List<InventoryItem> inventoryItems = inventoryItemRepository
1841
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 1842
			if (inventoryItems.size() == 0) {
1843
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 1844
				continue;
25612 amit.gupta 1845
			}
25609 amit.gupta 1846
			InventoryItem inventoryItem = inventoryItems.get(0);
1847
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
1848
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
1849
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
1850
				// check if pricedrop has been rolled out
1851
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
1852
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
1853
				if (uwh.size() > 0) {
25615 amit.gupta 1854
					Item item = itemRepository.selectById(inventoryItem.getItemId());
26945 amit.gupta 1855
					System.out.println(String.join("\t", Arrays.asList(priceDropIMEI.getImei(),
1856
							inventoryItem.getItemId() + "", item.getBrand(), item.getModelName(), item.getModelNumber(),
1857
							inventoryItem.getFofoId() + "", customRetailer.getBusinessName(),
1858
							inventoryItem.getCreateTimestamp().format(dtf), priceDrop.getAffectedOn().format(dtf),
1859
							priceDropIMEI.getUpdateTimestamp().format(dtf),
1860
							inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getAutoPartnerPayout() + "",
1861
							inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 1862
				}
1863
			}
1864
		}
25503 amit.gupta 1865
	}
25694 amit.gupta 1866
 
27686 amit.gupta 1867
	public void attachToffeeInvoices() throws Exception {
1868
		/*LOGGER.info("Insurance Sum Summary --- {}",
25846 amit.gupta 1869
				insurancePolicyRepository.selectAmountSumGroupByRetailerId(LocalDateTime.MIN, LocalDateTime.MAX));
1870
		LOGGER.info("Insurance Qty Summary --- {}",
1871
				insurancePolicyRepository.selectQtyGroupByRetailerId(LocalDateTime.MIN, LocalDateTime.MAX));
25854 amit.gupta 1872
		LOGGER.info("SmartPhone Amount Summary --- {}",
25856 amit.gupta 1873
				fofoOrderItemRepository.selectSumAmountGroupByRetailer(LocalDateTime.MIN, LocalDateTime.MAX, 0, true));
25854 amit.gupta 1874
		LOGGER.info("Smartphone Qty Summary --- {}",
27686 amit.gupta 1875
				fofoOrderItemRepository.selectQtyGroupByRetailer(LocalDateTime.MIN, LocalDateTime.MAX, 0, true));*/
27678 amit.gupta 1876
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
1877
		for(InsurancePolicy insurancePolicy : insurancePolicies) {
1878
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
1879
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
1880
			PdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
1881
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
1882
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
27683 amit.gupta 1883
			String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
27678 amit.gupta 1884
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
1885
			if(attached) {
1886
				insurancePolicy.setPosted(true);
1887
			}
1888
		}
25694 amit.gupta 1889
	}
1890
 
1891
	public void schemeRollback(List<String> schemeIds) throws Exception {
1892
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 1893
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 1894
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1895
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
1896
		for (SchemeInOut sio : schemeInOuts) {
1897
			Scheme scheme = schemesMap.get(sio.getSchemeId());
1898
			if (scheme.getType().equals(SchemeType.IN)) {
1899
 
1900
			} else if (scheme.getType().equals(SchemeType.OUT)) {
1901
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
1902
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
1903
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
1904
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
1905
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
1906
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
1907
					sio.setRolledBackTimestamp(LocalDateTime.now());
1908
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 1909
					String rollbackReason = "Scheme reversed for "
1910
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 1911
							+ fofoOrder.getInvoiceNumber();
1912
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 1913
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
1914
							LocalDateTime.now());
25694 amit.gupta 1915
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
1916
							rollbackReason);
1917
				}
1918
			}
1919
		}
25721 tejbeer 1920
		// throw new Exception();
25694 amit.gupta 1921
	}
25721 tejbeer 1922
 
1923
	public void checkfocusedModelInPartnerStock() throws Exception {
1924
 
1925
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1926
				.collect(Collectors.toList());
27212 tejbeer 1927
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
1928
				.getSaholicStock();
27213 tejbeer 1929
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
1930
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 1931
 
1932
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
1933
				.getSaholicPOItems();
25721 tejbeer 1934
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
1935
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 1936
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
1937
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 1938
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
1939
			Map<Integer, Integer> processingOrderMap = null;
1940
			Map<Integer, Integer> catalogIdAndQtyMap = null;
1941
			Map<Integer, Integer> grnPendingOrdersMap = null;
1942
 
1943
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
1944
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
1945
 
1946
			if (!currentInventorySnapshot.isEmpty()) {
1947
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
1948
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1949
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
1950
 
1951
			}
1952
 
1953
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
1954
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1955
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1956
			if (!grnPendingOrders.isEmpty()) {
1957
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
1958
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1959
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
1960
 
1961
			}
1962
 
1963
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
1964
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
1965
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
1966
			if (!processingOrder.isEmpty()) {
1967
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
1968
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
1969
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
1970
 
1971
			}
1972
 
25800 tejbeer 1973
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
1974
					.collect(Collectors.toList());
1975
 
27088 tejbeer 1976
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
1977
					.collect(Collectors.toList());
27095 tejbeer 1978
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 1979
			if (regionIds.size() == 0) {
1980
				LOGGER.info("No region found for partner {}", fofoId);
1981
				continue;
1982
			}
27100 amit.gupta 1983
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 1984
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
1985
							Collectors.mapping(FocusedModel::getMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 1986
 
25721 tejbeer 1987
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
1988
 
27100 amit.gupta 1989
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
1990
				int minQty = entry.getValue().get();
25721 tejbeer 1991
				int inStockQty = 0;
1992
				int processingQty = 0;
1993
				int grnPendingQty = 0;
27208 tejbeer 1994
				int allColorNetAvailability = 0;
27253 tejbeer 1995
				int allColorPoAvailability = 0;
25721 tejbeer 1996
				if (processingOrderMap != null) {
1997
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
1998
							: processingOrderMap.get(entry.getKey());
1999
 
2000
				}
2001
				if (grnPendingOrdersMap != null) {
2002
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2003
							: grnPendingOrdersMap.get(entry.getKey());
2004
 
2005
				}
2006
				if (catalogIdAndQtyMap != null) {
2007
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2008
							: catalogIdAndQtyMap.get(entry.getKey());
2009
 
2010
				}
2011
				int totalQty = processingQty + grnPendingQty + inStockQty;
2012
 
27100 amit.gupta 2013
				if (totalQty < minQty) {
25721 tejbeer 2014
 
27100 amit.gupta 2015
					int shortageQty = minQty - totalQty;
25721 tejbeer 2016
					List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
27212 tejbeer 2017
					FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
27213 tejbeer 2018
 
27212 tejbeer 2019
					Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2020
							.get(fofoStore.getWarehouseId());
25721 tejbeer 2021
 
27212 tejbeer 2022
					Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2023
							.get(fofoStore.getWarehouseId());
27208 tejbeer 2024
 
2025
					for (Item it : item) {
2026
						List<SaholicCIS> currentAvailability = itemAvailabilityMap.get(it.getId());
2027
						List<SaholicPOItem> poItemAvailability = poItemAvailabilityMap.get(it.getId());
2028
						if (currentAvailability != null) {
2029
							allColorNetAvailability += currentAvailability.stream()
2030
									.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2031
						}
27253 tejbeer 2032
 
27208 tejbeer 2033
						if (poItemAvailability != null) {
27253 tejbeer 2034
							allColorPoAvailability += poItemAvailability.stream()
27208 tejbeer 2035
									.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
2036
						}
27253 tejbeer 2037
 
27208 tejbeer 2038
					}
2039
 
25721 tejbeer 2040
					FocusedModelShortageModel fm = new FocusedModelShortageModel();
2041
					fm.setFofoId(fofoId);
27212 tejbeer 2042
					fm.setStoreCode(fofoStore.getCode());
25721 tejbeer 2043
					fm.setStoreName(customRetailer.getBusinessName());
27208 tejbeer 2044
					fm.setBrandName(item.get(0).getBrand());
2045
					fm.setModelName(item.get(0).getModelName());
2046
					fm.setModelNumber(item.get(0).getModelNumber());
25721 tejbeer 2047
					fm.setShortageQty(shortageQty);
27253 tejbeer 2048
					fm.setPoAvailabitiy(allColorPoAvailability);
27208 tejbeer 2049
					fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
27213 tejbeer 2050
					fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2051
					fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
27246 tejbeer 2052
					fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
27208 tejbeer 2053
					fm.setAvailabitiy(allColorNetAvailability);
25721 tejbeer 2054
 
27102 amit.gupta 2055
					focusedModelShortageList.add(fm);
25721 tejbeer 2056
				}
2057
 
2058
			}
27233 tejbeer 2059
 
2060
			if (!focusedModelShortageList.isEmpty()) {
2061
				String subject = "Stock Alert";
2062
				String messageText = this.getMessage(focusedModelShortageList);
2063
 
2064
				this.sendMailWithAttachments(subject, messageText, customRetailer.getEmail());
2065
				String notificationMessage = this.getNotificationMessage(focusedModelShortageList);
2066
 
2067
				LOGGER.info("notificationMessage" + notificationMessage);
2068
 
2069
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
2070
				sendNotificationModel.setCampaignName("Stock Alert");
2071
				sendNotificationModel.setTitle("Alert");
2072
				sendNotificationModel.setMessage(notificationMessage);
2073
				sendNotificationModel.setType("url");
2074
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2075
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2076
				sendNotificationModel.setMessageType(MessageType.notification);
2077
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2078
				sendNotificationModel.setUserIds(Arrays.asList(userId));
2079
				notificationService.sendNotification(sendNotificationModel);
2080
 
2081
			}
2082
 
25721 tejbeer 2083
		}
27102 amit.gupta 2084
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2085
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2086
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2087
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2088
 
25800 tejbeer 2089
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2090
				storeGuyMap.entrySet().forEach(y -> {
2091
 
2092
					if (y.getValue().contains(x.getKey())) {
2093
						if (!emailRowsMap.containsKey(y.getKey())) {
2094
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2095
						}
27208 tejbeer 2096
						List<List<? extends Serializable>> fms = x.getValue().stream()
2097
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2098
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
27271 amit.gupta 2099
										r.getTerritoryManager(), r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2100
								.collect(Collectors.toList());
2101
						emailRowsMap.get(y.getKey()).addAll(fms);
2102
 
25721 tejbeer 2103
					}
2104
 
25800 tejbeer 2105
				});
25721 tejbeer 2106
 
2107
			});
2108
 
27212 tejbeer 2109
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
27271 amit.gupta 2110
					"Warehouse Name", "State Manager", "Territory Manager", "Shortage Qty", "Availability");
25837 amit.gupta 2111
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2112
 
25800 tejbeer 2113
				ByteArrayOutputStream baos = null;
2114
				try {
25837 amit.gupta 2115
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2116
				} catch (Exception e2) {
2117
					e2.printStackTrace();
2118
				}
27215 tejbeer 2119
				String[] sendToArray = new String[] { entry.getKey() };
25800 tejbeer 2120
				try {
2121
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2122
							new ByteArrayResource(baos.toByteArray()));
2123
				} catch (Exception e1) { // TODO Auto-generated catch block
2124
					e1.printStackTrace();
2125
				}
25721 tejbeer 2126
 
25800 tejbeer 2127
			});
2128
		}
25721 tejbeer 2129
	}
2130
 
2131
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2132
		StringBuilder sb = new StringBuilder();
2133
		sb.append("Focused Model Shortage in Your Stock : \n");
2134
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2135
 
2136
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2137
			sb.append(String.format("%n", ""));
2138
		}
2139
		return sb.toString();
2140
	}
2141
 
2142
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2143
		MimeMessage message = mailSender.createMimeMessage();
2144
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2145
 
2146
		helper.setSubject(subject);
2147
		helper.setText(messageText, true);
2148
		helper.setTo(email);
27116 amit.gupta 2149
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2150
		helper.setFrom(senderAddress);
2151
		mailSender.send(message);
2152
 
2153
	}
2154
 
2155
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2156
		StringBuilder sb = new StringBuilder();
2157
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2158
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2159
		sb.append("<tbody>\n" + "	    				<tr>\n"
2160
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2161
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2162
				+ "	    				</tr>");
2163
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2164
 
2165
			sb.append("<tr>");
2166
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2167
 
2168
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2169
 
2170
			sb.append("</tr>");
2171
 
2172
		}
2173
 
2174
		sb.append("</tbody></table></body></html>");
2175
 
2176
		return sb.toString();
2177
	}
2178
 
25927 amit.gupta 2179
	public void notifyLead() throws Exception {
2180
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(LocalDateTime.now().minusDays(15),
2181
				LocalDateTime.now().plusHours(4));
2182
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2183
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2184
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2185
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2186
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2187
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2188
 
27477 amit.gupta 2189
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2190
 
25927 amit.gupta 2191
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2192
 
2193
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2194
			int authId = authUserEmail.getKey();
2195
			String email = authUserEmail.getValue();
2196
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2197
		}
27477 amit.gupta 2198
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2199
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2200
 
25927 amit.gupta 2201
		String templateMessage = "Lead followup for %s %s, %s is due by %s";
2202
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
2203
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2204
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2205
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2206
				continue;
2207
			}
2208
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
25941 amit.gupta 2209
					lead.getAddress(), timeFormatter.format(lead.getLeadActivity().getSchelduleTimestamp()));
25927 amit.gupta 2210
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2211
			sendNotificationModel.setCampaignName("Lead Reminder");
2212
			sendNotificationModel.setTitle("Leads followup Reminder");
2213
			sendNotificationModel.setMessage(notificationMessage);
2214
			sendNotificationModel.setType("url");
27206 tejbeer 2215
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2216
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2217
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2218
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2219
			System.out.println(sendNotificationModel);
25927 amit.gupta 2220
			notificationService.sendNotification(sendNotificationModel);
2221
		}
2222
	}
26945 amit.gupta 2223
 
25927 amit.gupta 2224
	public void notifyVisits() throws Exception {
26945 amit.gupta 2225
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2226
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2227
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2228
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2229
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2230
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2231
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2232
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2233
 
25927 amit.gupta 2234
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2235
			int authId = authUserEmail.getKey();
2236
			String email = authUserEmail.getValue();
2237
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2238
		}
2239
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2240
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2241
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2242
		for (FranchiseeVisit visit : franchiseeVisits) {
2243
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2244
				continue;
2245
			}
2246
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2247
			String message = null;
26945 amit.gupta 2248
			if (visit.getFranchiseActivityId() == 0) {
2249
				message = String.format(visitTemplate, visit.getPartnerName(),
2250
						timeFormatter.format(visit.getSchelduleTimestamp()));
2251
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2252
			} else {
26945 amit.gupta 2253
				message = String.format(followupTemplate, visit.getPartnerName(),
2254
						timeFormatter.format(visit.getSchelduleTimestamp()));
25927 amit.gupta 2255
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2256
			}
2257
			sendNotificationModel.setMessage(message);
2258
			sendNotificationModel.setType("url");
26482 tejbeer 2259
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2260
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2261
			sendNotificationModel.setMessageType(MessageType.reminder);
2262
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2263
			notificationService.sendNotification(sendNotificationModel);
2264
		}
25910 amit.gupta 2265
	}
25982 amit.gupta 2266
 
26283 tejbeer 2267
	public void ticketClosed() throws Exception {
2268
 
2269
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2270
		for (Ticket ticket : tickets) {
2271
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2272
				ticket.setCloseTimestamp(LocalDateTime.now());
2273
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2274
				ticket.setUpdateTimestamp(LocalDateTime.now());
2275
				ticketRepository.persist(ticket);
2276
			}
2277
		}
2278
 
2279
	}
2280
 
26790 tejbeer 2281
	public void checkValidateReferral() throws Exception {
2282
 
2283
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2284
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2285
		if (!referrals.isEmpty()) {
2286
			String subject = "Referral Request";
2287
			String messageText = this.getMessageForReferral(referrals);
2288
 
26792 tejbeer 2289
			MimeMessage message = mailSender.createMimeMessage();
2290
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
2291
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
2292
			helper.setSubject(subject);
2293
			helper.setText(messageText, true);
2294
			helper.setTo(email);
2295
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2296
			helper.setFrom(senderAddress);
2297
			mailSender.send(message);
2298
 
26790 tejbeer 2299
		}
2300
	}
2301
 
2302
	private String getMessageForReferral(List<Refferal> referrals) {
2303
		StringBuilder sb = new StringBuilder();
2304
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2305
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2306
		sb.append("<tbody>\n" + "	    				<tr>\n"
2307
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2308
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2309
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2310
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2311
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2312
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2313
				+ "	    				</tr>");
2314
		for (Refferal entry : referrals) {
2315
 
2316
			sb.append("<tr>");
2317
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2318
 
2319
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2320
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2321
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2322
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2323
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2324
 
2325
			sb.append("</tr>");
2326
 
2327
		}
2328
 
2329
		sb.append("</tbody></table></body></html>");
2330
 
2331
		return sb.toString();
2332
	}
2333
 
27271 amit.gupta 2334
	public void reverseWallet() throws Exception {
2335
		LocalDate localDate = LocalDate.of(2020, 10, 28);
2336
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), 
2337
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2338
		for (UserWalletHistory uwh : uwhList) {
2339
			if(uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2340
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
27313 amit.gupta 2341
				//LOGGER.info("UWH - {}", uwh);
27274 amit.gupta 2342
				//amount  += uwh.getAmount();
2343
				//System.out.println("Amount is - " + amount);
27313 amit.gupta 2344
				//walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(), uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone run", uwh.getBusinessTimestamp());
2345
				int orderId = uwh.getReference();
2346
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2347
				int inventoryItemId = 0;
2348
				//fofoOrderRepository.delete(fofoOrder);
2349
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2350
				/*List<PaymentOptionTransaction> paymentOptionTransactions = paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId(), PaymentOptionReferenceType.ORDER);
2351
				for(PaymentOptionTransaction paymentOptionTransaction : paymentOptionTransactions) {
2352
					//paymentOptionTransactionRepository.delete(paymentOptionTransaction);
2353
				}*/
2354
				for(FofoOrderItem foi : fofoOrderItems) {
2355
					//fofoOrderItemRepository.delete(foi);
2356
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
2357
					for(FofoLineItem fli : flis) {
2358
						//fofoLineItemRepository.delete(fli);
2359
						inventoryItemId = fli.getInventoryItemId();
2360
					}
2361
				}
2362
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2363
				for(SchemeInOut sio : schemeInOuts) {
2364
					if(sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2365
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2366
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2367
					}
2368
				}
2369
				//Rollback entry with reversal reason
2370
				/*if(fofoOrder.getCreateTimestamp().isAfter(LocalDate.of(2020, 4, 1).atStartOfDay())) {
2371
					List<UserWalletHistory> userWalletHistory = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
2372
					totalAmount += userWalletHistory.stream().collect(Collectors.summingInt(y->y.getAmount()));
2373
					walletService.rollbackAmountFromWallet(fofoOrder.getFofoId(), totalAmount, fofoOrder.getId(), WalletReferenceType.SCHEME_OUT, 
2374
							"Same order for Invoice-"+ invoiceNumber + "created twice, duplicate invoice rollback", fofoOrder.getCancelledTimestamp());
2375
					List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId)));
2376
					for(SchemeInOut sio : schemeInOuts) {
2377
						LOGGER.info(sio);
2378
					}
2379
 
2380
				}*/ 
2381
 
2382
 
27271 amit.gupta 2383
			}
2384
		}
2385
 
2386
	}
26418 tejbeer 2387
}
27438 amit.gupta 2388
//2284