Subversion Repositories SmartDukaan

Rev

Rev 29488 | Rev 29668 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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