Subversion Repositories SmartDukaan

Rev

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