Subversion Repositories SmartDukaan

Rev

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