Subversion Repositories SmartDukaan

Rev

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