Subversion Repositories SmartDukaan

Rev

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