Subversion Repositories SmartDukaan

Rev

Rev 28632 | Rev 28712 | 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();
1104
 
1105
		for (FofoStore fofoStore : fofoStores) {
1106
 
1107
			if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
1108
 
1109
				fofoStore.setActive(true);
1110
				fofoStoreRepository.persist(fofoStore);
1111
				LOGGER.info("inserted into InActiveFofoStore successfully");
1112
 
1113
			}
1114
 
1115
			else {
1116
				fofoStore.setActive(false);
1117
				fofoStore.setActiveTimeStamp(null);
1118
				fofoStoreRepository.persist(fofoStore);
1119
				LOGGER.info("inserted into InActiveFofoStore successfully");
1120
			}
1121
 
1122
		}
1123
 
1124
	}
1125
 
24697 amit.gupta 1126
	public void sendAgeingReport() throws Exception {
27210 tejbeer 1127
		sendAgeingReport("kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 1128
				"niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
24697 amit.gupta 1129
	}
1130
 
24533 govind 1131
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 1132
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 1133
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 1134
			priceDropService.priceDropStatus(priceDrop.getId());
1135
		}
1136
	}
23929 amit.gupta 1137
 
24542 amit.gupta 1138
	public void walletmismatch() throws Exception {
1139
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 1140
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 1141
		System.out.println(pdis.size());
24542 amit.gupta 1142
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 1143
			int fofoId = pdi.getFofoId();
24542 amit.gupta 1144
			for (PartnerDailyInvestment investment : Lists
1145
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 1146
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 1147
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 1148
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 1149
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
1150
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 1151
 
24542 amit.gupta 1152
			}
24549 amit.gupta 1153
		}
24542 amit.gupta 1154
 
1155
	}
1156
 
1157
	public void gst() throws Exception {
24548 amit.gupta 1158
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2019, 1, 26).atStartOfDay(),
1159
				LocalDate.of(2019, 1, 27).atTime(LocalTime.MAX));
1160
		for (FofoOrder fofoOrder : fofoOrders) {
1161
			int retailerAddressId = retailerRegisteredAddressRepository
1162
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 1163
 
1164
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
1165
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1166
			Integer stateId = null;
1167
			if (customerAddress.getState().equals(retailerAddress.getState())) {
1168
				try {
1169
					stateId = Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
1170
				} catch (Exception e) {
1171
					LOGGER.error("Unable to get state rates");
1172
				}
1173
			}
1174
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1175
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 1176
 
1177
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
26929 amit.gupta 1178
			List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
24542 amit.gupta 1179
			if (stateId != null) {
26929 amit.gupta 1180
				itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
24542 amit.gupta 1181
			} else {
26929 amit.gupta 1182
				itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
24542 amit.gupta 1183
			}
1184
 
24548 amit.gupta 1185
			for (FofoOrderItem foi : fofoOrderItems) {
24542 amit.gupta 1186
				if (stateId == null) {
1187
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
1188
				} else {
1189
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1190
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1191
				}
1192
				fofoOrderItemRepository.persist(foi);
1193
			}
1194
		}
24548 amit.gupta 1195
 
24542 amit.gupta 1196
	}
1197
 
24580 amit.gupta 1198
	public void schemewalletmismatch() {
1199
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 1200
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 1201
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 1202
			// reconcileOrders(dateTime);
1203
			// reconcileRecharges(dateTime);
24580 amit.gupta 1204
			dateToReconcile = dateToReconcile.plusDays(1);
1205
		}
1206
	}
1207
 
1208
	private void reconcileSchemes(LocalDate date) {
1209
		LocalDateTime startDate = date.atStartOfDay();
1210
		LocalDateTime endDate = startDate.plusDays(1);
1211
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1212
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 1213
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1214
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 1215
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 1216
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
1217
				WalletReferenceType.SCHEME_OUT);
1218
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
1219
				walletReferenceTypes);
1220
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1221
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 1222
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 1223
 
1224
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
1225
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1226
 
1227
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
1228
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1229
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
1230
 
1231
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
1232
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1233
 
1234
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
1235
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
1236
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
1237
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
1238
 
1239
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
26092 amit.gupta 1240
 
24587 amit.gupta 1241
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1242
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1243
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1244
				} else {
1245
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
1246
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
1247
				}
1248
			}
24590 amit.gupta 1249
			Map<Integer, Integer> userWalletMap = userWalletRepository
1250
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1251
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1252
 
24587 amit.gupta 1253
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1254
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1255
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1256
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1257
				if (diff > 5) {
1258
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1259
				}
1260
			}
24580 amit.gupta 1261
		}
24587 amit.gupta 1262
 
24580 amit.gupta 1263
	}
24590 amit.gupta 1264
 
24592 amit.gupta 1265
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1266
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1267
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1268
 
24592 amit.gupta 1269
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1270
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1271
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1272
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1273
		Set<String> serialNumbersConsidered = new HashSet<>();
1274
 
25096 amit.gupta 1275
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1276
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1277
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1278
 
24683 amit.gupta 1279
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1280
		purchases.stream().forEach(purchase -> {
1281
			float amountToRollback = 0;
1282
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1283
					+ purchase.getPurchaseReference();
1284
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1285
					.stream().filter(ii -> ii.getSerialNumber() != null)
1286
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1287
			if (inventorySerialNumberMap.size() > 0) {
1288
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1289
					String serialNumber = inventorySerialNumberEntry.getValue();
1290
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1291
					if (serialNumbersConsidered.contains(serialNumber)) {
1292
						// This will rollback scheme for differenct orders for same serial
1293
						List<SchemeInOut> sios = schemeInOutRepository
1294
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1295
								.filter(x -> x.getRolledBackTimestamp() == null
1296
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1297
								.collect(Collectors.toList());
1298
						Collections.reverse(sios);
1299
						for (SchemeInOut sio : sios) {
1300
							sio.setRolledBackTimestamp(LocalDateTime.now());
1301
							amountToRollback += sio.getAmount();
1302
							// sio.setSchemeType(SchemeType.OUT);
1303
							sio.setSerialNumber(serialNumber);
1304
							rolledbackSios.add(sio);
1305
						}
1306
						description = description.concat(" " + serialNumber + " ");
1307
					} else {
1308
						serialNumbersConsidered.add(serialNumber);
1309
						List<Integer> schemesConsidered = new ArrayList<>();
1310
						List<SchemeInOut> sios = schemeInOutRepository
1311
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1312
								.filter(x -> x.getRolledBackTimestamp() == null
1313
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1314
								.collect(Collectors.toList());
1315
						Collections.reverse(sios);
1316
						for (SchemeInOut sio : sios) {
1317
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1318
								schemesConsidered.add(sio.getSchemeId());
1319
								continue;
1320
							}
1321
							sio.setRolledBackTimestamp(LocalDateTime.now());
1322
							amountToRollback += sio.getAmount();
1323
							// sio.setSchemeType(SchemeType.OUT);
1324
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1325
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1326
							sio.setReference(purchase.getId());
24635 amit.gupta 1327
							rolledbackSios.add(sio);
1328
						}
1329
					}
1330
 
1331
				}
1332
			}
1333
			if (amountToRollback > 0) {
24683 amit.gupta 1334
				// Address address =
1335
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1336
				UserWalletHistory uwh = new UserWalletHistory();
1337
				uwh.setAmount(Math.round(amountToRollback));
1338
				uwh.setDescription(description);
1339
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1340
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1341
				uwh.setReference(purchase.getId());
1342
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1343
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1344
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1345
				userWalletHistory.add(uwh);
1346
			}
1347
		});
1348
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1349
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1350
						"Timestamp"),
1351
				userWalletHistory.stream()
1352
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1353
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1354
						.collect(Collectors.toList()));
1355
 
1356
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1357
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1358
						"Created", "Rolledback"),
24635 amit.gupta 1359
				rolledbackSios.stream()
24681 amit.gupta 1360
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1361
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1362
						.collect(Collectors.toList()));
1363
 
25043 amit.gupta 1364
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1365
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 1366
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 1367
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1368
 
25096 amit.gupta 1369
		throw new Exception();
24635 amit.gupta 1370
 
1371
	}
1372
 
1373
	public void dryRunOutSchemeReco() throws Exception {
1374
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1375
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1376
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1377
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1378
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1379
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1380
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1381
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1382
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1383
		// Collections.reverse(allOrders);
1384
		// List<FofoOrder> allOrders =
24653 govind 1385
		// List<FofoOrder> allOrders =
24631 amit.gupta 1386
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1387
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1388
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1389
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1390
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1391
			float amountToRollback = 0;
24590 amit.gupta 1392
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1393
			orderItems.forEach(x -> {
24606 amit.gupta 1394
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1395
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1396
			});
24606 amit.gupta 1397
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1398
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1399
					String serialNumber = inventorySerialNumberEntry.getValue();
1400
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1401
					if (serialNumbersConsidered.contains(serialNumber)) {
1402
						// This will rollback scheme for differenct orders for same serial
1403
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1404
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1405
								.filter(x -> x.getRolledBackTimestamp() == null
1406
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1407
								.collect(Collectors.toList());
1408
						Collections.reverse(sios);
1409
						for (SchemeInOut sio : sios) {
1410
							sio.setRolledBackTimestamp(LocalDateTime.now());
1411
							amountToRollback += sio.getAmount();
1412
							// sio.setSchemeType(SchemeType.OUT);
1413
							sio.setSerialNumber(serialNumber);
1414
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1415
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1416
							rolledbackSios.add(sio);
24623 amit.gupta 1417
						}
24635 amit.gupta 1418
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1419
					} else {
1420
						serialNumbersConsidered.add(serialNumber);
1421
						List<Integer> schemesConsidered = new ArrayList<>();
1422
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1423
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1424
								.filter(x -> x.getRolledBackTimestamp() == null
1425
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1426
								.collect(Collectors.toList());
1427
						Collections.reverse(sios);
1428
						for (SchemeInOut sio : sios) {
1429
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1430
								schemesConsidered.add(sio.getSchemeId());
1431
								continue;
1432
							}
1433
							sio.setRolledBackTimestamp(LocalDateTime.now());
1434
							amountToRollback += sio.getAmount();
1435
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1436
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1437
							sio.setSerialNumber(serialNumber);
1438
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1439
							rolledbackSios.add(sio);
1440
						}
24615 amit.gupta 1441
					}
24631 amit.gupta 1442
 
24604 amit.gupta 1443
				}
24590 amit.gupta 1444
			}
24631 amit.gupta 1445
			if (amountToRollback > 0) {
1446
				UserWalletHistory uwh = new UserWalletHistory();
1447
				uwh.setAmount(Math.round(amountToRollback));
1448
				uwh.setDescription(description);
1449
				uwh.setTimestamp(LocalDateTime.now());
1450
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1451
				uwh.setReference(fofoOrder.getId());
1452
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1453
				uwh.setFofoId(fofoOrder.getFofoId());
1454
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1455
				userWalletHistory.add(uwh);
1456
			}
24590 amit.gupta 1457
		});
24598 amit.gupta 1458
 
24592 amit.gupta 1459
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1460
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1461
						"Timestamp"),
1462
				userWalletHistory.stream()
1463
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1464
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1465
						.collect(Collectors.toList()));
1466
 
1467
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1468
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1469
						"Rolledback"),
1470
				rolledbackSios.stream()
1471
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1472
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1473
						.collect(Collectors.toList()));
1474
 
25043 amit.gupta 1475
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1476
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1477
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1478
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1479
 
25267 amit.gupta 1480
		throw new Exception();
24590 amit.gupta 1481
	}
24615 amit.gupta 1482
 
24611 amit.gupta 1483
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1484
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1485
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1486
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1487
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1488
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1489
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1490
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1491
		references.stream().forEach(reference -> {
1492
			FofoOrder fofoOrder = null;
1493
			try {
1494
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1495
			} catch (Exception e) {
1496
 
24611 amit.gupta 1497
			}
1498
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1499
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1500
			float amountToRollback = 0;
1501
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1502
			orderItems.forEach(x -> {
1503
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1504
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1505
			});
1506
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1507
				List<SchemeInOut> sios = schemeInOutRepository
1508
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1509
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1510
						.collect(Collectors.toList());
1511
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1512
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1513
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1514
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1515
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1516
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1517
					if (outList.size() > 1) {
1518
 
24611 amit.gupta 1519
					}
1520
				}
1521
				uwh.setAmount(Math.round(amountToRollback));
1522
				uwh.setDescription(description);
1523
				uwh.setTimestamp(LocalDateTime.now());
1524
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1525
				uwh.setReference(fofoOrder.getId());
1526
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1527
				uwh.setFofoId(fofoOrder.getFofoId());
1528
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1529
				userWalletHistory.add(uwh);
1530
			}
1531
		});
24615 amit.gupta 1532
 
24611 amit.gupta 1533
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1534
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1535
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1536
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1537
						.collect(Collectors.toList()));
1538
 
24611 amit.gupta 1539
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1540
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1541
						"Rolledback"),
1542
				rolledbackSios.stream()
24615 amit.gupta 1543
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1544
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1545
						.collect(Collectors.toList()));
1546
 
24623 amit.gupta 1547
		Utils.sendMailWithAttachments(googleMailSender,
1548
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1549
				"Partner Excess Amount", "PFA",
1550
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1551
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1552
 
24628 amit.gupta 1553
		throw new Exception();
24615 amit.gupta 1554
 
24611 amit.gupta 1555
	}
24615 amit.gupta 1556
 
26945 amit.gupta 1557
	public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
25927 amit.gupta 1558
 
24653 govind 1559
		LocalDateTime now = LocalDateTime.now();
25837 amit.gupta 1560
		LocalDateTime from = now.with(LocalTime.MIN);
25925 amit.gupta 1561
		String timeString = "Today %s";
25927 amit.gupta 1562
		// Send yesterday's report
27007 amit.gupta 1563
		/*
1564
		 * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1565
		 * now.minusDays(1).; now = from.with(LocalTime.MAX);
1566
		 * 
1567
		 * }
1568
		 */
24855 amit.gupta 1569
		List<Integer> fofoIds = null;
25043 amit.gupta 1570
		if (fofoIdInt == null) {
1571
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1572
					.collect(Collectors.toList());
24856 amit.gupta 1573
		} else {
24855 amit.gupta 1574
			fofoIds = Arrays.asList(fofoIdInt);
1575
		}
25912 amit.gupta 1576
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
24683 amit.gupta 1577
 
25865 amit.gupta 1578
		Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now,
1579
				null);
1580
		Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
26945 amit.gupta 1581
 
1582
		Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1583
				true);
1584
 
1585
		Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository
1586
				.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
26941 amit.gupta 1587
		Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
1588
 
26945 amit.gupta 1589
		Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1590
				false);
26941 amit.gupta 1591
		Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
26945 amit.gupta 1592
 
25865 amit.gupta 1593
		Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1594
		for (int fofoId : fofoIds) {
1595
			SaleTargetReportModel model = new SaleTargetReportModel();
25927 amit.gupta 1596
			model.setInsuranceSale(
1597
					partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
25865 amit.gupta 1598
			model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
26941 amit.gupta 1599
			model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1600
			model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1601
			model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1602
			model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
26945 amit.gupta 1603
			model.setPast3daysSale(
1604
					spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
25880 amit.gupta 1605
			model.setFofoId(fofoId);
25865 amit.gupta 1606
			saleTargetReportModelMap.put(fofoId, model);
1607
		}
25880 amit.gupta 1608
 
26945 amit.gupta 1609
		Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
24653 govind 1610
		for (Integer fofoId : fofoIds) {
25865 amit.gupta 1611
			SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
25821 amit.gupta 1612
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1613
			sendNotificationModel.setCampaignName("Sales update alert");
25884 tejbeer 1614
			sendNotificationModel.setTitle("Sale Update");
25927 amit.gupta 1615
			sendNotificationModel
1616
					.setMessage(String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1617
							model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1618
							String.format(timeString, now.format(timeFormatter))));
25821 amit.gupta 1619
			sendNotificationModel.setType("url");
27206 tejbeer 1620
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1621
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1622
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1623
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1624
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1625
			notificationService.sendNotification(sendNotificationModel);
24653 govind 1626
		}
26945 amit.gupta 1627
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1628
		// saleTargetReportModelMap);
1629
		String statewiseSaleReport = this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
27116 amit.gupta 1630
		String cc[] = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com",
26945 amit.gupta 1631
				"niranjan.kala@smartdukaan.com", "up.singh@smartdukaan.com", "sm@smartdukaan.com" };
25837 amit.gupta 1632
 
25912 amit.gupta 1633
		String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
26945 amit.gupta 1634
		// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
1635
		// subject);
1636
		this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com", statewiseSaleReport, cc, "Statewise" + subject);
24653 govind 1637
	}
1638
 
28377 tejbeer 1639
	public void checkRazorPayPaymentStatus() throws Exception {
28368 tejbeer 1640
		List<PendingOrder> pendingOrder = pendingOrderRepository
1641
				.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
1642
 
1643
		for (PendingOrder po : pendingOrder) {
1644
			RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
28377 tejbeer 1645
			List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28368 tejbeer 1646
 
28369 tejbeer 1647
			LOGGER.info("razorPay" + razorPay);
1648
			if (razorPay != null) {
1649
				List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28377 tejbeer 1650
 
28369 tejbeer 1651
				if (!payments.isEmpty()) {
28377 tejbeer 1652
					List<String> statusList = new ArrayList<>();
28369 tejbeer 1653
					for (Payment payment : payments) {
28368 tejbeer 1654
 
28377 tejbeer 1655
						JSONObject jsonObj = new JSONObject(payment.toString());
1656
 
1657
						String status = jsonObj.getString("status");
1658
 
1659
						statusList.add(status);
1660
 
28369 tejbeer 1661
					}
28377 tejbeer 1662
					LOGGER.info("statusList" + statusList);
28368 tejbeer 1663
 
28377 tejbeer 1664
					if (statusList.contains("authorized") || statusList.contains("captured")) {
1665
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1666
						po.setPaidAmount(po.getTotalAmount());
1667
						for (PendingOrderItem poi : poItems) {
1668
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1669
						}
1670
						Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
1671
 
1672
						CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1673
						Customer customer = customerRepository.selectById(po.getCustomerId());
1674
						String[] customerEmail = null;
1675
						if (customer.getEmailId() != null) {
1676
							customerEmail = new String[] { customer.getEmailId() };
1677
						}
1678
						List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com",
28467 tejbeer 1679
								"tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
1680
								"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28377 tejbeer 1681
						List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1682
						if (authUserEmails != null) {
1683
							authUserEmails = new ArrayList<>();
1684
						}
1685
						authUserEmails.addAll(bccTo);
1686
 
28382 tejbeer 1687
						// emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1688
						// "order-confirm.vm",
1689
						// emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
28377 tejbeer 1690
 
1691
					} else if (statusList.contains("refunded") || statusList.contains("failed")) {
1692
						for (PendingOrderItem poi : poItems) {
1693
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1694
						}
1695
 
1696
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1697
					}
1698
 
28369 tejbeer 1699
				}
28377 tejbeer 1700
				// LOGGER.info("payment" + payments);
28369 tejbeer 1701
 
1702
			}
28368 tejbeer 1703
		}
1704
	}
1705
 
25865 amit.gupta 1706
	public static class SaleTargetReportModel {
1707
		private double totalSale;
26941 amit.gupta 1708
		private long totalQty;
26945 amit.gupta 1709
		private double past3daysSale;
25880 amit.gupta 1710
		private int fofoId;
1711
 
1712
		public int getFofoId() {
1713
			return fofoId;
1714
		}
1715
 
1716
		public void setFofoId(int fofoId) {
1717
			this.fofoId = fofoId;
1718
		}
1719
 
25865 amit.gupta 1720
		private double smartphoneSale;
1721
		private long smartphoneQty;
1722
		private double insuranceSale;
1723
		private long insruanceQty;
1724
 
26941 amit.gupta 1725
		public long getTotalQty() {
1726
			return totalQty;
1727
		}
1728
 
1729
		public void setTotalQty(long totalQty) {
1730
			this.totalQty = totalQty;
1731
		}
1732
 
26945 amit.gupta 1733
		public double getPast3daysSale() {
1734
			return past3daysSale;
1735
		}
1736
 
1737
		public void setPast3daysSale(double past3daysSale) {
1738
			this.past3daysSale = past3daysSale;
1739
		}
1740
 
25865 amit.gupta 1741
		@Override
1742
		public int hashCode() {
1743
			final int prime = 31;
1744
			int result = 1;
25880 amit.gupta 1745
			result = prime * result + fofoId;
25865 amit.gupta 1746
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1747
			long temp;
1748
			temp = Double.doubleToLongBits(insuranceSale);
1749
			result = prime * result + (int) (temp ^ (temp >>> 32));
1750
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1751
			temp = Double.doubleToLongBits(smartphoneSale);
1752
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1753
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 1754
			temp = Double.doubleToLongBits(totalSale);
1755
			result = prime * result + (int) (temp ^ (temp >>> 32));
1756
			return result;
1757
		}
1758
 
1759
		@Override
1760
		public boolean equals(Object obj) {
1761
			if (this == obj)
1762
				return true;
1763
			if (obj == null)
1764
				return false;
1765
			if (getClass() != obj.getClass())
1766
				return false;
1767
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 1768
			if (fofoId != other.fofoId)
1769
				return false;
25865 amit.gupta 1770
			if (insruanceQty != other.insruanceQty)
1771
				return false;
1772
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
1773
				return false;
1774
			if (smartphoneQty != other.smartphoneQty)
1775
				return false;
1776
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
1777
				return false;
26941 amit.gupta 1778
			if (totalQty != other.totalQty)
1779
				return false;
25865 amit.gupta 1780
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
1781
				return false;
1782
			return true;
1783
		}
1784
 
1785
		public double getTotalSale() {
1786
			return totalSale;
1787
		}
1788
 
1789
		public void setTotalSale(double totalSale) {
1790
			this.totalSale = totalSale;
1791
		}
1792
 
1793
		public double getSmartphoneSale() {
1794
			return smartphoneSale;
1795
		}
1796
 
1797
		public void setSmartphoneSale(double smartphoneSale) {
1798
			this.smartphoneSale = smartphoneSale;
1799
		}
1800
 
1801
		public long getSmartphoneQty() {
1802
			return smartphoneQty;
1803
		}
1804
 
1805
		public void setSmartphoneQty(long smartphoneQty) {
1806
			this.smartphoneQty = smartphoneQty;
1807
		}
1808
 
1809
		public double getInsuranceSale() {
1810
			return insuranceSale;
1811
		}
1812
 
1813
		public void setInsuranceSale(double insuranceSale) {
1814
			this.insuranceSale = insuranceSale;
1815
		}
1816
 
1817
		public long getInsruanceQty() {
1818
			return insruanceQty;
1819
		}
1820
 
1821
		public void setInsruanceQty(long insruanceQty) {
1822
			this.insruanceQty = insruanceQty;
1823
		}
1824
 
1825
		@Override
1826
		public String toString() {
26945 amit.gupta 1827
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
1828
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
1829
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 1830
		}
1831
 
1832
	}
1833
 
26945 amit.gupta 1834
	private String getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
1835
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
26940 amit.gupta 1836
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
26945 amit.gupta 1837
		Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors
1838
				.groupingBy(x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
26940 amit.gupta 1839
		List<List<Serializable>> stateWiseSales = new ArrayList<>();
1840
		for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
26945 amit.gupta 1841
			long totalQty = stateMapEntry.getValue().stream()
1842
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
1843
			double totalSale = stateMapEntry.getValue().stream()
1844
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
1845
			long smartPhoneQty = stateMapEntry.getValue().stream()
1846
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
1847
			double smartPhoneSale = stateMapEntry.getValue().stream()
1848
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
1849
			stateWiseSales
1850
					.add(Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
26940 amit.gupta 1851
		}
1852
		StringBuilder sb = new StringBuilder();
26945 amit.gupta 1853
		sb.append("<html><body>");
1854
		sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
26940 amit.gupta 1855
		sb.append("<tbody>\n" + "	    <tr>"
1856
				+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
26941 amit.gupta 1857
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
1858
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
1859
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
1860
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
26940 amit.gupta 1861
				+ "	    				</tr>");
1862
		for (List<Serializable> stateSale : stateWiseSales) {
1863
			sb.append("<tr>");
1864
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
1865
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
1866
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
26941 amit.gupta 1867
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
1868
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
26940 amit.gupta 1869
			sb.append("</tr>");
1870
		}
26945 amit.gupta 1871
		sb.append("</tbody></table><br><br>");
25872 tejbeer 1872
 
26945 amit.gupta 1873
		sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
24653 govind 1874
		sb.append("<tbody>\n" + "	    				<tr>\n"
26945 amit.gupta 1875
				+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
1876
				+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
1877
				+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
1878
				+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
1879
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
1880
				+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
1881
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
24653 govind 1882
				+ "	    				</tr>");
26945 amit.gupta 1883
 
1884
		List<Integer> sortedPartnerSalesHeaders = partnerSalesHeadersMap.values().stream()
26947 amit.gupta 1885
				.sorted(Comparator.comparing(FofoReportingModel::getCode)
1886
						.thenComparing(FofoReportingModel::getRegionalManager)
26948 amit.gupta 1887
						.thenComparing(FofoReportingModel::getTerritoryManager))
26945 amit.gupta 1888
				.map(FofoReportingModel::getFofoId).collect(Collectors.toList());
25927 amit.gupta 1889
		for (Integer fofoId : sortedPartnerSalesHeaders) {
27007 amit.gupta 1890
			if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
26947 amit.gupta 1891
				sb.append("<tr style='background-color:red'>");
1892
			} else {
26945 amit.gupta 1893
				sb.append("<tr>");
1894
			}
1895
			sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode()
25880 amit.gupta 1896
					+ "</td>");
1897
			sb.append("<td style='border:1px solid black;padding: 5px'>"
27007 amit.gupta 1898
					+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
1899
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1900
					+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
1901
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1902
					+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
1903
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1904
					+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
25880 amit.gupta 1905
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1906
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
25880 amit.gupta 1907
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1908
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
25865 amit.gupta 1909
			sb.append("</tr>");
24653 govind 1910
		}
24683 amit.gupta 1911
 
26945 amit.gupta 1912
		sb.append("</tr>");
1913
 
1914
		sb.append("</body></html>");
1915
 
1916
		return sb.toString();
24653 govind 1917
	}
24841 govind 1918
 
26945 amit.gupta 1919
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 1920
			throws MessagingException, ProfitMandiBusinessException, IOException {
1921
		MimeMessage message = mailSender.createMimeMessage();
1922
		MimeMessageHelper helper = new MimeMessageHelper(message);
1923
		helper.setSubject(subject);
1924
		helper.setText(body, true);
1925
		helper.setTo(email);
1926
		if (cc != null) {
1927
			helper.setCc(cc);
1928
		}
1929
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
1930
		helper.setFrom(senderAddress);
1931
		mailSender.send(message);
1932
	}
25300 tejbeer 1933
 
25351 tejbeer 1934
	public void sendNotification() throws Exception {
25300 tejbeer 1935
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
1936
		if (!pushNotifications.isEmpty()) {
1937
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 1938
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 1939
				NotificationCampaign notificationCampaign = notificationCampaignRepository
1940
						.selectById(pushNotification.getNotificationCampaignid());
1941
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
1942
						SimpleCampaignParams.class);
1943
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 1944
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 1945
				JSONObject json = new JSONObject();
25351 tejbeer 1946
				json.put("to", device.getFcmId());
25300 tejbeer 1947
				JSONObject jsonObj = new JSONObject();
1948
				jsonObj.put("message", campaign.getMessage());
1949
				jsonObj.put("title", campaign.getTitle());
1950
				jsonObj.put("type", campaign.getType());
1951
				jsonObj.put("url", result_url);
1952
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
1953
				jsonObj.put("image", campaign.getImageUrl());
1954
				jsonObj.put("largeIcon", "large_icon");
1955
				jsonObj.put("smallIcon", "small_icon");
1956
				jsonObj.put("vibrate", 1);
1957
				jsonObj.put("pid", pushNotification.getId());
1958
				jsonObj.put("sound", 1);
1959
				jsonObj.put("priority", "high");
1960
				json.put("data", jsonObj);
25351 tejbeer 1961
				try {
1962
					CloseableHttpClient client = HttpClients.createDefault();
1963
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 1964
 
25351 tejbeer 1965
					httpPost.setHeader("Content-Type", "application/json; utf-8");
1966
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
1967
					StringEntity entity = new StringEntity(json.toString());
1968
					httpPost.setEntity(entity);
1969
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 1970
 
25351 tejbeer 1971
					if (response.getStatusLine().getStatusCode() == 200) {
1972
						pushNotification.setSentTimestamp(LocalDateTime.now());
1973
					} else {
25356 tejbeer 1974
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 1975
						LOGGER.info("message" + "not sent");
26945 amit.gupta 1976
						response.toString();
25351 tejbeer 1977
					}
25300 tejbeer 1978
 
25351 tejbeer 1979
				} catch (Exception e) {
1980
					e.printStackTrace();
26443 amit.gupta 1981
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 1982
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 1983
				}
1984
			}
1985
		}
1986
	}
1987
 
25553 amit.gupta 1988
	public void grouping() throws Exception {
25609 amit.gupta 1989
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
1990
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
1991
		System.out.println(String.join("\t",
1992
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 1993
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 1994
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 1995
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 1996
			if (priceDropIMEI.getPartnerId() == 0)
1997
				continue;
25609 amit.gupta 1998
			HashSet<String> imeis = new HashSet<>();
1999
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2000
			imeis.add(priceDropIMEI.getImei());
2001
			List<InventoryItem> inventoryItems = inventoryItemRepository
2002
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 2003
			if (inventoryItems.size() == 0) {
2004
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 2005
				continue;
25612 amit.gupta 2006
			}
25609 amit.gupta 2007
			InventoryItem inventoryItem = inventoryItems.get(0);
2008
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
2009
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
2010
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
2011
				// check if pricedrop has been rolled out
2012
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
2013
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
2014
				if (uwh.size() > 0) {
25615 amit.gupta 2015
					Item item = itemRepository.selectById(inventoryItem.getItemId());
26945 amit.gupta 2016
					System.out.println(String.join("\t", Arrays.asList(priceDropIMEI.getImei(),
2017
							inventoryItem.getItemId() + "", item.getBrand(), item.getModelName(), item.getModelNumber(),
2018
							inventoryItem.getFofoId() + "", customRetailer.getBusinessName(),
2019
							inventoryItem.getCreateTimestamp().format(dtf), priceDrop.getAffectedOn().format(dtf),
2020
							priceDropIMEI.getUpdateTimestamp().format(dtf),
2021
							inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getAutoPartnerPayout() + "",
2022
							inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 2023
				}
2024
			}
2025
		}
25503 amit.gupta 2026
	}
25694 amit.gupta 2027
 
27686 amit.gupta 2028
	public void attachToffeeInvoices() throws Exception {
28205 tejbeer 2029
		/*
2030
		 * LOGGER.info("Insurance Sum Summary --- {}",
2031
		 * insurancePolicyRepository.selectAmountSumGroupByRetailerId(LocalDateTime.MIN,
2032
		 * LocalDateTime.MAX)); LOGGER.info("Insurance Qty Summary --- {}",
2033
		 * insurancePolicyRepository.selectQtyGroupByRetailerId(LocalDateTime.MIN,
2034
		 * LocalDateTime.MAX)); LOGGER.info("SmartPhone Amount Summary --- {}",
2035
		 * fofoOrderItemRepository.selectSumAmountGroupByRetailer(LocalDateTime.MIN,
2036
		 * LocalDateTime.MAX, 0, true)); LOGGER.info("Smartphone Qty Summary --- {}",
2037
		 * fofoOrderItemRepository.selectQtyGroupByRetailer(LocalDateTime.MIN,
2038
		 * LocalDateTime.MAX, 0, true));
2039
		 */
2040
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3,
2041
				Optional.of(false));
2042
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
27678 amit.gupta 2043
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2044
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2045
			PdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2046
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2047
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
28205 tejbeer 2048
			String pdfInvoiceString = "data:application/pdf;base64,"
2049
					+ Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2050
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1],
2051
					pdfInvoiceString);
2052
			if (attached) {
27678 amit.gupta 2053
				insurancePolicy.setPosted(true);
2054
			}
2055
		}
25694 amit.gupta 2056
	}
2057
 
2058
	public void schemeRollback(List<String> schemeIds) throws Exception {
2059
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 2060
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 2061
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2062
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2063
		for (SchemeInOut sio : schemeInOuts) {
2064
			Scheme scheme = schemesMap.get(sio.getSchemeId());
2065
			if (scheme.getType().equals(SchemeType.IN)) {
2066
 
2067
			} else if (scheme.getType().equals(SchemeType.OUT)) {
2068
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2069
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
2070
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
2071
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2072
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
2073
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
2074
					sio.setRolledBackTimestamp(LocalDateTime.now());
2075
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 2076
					String rollbackReason = "Scheme reversed for "
2077
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 2078
							+ fofoOrder.getInvoiceNumber();
2079
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 2080
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
2081
							LocalDateTime.now());
25694 amit.gupta 2082
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
2083
							rollbackReason);
2084
				}
2085
			}
2086
		}
25721 tejbeer 2087
		// throw new Exception();
25694 amit.gupta 2088
	}
25721 tejbeer 2089
 
2090
	public void checkfocusedModelInPartnerStock() throws Exception {
2091
 
2092
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
2093
				.collect(Collectors.toList());
27212 tejbeer 2094
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
2095
				.getSaholicStock();
27213 tejbeer 2096
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2097
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 2098
 
2099
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
2100
				.getSaholicPOItems();
25721 tejbeer 2101
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2102
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 2103
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2104
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 2105
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2106
			Map<Integer, Integer> processingOrderMap = null;
2107
			Map<Integer, Integer> catalogIdAndQtyMap = null;
2108
			Map<Integer, Integer> grnPendingOrdersMap = null;
2109
 
2110
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
2111
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
2112
 
2113
			if (!currentInventorySnapshot.isEmpty()) {
2114
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
2115
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2116
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
2117
 
2118
			}
2119
 
2120
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
2121
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2122
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2123
			if (!grnPendingOrders.isEmpty()) {
2124
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
2125
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2126
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
2127
 
2128
			}
2129
 
2130
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
2131
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2132
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2133
			if (!processingOrder.isEmpty()) {
2134
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
2135
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2136
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
2137
 
2138
			}
2139
 
25800 tejbeer 2140
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
2141
					.collect(Collectors.toList());
2142
 
27088 tejbeer 2143
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
2144
					.collect(Collectors.toList());
27095 tejbeer 2145
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 2146
			if (regionIds.size() == 0) {
2147
				LOGGER.info("No region found for partner {}", fofoId);
2148
				continue;
2149
			}
27100 amit.gupta 2150
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 2151
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
2152
							Collectors.mapping(FocusedModel::getMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 2153
 
25721 tejbeer 2154
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
2155
 
27100 amit.gupta 2156
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2157
				int minQty = entry.getValue().get();
25721 tejbeer 2158
				int inStockQty = 0;
2159
				int processingQty = 0;
2160
				int grnPendingQty = 0;
27208 tejbeer 2161
				int allColorNetAvailability = 0;
27253 tejbeer 2162
				int allColorPoAvailability = 0;
25721 tejbeer 2163
				if (processingOrderMap != null) {
2164
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
2165
							: processingOrderMap.get(entry.getKey());
2166
 
2167
				}
2168
				if (grnPendingOrdersMap != null) {
2169
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2170
							: grnPendingOrdersMap.get(entry.getKey());
2171
 
2172
				}
2173
				if (catalogIdAndQtyMap != null) {
2174
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2175
							: catalogIdAndQtyMap.get(entry.getKey());
2176
 
2177
				}
28526 tejbeer 2178
 
2179
				int grnStockQty = grnPendingQty + inStockQty;
25721 tejbeer 2180
				int totalQty = processingQty + grnPendingQty + inStockQty;
2181
 
27100 amit.gupta 2182
				if (totalQty < minQty) {
25721 tejbeer 2183
 
27100 amit.gupta 2184
					int shortageQty = minQty - totalQty;
25721 tejbeer 2185
					List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
27212 tejbeer 2186
					FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
27213 tejbeer 2187
 
27212 tejbeer 2188
					Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2189
							.get(fofoStore.getWarehouseId());
25721 tejbeer 2190
 
27212 tejbeer 2191
					Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2192
							.get(fofoStore.getWarehouseId());
27208 tejbeer 2193
 
2194
					for (Item it : item) {
28527 tejbeer 2195
						List<SaholicCIS> currentAvailability = null;
28528 tejbeer 2196
						List<SaholicPOItem> poItemAvailability = null;
28527 tejbeer 2197
						if (itemAvailabilityMap != null) {
2198
							currentAvailability = itemAvailabilityMap.get(it.getId());
2199
						}
28528 tejbeer 2200
 
2201
						if (poItemAvailabilityMap != null) {
2202
							poItemAvailability = poItemAvailabilityMap.get(it.getId());
2203
						}
27208 tejbeer 2204
						if (currentAvailability != null) {
2205
							allColorNetAvailability += currentAvailability.stream()
2206
									.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2207
						}
27253 tejbeer 2208
 
27208 tejbeer 2209
						if (poItemAvailability != null) {
27253 tejbeer 2210
							allColorPoAvailability += poItemAvailability.stream()
27208 tejbeer 2211
									.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
2212
						}
27253 tejbeer 2213
 
27208 tejbeer 2214
					}
2215
 
25721 tejbeer 2216
					FocusedModelShortageModel fm = new FocusedModelShortageModel();
2217
					fm.setFofoId(fofoId);
27212 tejbeer 2218
					fm.setStoreCode(fofoStore.getCode());
25721 tejbeer 2219
					fm.setStoreName(customRetailer.getBusinessName());
27208 tejbeer 2220
					fm.setBrandName(item.get(0).getBrand());
2221
					fm.setModelName(item.get(0).getModelName());
2222
					fm.setModelNumber(item.get(0).getModelNumber());
28526 tejbeer 2223
					fm.setGrnStockQty(grnStockQty);
2224
					fm.setPendingIndentQty(processingQty);
25721 tejbeer 2225
					fm.setShortageQty(shortageQty);
27253 tejbeer 2226
					fm.setPoAvailabitiy(allColorPoAvailability);
27208 tejbeer 2227
					fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
27213 tejbeer 2228
					fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2229
					fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
27246 tejbeer 2230
					fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
27208 tejbeer 2231
					fm.setAvailabitiy(allColorNetAvailability);
25721 tejbeer 2232
 
27102 amit.gupta 2233
					focusedModelShortageList.add(fm);
25721 tejbeer 2234
				}
2235
 
2236
			}
27233 tejbeer 2237
 
28529 tejbeer 2238
			if (!focusedModelShortageList.isEmpty()) {
2239
				String subject = "Stock Alert";
2240
				String messageText = this.getMessage(focusedModelShortageList);
27233 tejbeer 2241
 
28529 tejbeer 2242
				this.sendMailWithAttachments(subject, messageText, customRetailer.getEmail());
2243
				String notificationMessage = this.getNotificationMessage(focusedModelShortageList);
2244
 
2245
				LOGGER.info("notificationMessage" + notificationMessage);
2246
 
2247
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
2248
				sendNotificationModel.setCampaignName("Stock Alert");
2249
				sendNotificationModel.setTitle("Alert");
2250
				sendNotificationModel.setMessage(notificationMessage);
2251
				sendNotificationModel.setType("url");
2252
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2253
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2254
				sendNotificationModel.setMessageType(MessageType.notification);
2255
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2256
				sendNotificationModel.setUserIds(Arrays.asList(userId));
2257
				notificationService.sendNotification(sendNotificationModel);
2258
 
2259
			}
2260
 
25721 tejbeer 2261
		}
27102 amit.gupta 2262
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2263
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2264
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2265
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2266
 
25800 tejbeer 2267
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2268
				storeGuyMap.entrySet().forEach(y -> {
2269
 
2270
					if (y.getValue().contains(x.getKey())) {
2271
						if (!emailRowsMap.containsKey(y.getKey())) {
2272
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2273
						}
27208 tejbeer 2274
						List<List<? extends Serializable>> fms = x.getValue().stream()
2275
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2276
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
28526 tejbeer 2277
										r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(),
2278
										r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2279
								.collect(Collectors.toList());
2280
						emailRowsMap.get(y.getKey()).addAll(fms);
2281
 
25721 tejbeer 2282
					}
2283
 
25800 tejbeer 2284
				});
25721 tejbeer 2285
 
2286
			});
2287
 
27212 tejbeer 2288
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
28526 tejbeer 2289
					"Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty",
2290
					"Availability");
25837 amit.gupta 2291
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2292
 
25800 tejbeer 2293
				ByteArrayOutputStream baos = null;
2294
				try {
25837 amit.gupta 2295
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2296
				} catch (Exception e2) {
2297
					e2.printStackTrace();
2298
				}
28529 tejbeer 2299
				String[] sendToArray = new String[] { entry.getKey() };
28526 tejbeer 2300
 
25800 tejbeer 2301
				try {
2302
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2303
							new ByteArrayResource(baos.toByteArray()));
2304
				} catch (Exception e1) { // TODO Auto-generated catch block
2305
					e1.printStackTrace();
2306
				}
25721 tejbeer 2307
 
25800 tejbeer 2308
			});
2309
		}
25721 tejbeer 2310
	}
2311
 
2312
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2313
		StringBuilder sb = new StringBuilder();
2314
		sb.append("Focused Model Shortage in Your Stock : \n");
2315
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2316
 
2317
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2318
			sb.append(String.format("%n", ""));
2319
		}
2320
		return sb.toString();
2321
	}
2322
 
2323
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2324
		MimeMessage message = mailSender.createMimeMessage();
2325
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2326
 
2327
		helper.setSubject(subject);
2328
		helper.setText(messageText, true);
2329
		helper.setTo(email);
27116 amit.gupta 2330
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2331
		helper.setFrom(senderAddress);
2332
		mailSender.send(message);
2333
 
2334
	}
2335
 
2336
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2337
		StringBuilder sb = new StringBuilder();
2338
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2339
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2340
		sb.append("<tbody>\n" + "	    				<tr>\n"
2341
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2342
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2343
				+ "	    				</tr>");
2344
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2345
 
2346
			sb.append("<tr>");
2347
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2348
 
2349
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2350
 
2351
			sb.append("</tr>");
2352
 
2353
		}
2354
 
2355
		sb.append("</tbody></table></body></html>");
2356
 
2357
		return sb.toString();
2358
	}
2359
 
25927 amit.gupta 2360
	public void notifyLead() throws Exception {
2361
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(LocalDateTime.now().minusDays(15),
2362
				LocalDateTime.now().plusHours(4));
2363
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2364
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2365
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2366
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2367
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2368
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2369
 
27477 amit.gupta 2370
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2371
 
25927 amit.gupta 2372
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2373
 
2374
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2375
			int authId = authUserEmail.getKey();
2376
			String email = authUserEmail.getValue();
2377
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2378
		}
27477 amit.gupta 2379
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2380
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2381
 
25927 amit.gupta 2382
		String templateMessage = "Lead followup for %s %s, %s is due by %s";
2383
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2384
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2385
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2386
				continue;
2387
			}
2388
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
27795 amit.gupta 2389
					lead.getAddress(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
25927 amit.gupta 2390
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2391
			sendNotificationModel.setCampaignName("Lead Reminder");
2392
			sendNotificationModel.setTitle("Leads followup Reminder");
2393
			sendNotificationModel.setMessage(notificationMessage);
2394
			sendNotificationModel.setType("url");
27206 tejbeer 2395
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2396
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2397
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2398
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2399
			System.out.println(sendNotificationModel);
25927 amit.gupta 2400
			notificationService.sendNotification(sendNotificationModel);
2401
		}
2402
	}
26945 amit.gupta 2403
 
25927 amit.gupta 2404
	public void notifyVisits() throws Exception {
26945 amit.gupta 2405
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2406
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2407
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2408
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2409
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2410
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2411
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2412
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2413
 
25927 amit.gupta 2414
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2415
			int authId = authUserEmail.getKey();
2416
			String email = authUserEmail.getValue();
2417
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2418
		}
2419
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2420
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2421
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2422
		for (FranchiseeVisit visit : franchiseeVisits) {
2423
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2424
				continue;
2425
			}
2426
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2427
			String message = null;
26945 amit.gupta 2428
			if (visit.getFranchiseActivityId() == 0) {
2429
				message = String.format(visitTemplate, visit.getPartnerName(),
2430
						timeFormatter.format(visit.getSchelduleTimestamp()));
2431
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2432
			} else {
26945 amit.gupta 2433
				message = String.format(followupTemplate, visit.getPartnerName(),
2434
						timeFormatter.format(visit.getSchelduleTimestamp()));
25927 amit.gupta 2435
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2436
			}
2437
			sendNotificationModel.setMessage(message);
2438
			sendNotificationModel.setType("url");
26482 tejbeer 2439
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2440
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2441
			sendNotificationModel.setMessageType(MessageType.reminder);
2442
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2443
			notificationService.sendNotification(sendNotificationModel);
2444
		}
25910 amit.gupta 2445
	}
25982 amit.gupta 2446
 
26283 tejbeer 2447
	public void ticketClosed() throws Exception {
2448
 
2449
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2450
		for (Ticket ticket : tickets) {
2451
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2452
				ticket.setCloseTimestamp(LocalDateTime.now());
2453
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2454
				ticket.setUpdateTimestamp(LocalDateTime.now());
2455
				ticketRepository.persist(ticket);
2456
			}
2457
		}
2458
 
2459
	}
2460
 
26790 tejbeer 2461
	public void checkValidateReferral() throws Exception {
2462
 
2463
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2464
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2465
		if (!referrals.isEmpty()) {
2466
			String subject = "Referral Request";
2467
			String messageText = this.getMessageForReferral(referrals);
2468
 
26792 tejbeer 2469
			MimeMessage message = mailSender.createMimeMessage();
2470
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
2471
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
2472
			helper.setSubject(subject);
2473
			helper.setText(messageText, true);
2474
			helper.setTo(email);
2475
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2476
			helper.setFrom(senderAddress);
2477
			mailSender.send(message);
2478
 
26790 tejbeer 2479
		}
2480
	}
2481
 
2482
	private String getMessageForReferral(List<Refferal> referrals) {
2483
		StringBuilder sb = new StringBuilder();
2484
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2485
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2486
		sb.append("<tbody>\n" + "	    				<tr>\n"
2487
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2488
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2489
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2490
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2491
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2492
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2493
				+ "	    				</tr>");
2494
		for (Refferal entry : referrals) {
2495
 
2496
			sb.append("<tr>");
2497
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2498
 
2499
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2500
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2501
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2502
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2503
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2504
 
2505
			sb.append("</tr>");
2506
 
2507
		}
2508
 
2509
		sb.append("</tbody></table></body></html>");
2510
 
2511
		return sb.toString();
2512
	}
2513
 
27271 amit.gupta 2514
	public void reverseWallet() throws Exception {
2515
		LocalDate localDate = LocalDate.of(2020, 10, 28);
28205 tejbeer 2516
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(),
2517
				localDate.plusDays(1).atStartOfDay(),
27271 amit.gupta 2518
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2519
		for (UserWalletHistory uwh : uwhList) {
28205 tejbeer 2520
			if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2521
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
28205 tejbeer 2522
				// LOGGER.info("UWH - {}", uwh);
2523
				// amount += uwh.getAmount();
2524
				// System.out.println("Amount is - " + amount);
2525
				// walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2526
				// uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2527
				// run", uwh.getBusinessTimestamp());
27313 amit.gupta 2528
				int orderId = uwh.getReference();
2529
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2530
				int inventoryItemId = 0;
28205 tejbeer 2531
				// fofoOrderRepository.delete(fofoOrder);
27313 amit.gupta 2532
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
28205 tejbeer 2533
				/*
2534
				 * List<PaymentOptionTransaction> paymentOptionTransactions =
2535
				 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2536
				 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2537
				 * paymentOptionTransaction : paymentOptionTransactions) {
2538
				 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2539
				 */
2540
				for (FofoOrderItem foi : fofoOrderItems) {
2541
					// fofoOrderItemRepository.delete(foi);
27313 amit.gupta 2542
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
28205 tejbeer 2543
					for (FofoLineItem fli : flis) {
2544
						// fofoLineItemRepository.delete(fli);
27313 amit.gupta 2545
						inventoryItemId = fli.getInventoryItemId();
2546
					}
2547
				}
28205 tejbeer 2548
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2549
						java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2550
				for (SchemeInOut sio : schemeInOuts) {
2551
					if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2552
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2553
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2554
					}
2555
				}
28205 tejbeer 2556
 
27271 amit.gupta 2557
			}
2558
		}
28205 tejbeer 2559
 
27271 amit.gupta 2560
	}
28205 tejbeer 2561
 
2562
	public void partnerProblemAlert() throws Exception {
2563
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
2564
		Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2565
				curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
2566
		Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1),
2567
				curDate.with(LocalTime.MAX), 0, false);
2568
		Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream()
2569
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2570
 
2571
		for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
2572
 
2573
			double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2574
 
2575
			LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
2576
 
28211 tejbeer 2577
			double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28208 tejbeer 2578
 
2579
			LOGGER.info("mtdSale" + mtdSale);
2580
 
28209 tejbeer 2581
			double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0
2582
					: pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2583
 
28208 tejbeer 2584
			LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
2585
 
28209 tejbeer 2586
			double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28208 tejbeer 2587
 
2588
			LOGGER.info("stockInvestment" + stockInvestment);
2589
 
28205 tejbeer 2590
			boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
2591
 
2592
			PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
2593
 
28210 tejbeer 2594
			if (partnerProblem == null) {
28205 tejbeer 2595
				partnerProblem = new PartnerProblem();
2596
				partnerProblem.setFofoId(ls.getKey());
2597
				if (mtdSale < lmtdTwentyPercentSale) {
2598
					partnerProblem.setMtd(1);
2599
				}
2600
				if (Investmentvalue) {
2601
					partnerProblem.setInvestment(1);
2602
				}
2603
 
2604
				if (stockInvestment < totalSixtyPercentInvestment) {
2605
					partnerProblem.setInvestment(1);
2606
				}
2607
 
2608
				partnerProblemRepository.persist(partnerProblem);
2609
			} else {
2610
				if (mtdSale < lmtdTwentyPercentSale) {
2611
					partnerProblem.setMtd(partnerProblem.getMtd() + 1);
2612
 
2613
				} else {
2614
					partnerProblem.setMtd(0);
2615
 
2616
				}
2617
				if (Investmentvalue) {
2618
					partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2619
				} else {
2620
					partnerProblem.setInvestment(0);
2621
 
2622
				}
2623
				if (stockInvestment < totalSixtyPercentInvestment) {
2624
					partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2625
				} else {
2626
					partnerProblem.setStockInvestment(0);
2627
				}
2628
 
2629
			}
2630
 
2631
		}
2632
 
28213 tejbeer 2633
		List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream()
2634
				.filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
2635
 
28223 tejbeer 2636
		partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
28224 tejbeer 2637
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
28223 tejbeer 2638
					+ x2.getStockInvestment() ? 1 : -1;
2639
		}).collect(Collectors.toList());
28227 tejbeer 2640
 
2641
		Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
2642
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
2643
					+ x2.getStockInvestment() ? 1 : -1;
2644
		}).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2645
 
28212 tejbeer 2646
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28213 tejbeer 2647
 
28467 tejbeer 2648
		List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28213 tejbeer 2649
 
2650
		Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream()
2651
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2652
 
28286 tejbeer 2653
		List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 2654
				"niranjan.kala@smartdukaan.com", "sm@smartdukaan.com", "tejbeer.kaur@shop2020.in");
28208 tejbeer 2655
		LOGGER.info("partnerProblem" + partnerProblems);
28205 tejbeer 2656
		StringBuilder sb = new StringBuilder();
28218 tejbeer 2657
		sb.append("<htl><body>");
28222 tejbeer 2658
		sb.append(
2659
				"<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 2660
		sb.append("<tbody>\n" + "	    <tr>"
2661
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2662
				+ "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>"
2663
				+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2664
				+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2665
				+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
2666
				+ "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
2667
 
2668
				+ "	    				</tr>");
2669
 
2670
		for (PartnerProblem pp : partnerProblems) {
28467 tejbeer 2671
			int value = pp.getFofoId() % 4;
28205 tejbeer 2672
 
2673
			Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
28217 tejbeer 2674
			LOGGER.info("authUserMap" + authUserMap);
28205 tejbeer 2675
			sb.append("<tr>");
2676
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2677
					+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
28213 tejbeer 2678
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2679
					+ assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
28205 tejbeer 2680
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2681
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2682
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28216 tejbeer 2683
			sb.append("<td style='border:1px solid black;padding: 5px'>"
28224 tejbeer 2684
					+ (authUserMap.get(EscalationType.L1) == null ? "N/A"
28216 tejbeer 2685
							: authUserMap.get(EscalationType.L1).getFirstName())
28224 tejbeer 2686
					+ " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A"
28218 tejbeer 2687
							: authUserMap.get(EscalationType.L2).getFirstName())
28216 tejbeer 2688
					+ "</td>");
28205 tejbeer 2689
 
2690
			sb.append("</tr>");
2691
		}
2692
		sb.append("</tbody></table><br><br>");
2693
		String subject = "Partner Problem Alert!";
2694
		String[] email = sendTo.toArray(new String[sendTo.size()]);
2695
 
28222 tejbeer 2696
		this.sendMailHtmlFormat(email, sb.toString(), null, subject);
2697
 
28218 tejbeer 2698
		Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
2699
 
2700
		for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
28222 tejbeer 2701
			AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
28227 tejbeer 2702
			for (Integer patnerId : authUserPartner.getValue()) {
2703
				if (partnerProblemMap.get(patnerId) != null) {
28218 tejbeer 2704
 
28227 tejbeer 2705
					StringBuilder sbbuilder = new StringBuilder();
2706
					sbbuilder.append("<hml><body>");
2707
					sb.append(
2708
							"<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>");
2709
					sbbuilder.append("<tbody>\n" + "	    <tr>"
2710
							+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2711
							+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2712
							+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2713
							+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 2714
 
28227 tejbeer 2715
							+ "	    				</tr>");
28218 tejbeer 2716
 
28227 tejbeer 2717
					for (Integer partnerId : authUserPartner.getValue()) {
2718
						if (partnerProblemMap.get(partnerId) != null) {
2719
							PartnerProblem pp = partnerProblemMap.get(partnerId);
2720
							sbbuilder.append("<tr>");
2721
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2722
									+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2723
							sbbuilder
2724
									.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2725
							sbbuilder.append(
2726
									"<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2727
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2728
									+ pp.getStockInvestment() + "</td>");
2729
 
2730
							sbbuilder.append("</tr>");
2731
						}
2732
 
28224 tejbeer 2733
					}
28227 tejbeer 2734
					sbbuilder.append("</tbody></table><br><br>");
28224 tejbeer 2735
 
28286 tejbeer 2736
					this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
28230 tejbeer 2737
					break;
28218 tejbeer 2738
				}
28230 tejbeer 2739
 
28223 tejbeer 2740
			}
28222 tejbeer 2741
		}
2742
	}
28218 tejbeer 2743
 
28222 tejbeer 2744
	private void sendMailHtmlFormat(String email[], String body, String cc[], String subject)
2745
			throws MessagingException, ProfitMandiBusinessException, IOException {
2746
		MimeMessage message = mailSender.createMimeMessage();
2747
		MimeMessageHelper helper = new MimeMessageHelper(message);
2748
		helper.setSubject(subject);
2749
		helper.setText(body, true);
2750
		helper.setTo(email);
2751
		if (cc != null) {
2752
			helper.setCc(cc);
28218 tejbeer 2753
		}
28222 tejbeer 2754
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2755
		helper.setFrom(senderAddress);
2756
		mailSender.send(message);
28205 tejbeer 2757
	}
2758
 
26418 tejbeer 2759
}
27438 amit.gupta 2760
//2284