Subversion Repositories SmartDukaan

Rev

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