Subversion Repositories SmartDukaan

Rev

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