Subversion Repositories SmartDukaan

Rev

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

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