Subversion Repositories SmartDukaan

Rev

Rev 28775 | Rev 28780 | 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)) {
28775 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.\nRegards\nHR Team", authUser.getFullName());
28769 amit.gupta 1129
				Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, new String[] { "jyoti.rawat@smartdukaan.com" }, "Attendance Alert", 
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)) {
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.\nRegards\nHR Team", authUser.getFullName());
1160
				Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, new String[] { "jyoti.rawat@smartdukaan.com" }, "Attendance Alert", 
1161
						body);
1162
				break;
1163
			}
1164
		}
1165
 
1166
	}
1167
 
28709 amit.gupta 1168
	public void checkPartnerActiveStore() throws Exception {
1169
 
1170
		List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
1171
 
1172
		LocalDateTime currentDate = LocalDate.now().atStartOfDay();
28712 amit.gupta 1173
		if (!fofoStores.isEmpty()) {
1174
			for (FofoStore fofoStore : fofoStores) {
28709 amit.gupta 1175
 
28712 amit.gupta 1176
				if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
28709 amit.gupta 1177
 
28712 amit.gupta 1178
					fofoStore.setActive(true);
1179
					fofoStoreRepository.persist(fofoStore);
1180
					LOGGER.info("inserted into InActiveFofoStore successfully");
28709 amit.gupta 1181
 
28712 amit.gupta 1182
				}
28709 amit.gupta 1183
 
28712 amit.gupta 1184
				else {
1185
					fofoStore.setActive(false);
1186
					fofoStore.setActiveTimeStamp(null);
1187
					fofoStoreRepository.persist(fofoStore);
1188
					LOGGER.info("inserted into InActiveFofoStore successfully");
1189
				}
28709 amit.gupta 1190
 
1191
			}
1192
		}
1193
 
1194
	}
1195
 
24697 amit.gupta 1196
	public void sendAgeingReport() throws Exception {
27210 tejbeer 1197
		sendAgeingReport("kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 1198
				"niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
24697 amit.gupta 1199
	}
1200
 
24533 govind 1201
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 1202
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 1203
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 1204
			priceDropService.priceDropStatus(priceDrop.getId());
1205
		}
1206
	}
23929 amit.gupta 1207
 
24542 amit.gupta 1208
	public void walletmismatch() throws Exception {
1209
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 1210
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 1211
		System.out.println(pdis.size());
24542 amit.gupta 1212
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 1213
			int fofoId = pdi.getFofoId();
24542 amit.gupta 1214
			for (PartnerDailyInvestment investment : Lists
1215
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 1216
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 1217
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 1218
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 1219
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
1220
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 1221
 
24542 amit.gupta 1222
			}
24549 amit.gupta 1223
		}
24542 amit.gupta 1224
 
1225
	}
1226
 
1227
	public void gst() throws Exception {
24548 amit.gupta 1228
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2019, 1, 26).atStartOfDay(),
1229
				LocalDate.of(2019, 1, 27).atTime(LocalTime.MAX));
1230
		for (FofoOrder fofoOrder : fofoOrders) {
1231
			int retailerAddressId = retailerRegisteredAddressRepository
1232
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 1233
 
1234
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
1235
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1236
			Integer stateId = null;
1237
			if (customerAddress.getState().equals(retailerAddress.getState())) {
1238
				try {
1239
					stateId = Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
1240
				} catch (Exception e) {
1241
					LOGGER.error("Unable to get state rates");
1242
				}
1243
			}
1244
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1245
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 1246
 
1247
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
26929 amit.gupta 1248
			List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
24542 amit.gupta 1249
			if (stateId != null) {
26929 amit.gupta 1250
				itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
24542 amit.gupta 1251
			} else {
26929 amit.gupta 1252
				itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
24542 amit.gupta 1253
			}
1254
 
24548 amit.gupta 1255
			for (FofoOrderItem foi : fofoOrderItems) {
24542 amit.gupta 1256
				if (stateId == null) {
1257
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
1258
				} else {
1259
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1260
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1261
				}
1262
				fofoOrderItemRepository.persist(foi);
1263
			}
1264
		}
24548 amit.gupta 1265
 
24542 amit.gupta 1266
	}
1267
 
24580 amit.gupta 1268
	public void schemewalletmismatch() {
1269
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 1270
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 1271
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 1272
			// reconcileOrders(dateTime);
1273
			// reconcileRecharges(dateTime);
24580 amit.gupta 1274
			dateToReconcile = dateToReconcile.plusDays(1);
1275
		}
1276
	}
1277
 
1278
	private void reconcileSchemes(LocalDate date) {
1279
		LocalDateTime startDate = date.atStartOfDay();
1280
		LocalDateTime endDate = startDate.plusDays(1);
1281
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1282
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 1283
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1284
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 1285
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 1286
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
1287
				WalletReferenceType.SCHEME_OUT);
1288
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
1289
				walletReferenceTypes);
1290
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1291
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 1292
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 1293
 
1294
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
1295
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1296
 
1297
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
1298
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1299
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
1300
 
1301
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
1302
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1303
 
1304
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
1305
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
1306
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
1307
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
1308
 
1309
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
26092 amit.gupta 1310
 
24587 amit.gupta 1311
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1312
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1313
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1314
				} else {
1315
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
1316
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
1317
				}
1318
			}
24590 amit.gupta 1319
			Map<Integer, Integer> userWalletMap = userWalletRepository
1320
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1321
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1322
 
24587 amit.gupta 1323
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1324
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1325
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1326
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1327
				if (diff > 5) {
1328
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1329
				}
1330
			}
24580 amit.gupta 1331
		}
24587 amit.gupta 1332
 
24580 amit.gupta 1333
	}
24590 amit.gupta 1334
 
24592 amit.gupta 1335
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1336
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1337
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1338
 
24592 amit.gupta 1339
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1340
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1341
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1342
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1343
		Set<String> serialNumbersConsidered = new HashSet<>();
1344
 
25096 amit.gupta 1345
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1346
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1347
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1348
 
24683 amit.gupta 1349
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1350
		purchases.stream().forEach(purchase -> {
1351
			float amountToRollback = 0;
1352
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1353
					+ purchase.getPurchaseReference();
1354
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1355
					.stream().filter(ii -> ii.getSerialNumber() != null)
1356
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1357
			if (inventorySerialNumberMap.size() > 0) {
1358
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1359
					String serialNumber = inventorySerialNumberEntry.getValue();
1360
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1361
					if (serialNumbersConsidered.contains(serialNumber)) {
1362
						// This will rollback scheme for differenct orders for same serial
1363
						List<SchemeInOut> sios = schemeInOutRepository
1364
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1365
								.filter(x -> x.getRolledBackTimestamp() == null
1366
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1367
								.collect(Collectors.toList());
1368
						Collections.reverse(sios);
1369
						for (SchemeInOut sio : sios) {
1370
							sio.setRolledBackTimestamp(LocalDateTime.now());
1371
							amountToRollback += sio.getAmount();
1372
							// sio.setSchemeType(SchemeType.OUT);
1373
							sio.setSerialNumber(serialNumber);
1374
							rolledbackSios.add(sio);
1375
						}
1376
						description = description.concat(" " + serialNumber + " ");
1377
					} else {
1378
						serialNumbersConsidered.add(serialNumber);
1379
						List<Integer> schemesConsidered = new ArrayList<>();
1380
						List<SchemeInOut> sios = schemeInOutRepository
1381
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1382
								.filter(x -> x.getRolledBackTimestamp() == null
1383
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1384
								.collect(Collectors.toList());
1385
						Collections.reverse(sios);
1386
						for (SchemeInOut sio : sios) {
1387
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1388
								schemesConsidered.add(sio.getSchemeId());
1389
								continue;
1390
							}
1391
							sio.setRolledBackTimestamp(LocalDateTime.now());
1392
							amountToRollback += sio.getAmount();
1393
							// sio.setSchemeType(SchemeType.OUT);
1394
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1395
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1396
							sio.setReference(purchase.getId());
24635 amit.gupta 1397
							rolledbackSios.add(sio);
1398
						}
1399
					}
1400
 
1401
				}
1402
			}
1403
			if (amountToRollback > 0) {
24683 amit.gupta 1404
				// Address address =
1405
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1406
				UserWalletHistory uwh = new UserWalletHistory();
1407
				uwh.setAmount(Math.round(amountToRollback));
1408
				uwh.setDescription(description);
1409
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1410
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1411
				uwh.setReference(purchase.getId());
1412
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1413
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1414
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1415
				userWalletHistory.add(uwh);
1416
			}
1417
		});
1418
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1419
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1420
						"Timestamp"),
1421
				userWalletHistory.stream()
1422
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1423
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1424
						.collect(Collectors.toList()));
1425
 
1426
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1427
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1428
						"Created", "Rolledback"),
24635 amit.gupta 1429
				rolledbackSios.stream()
24681 amit.gupta 1430
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1431
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1432
						.collect(Collectors.toList()));
1433
 
25043 amit.gupta 1434
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1435
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 1436
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 1437
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1438
 
25096 amit.gupta 1439
		throw new Exception();
24635 amit.gupta 1440
 
1441
	}
1442
 
1443
	public void dryRunOutSchemeReco() throws Exception {
1444
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1445
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1446
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1447
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1448
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1449
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1450
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1451
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1452
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1453
		// Collections.reverse(allOrders);
1454
		// List<FofoOrder> allOrders =
24653 govind 1455
		// List<FofoOrder> allOrders =
24631 amit.gupta 1456
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1457
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1458
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1459
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1460
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1461
			float amountToRollback = 0;
24590 amit.gupta 1462
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1463
			orderItems.forEach(x -> {
24606 amit.gupta 1464
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1465
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1466
			});
24606 amit.gupta 1467
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1468
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1469
					String serialNumber = inventorySerialNumberEntry.getValue();
1470
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1471
					if (serialNumbersConsidered.contains(serialNumber)) {
1472
						// This will rollback scheme for differenct orders for same serial
1473
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1474
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1475
								.filter(x -> x.getRolledBackTimestamp() == null
1476
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1477
								.collect(Collectors.toList());
1478
						Collections.reverse(sios);
1479
						for (SchemeInOut sio : sios) {
1480
							sio.setRolledBackTimestamp(LocalDateTime.now());
1481
							amountToRollback += sio.getAmount();
1482
							// sio.setSchemeType(SchemeType.OUT);
1483
							sio.setSerialNumber(serialNumber);
1484
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1485
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1486
							rolledbackSios.add(sio);
24623 amit.gupta 1487
						}
24635 amit.gupta 1488
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1489
					} else {
1490
						serialNumbersConsidered.add(serialNumber);
1491
						List<Integer> schemesConsidered = new ArrayList<>();
1492
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1493
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1494
								.filter(x -> x.getRolledBackTimestamp() == null
1495
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1496
								.collect(Collectors.toList());
1497
						Collections.reverse(sios);
1498
						for (SchemeInOut sio : sios) {
1499
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1500
								schemesConsidered.add(sio.getSchemeId());
1501
								continue;
1502
							}
1503
							sio.setRolledBackTimestamp(LocalDateTime.now());
1504
							amountToRollback += sio.getAmount();
1505
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1506
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1507
							sio.setSerialNumber(serialNumber);
1508
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1509
							rolledbackSios.add(sio);
1510
						}
24615 amit.gupta 1511
					}
24631 amit.gupta 1512
 
24604 amit.gupta 1513
				}
24590 amit.gupta 1514
			}
24631 amit.gupta 1515
			if (amountToRollback > 0) {
1516
				UserWalletHistory uwh = new UserWalletHistory();
1517
				uwh.setAmount(Math.round(amountToRollback));
1518
				uwh.setDescription(description);
1519
				uwh.setTimestamp(LocalDateTime.now());
1520
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1521
				uwh.setReference(fofoOrder.getId());
1522
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1523
				uwh.setFofoId(fofoOrder.getFofoId());
1524
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1525
				userWalletHistory.add(uwh);
1526
			}
24590 amit.gupta 1527
		});
24598 amit.gupta 1528
 
24592 amit.gupta 1529
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1530
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1531
						"Timestamp"),
1532
				userWalletHistory.stream()
1533
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1534
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1535
						.collect(Collectors.toList()));
1536
 
1537
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1538
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1539
						"Rolledback"),
1540
				rolledbackSios.stream()
1541
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1542
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1543
						.collect(Collectors.toList()));
1544
 
25043 amit.gupta 1545
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1546
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1547
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1548
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1549
 
25267 amit.gupta 1550
		throw new Exception();
24590 amit.gupta 1551
	}
24615 amit.gupta 1552
 
24611 amit.gupta 1553
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1554
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1555
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1556
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1557
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1558
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1559
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1560
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1561
		references.stream().forEach(reference -> {
1562
			FofoOrder fofoOrder = null;
1563
			try {
1564
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1565
			} catch (Exception e) {
1566
 
24611 amit.gupta 1567
			}
1568
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1569
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1570
			float amountToRollback = 0;
1571
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1572
			orderItems.forEach(x -> {
1573
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1574
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1575
			});
1576
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1577
				List<SchemeInOut> sios = schemeInOutRepository
1578
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1579
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1580
						.collect(Collectors.toList());
1581
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1582
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1583
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1584
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1585
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1586
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1587
					if (outList.size() > 1) {
1588
 
24611 amit.gupta 1589
					}
1590
				}
1591
				uwh.setAmount(Math.round(amountToRollback));
1592
				uwh.setDescription(description);
1593
				uwh.setTimestamp(LocalDateTime.now());
1594
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1595
				uwh.setReference(fofoOrder.getId());
1596
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1597
				uwh.setFofoId(fofoOrder.getFofoId());
1598
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1599
				userWalletHistory.add(uwh);
1600
			}
1601
		});
24615 amit.gupta 1602
 
24611 amit.gupta 1603
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1604
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1605
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1606
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1607
						.collect(Collectors.toList()));
1608
 
24611 amit.gupta 1609
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1610
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1611
						"Rolledback"),
1612
				rolledbackSios.stream()
24615 amit.gupta 1613
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1614
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1615
						.collect(Collectors.toList()));
1616
 
24623 amit.gupta 1617
		Utils.sendMailWithAttachments(googleMailSender,
1618
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1619
				"Partner Excess Amount", "PFA",
1620
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1621
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1622
 
24628 amit.gupta 1623
		throw new Exception();
24615 amit.gupta 1624
 
24611 amit.gupta 1625
	}
24615 amit.gupta 1626
 
26945 amit.gupta 1627
	public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
25927 amit.gupta 1628
 
24653 govind 1629
		LocalDateTime now = LocalDateTime.now();
25837 amit.gupta 1630
		LocalDateTime from = now.with(LocalTime.MIN);
25925 amit.gupta 1631
		String timeString = "Today %s";
25927 amit.gupta 1632
		// Send yesterday's report
27007 amit.gupta 1633
		/*
1634
		 * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1635
		 * now.minusDays(1).; now = from.with(LocalTime.MAX);
1636
		 * 
1637
		 * }
1638
		 */
24855 amit.gupta 1639
		List<Integer> fofoIds = null;
25043 amit.gupta 1640
		if (fofoIdInt == null) {
1641
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1642
					.collect(Collectors.toList());
24856 amit.gupta 1643
		} else {
24855 amit.gupta 1644
			fofoIds = Arrays.asList(fofoIdInt);
1645
		}
25912 amit.gupta 1646
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
24683 amit.gupta 1647
 
25865 amit.gupta 1648
		Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now,
1649
				null);
1650
		Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
26945 amit.gupta 1651
 
1652
		Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1653
				true);
1654
 
1655
		Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository
1656
				.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
26941 amit.gupta 1657
		Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
1658
 
26945 amit.gupta 1659
		Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1660
				false);
26941 amit.gupta 1661
		Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
26945 amit.gupta 1662
 
25865 amit.gupta 1663
		Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1664
		for (int fofoId : fofoIds) {
1665
			SaleTargetReportModel model = new SaleTargetReportModel();
25927 amit.gupta 1666
			model.setInsuranceSale(
1667
					partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
25865 amit.gupta 1668
			model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
26941 amit.gupta 1669
			model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1670
			model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1671
			model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1672
			model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
26945 amit.gupta 1673
			model.setPast3daysSale(
1674
					spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
25880 amit.gupta 1675
			model.setFofoId(fofoId);
25865 amit.gupta 1676
			saleTargetReportModelMap.put(fofoId, model);
1677
		}
25880 amit.gupta 1678
 
26945 amit.gupta 1679
		Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
24653 govind 1680
		for (Integer fofoId : fofoIds) {
25865 amit.gupta 1681
			SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
25821 amit.gupta 1682
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1683
			sendNotificationModel.setCampaignName("Sales update alert");
25884 tejbeer 1684
			sendNotificationModel.setTitle("Sale Update");
25927 amit.gupta 1685
			sendNotificationModel
1686
					.setMessage(String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1687
							model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1688
							String.format(timeString, now.format(timeFormatter))));
25821 amit.gupta 1689
			sendNotificationModel.setType("url");
27206 tejbeer 1690
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1691
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1692
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1693
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1694
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1695
			notificationService.sendNotification(sendNotificationModel);
24653 govind 1696
		}
26945 amit.gupta 1697
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1698
		// saleTargetReportModelMap);
1699
		String statewiseSaleReport = this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
27116 amit.gupta 1700
		String cc[] = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com",
26945 amit.gupta 1701
				"niranjan.kala@smartdukaan.com", "up.singh@smartdukaan.com", "sm@smartdukaan.com" };
25837 amit.gupta 1702
 
25912 amit.gupta 1703
		String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
26945 amit.gupta 1704
		// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
1705
		// subject);
1706
		this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com", statewiseSaleReport, cc, "Statewise" + subject);
24653 govind 1707
	}
1708
 
28377 tejbeer 1709
	public void checkRazorPayPaymentStatus() throws Exception {
28368 tejbeer 1710
		List<PendingOrder> pendingOrder = pendingOrderRepository
1711
				.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
1712
 
1713
		for (PendingOrder po : pendingOrder) {
1714
			RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
28377 tejbeer 1715
			List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28368 tejbeer 1716
 
28369 tejbeer 1717
			LOGGER.info("razorPay" + razorPay);
1718
			if (razorPay != null) {
1719
				List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28377 tejbeer 1720
 
28369 tejbeer 1721
				if (!payments.isEmpty()) {
28377 tejbeer 1722
					List<String> statusList = new ArrayList<>();
28369 tejbeer 1723
					for (Payment payment : payments) {
28368 tejbeer 1724
 
28377 tejbeer 1725
						JSONObject jsonObj = new JSONObject(payment.toString());
1726
 
1727
						String status = jsonObj.getString("status");
1728
 
1729
						statusList.add(status);
1730
 
28369 tejbeer 1731
					}
28377 tejbeer 1732
					LOGGER.info("statusList" + statusList);
28368 tejbeer 1733
 
28377 tejbeer 1734
					if (statusList.contains("authorized") || statusList.contains("captured")) {
1735
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1736
						po.setPaidAmount(po.getTotalAmount());
1737
						for (PendingOrderItem poi : poItems) {
1738
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1739
						}
1740
						Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
1741
 
1742
						CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1743
						Customer customer = customerRepository.selectById(po.getCustomerId());
1744
						String[] customerEmail = null;
1745
						if (customer.getEmailId() != null) {
1746
							customerEmail = new String[] { customer.getEmailId() };
1747
						}
1748
						List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com",
28467 tejbeer 1749
								"tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
1750
								"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28377 tejbeer 1751
						List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1752
						if (authUserEmails != null) {
1753
							authUserEmails = new ArrayList<>();
1754
						}
1755
						authUserEmails.addAll(bccTo);
1756
 
28382 tejbeer 1757
						// emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1758
						// "order-confirm.vm",
1759
						// emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
28377 tejbeer 1760
 
1761
					} else if (statusList.contains("refunded") || statusList.contains("failed")) {
1762
						for (PendingOrderItem poi : poItems) {
1763
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1764
						}
1765
 
1766
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1767
					}
1768
 
28369 tejbeer 1769
				}
28377 tejbeer 1770
				// LOGGER.info("payment" + payments);
28369 tejbeer 1771
 
1772
			}
28368 tejbeer 1773
		}
1774
	}
1775
 
25865 amit.gupta 1776
	public static class SaleTargetReportModel {
1777
		private double totalSale;
26941 amit.gupta 1778
		private long totalQty;
26945 amit.gupta 1779
		private double past3daysSale;
25880 amit.gupta 1780
		private int fofoId;
1781
 
1782
		public int getFofoId() {
1783
			return fofoId;
1784
		}
1785
 
1786
		public void setFofoId(int fofoId) {
1787
			this.fofoId = fofoId;
1788
		}
1789
 
25865 amit.gupta 1790
		private double smartphoneSale;
1791
		private long smartphoneQty;
1792
		private double insuranceSale;
1793
		private long insruanceQty;
1794
 
26941 amit.gupta 1795
		public long getTotalQty() {
1796
			return totalQty;
1797
		}
1798
 
1799
		public void setTotalQty(long totalQty) {
1800
			this.totalQty = totalQty;
1801
		}
1802
 
26945 amit.gupta 1803
		public double getPast3daysSale() {
1804
			return past3daysSale;
1805
		}
1806
 
1807
		public void setPast3daysSale(double past3daysSale) {
1808
			this.past3daysSale = past3daysSale;
1809
		}
1810
 
25865 amit.gupta 1811
		@Override
1812
		public int hashCode() {
1813
			final int prime = 31;
1814
			int result = 1;
25880 amit.gupta 1815
			result = prime * result + fofoId;
25865 amit.gupta 1816
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1817
			long temp;
1818
			temp = Double.doubleToLongBits(insuranceSale);
1819
			result = prime * result + (int) (temp ^ (temp >>> 32));
1820
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1821
			temp = Double.doubleToLongBits(smartphoneSale);
1822
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1823
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 1824
			temp = Double.doubleToLongBits(totalSale);
1825
			result = prime * result + (int) (temp ^ (temp >>> 32));
1826
			return result;
1827
		}
1828
 
1829
		@Override
1830
		public boolean equals(Object obj) {
1831
			if (this == obj)
1832
				return true;
1833
			if (obj == null)
1834
				return false;
1835
			if (getClass() != obj.getClass())
1836
				return false;
1837
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 1838
			if (fofoId != other.fofoId)
1839
				return false;
25865 amit.gupta 1840
			if (insruanceQty != other.insruanceQty)
1841
				return false;
1842
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
1843
				return false;
1844
			if (smartphoneQty != other.smartphoneQty)
1845
				return false;
1846
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
1847
				return false;
26941 amit.gupta 1848
			if (totalQty != other.totalQty)
1849
				return false;
25865 amit.gupta 1850
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
1851
				return false;
1852
			return true;
1853
		}
1854
 
1855
		public double getTotalSale() {
1856
			return totalSale;
1857
		}
1858
 
1859
		public void setTotalSale(double totalSale) {
1860
			this.totalSale = totalSale;
1861
		}
1862
 
1863
		public double getSmartphoneSale() {
1864
			return smartphoneSale;
1865
		}
1866
 
1867
		public void setSmartphoneSale(double smartphoneSale) {
1868
			this.smartphoneSale = smartphoneSale;
1869
		}
1870
 
1871
		public long getSmartphoneQty() {
1872
			return smartphoneQty;
1873
		}
1874
 
1875
		public void setSmartphoneQty(long smartphoneQty) {
1876
			this.smartphoneQty = smartphoneQty;
1877
		}
1878
 
1879
		public double getInsuranceSale() {
1880
			return insuranceSale;
1881
		}
1882
 
1883
		public void setInsuranceSale(double insuranceSale) {
1884
			this.insuranceSale = insuranceSale;
1885
		}
1886
 
1887
		public long getInsruanceQty() {
1888
			return insruanceQty;
1889
		}
1890
 
1891
		public void setInsruanceQty(long insruanceQty) {
1892
			this.insruanceQty = insruanceQty;
1893
		}
1894
 
1895
		@Override
1896
		public String toString() {
26945 amit.gupta 1897
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
1898
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
1899
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 1900
		}
1901
 
1902
	}
1903
 
26945 amit.gupta 1904
	private String getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
1905
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
26940 amit.gupta 1906
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
26945 amit.gupta 1907
		Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors
1908
				.groupingBy(x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
26940 amit.gupta 1909
		List<List<Serializable>> stateWiseSales = new ArrayList<>();
1910
		for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
26945 amit.gupta 1911
			long totalQty = stateMapEntry.getValue().stream()
1912
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
1913
			double totalSale = stateMapEntry.getValue().stream()
1914
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
1915
			long smartPhoneQty = stateMapEntry.getValue().stream()
1916
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
1917
			double smartPhoneSale = stateMapEntry.getValue().stream()
1918
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
1919
			stateWiseSales
1920
					.add(Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
26940 amit.gupta 1921
		}
1922
		StringBuilder sb = new StringBuilder();
26945 amit.gupta 1923
		sb.append("<html><body>");
1924
		sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
26940 amit.gupta 1925
		sb.append("<tbody>\n" + "	    <tr>"
1926
				+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
26941 amit.gupta 1927
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
1928
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
1929
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
1930
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
26940 amit.gupta 1931
				+ "	    				</tr>");
1932
		for (List<Serializable> stateSale : stateWiseSales) {
1933
			sb.append("<tr>");
1934
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
1935
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
1936
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
26941 amit.gupta 1937
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
1938
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
26940 amit.gupta 1939
			sb.append("</tr>");
1940
		}
26945 amit.gupta 1941
		sb.append("</tbody></table><br><br>");
25872 tejbeer 1942
 
26945 amit.gupta 1943
		sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
24653 govind 1944
		sb.append("<tbody>\n" + "	    				<tr>\n"
26945 amit.gupta 1945
				+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
1946
				+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
1947
				+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
1948
				+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
1949
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
1950
				+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
1951
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
24653 govind 1952
				+ "	    				</tr>");
26945 amit.gupta 1953
 
1954
		List<Integer> sortedPartnerSalesHeaders = partnerSalesHeadersMap.values().stream()
26947 amit.gupta 1955
				.sorted(Comparator.comparing(FofoReportingModel::getCode)
1956
						.thenComparing(FofoReportingModel::getRegionalManager)
26948 amit.gupta 1957
						.thenComparing(FofoReportingModel::getTerritoryManager))
26945 amit.gupta 1958
				.map(FofoReportingModel::getFofoId).collect(Collectors.toList());
25927 amit.gupta 1959
		for (Integer fofoId : sortedPartnerSalesHeaders) {
27007 amit.gupta 1960
			if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
26947 amit.gupta 1961
				sb.append("<tr style='background-color:red'>");
1962
			} else {
26945 amit.gupta 1963
				sb.append("<tr>");
1964
			}
1965
			sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode()
25880 amit.gupta 1966
					+ "</td>");
1967
			sb.append("<td style='border:1px solid black;padding: 5px'>"
27007 amit.gupta 1968
					+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
1969
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1970
					+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
1971
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1972
					+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
1973
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1974
					+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
25880 amit.gupta 1975
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1976
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
25880 amit.gupta 1977
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1978
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
25865 amit.gupta 1979
			sb.append("</tr>");
24653 govind 1980
		}
24683 amit.gupta 1981
 
26945 amit.gupta 1982
		sb.append("</tr>");
1983
 
1984
		sb.append("</body></html>");
1985
 
1986
		return sb.toString();
24653 govind 1987
	}
24841 govind 1988
 
26945 amit.gupta 1989
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 1990
			throws MessagingException, ProfitMandiBusinessException, IOException {
1991
		MimeMessage message = mailSender.createMimeMessage();
1992
		MimeMessageHelper helper = new MimeMessageHelper(message);
1993
		helper.setSubject(subject);
1994
		helper.setText(body, true);
1995
		helper.setTo(email);
1996
		if (cc != null) {
1997
			helper.setCc(cc);
1998
		}
1999
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2000
		helper.setFrom(senderAddress);
2001
		mailSender.send(message);
2002
	}
25300 tejbeer 2003
 
25351 tejbeer 2004
	public void sendNotification() throws Exception {
25300 tejbeer 2005
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2006
		if (!pushNotifications.isEmpty()) {
2007
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 2008
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 2009
				NotificationCampaign notificationCampaign = notificationCampaignRepository
2010
						.selectById(pushNotification.getNotificationCampaignid());
2011
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
2012
						SimpleCampaignParams.class);
2013
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 2014
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 2015
				JSONObject json = new JSONObject();
25351 tejbeer 2016
				json.put("to", device.getFcmId());
25300 tejbeer 2017
				JSONObject jsonObj = new JSONObject();
2018
				jsonObj.put("message", campaign.getMessage());
2019
				jsonObj.put("title", campaign.getTitle());
2020
				jsonObj.put("type", campaign.getType());
2021
				jsonObj.put("url", result_url);
2022
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2023
				jsonObj.put("image", campaign.getImageUrl());
2024
				jsonObj.put("largeIcon", "large_icon");
2025
				jsonObj.put("smallIcon", "small_icon");
2026
				jsonObj.put("vibrate", 1);
2027
				jsonObj.put("pid", pushNotification.getId());
2028
				jsonObj.put("sound", 1);
2029
				jsonObj.put("priority", "high");
2030
				json.put("data", jsonObj);
25351 tejbeer 2031
				try {
2032
					CloseableHttpClient client = HttpClients.createDefault();
2033
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 2034
 
25351 tejbeer 2035
					httpPost.setHeader("Content-Type", "application/json; utf-8");
2036
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2037
					StringEntity entity = new StringEntity(json.toString());
2038
					httpPost.setEntity(entity);
2039
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 2040
 
25351 tejbeer 2041
					if (response.getStatusLine().getStatusCode() == 200) {
2042
						pushNotification.setSentTimestamp(LocalDateTime.now());
2043
					} else {
25356 tejbeer 2044
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 2045
						LOGGER.info("message" + "not sent");
26945 amit.gupta 2046
						response.toString();
25351 tejbeer 2047
					}
25300 tejbeer 2048
 
25351 tejbeer 2049
				} catch (Exception e) {
2050
					e.printStackTrace();
26443 amit.gupta 2051
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 2052
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 2053
				}
2054
			}
2055
		}
2056
	}
2057
 
25553 amit.gupta 2058
	public void grouping() throws Exception {
25609 amit.gupta 2059
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2060
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
2061
		System.out.println(String.join("\t",
2062
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 2063
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 2064
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 2065
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 2066
			if (priceDropIMEI.getPartnerId() == 0)
2067
				continue;
25609 amit.gupta 2068
			HashSet<String> imeis = new HashSet<>();
2069
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2070
			imeis.add(priceDropIMEI.getImei());
2071
			List<InventoryItem> inventoryItems = inventoryItemRepository
2072
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 2073
			if (inventoryItems.size() == 0) {
2074
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 2075
				continue;
25612 amit.gupta 2076
			}
25609 amit.gupta 2077
			InventoryItem inventoryItem = inventoryItems.get(0);
2078
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
2079
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
2080
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
2081
				// check if pricedrop has been rolled out
2082
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
2083
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
2084
				if (uwh.size() > 0) {
25615 amit.gupta 2085
					Item item = itemRepository.selectById(inventoryItem.getItemId());
26945 amit.gupta 2086
					System.out.println(String.join("\t", Arrays.asList(priceDropIMEI.getImei(),
2087
							inventoryItem.getItemId() + "", item.getBrand(), item.getModelName(), item.getModelNumber(),
2088
							inventoryItem.getFofoId() + "", customRetailer.getBusinessName(),
2089
							inventoryItem.getCreateTimestamp().format(dtf), priceDrop.getAffectedOn().format(dtf),
2090
							priceDropIMEI.getUpdateTimestamp().format(dtf),
2091
							inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getAutoPartnerPayout() + "",
2092
							inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 2093
				}
2094
			}
2095
		}
25503 amit.gupta 2096
	}
25694 amit.gupta 2097
 
27686 amit.gupta 2098
	public void attachToffeeInvoices() throws Exception {
28205 tejbeer 2099
		/*
2100
		 * LOGGER.info("Insurance Sum Summary --- {}",
2101
		 * insurancePolicyRepository.selectAmountSumGroupByRetailerId(LocalDateTime.MIN,
2102
		 * LocalDateTime.MAX)); LOGGER.info("Insurance Qty Summary --- {}",
2103
		 * insurancePolicyRepository.selectQtyGroupByRetailerId(LocalDateTime.MIN,
2104
		 * LocalDateTime.MAX)); LOGGER.info("SmartPhone Amount Summary --- {}",
2105
		 * fofoOrderItemRepository.selectSumAmountGroupByRetailer(LocalDateTime.MIN,
2106
		 * LocalDateTime.MAX, 0, true)); LOGGER.info("Smartphone Qty Summary --- {}",
2107
		 * fofoOrderItemRepository.selectQtyGroupByRetailer(LocalDateTime.MIN,
2108
		 * LocalDateTime.MAX, 0, true));
2109
		 */
2110
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3,
2111
				Optional.of(false));
2112
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
27678 amit.gupta 2113
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2114
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2115
			PdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2116
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2117
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
28205 tejbeer 2118
			String pdfInvoiceString = "data:application/pdf;base64,"
2119
					+ Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2120
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1],
2121
					pdfInvoiceString);
2122
			if (attached) {
27678 amit.gupta 2123
				insurancePolicy.setPosted(true);
2124
			}
2125
		}
25694 amit.gupta 2126
	}
2127
 
2128
	public void schemeRollback(List<String> schemeIds) throws Exception {
2129
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 2130
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 2131
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2132
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2133
		for (SchemeInOut sio : schemeInOuts) {
2134
			Scheme scheme = schemesMap.get(sio.getSchemeId());
2135
			if (scheme.getType().equals(SchemeType.IN)) {
2136
 
2137
			} else if (scheme.getType().equals(SchemeType.OUT)) {
2138
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2139
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
2140
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
2141
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2142
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
2143
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
2144
					sio.setRolledBackTimestamp(LocalDateTime.now());
2145
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 2146
					String rollbackReason = "Scheme reversed for "
2147
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 2148
							+ fofoOrder.getInvoiceNumber();
2149
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 2150
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
2151
							LocalDateTime.now());
25694 amit.gupta 2152
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
2153
							rollbackReason);
2154
				}
2155
			}
2156
		}
25721 tejbeer 2157
		// throw new Exception();
25694 amit.gupta 2158
	}
25721 tejbeer 2159
 
2160
	public void checkfocusedModelInPartnerStock() throws Exception {
2161
 
2162
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
2163
				.collect(Collectors.toList());
27212 tejbeer 2164
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
2165
				.getSaholicStock();
27213 tejbeer 2166
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2167
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 2168
 
2169
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
2170
				.getSaholicPOItems();
25721 tejbeer 2171
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2172
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 2173
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2174
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 2175
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2176
			Map<Integer, Integer> processingOrderMap = null;
2177
			Map<Integer, Integer> catalogIdAndQtyMap = null;
2178
			Map<Integer, Integer> grnPendingOrdersMap = null;
2179
 
2180
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
2181
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
2182
 
2183
			if (!currentInventorySnapshot.isEmpty()) {
2184
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
2185
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2186
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
2187
 
2188
			}
2189
 
2190
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
2191
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2192
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2193
			if (!grnPendingOrders.isEmpty()) {
2194
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
2195
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2196
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
2197
 
2198
			}
2199
 
2200
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
2201
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2202
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2203
			if (!processingOrder.isEmpty()) {
2204
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
2205
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2206
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
2207
 
2208
			}
2209
 
25800 tejbeer 2210
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
2211
					.collect(Collectors.toList());
2212
 
27088 tejbeer 2213
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
2214
					.collect(Collectors.toList());
27095 tejbeer 2215
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 2216
			if (regionIds.size() == 0) {
2217
				LOGGER.info("No region found for partner {}", fofoId);
2218
				continue;
2219
			}
27100 amit.gupta 2220
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 2221
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
2222
							Collectors.mapping(FocusedModel::getMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 2223
 
25721 tejbeer 2224
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
2225
 
27100 amit.gupta 2226
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2227
				int minQty = entry.getValue().get();
25721 tejbeer 2228
				int inStockQty = 0;
2229
				int processingQty = 0;
2230
				int grnPendingQty = 0;
27208 tejbeer 2231
				int allColorNetAvailability = 0;
27253 tejbeer 2232
				int allColorPoAvailability = 0;
25721 tejbeer 2233
				if (processingOrderMap != null) {
2234
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
2235
							: processingOrderMap.get(entry.getKey());
2236
 
2237
				}
2238
				if (grnPendingOrdersMap != null) {
2239
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2240
							: grnPendingOrdersMap.get(entry.getKey());
2241
 
2242
				}
2243
				if (catalogIdAndQtyMap != null) {
2244
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2245
							: catalogIdAndQtyMap.get(entry.getKey());
2246
 
2247
				}
28526 tejbeer 2248
 
2249
				int grnStockQty = grnPendingQty + inStockQty;
25721 tejbeer 2250
				int totalQty = processingQty + grnPendingQty + inStockQty;
2251
 
27100 amit.gupta 2252
				if (totalQty < minQty) {
25721 tejbeer 2253
 
27100 amit.gupta 2254
					int shortageQty = minQty - totalQty;
25721 tejbeer 2255
					List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
27212 tejbeer 2256
					FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
27213 tejbeer 2257
 
27212 tejbeer 2258
					Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2259
							.get(fofoStore.getWarehouseId());
25721 tejbeer 2260
 
27212 tejbeer 2261
					Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2262
							.get(fofoStore.getWarehouseId());
27208 tejbeer 2263
 
2264
					for (Item it : item) {
28527 tejbeer 2265
						List<SaholicCIS> currentAvailability = null;
28528 tejbeer 2266
						List<SaholicPOItem> poItemAvailability = null;
28527 tejbeer 2267
						if (itemAvailabilityMap != null) {
2268
							currentAvailability = itemAvailabilityMap.get(it.getId());
2269
						}
28528 tejbeer 2270
 
2271
						if (poItemAvailabilityMap != null) {
2272
							poItemAvailability = poItemAvailabilityMap.get(it.getId());
2273
						}
27208 tejbeer 2274
						if (currentAvailability != null) {
2275
							allColorNetAvailability += currentAvailability.stream()
2276
									.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2277
						}
27253 tejbeer 2278
 
27208 tejbeer 2279
						if (poItemAvailability != null) {
27253 tejbeer 2280
							allColorPoAvailability += poItemAvailability.stream()
27208 tejbeer 2281
									.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
2282
						}
27253 tejbeer 2283
 
27208 tejbeer 2284
					}
2285
 
25721 tejbeer 2286
					FocusedModelShortageModel fm = new FocusedModelShortageModel();
2287
					fm.setFofoId(fofoId);
27212 tejbeer 2288
					fm.setStoreCode(fofoStore.getCode());
25721 tejbeer 2289
					fm.setStoreName(customRetailer.getBusinessName());
27208 tejbeer 2290
					fm.setBrandName(item.get(0).getBrand());
2291
					fm.setModelName(item.get(0).getModelName());
2292
					fm.setModelNumber(item.get(0).getModelNumber());
28526 tejbeer 2293
					fm.setGrnStockQty(grnStockQty);
2294
					fm.setPendingIndentQty(processingQty);
25721 tejbeer 2295
					fm.setShortageQty(shortageQty);
27253 tejbeer 2296
					fm.setPoAvailabitiy(allColorPoAvailability);
27208 tejbeer 2297
					fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
27213 tejbeer 2298
					fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2299
					fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
27246 tejbeer 2300
					fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
27208 tejbeer 2301
					fm.setAvailabitiy(allColorNetAvailability);
25721 tejbeer 2302
 
27102 amit.gupta 2303
					focusedModelShortageList.add(fm);
25721 tejbeer 2304
				}
2305
 
2306
			}
27233 tejbeer 2307
 
28529 tejbeer 2308
			if (!focusedModelShortageList.isEmpty()) {
2309
				String subject = "Stock Alert";
2310
				String messageText = this.getMessage(focusedModelShortageList);
27233 tejbeer 2311
 
28529 tejbeer 2312
				this.sendMailWithAttachments(subject, messageText, customRetailer.getEmail());
2313
				String notificationMessage = this.getNotificationMessage(focusedModelShortageList);
2314
 
2315
				LOGGER.info("notificationMessage" + notificationMessage);
2316
 
2317
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
2318
				sendNotificationModel.setCampaignName("Stock Alert");
2319
				sendNotificationModel.setTitle("Alert");
2320
				sendNotificationModel.setMessage(notificationMessage);
2321
				sendNotificationModel.setType("url");
2322
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2323
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2324
				sendNotificationModel.setMessageType(MessageType.notification);
2325
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2326
				sendNotificationModel.setUserIds(Arrays.asList(userId));
2327
				notificationService.sendNotification(sendNotificationModel);
2328
 
2329
			}
2330
 
25721 tejbeer 2331
		}
27102 amit.gupta 2332
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2333
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2334
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2335
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2336
 
25800 tejbeer 2337
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2338
				storeGuyMap.entrySet().forEach(y -> {
2339
 
2340
					if (y.getValue().contains(x.getKey())) {
2341
						if (!emailRowsMap.containsKey(y.getKey())) {
2342
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2343
						}
27208 tejbeer 2344
						List<List<? extends Serializable>> fms = x.getValue().stream()
2345
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2346
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
28526 tejbeer 2347
										r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(),
2348
										r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2349
								.collect(Collectors.toList());
2350
						emailRowsMap.get(y.getKey()).addAll(fms);
2351
 
25721 tejbeer 2352
					}
2353
 
25800 tejbeer 2354
				});
25721 tejbeer 2355
 
2356
			});
2357
 
27212 tejbeer 2358
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
28526 tejbeer 2359
					"Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty",
2360
					"Availability");
25837 amit.gupta 2361
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2362
 
25800 tejbeer 2363
				ByteArrayOutputStream baos = null;
2364
				try {
25837 amit.gupta 2365
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2366
				} catch (Exception e2) {
2367
					e2.printStackTrace();
2368
				}
28529 tejbeer 2369
				String[] sendToArray = new String[] { entry.getKey() };
28526 tejbeer 2370
 
25800 tejbeer 2371
				try {
2372
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2373
							new ByteArrayResource(baos.toByteArray()));
2374
				} catch (Exception e1) { // TODO Auto-generated catch block
2375
					e1.printStackTrace();
2376
				}
25721 tejbeer 2377
 
25800 tejbeer 2378
			});
2379
		}
25721 tejbeer 2380
	}
2381
 
2382
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2383
		StringBuilder sb = new StringBuilder();
2384
		sb.append("Focused Model Shortage in Your Stock : \n");
2385
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2386
 
2387
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2388
			sb.append(String.format("%n", ""));
2389
		}
2390
		return sb.toString();
2391
	}
2392
 
2393
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2394
		MimeMessage message = mailSender.createMimeMessage();
2395
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2396
 
2397
		helper.setSubject(subject);
2398
		helper.setText(messageText, true);
2399
		helper.setTo(email);
27116 amit.gupta 2400
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2401
		helper.setFrom(senderAddress);
2402
		mailSender.send(message);
2403
 
2404
	}
2405
 
2406
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2407
		StringBuilder sb = new StringBuilder();
2408
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2409
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2410
		sb.append("<tbody>\n" + "	    				<tr>\n"
2411
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2412
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2413
				+ "	    				</tr>");
2414
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2415
 
2416
			sb.append("<tr>");
2417
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2418
 
2419
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2420
 
2421
			sb.append("</tr>");
2422
 
2423
		}
2424
 
2425
		sb.append("</tbody></table></body></html>");
2426
 
2427
		return sb.toString();
2428
	}
2429
 
25927 amit.gupta 2430
	public void notifyLead() throws Exception {
2431
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(LocalDateTime.now().minusDays(15),
2432
				LocalDateTime.now().plusHours(4));
2433
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2434
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2435
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2436
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2437
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2438
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2439
 
27477 amit.gupta 2440
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2441
 
25927 amit.gupta 2442
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2443
 
2444
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2445
			int authId = authUserEmail.getKey();
2446
			String email = authUserEmail.getValue();
2447
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2448
		}
27477 amit.gupta 2449
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2450
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2451
 
25927 amit.gupta 2452
		String templateMessage = "Lead followup for %s %s, %s is due by %s";
2453
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2454
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2455
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2456
				continue;
2457
			}
2458
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
27795 amit.gupta 2459
					lead.getAddress(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
25927 amit.gupta 2460
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2461
			sendNotificationModel.setCampaignName("Lead Reminder");
2462
			sendNotificationModel.setTitle("Leads followup Reminder");
2463
			sendNotificationModel.setMessage(notificationMessage);
2464
			sendNotificationModel.setType("url");
27206 tejbeer 2465
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2466
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2467
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2468
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2469
			System.out.println(sendNotificationModel);
25927 amit.gupta 2470
			notificationService.sendNotification(sendNotificationModel);
2471
		}
2472
	}
26945 amit.gupta 2473
 
25927 amit.gupta 2474
	public void notifyVisits() throws Exception {
26945 amit.gupta 2475
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2476
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2477
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2478
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2479
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2480
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2481
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2482
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2483
 
25927 amit.gupta 2484
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2485
			int authId = authUserEmail.getKey();
2486
			String email = authUserEmail.getValue();
2487
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2488
		}
2489
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2490
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2491
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2492
		for (FranchiseeVisit visit : franchiseeVisits) {
2493
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2494
				continue;
2495
			}
2496
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2497
			String message = null;
26945 amit.gupta 2498
			if (visit.getFranchiseActivityId() == 0) {
2499
				message = String.format(visitTemplate, visit.getPartnerName(),
2500
						timeFormatter.format(visit.getSchelduleTimestamp()));
2501
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2502
			} else {
26945 amit.gupta 2503
				message = String.format(followupTemplate, visit.getPartnerName(),
2504
						timeFormatter.format(visit.getSchelduleTimestamp()));
25927 amit.gupta 2505
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2506
			}
2507
			sendNotificationModel.setMessage(message);
2508
			sendNotificationModel.setType("url");
26482 tejbeer 2509
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2510
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2511
			sendNotificationModel.setMessageType(MessageType.reminder);
2512
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2513
			notificationService.sendNotification(sendNotificationModel);
2514
		}
25910 amit.gupta 2515
	}
25982 amit.gupta 2516
 
26283 tejbeer 2517
	public void ticketClosed() throws Exception {
2518
 
2519
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2520
		for (Ticket ticket : tickets) {
2521
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2522
				ticket.setCloseTimestamp(LocalDateTime.now());
2523
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2524
				ticket.setUpdateTimestamp(LocalDateTime.now());
2525
				ticketRepository.persist(ticket);
2526
			}
2527
		}
2528
 
2529
	}
2530
 
26790 tejbeer 2531
	public void checkValidateReferral() throws Exception {
2532
 
2533
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2534
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2535
		if (!referrals.isEmpty()) {
2536
			String subject = "Referral Request";
2537
			String messageText = this.getMessageForReferral(referrals);
2538
 
26792 tejbeer 2539
			MimeMessage message = mailSender.createMimeMessage();
2540
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
2541
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
2542
			helper.setSubject(subject);
2543
			helper.setText(messageText, true);
2544
			helper.setTo(email);
2545
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2546
			helper.setFrom(senderAddress);
2547
			mailSender.send(message);
2548
 
26790 tejbeer 2549
		}
2550
	}
2551
 
2552
	private String getMessageForReferral(List<Refferal> referrals) {
2553
		StringBuilder sb = new StringBuilder();
2554
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2555
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2556
		sb.append("<tbody>\n" + "	    				<tr>\n"
2557
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2558
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2559
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2560
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2561
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2562
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2563
				+ "	    				</tr>");
2564
		for (Refferal entry : referrals) {
2565
 
2566
			sb.append("<tr>");
2567
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2568
 
2569
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2570
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2571
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2572
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2573
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2574
 
2575
			sb.append("</tr>");
2576
 
2577
		}
2578
 
2579
		sb.append("</tbody></table></body></html>");
2580
 
2581
		return sb.toString();
2582
	}
2583
 
27271 amit.gupta 2584
	public void reverseWallet() throws Exception {
2585
		LocalDate localDate = LocalDate.of(2020, 10, 28);
28205 tejbeer 2586
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(),
2587
				localDate.plusDays(1).atStartOfDay(),
27271 amit.gupta 2588
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2589
		for (UserWalletHistory uwh : uwhList) {
28205 tejbeer 2590
			if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2591
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
28205 tejbeer 2592
				// LOGGER.info("UWH - {}", uwh);
2593
				// amount += uwh.getAmount();
2594
				// System.out.println("Amount is - " + amount);
2595
				// walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2596
				// uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2597
				// run", uwh.getBusinessTimestamp());
27313 amit.gupta 2598
				int orderId = uwh.getReference();
2599
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2600
				int inventoryItemId = 0;
28205 tejbeer 2601
				// fofoOrderRepository.delete(fofoOrder);
27313 amit.gupta 2602
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
28205 tejbeer 2603
				/*
2604
				 * List<PaymentOptionTransaction> paymentOptionTransactions =
2605
				 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2606
				 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2607
				 * paymentOptionTransaction : paymentOptionTransactions) {
2608
				 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2609
				 */
2610
				for (FofoOrderItem foi : fofoOrderItems) {
2611
					// fofoOrderItemRepository.delete(foi);
27313 amit.gupta 2612
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
28205 tejbeer 2613
					for (FofoLineItem fli : flis) {
2614
						// fofoLineItemRepository.delete(fli);
27313 amit.gupta 2615
						inventoryItemId = fli.getInventoryItemId();
2616
					}
2617
				}
28205 tejbeer 2618
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2619
						java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2620
				for (SchemeInOut sio : schemeInOuts) {
2621
					if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2622
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2623
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2624
					}
2625
				}
28205 tejbeer 2626
 
27271 amit.gupta 2627
			}
2628
		}
28205 tejbeer 2629
 
27271 amit.gupta 2630
	}
28205 tejbeer 2631
 
2632
	public void partnerProblemAlert() throws Exception {
2633
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
2634
		Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2635
				curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
2636
		Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1),
2637
				curDate.with(LocalTime.MAX), 0, false);
2638
		Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream()
2639
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2640
 
2641
		for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
2642
 
2643
			double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2644
 
2645
			LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
2646
 
28211 tejbeer 2647
			double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28208 tejbeer 2648
 
2649
			LOGGER.info("mtdSale" + mtdSale);
2650
 
28209 tejbeer 2651
			double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0
2652
					: pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2653
 
28208 tejbeer 2654
			LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
2655
 
28209 tejbeer 2656
			double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28208 tejbeer 2657
 
2658
			LOGGER.info("stockInvestment" + stockInvestment);
2659
 
28205 tejbeer 2660
			boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
2661
 
2662
			PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
2663
 
28210 tejbeer 2664
			if (partnerProblem == null) {
28205 tejbeer 2665
				partnerProblem = new PartnerProblem();
2666
				partnerProblem.setFofoId(ls.getKey());
2667
				if (mtdSale < lmtdTwentyPercentSale) {
2668
					partnerProblem.setMtd(1);
2669
				}
2670
				if (Investmentvalue) {
2671
					partnerProblem.setInvestment(1);
2672
				}
2673
 
2674
				if (stockInvestment < totalSixtyPercentInvestment) {
2675
					partnerProblem.setInvestment(1);
2676
				}
2677
 
2678
				partnerProblemRepository.persist(partnerProblem);
2679
			} else {
2680
				if (mtdSale < lmtdTwentyPercentSale) {
2681
					partnerProblem.setMtd(partnerProblem.getMtd() + 1);
2682
 
2683
				} else {
2684
					partnerProblem.setMtd(0);
2685
 
2686
				}
2687
				if (Investmentvalue) {
2688
					partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2689
				} else {
2690
					partnerProblem.setInvestment(0);
2691
 
2692
				}
2693
				if (stockInvestment < totalSixtyPercentInvestment) {
2694
					partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2695
				} else {
2696
					partnerProblem.setStockInvestment(0);
2697
				}
2698
 
2699
			}
2700
 
2701
		}
2702
 
28213 tejbeer 2703
		List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream()
2704
				.filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
2705
 
28223 tejbeer 2706
		partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
28224 tejbeer 2707
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
28223 tejbeer 2708
					+ x2.getStockInvestment() ? 1 : -1;
2709
		}).collect(Collectors.toList());
28227 tejbeer 2710
 
2711
		Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
2712
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
2713
					+ x2.getStockInvestment() ? 1 : -1;
2714
		}).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2715
 
28212 tejbeer 2716
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28213 tejbeer 2717
 
28467 tejbeer 2718
		List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28213 tejbeer 2719
 
2720
		Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream()
2721
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2722
 
28286 tejbeer 2723
		List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 2724
				"niranjan.kala@smartdukaan.com", "sm@smartdukaan.com", "tejbeer.kaur@shop2020.in");
28208 tejbeer 2725
		LOGGER.info("partnerProblem" + partnerProblems);
28205 tejbeer 2726
		StringBuilder sb = new StringBuilder();
28218 tejbeer 2727
		sb.append("<htl><body>");
28222 tejbeer 2728
		sb.append(
2729
				"<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 2730
		sb.append("<tbody>\n" + "	    <tr>"
2731
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2732
				+ "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>"
2733
				+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2734
				+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2735
				+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
2736
				+ "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
2737
 
2738
				+ "	    				</tr>");
2739
 
2740
		for (PartnerProblem pp : partnerProblems) {
28467 tejbeer 2741
			int value = pp.getFofoId() % 4;
28205 tejbeer 2742
 
2743
			Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
28217 tejbeer 2744
			LOGGER.info("authUserMap" + authUserMap);
28205 tejbeer 2745
			sb.append("<tr>");
2746
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2747
					+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
28213 tejbeer 2748
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2749
					+ assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
28205 tejbeer 2750
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2751
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2752
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28216 tejbeer 2753
			sb.append("<td style='border:1px solid black;padding: 5px'>"
28224 tejbeer 2754
					+ (authUserMap.get(EscalationType.L1) == null ? "N/A"
28216 tejbeer 2755
							: authUserMap.get(EscalationType.L1).getFirstName())
28224 tejbeer 2756
					+ " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A"
28218 tejbeer 2757
							: authUserMap.get(EscalationType.L2).getFirstName())
28216 tejbeer 2758
					+ "</td>");
28205 tejbeer 2759
 
2760
			sb.append("</tr>");
2761
		}
2762
		sb.append("</tbody></table><br><br>");
2763
		String subject = "Partner Problem Alert!";
2764
		String[] email = sendTo.toArray(new String[sendTo.size()]);
2765
 
28222 tejbeer 2766
		this.sendMailHtmlFormat(email, sb.toString(), null, subject);
2767
 
28218 tejbeer 2768
		Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
2769
 
2770
		for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
28222 tejbeer 2771
			AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
28227 tejbeer 2772
			for (Integer patnerId : authUserPartner.getValue()) {
2773
				if (partnerProblemMap.get(patnerId) != null) {
28218 tejbeer 2774
 
28227 tejbeer 2775
					StringBuilder sbbuilder = new StringBuilder();
2776
					sbbuilder.append("<hml><body>");
2777
					sb.append(
2778
							"<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>");
2779
					sbbuilder.append("<tbody>\n" + "	    <tr>"
2780
							+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2781
							+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2782
							+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2783
							+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 2784
 
28227 tejbeer 2785
							+ "	    				</tr>");
28218 tejbeer 2786
 
28227 tejbeer 2787
					for (Integer partnerId : authUserPartner.getValue()) {
2788
						if (partnerProblemMap.get(partnerId) != null) {
2789
							PartnerProblem pp = partnerProblemMap.get(partnerId);
2790
							sbbuilder.append("<tr>");
2791
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2792
									+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2793
							sbbuilder
2794
									.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2795
							sbbuilder.append(
2796
									"<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2797
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2798
									+ pp.getStockInvestment() + "</td>");
2799
 
2800
							sbbuilder.append("</tr>");
2801
						}
2802
 
28224 tejbeer 2803
					}
28227 tejbeer 2804
					sbbuilder.append("</tbody></table><br><br>");
28224 tejbeer 2805
 
28286 tejbeer 2806
					this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
28230 tejbeer 2807
					break;
28218 tejbeer 2808
				}
28230 tejbeer 2809
 
28223 tejbeer 2810
			}
28222 tejbeer 2811
		}
2812
	}
28218 tejbeer 2813
 
28222 tejbeer 2814
	private void sendMailHtmlFormat(String email[], String body, String cc[], String subject)
2815
			throws MessagingException, ProfitMandiBusinessException, IOException {
2816
		MimeMessage message = mailSender.createMimeMessage();
2817
		MimeMessageHelper helper = new MimeMessageHelper(message);
2818
		helper.setSubject(subject);
2819
		helper.setText(body, true);
2820
		helper.setTo(email);
2821
		if (cc != null) {
2822
			helper.setCc(cc);
28218 tejbeer 2823
		}
28222 tejbeer 2824
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2825
		helper.setFrom(senderAddress);
2826
		mailSender.send(message);
28205 tejbeer 2827
	}
2828
 
28775 amit.gupta 2829
	@Autowired
2830
	WarehouseRepository warehouseRepository;
2831
	public void getVendorWarehouses(int warehouseId) {
28778 amit.gupta 2832
		LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
28775 amit.gupta 2833
 
2834
	}
2835
 
26418 tejbeer 2836
}
27438 amit.gupta 2837
//2284