Subversion Repositories SmartDukaan

Rev

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

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