Subversion Repositories SmartDukaan

Rev

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