Subversion Repositories SmartDukaan

Rev

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

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