Subversion Repositories SmartDukaan

Rev

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

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