Subversion Repositories SmartDukaan

Rev

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