Subversion Repositories SmartDukaan

Rev

Rev 28787 | Rev 28790 | 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 {
28789 amit.gupta 1109
		LocalDateTime moriningTime = LocalDate.now().atTime(10, 30);
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)) {
28789 amit.gupta 1128
				String body = String.format("Dear %s,\n Pls note that you haven't punched your attendance by 10:30am. 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
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
1138
		Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x->x.isActive()).collect(Collectors.toMap(x->x.getEmailId(), x->x));
1139
 
1140
		List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1141
		Map<String, User> userMap = users.stream().collect(Collectors.toMap(x->x.getEmailId(), x->x));
1142
 
28784 amit.gupta 1143
		Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now())
1144
				.stream().collect(Collectors.groupingBy(x->x.getUserId()));
28775 amit.gupta 1145
 
1146
		for(AuthUser authUser: authUsers) {
1147
			User user = userMap.get(authUser.getEmailId());
28784 amit.gupta 1148
			String body = null;
1149
			List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1150
			if(employeeAttendances==null ) {
1151
				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());
1152
			} else {
1153
				List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x->x.getCreateTimestamp()).collect(Collectors.toList());
1154
				if(punchTimes.size()==1) {
1155
					//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());
1156
				} else {
1157
					LocalDateTime firstPunch = punchTimes.get(0);
1158
					LocalDateTime lastPunch = punchTimes.get(punchTimes.size()-1);
1159
					boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1160
					if(!hoursCompleted) {
1161
						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());
1162
					}
1163
				}
1164
 
1165
			}
1166
			if(body != null) {
28782 amit.gupta 1167
				Utils.sendMailWithAttachments(googleMailSender, new String[] { authUser.getEmailId() }, new String[] { "jyoti.rawat@smartdukaan.com" }, "Attendance Alert", 
28775 amit.gupta 1168
						body);
1169
			}
1170
		}
1171
 
1172
	}
1173
 
28709 amit.gupta 1174
	public void checkPartnerActiveStore() throws Exception {
1175
 
1176
		List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
1177
 
1178
		LocalDateTime currentDate = LocalDate.now().atStartOfDay();
28712 amit.gupta 1179
		if (!fofoStores.isEmpty()) {
1180
			for (FofoStore fofoStore : fofoStores) {
28709 amit.gupta 1181
 
28712 amit.gupta 1182
				if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
28709 amit.gupta 1183
 
28712 amit.gupta 1184
					fofoStore.setActive(true);
1185
					fofoStoreRepository.persist(fofoStore);
1186
					LOGGER.info("inserted into InActiveFofoStore successfully");
28709 amit.gupta 1187
 
28712 amit.gupta 1188
				}
28709 amit.gupta 1189
 
28712 amit.gupta 1190
				else {
1191
					fofoStore.setActive(false);
1192
					fofoStore.setActiveTimeStamp(null);
1193
					fofoStoreRepository.persist(fofoStore);
1194
					LOGGER.info("inserted into InActiveFofoStore successfully");
1195
				}
28709 amit.gupta 1196
 
1197
			}
1198
		}
1199
 
1200
	}
1201
 
24697 amit.gupta 1202
	public void sendAgeingReport() throws Exception {
27210 tejbeer 1203
		sendAgeingReport("kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 1204
				"niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
24697 amit.gupta 1205
	}
1206
 
24533 govind 1207
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 1208
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 1209
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 1210
			priceDropService.priceDropStatus(priceDrop.getId());
1211
		}
1212
	}
23929 amit.gupta 1213
 
24542 amit.gupta 1214
	public void walletmismatch() throws Exception {
1215
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 1216
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 1217
		System.out.println(pdis.size());
24542 amit.gupta 1218
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 1219
			int fofoId = pdi.getFofoId();
24542 amit.gupta 1220
			for (PartnerDailyInvestment investment : Lists
1221
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 1222
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 1223
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 1224
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 1225
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
1226
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 1227
 
24542 amit.gupta 1228
			}
24549 amit.gupta 1229
		}
24542 amit.gupta 1230
 
1231
	}
1232
 
1233
	public void gst() throws Exception {
24548 amit.gupta 1234
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2019, 1, 26).atStartOfDay(),
1235
				LocalDate.of(2019, 1, 27).atTime(LocalTime.MAX));
1236
		for (FofoOrder fofoOrder : fofoOrders) {
1237
			int retailerAddressId = retailerRegisteredAddressRepository
1238
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 1239
 
1240
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
1241
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1242
			Integer stateId = null;
1243
			if (customerAddress.getState().equals(retailerAddress.getState())) {
1244
				try {
1245
					stateId = Long.valueOf(Utils.getStateInfo(customerAddress.getState()).getId()).intValue();
1246
				} catch (Exception e) {
1247
					LOGGER.error("Unable to get state rates");
1248
				}
1249
			}
1250
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1251
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 1252
 
1253
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
26929 amit.gupta 1254
			List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
24542 amit.gupta 1255
			if (stateId != null) {
26929 amit.gupta 1256
				itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
24542 amit.gupta 1257
			} else {
26929 amit.gupta 1258
				itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
24542 amit.gupta 1259
			}
1260
 
24548 amit.gupta 1261
			for (FofoOrderItem foi : fofoOrderItems) {
24542 amit.gupta 1262
				if (stateId == null) {
1263
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
1264
				} else {
1265
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1266
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1267
				}
1268
				fofoOrderItemRepository.persist(foi);
1269
			}
1270
		}
24548 amit.gupta 1271
 
24542 amit.gupta 1272
	}
1273
 
24580 amit.gupta 1274
	public void schemewalletmismatch() {
1275
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 1276
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 1277
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 1278
			// reconcileOrders(dateTime);
1279
			// reconcileRecharges(dateTime);
24580 amit.gupta 1280
			dateToReconcile = dateToReconcile.plusDays(1);
1281
		}
1282
	}
1283
 
1284
	private void reconcileSchemes(LocalDate date) {
1285
		LocalDateTime startDate = date.atStartOfDay();
1286
		LocalDateTime endDate = startDate.plusDays(1);
1287
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1288
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 1289
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1290
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 1291
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 1292
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
1293
				WalletReferenceType.SCHEME_OUT);
1294
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
1295
				walletReferenceTypes);
1296
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1297
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 1298
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 1299
 
1300
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
1301
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1302
 
1303
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
1304
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1305
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
1306
 
1307
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
1308
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1309
 
1310
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
1311
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
1312
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
1313
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
1314
 
1315
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
26092 amit.gupta 1316
 
24587 amit.gupta 1317
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1318
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1319
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1320
				} else {
1321
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
1322
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
1323
				}
1324
			}
24590 amit.gupta 1325
			Map<Integer, Integer> userWalletMap = userWalletRepository
1326
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1327
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1328
 
24587 amit.gupta 1329
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1330
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1331
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1332
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1333
				if (diff > 5) {
1334
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1335
				}
1336
			}
24580 amit.gupta 1337
		}
24587 amit.gupta 1338
 
24580 amit.gupta 1339
	}
24590 amit.gupta 1340
 
24592 amit.gupta 1341
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1342
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1343
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1344
 
24592 amit.gupta 1345
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1346
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1347
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1348
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1349
		Set<String> serialNumbersConsidered = new HashSet<>();
1350
 
25096 amit.gupta 1351
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1352
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1353
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1354
 
24683 amit.gupta 1355
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1356
		purchases.stream().forEach(purchase -> {
1357
			float amountToRollback = 0;
1358
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1359
					+ purchase.getPurchaseReference();
1360
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1361
					.stream().filter(ii -> ii.getSerialNumber() != null)
1362
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1363
			if (inventorySerialNumberMap.size() > 0) {
1364
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1365
					String serialNumber = inventorySerialNumberEntry.getValue();
1366
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1367
					if (serialNumbersConsidered.contains(serialNumber)) {
1368
						// This will rollback scheme for differenct orders for same serial
1369
						List<SchemeInOut> sios = schemeInOutRepository
1370
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1371
								.filter(x -> x.getRolledBackTimestamp() == null
1372
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1373
								.collect(Collectors.toList());
1374
						Collections.reverse(sios);
1375
						for (SchemeInOut sio : sios) {
1376
							sio.setRolledBackTimestamp(LocalDateTime.now());
1377
							amountToRollback += sio.getAmount();
1378
							// sio.setSchemeType(SchemeType.OUT);
1379
							sio.setSerialNumber(serialNumber);
1380
							rolledbackSios.add(sio);
1381
						}
1382
						description = description.concat(" " + serialNumber + " ");
1383
					} else {
1384
						serialNumbersConsidered.add(serialNumber);
1385
						List<Integer> schemesConsidered = new ArrayList<>();
1386
						List<SchemeInOut> sios = schemeInOutRepository
1387
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1388
								.filter(x -> x.getRolledBackTimestamp() == null
1389
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1390
								.collect(Collectors.toList());
1391
						Collections.reverse(sios);
1392
						for (SchemeInOut sio : sios) {
1393
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1394
								schemesConsidered.add(sio.getSchemeId());
1395
								continue;
1396
							}
1397
							sio.setRolledBackTimestamp(LocalDateTime.now());
1398
							amountToRollback += sio.getAmount();
1399
							// sio.setSchemeType(SchemeType.OUT);
1400
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1401
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1402
							sio.setReference(purchase.getId());
24635 amit.gupta 1403
							rolledbackSios.add(sio);
1404
						}
1405
					}
1406
 
1407
				}
1408
			}
1409
			if (amountToRollback > 0) {
24683 amit.gupta 1410
				// Address address =
1411
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1412
				UserWalletHistory uwh = new UserWalletHistory();
1413
				uwh.setAmount(Math.round(amountToRollback));
1414
				uwh.setDescription(description);
1415
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1416
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1417
				uwh.setReference(purchase.getId());
1418
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1419
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1420
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1421
				userWalletHistory.add(uwh);
1422
			}
1423
		});
1424
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1425
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1426
						"Timestamp"),
1427
				userWalletHistory.stream()
1428
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1429
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1430
						.collect(Collectors.toList()));
1431
 
1432
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1433
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1434
						"Created", "Rolledback"),
24635 amit.gupta 1435
				rolledbackSios.stream()
24681 amit.gupta 1436
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1437
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1438
						.collect(Collectors.toList()));
1439
 
25043 amit.gupta 1440
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1441
				"Partner Excess Amount Scheme In", "PFA",
24635 amit.gupta 1442
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
24636 amit.gupta 1443
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1444
 
25096 amit.gupta 1445
		throw new Exception();
24635 amit.gupta 1446
 
1447
	}
1448
 
1449
	public void dryRunOutSchemeReco() throws Exception {
1450
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1451
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1452
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1453
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1454
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1455
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1456
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1457
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1458
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1459
		// Collections.reverse(allOrders);
1460
		// List<FofoOrder> allOrders =
24653 govind 1461
		// List<FofoOrder> allOrders =
24631 amit.gupta 1462
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1463
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1464
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1465
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1466
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1467
			float amountToRollback = 0;
24590 amit.gupta 1468
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1469
			orderItems.forEach(x -> {
24606 amit.gupta 1470
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1471
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1472
			});
24606 amit.gupta 1473
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1474
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1475
					String serialNumber = inventorySerialNumberEntry.getValue();
1476
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1477
					if (serialNumbersConsidered.contains(serialNumber)) {
1478
						// This will rollback scheme for differenct orders for same serial
1479
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1480
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1481
								.filter(x -> x.getRolledBackTimestamp() == null
1482
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1483
								.collect(Collectors.toList());
1484
						Collections.reverse(sios);
1485
						for (SchemeInOut sio : sios) {
1486
							sio.setRolledBackTimestamp(LocalDateTime.now());
1487
							amountToRollback += sio.getAmount();
1488
							// sio.setSchemeType(SchemeType.OUT);
1489
							sio.setSerialNumber(serialNumber);
1490
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1491
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1492
							rolledbackSios.add(sio);
24623 amit.gupta 1493
						}
24635 amit.gupta 1494
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1495
					} else {
1496
						serialNumbersConsidered.add(serialNumber);
1497
						List<Integer> schemesConsidered = new ArrayList<>();
1498
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1499
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1500
								.filter(x -> x.getRolledBackTimestamp() == null
1501
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1502
								.collect(Collectors.toList());
1503
						Collections.reverse(sios);
1504
						for (SchemeInOut sio : sios) {
1505
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1506
								schemesConsidered.add(sio.getSchemeId());
1507
								continue;
1508
							}
1509
							sio.setRolledBackTimestamp(LocalDateTime.now());
1510
							amountToRollback += sio.getAmount();
1511
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1512
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1513
							sio.setSerialNumber(serialNumber);
1514
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1515
							rolledbackSios.add(sio);
1516
						}
24615 amit.gupta 1517
					}
24631 amit.gupta 1518
 
24604 amit.gupta 1519
				}
24590 amit.gupta 1520
			}
24631 amit.gupta 1521
			if (amountToRollback > 0) {
1522
				UserWalletHistory uwh = new UserWalletHistory();
1523
				uwh.setAmount(Math.round(amountToRollback));
1524
				uwh.setDescription(description);
1525
				uwh.setTimestamp(LocalDateTime.now());
1526
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1527
				uwh.setReference(fofoOrder.getId());
1528
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1529
				uwh.setFofoId(fofoOrder.getFofoId());
1530
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1531
				userWalletHistory.add(uwh);
1532
			}
24590 amit.gupta 1533
		});
24598 amit.gupta 1534
 
24592 amit.gupta 1535
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1536
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1537
						"Timestamp"),
1538
				userWalletHistory.stream()
1539
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1540
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1541
						.collect(Collectors.toList()));
1542
 
1543
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1544
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1545
						"Rolledback"),
1546
				rolledbackSios.stream()
1547
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1548
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1549
						.collect(Collectors.toList()));
1550
 
25043 amit.gupta 1551
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1552
				"Partner Excess Amount Scheme Out", "PFA",
24598 amit.gupta 1553
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1554
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1555
 
25267 amit.gupta 1556
		throw new Exception();
24590 amit.gupta 1557
	}
24615 amit.gupta 1558
 
24611 amit.gupta 1559
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1560
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1561
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1562
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1563
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1564
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1565
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1566
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1567
		references.stream().forEach(reference -> {
1568
			FofoOrder fofoOrder = null;
1569
			try {
1570
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1571
			} catch (Exception e) {
1572
 
24611 amit.gupta 1573
			}
1574
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1575
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1576
			float amountToRollback = 0;
1577
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1578
			orderItems.forEach(x -> {
1579
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1580
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1581
			});
1582
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1583
				List<SchemeInOut> sios = schemeInOutRepository
1584
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1585
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1586
						.collect(Collectors.toList());
1587
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1588
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1589
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1590
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1591
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1592
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1593
					if (outList.size() > 1) {
1594
 
24611 amit.gupta 1595
					}
1596
				}
1597
				uwh.setAmount(Math.round(amountToRollback));
1598
				uwh.setDescription(description);
1599
				uwh.setTimestamp(LocalDateTime.now());
1600
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1601
				uwh.setReference(fofoOrder.getId());
1602
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1603
				uwh.setFofoId(fofoOrder.getFofoId());
1604
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1605
				userWalletHistory.add(uwh);
1606
			}
1607
		});
24615 amit.gupta 1608
 
24611 amit.gupta 1609
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1610
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1611
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
1612
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1613
						.collect(Collectors.toList()));
1614
 
24611 amit.gupta 1615
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1616
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1617
						"Rolledback"),
1618
				rolledbackSios.stream()
24615 amit.gupta 1619
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1620
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1621
						.collect(Collectors.toList()));
1622
 
24623 amit.gupta 1623
		Utils.sendMailWithAttachments(googleMailSender,
1624
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1625
				"Partner Excess Amount", "PFA",
1626
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1627
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1628
 
24628 amit.gupta 1629
		throw new Exception();
24615 amit.gupta 1630
 
24611 amit.gupta 1631
	}
24615 amit.gupta 1632
 
26945 amit.gupta 1633
	public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
25927 amit.gupta 1634
 
24653 govind 1635
		LocalDateTime now = LocalDateTime.now();
25837 amit.gupta 1636
		LocalDateTime from = now.with(LocalTime.MIN);
25925 amit.gupta 1637
		String timeString = "Today %s";
25927 amit.gupta 1638
		// Send yesterday's report
27007 amit.gupta 1639
		/*
1640
		 * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1641
		 * now.minusDays(1).; now = from.with(LocalTime.MAX);
1642
		 * 
1643
		 * }
1644
		 */
24855 amit.gupta 1645
		List<Integer> fofoIds = null;
25043 amit.gupta 1646
		if (fofoIdInt == null) {
1647
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1648
					.collect(Collectors.toList());
24856 amit.gupta 1649
		} else {
24855 amit.gupta 1650
			fofoIds = Arrays.asList(fofoIdInt);
1651
		}
25912 amit.gupta 1652
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
24683 amit.gupta 1653
 
25865 amit.gupta 1654
		Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now,
1655
				null);
1656
		Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
26945 amit.gupta 1657
 
1658
		Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1659
				true);
1660
 
1661
		Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository
1662
				.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
26941 amit.gupta 1663
		Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
1664
 
26945 amit.gupta 1665
		Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1666
				false);
26941 amit.gupta 1667
		Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
26945 amit.gupta 1668
 
25865 amit.gupta 1669
		Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1670
		for (int fofoId : fofoIds) {
1671
			SaleTargetReportModel model = new SaleTargetReportModel();
25927 amit.gupta 1672
			model.setInsuranceSale(
1673
					partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
25865 amit.gupta 1674
			model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
26941 amit.gupta 1675
			model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1676
			model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1677
			model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1678
			model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
26945 amit.gupta 1679
			model.setPast3daysSale(
1680
					spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
25880 amit.gupta 1681
			model.setFofoId(fofoId);
25865 amit.gupta 1682
			saleTargetReportModelMap.put(fofoId, model);
1683
		}
25880 amit.gupta 1684
 
26945 amit.gupta 1685
		Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
24653 govind 1686
		for (Integer fofoId : fofoIds) {
25865 amit.gupta 1687
			SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
25821 amit.gupta 1688
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1689
			sendNotificationModel.setCampaignName("Sales update alert");
25884 tejbeer 1690
			sendNotificationModel.setTitle("Sale Update");
25927 amit.gupta 1691
			sendNotificationModel
1692
					.setMessage(String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1693
							model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1694
							String.format(timeString, now.format(timeFormatter))));
25821 amit.gupta 1695
			sendNotificationModel.setType("url");
27206 tejbeer 1696
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1697
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1698
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1699
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1700
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1701
			notificationService.sendNotification(sendNotificationModel);
24653 govind 1702
		}
26945 amit.gupta 1703
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1704
		// saleTargetReportModelMap);
1705
		String statewiseSaleReport = this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
27116 amit.gupta 1706
		String cc[] = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "amit.babu@smartdukaan.com",
26945 amit.gupta 1707
				"niranjan.kala@smartdukaan.com", "up.singh@smartdukaan.com", "sm@smartdukaan.com" };
25837 amit.gupta 1708
 
25912 amit.gupta 1709
		String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
26945 amit.gupta 1710
		// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
1711
		// subject);
1712
		this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com", statewiseSaleReport, cc, "Statewise" + subject);
24653 govind 1713
	}
1714
 
28377 tejbeer 1715
	public void checkRazorPayPaymentStatus() throws Exception {
28368 tejbeer 1716
		List<PendingOrder> pendingOrder = pendingOrderRepository
1717
				.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
1718
 
1719
		for (PendingOrder po : pendingOrder) {
1720
			RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
28377 tejbeer 1721
			List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28368 tejbeer 1722
 
28369 tejbeer 1723
			LOGGER.info("razorPay" + razorPay);
1724
			if (razorPay != null) {
1725
				List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28377 tejbeer 1726
 
28369 tejbeer 1727
				if (!payments.isEmpty()) {
28377 tejbeer 1728
					List<String> statusList = new ArrayList<>();
28369 tejbeer 1729
					for (Payment payment : payments) {
28368 tejbeer 1730
 
28377 tejbeer 1731
						JSONObject jsonObj = new JSONObject(payment.toString());
1732
 
1733
						String status = jsonObj.getString("status");
1734
 
1735
						statusList.add(status);
1736
 
28369 tejbeer 1737
					}
28377 tejbeer 1738
					LOGGER.info("statusList" + statusList);
28368 tejbeer 1739
 
28377 tejbeer 1740
					if (statusList.contains("authorized") || statusList.contains("captured")) {
1741
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1742
						po.setPaidAmount(po.getTotalAmount());
1743
						for (PendingOrderItem poi : poItems) {
1744
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1745
						}
1746
						Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
1747
 
1748
						CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1749
						Customer customer = customerRepository.selectById(po.getCustomerId());
1750
						String[] customerEmail = null;
1751
						if (customer.getEmailId() != null) {
1752
							customerEmail = new String[] { customer.getEmailId() };
1753
						}
1754
						List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com",
28467 tejbeer 1755
								"tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
1756
								"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28377 tejbeer 1757
						List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1758
						if (authUserEmails != null) {
1759
							authUserEmails = new ArrayList<>();
1760
						}
1761
						authUserEmails.addAll(bccTo);
1762
 
28382 tejbeer 1763
						// emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1764
						// "order-confirm.vm",
1765
						// emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
28377 tejbeer 1766
 
1767
					} else if (statusList.contains("refunded") || statusList.contains("failed")) {
1768
						for (PendingOrderItem poi : poItems) {
1769
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1770
						}
1771
 
1772
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1773
					}
1774
 
28369 tejbeer 1775
				}
28377 tejbeer 1776
				// LOGGER.info("payment" + payments);
28369 tejbeer 1777
 
1778
			}
28368 tejbeer 1779
		}
1780
	}
1781
 
25865 amit.gupta 1782
	public static class SaleTargetReportModel {
1783
		private double totalSale;
26941 amit.gupta 1784
		private long totalQty;
26945 amit.gupta 1785
		private double past3daysSale;
25880 amit.gupta 1786
		private int fofoId;
1787
 
1788
		public int getFofoId() {
1789
			return fofoId;
1790
		}
1791
 
1792
		public void setFofoId(int fofoId) {
1793
			this.fofoId = fofoId;
1794
		}
1795
 
25865 amit.gupta 1796
		private double smartphoneSale;
1797
		private long smartphoneQty;
1798
		private double insuranceSale;
1799
		private long insruanceQty;
1800
 
26941 amit.gupta 1801
		public long getTotalQty() {
1802
			return totalQty;
1803
		}
1804
 
1805
		public void setTotalQty(long totalQty) {
1806
			this.totalQty = totalQty;
1807
		}
1808
 
26945 amit.gupta 1809
		public double getPast3daysSale() {
1810
			return past3daysSale;
1811
		}
1812
 
1813
		public void setPast3daysSale(double past3daysSale) {
1814
			this.past3daysSale = past3daysSale;
1815
		}
1816
 
25865 amit.gupta 1817
		@Override
1818
		public int hashCode() {
1819
			final int prime = 31;
1820
			int result = 1;
25880 amit.gupta 1821
			result = prime * result + fofoId;
25865 amit.gupta 1822
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1823
			long temp;
1824
			temp = Double.doubleToLongBits(insuranceSale);
1825
			result = prime * result + (int) (temp ^ (temp >>> 32));
1826
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1827
			temp = Double.doubleToLongBits(smartphoneSale);
1828
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1829
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 1830
			temp = Double.doubleToLongBits(totalSale);
1831
			result = prime * result + (int) (temp ^ (temp >>> 32));
1832
			return result;
1833
		}
1834
 
1835
		@Override
1836
		public boolean equals(Object obj) {
1837
			if (this == obj)
1838
				return true;
1839
			if (obj == null)
1840
				return false;
1841
			if (getClass() != obj.getClass())
1842
				return false;
1843
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 1844
			if (fofoId != other.fofoId)
1845
				return false;
25865 amit.gupta 1846
			if (insruanceQty != other.insruanceQty)
1847
				return false;
1848
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
1849
				return false;
1850
			if (smartphoneQty != other.smartphoneQty)
1851
				return false;
1852
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
1853
				return false;
26941 amit.gupta 1854
			if (totalQty != other.totalQty)
1855
				return false;
25865 amit.gupta 1856
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
1857
				return false;
1858
			return true;
1859
		}
1860
 
1861
		public double getTotalSale() {
1862
			return totalSale;
1863
		}
1864
 
1865
		public void setTotalSale(double totalSale) {
1866
			this.totalSale = totalSale;
1867
		}
1868
 
1869
		public double getSmartphoneSale() {
1870
			return smartphoneSale;
1871
		}
1872
 
1873
		public void setSmartphoneSale(double smartphoneSale) {
1874
			this.smartphoneSale = smartphoneSale;
1875
		}
1876
 
1877
		public long getSmartphoneQty() {
1878
			return smartphoneQty;
1879
		}
1880
 
1881
		public void setSmartphoneQty(long smartphoneQty) {
1882
			this.smartphoneQty = smartphoneQty;
1883
		}
1884
 
1885
		public double getInsuranceSale() {
1886
			return insuranceSale;
1887
		}
1888
 
1889
		public void setInsuranceSale(double insuranceSale) {
1890
			this.insuranceSale = insuranceSale;
1891
		}
1892
 
1893
		public long getInsruanceQty() {
1894
			return insruanceQty;
1895
		}
1896
 
1897
		public void setInsruanceQty(long insruanceQty) {
1898
			this.insruanceQty = insruanceQty;
1899
		}
1900
 
1901
		@Override
1902
		public String toString() {
26945 amit.gupta 1903
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
1904
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
1905
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 1906
		}
1907
 
1908
	}
1909
 
26945 amit.gupta 1910
	private String getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
1911
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
26940 amit.gupta 1912
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
26945 amit.gupta 1913
		Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors
1914
				.groupingBy(x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
26940 amit.gupta 1915
		List<List<Serializable>> stateWiseSales = new ArrayList<>();
1916
		for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
26945 amit.gupta 1917
			long totalQty = stateMapEntry.getValue().stream()
1918
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
1919
			double totalSale = stateMapEntry.getValue().stream()
1920
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
1921
			long smartPhoneQty = stateMapEntry.getValue().stream()
1922
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
1923
			double smartPhoneSale = stateMapEntry.getValue().stream()
1924
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
1925
			stateWiseSales
1926
					.add(Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
26940 amit.gupta 1927
		}
1928
		StringBuilder sb = new StringBuilder();
26945 amit.gupta 1929
		sb.append("<html><body>");
1930
		sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
26940 amit.gupta 1931
		sb.append("<tbody>\n" + "	    <tr>"
1932
				+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
26941 amit.gupta 1933
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
1934
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
1935
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
1936
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
26940 amit.gupta 1937
				+ "	    				</tr>");
1938
		for (List<Serializable> stateSale : stateWiseSales) {
1939
			sb.append("<tr>");
1940
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
1941
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
1942
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
26941 amit.gupta 1943
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
1944
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
26940 amit.gupta 1945
			sb.append("</tr>");
1946
		}
26945 amit.gupta 1947
		sb.append("</tbody></table><br><br>");
25872 tejbeer 1948
 
26945 amit.gupta 1949
		sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
24653 govind 1950
		sb.append("<tbody>\n" + "	    				<tr>\n"
26945 amit.gupta 1951
				+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
1952
				+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
1953
				+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
1954
				+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
1955
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
1956
				+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
1957
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
24653 govind 1958
				+ "	    				</tr>");
26945 amit.gupta 1959
 
1960
		List<Integer> sortedPartnerSalesHeaders = partnerSalesHeadersMap.values().stream()
26947 amit.gupta 1961
				.sorted(Comparator.comparing(FofoReportingModel::getCode)
1962
						.thenComparing(FofoReportingModel::getRegionalManager)
26948 amit.gupta 1963
						.thenComparing(FofoReportingModel::getTerritoryManager))
26945 amit.gupta 1964
				.map(FofoReportingModel::getFofoId).collect(Collectors.toList());
25927 amit.gupta 1965
		for (Integer fofoId : sortedPartnerSalesHeaders) {
27007 amit.gupta 1966
			if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
26947 amit.gupta 1967
				sb.append("<tr style='background-color:red'>");
1968
			} else {
26945 amit.gupta 1969
				sb.append("<tr>");
1970
			}
1971
			sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode()
25880 amit.gupta 1972
					+ "</td>");
1973
			sb.append("<td style='border:1px solid black;padding: 5px'>"
27007 amit.gupta 1974
					+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
1975
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1976
					+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
1977
			sb.append("<td style='border:1px solid black;padding: 5px'>"
1978
					+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
1979
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1980
					+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
25880 amit.gupta 1981
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1982
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
25880 amit.gupta 1983
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 1984
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
25865 amit.gupta 1985
			sb.append("</tr>");
24653 govind 1986
		}
24683 amit.gupta 1987
 
26945 amit.gupta 1988
		sb.append("</tr>");
1989
 
1990
		sb.append("</body></html>");
1991
 
1992
		return sb.toString();
24653 govind 1993
	}
24841 govind 1994
 
26945 amit.gupta 1995
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 1996
			throws MessagingException, ProfitMandiBusinessException, IOException {
1997
		MimeMessage message = mailSender.createMimeMessage();
1998
		MimeMessageHelper helper = new MimeMessageHelper(message);
1999
		helper.setSubject(subject);
2000
		helper.setText(body, true);
2001
		helper.setTo(email);
2002
		if (cc != null) {
2003
			helper.setCc(cc);
2004
		}
2005
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2006
		helper.setFrom(senderAddress);
2007
		mailSender.send(message);
2008
	}
25300 tejbeer 2009
 
25351 tejbeer 2010
	public void sendNotification() throws Exception {
25300 tejbeer 2011
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2012
		if (!pushNotifications.isEmpty()) {
2013
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 2014
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 2015
				NotificationCampaign notificationCampaign = notificationCampaignRepository
2016
						.selectById(pushNotification.getNotificationCampaignid());
2017
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
2018
						SimpleCampaignParams.class);
2019
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 2020
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 2021
				JSONObject json = new JSONObject();
25351 tejbeer 2022
				json.put("to", device.getFcmId());
25300 tejbeer 2023
				JSONObject jsonObj = new JSONObject();
2024
				jsonObj.put("message", campaign.getMessage());
2025
				jsonObj.put("title", campaign.getTitle());
2026
				jsonObj.put("type", campaign.getType());
2027
				jsonObj.put("url", result_url);
2028
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2029
				jsonObj.put("image", campaign.getImageUrl());
2030
				jsonObj.put("largeIcon", "large_icon");
2031
				jsonObj.put("smallIcon", "small_icon");
2032
				jsonObj.put("vibrate", 1);
2033
				jsonObj.put("pid", pushNotification.getId());
2034
				jsonObj.put("sound", 1);
2035
				jsonObj.put("priority", "high");
2036
				json.put("data", jsonObj);
25351 tejbeer 2037
				try {
2038
					CloseableHttpClient client = HttpClients.createDefault();
2039
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 2040
 
25351 tejbeer 2041
					httpPost.setHeader("Content-Type", "application/json; utf-8");
2042
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2043
					StringEntity entity = new StringEntity(json.toString());
2044
					httpPost.setEntity(entity);
2045
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 2046
 
25351 tejbeer 2047
					if (response.getStatusLine().getStatusCode() == 200) {
2048
						pushNotification.setSentTimestamp(LocalDateTime.now());
2049
					} else {
25356 tejbeer 2050
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 2051
						LOGGER.info("message" + "not sent");
26945 amit.gupta 2052
						response.toString();
25351 tejbeer 2053
					}
25300 tejbeer 2054
 
25351 tejbeer 2055
				} catch (Exception e) {
2056
					e.printStackTrace();
26443 amit.gupta 2057
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 2058
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 2059
				}
2060
			}
2061
		}
2062
	}
2063
 
25553 amit.gupta 2064
	public void grouping() throws Exception {
25609 amit.gupta 2065
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2066
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
2067
		System.out.println(String.join("\t",
2068
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 2069
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 2070
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 2071
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 2072
			if (priceDropIMEI.getPartnerId() == 0)
2073
				continue;
25609 amit.gupta 2074
			HashSet<String> imeis = new HashSet<>();
2075
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2076
			imeis.add(priceDropIMEI.getImei());
2077
			List<InventoryItem> inventoryItems = inventoryItemRepository
2078
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 2079
			if (inventoryItems.size() == 0) {
2080
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 2081
				continue;
25612 amit.gupta 2082
			}
25609 amit.gupta 2083
			InventoryItem inventoryItem = inventoryItems.get(0);
2084
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
2085
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
2086
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
2087
				// check if pricedrop has been rolled out
2088
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
2089
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
2090
				if (uwh.size() > 0) {
25615 amit.gupta 2091
					Item item = itemRepository.selectById(inventoryItem.getItemId());
26945 amit.gupta 2092
					System.out.println(String.join("\t", Arrays.asList(priceDropIMEI.getImei(),
2093
							inventoryItem.getItemId() + "", item.getBrand(), item.getModelName(), item.getModelNumber(),
2094
							inventoryItem.getFofoId() + "", customRetailer.getBusinessName(),
2095
							inventoryItem.getCreateTimestamp().format(dtf), priceDrop.getAffectedOn().format(dtf),
2096
							priceDropIMEI.getUpdateTimestamp().format(dtf),
2097
							inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getAutoPartnerPayout() + "",
2098
							inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 2099
				}
2100
			}
2101
		}
25503 amit.gupta 2102
	}
25694 amit.gupta 2103
 
27686 amit.gupta 2104
	public void attachToffeeInvoices() throws Exception {
28205 tejbeer 2105
		/*
2106
		 * LOGGER.info("Insurance Sum Summary --- {}",
2107
		 * insurancePolicyRepository.selectAmountSumGroupByRetailerId(LocalDateTime.MIN,
2108
		 * LocalDateTime.MAX)); LOGGER.info("Insurance Qty Summary --- {}",
2109
		 * insurancePolicyRepository.selectQtyGroupByRetailerId(LocalDateTime.MIN,
2110
		 * LocalDateTime.MAX)); LOGGER.info("SmartPhone Amount Summary --- {}",
2111
		 * fofoOrderItemRepository.selectSumAmountGroupByRetailer(LocalDateTime.MIN,
2112
		 * LocalDateTime.MAX, 0, true)); LOGGER.info("Smartphone Qty Summary --- {}",
2113
		 * fofoOrderItemRepository.selectQtyGroupByRetailer(LocalDateTime.MIN,
2114
		 * LocalDateTime.MAX, 0, true));
2115
		 */
2116
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3,
2117
				Optional.of(false));
2118
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
27678 amit.gupta 2119
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2120
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2121
			PdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2122
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2123
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
28205 tejbeer 2124
			String pdfInvoiceString = "data:application/pdf;base64,"
2125
					+ Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2126
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1],
2127
					pdfInvoiceString);
2128
			if (attached) {
27678 amit.gupta 2129
				insurancePolicy.setPosted(true);
2130
			}
2131
		}
25694 amit.gupta 2132
	}
2133
 
2134
	public void schemeRollback(List<String> schemeIds) throws Exception {
2135
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 2136
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 2137
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2138
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2139
		for (SchemeInOut sio : schemeInOuts) {
2140
			Scheme scheme = schemesMap.get(sio.getSchemeId());
2141
			if (scheme.getType().equals(SchemeType.IN)) {
2142
 
2143
			} else if (scheme.getType().equals(SchemeType.OUT)) {
2144
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2145
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
2146
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
2147
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2148
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
2149
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
2150
					sio.setRolledBackTimestamp(LocalDateTime.now());
2151
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 2152
					String rollbackReason = "Scheme reversed for "
2153
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 2154
							+ fofoOrder.getInvoiceNumber();
2155
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 2156
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
2157
							LocalDateTime.now());
25694 amit.gupta 2158
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
2159
							rollbackReason);
2160
				}
2161
			}
2162
		}
25721 tejbeer 2163
		// throw new Exception();
25694 amit.gupta 2164
	}
25721 tejbeer 2165
 
2166
	public void checkfocusedModelInPartnerStock() throws Exception {
2167
 
2168
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
2169
				.collect(Collectors.toList());
27212 tejbeer 2170
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
2171
				.getSaholicStock();
27213 tejbeer 2172
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2173
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 2174
 
2175
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
2176
				.getSaholicPOItems();
25721 tejbeer 2177
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2178
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 2179
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2180
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 2181
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2182
			Map<Integer, Integer> processingOrderMap = null;
2183
			Map<Integer, Integer> catalogIdAndQtyMap = null;
2184
			Map<Integer, Integer> grnPendingOrdersMap = null;
2185
 
2186
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
2187
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
2188
 
2189
			if (!currentInventorySnapshot.isEmpty()) {
2190
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
2191
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2192
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
2193
 
2194
			}
2195
 
2196
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
2197
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2198
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2199
			if (!grnPendingOrders.isEmpty()) {
2200
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
2201
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2202
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
2203
 
2204
			}
2205
 
2206
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
2207
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2208
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2209
			if (!processingOrder.isEmpty()) {
2210
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
2211
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2212
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
2213
 
2214
			}
2215
 
25800 tejbeer 2216
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
2217
					.collect(Collectors.toList());
2218
 
27088 tejbeer 2219
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
2220
					.collect(Collectors.toList());
27095 tejbeer 2221
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 2222
			if (regionIds.size() == 0) {
2223
				LOGGER.info("No region found for partner {}", fofoId);
2224
				continue;
2225
			}
27100 amit.gupta 2226
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 2227
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
2228
							Collectors.mapping(FocusedModel::getMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 2229
 
25721 tejbeer 2230
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
2231
 
27100 amit.gupta 2232
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2233
				int minQty = entry.getValue().get();
25721 tejbeer 2234
				int inStockQty = 0;
2235
				int processingQty = 0;
2236
				int grnPendingQty = 0;
27208 tejbeer 2237
				int allColorNetAvailability = 0;
27253 tejbeer 2238
				int allColorPoAvailability = 0;
25721 tejbeer 2239
				if (processingOrderMap != null) {
2240
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
2241
							: processingOrderMap.get(entry.getKey());
2242
 
2243
				}
2244
				if (grnPendingOrdersMap != null) {
2245
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2246
							: grnPendingOrdersMap.get(entry.getKey());
2247
 
2248
				}
2249
				if (catalogIdAndQtyMap != null) {
2250
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2251
							: catalogIdAndQtyMap.get(entry.getKey());
2252
 
2253
				}
28526 tejbeer 2254
 
2255
				int grnStockQty = grnPendingQty + inStockQty;
25721 tejbeer 2256
				int totalQty = processingQty + grnPendingQty + inStockQty;
2257
 
27100 amit.gupta 2258
				if (totalQty < minQty) {
25721 tejbeer 2259
 
27100 amit.gupta 2260
					int shortageQty = minQty - totalQty;
25721 tejbeer 2261
					List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
27212 tejbeer 2262
					FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
27213 tejbeer 2263
 
27212 tejbeer 2264
					Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2265
							.get(fofoStore.getWarehouseId());
25721 tejbeer 2266
 
27212 tejbeer 2267
					Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2268
							.get(fofoStore.getWarehouseId());
27208 tejbeer 2269
 
2270
					for (Item it : item) {
28527 tejbeer 2271
						List<SaholicCIS> currentAvailability = null;
28528 tejbeer 2272
						List<SaholicPOItem> poItemAvailability = null;
28527 tejbeer 2273
						if (itemAvailabilityMap != null) {
2274
							currentAvailability = itemAvailabilityMap.get(it.getId());
2275
						}
28528 tejbeer 2276
 
2277
						if (poItemAvailabilityMap != null) {
2278
							poItemAvailability = poItemAvailabilityMap.get(it.getId());
2279
						}
27208 tejbeer 2280
						if (currentAvailability != null) {
2281
							allColorNetAvailability += currentAvailability.stream()
2282
									.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2283
						}
27253 tejbeer 2284
 
27208 tejbeer 2285
						if (poItemAvailability != null) {
27253 tejbeer 2286
							allColorPoAvailability += poItemAvailability.stream()
27208 tejbeer 2287
									.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
2288
						}
27253 tejbeer 2289
 
27208 tejbeer 2290
					}
2291
 
25721 tejbeer 2292
					FocusedModelShortageModel fm = new FocusedModelShortageModel();
2293
					fm.setFofoId(fofoId);
27212 tejbeer 2294
					fm.setStoreCode(fofoStore.getCode());
25721 tejbeer 2295
					fm.setStoreName(customRetailer.getBusinessName());
27208 tejbeer 2296
					fm.setBrandName(item.get(0).getBrand());
2297
					fm.setModelName(item.get(0).getModelName());
2298
					fm.setModelNumber(item.get(0).getModelNumber());
28526 tejbeer 2299
					fm.setGrnStockQty(grnStockQty);
2300
					fm.setPendingIndentQty(processingQty);
25721 tejbeer 2301
					fm.setShortageQty(shortageQty);
27253 tejbeer 2302
					fm.setPoAvailabitiy(allColorPoAvailability);
27208 tejbeer 2303
					fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
27213 tejbeer 2304
					fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2305
					fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
27246 tejbeer 2306
					fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
27208 tejbeer 2307
					fm.setAvailabitiy(allColorNetAvailability);
25721 tejbeer 2308
 
27102 amit.gupta 2309
					focusedModelShortageList.add(fm);
25721 tejbeer 2310
				}
2311
 
2312
			}
27233 tejbeer 2313
 
28529 tejbeer 2314
			if (!focusedModelShortageList.isEmpty()) {
2315
				String subject = "Stock Alert";
2316
				String messageText = this.getMessage(focusedModelShortageList);
27233 tejbeer 2317
 
28529 tejbeer 2318
				this.sendMailWithAttachments(subject, messageText, customRetailer.getEmail());
2319
				String notificationMessage = this.getNotificationMessage(focusedModelShortageList);
2320
 
2321
				LOGGER.info("notificationMessage" + notificationMessage);
2322
 
2323
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
2324
				sendNotificationModel.setCampaignName("Stock Alert");
2325
				sendNotificationModel.setTitle("Alert");
2326
				sendNotificationModel.setMessage(notificationMessage);
2327
				sendNotificationModel.setType("url");
2328
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2329
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2330
				sendNotificationModel.setMessageType(MessageType.notification);
2331
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2332
				sendNotificationModel.setUserIds(Arrays.asList(userId));
2333
				notificationService.sendNotification(sendNotificationModel);
2334
 
2335
			}
2336
 
25721 tejbeer 2337
		}
27102 amit.gupta 2338
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2339
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2340
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2341
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2342
 
25800 tejbeer 2343
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2344
				storeGuyMap.entrySet().forEach(y -> {
2345
 
2346
					if (y.getValue().contains(x.getKey())) {
2347
						if (!emailRowsMap.containsKey(y.getKey())) {
2348
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2349
						}
27208 tejbeer 2350
						List<List<? extends Serializable>> fms = x.getValue().stream()
2351
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2352
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
28526 tejbeer 2353
										r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(),
2354
										r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2355
								.collect(Collectors.toList());
2356
						emailRowsMap.get(y.getKey()).addAll(fms);
2357
 
25721 tejbeer 2358
					}
2359
 
25800 tejbeer 2360
				});
25721 tejbeer 2361
 
2362
			});
2363
 
27212 tejbeer 2364
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
28526 tejbeer 2365
					"Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty",
2366
					"Availability");
25837 amit.gupta 2367
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2368
 
25800 tejbeer 2369
				ByteArrayOutputStream baos = null;
2370
				try {
25837 amit.gupta 2371
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2372
				} catch (Exception e2) {
2373
					e2.printStackTrace();
2374
				}
28529 tejbeer 2375
				String[] sendToArray = new String[] { entry.getKey() };
28526 tejbeer 2376
 
25800 tejbeer 2377
				try {
2378
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2379
							new ByteArrayResource(baos.toByteArray()));
2380
				} catch (Exception e1) { // TODO Auto-generated catch block
2381
					e1.printStackTrace();
2382
				}
25721 tejbeer 2383
 
25800 tejbeer 2384
			});
2385
		}
25721 tejbeer 2386
	}
2387
 
2388
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2389
		StringBuilder sb = new StringBuilder();
2390
		sb.append("Focused Model Shortage in Your Stock : \n");
2391
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2392
 
2393
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2394
			sb.append(String.format("%n", ""));
2395
		}
2396
		return sb.toString();
2397
	}
2398
 
2399
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2400
		MimeMessage message = mailSender.createMimeMessage();
2401
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2402
 
2403
		helper.setSubject(subject);
2404
		helper.setText(messageText, true);
2405
		helper.setTo(email);
27116 amit.gupta 2406
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2407
		helper.setFrom(senderAddress);
2408
		mailSender.send(message);
2409
 
2410
	}
2411
 
2412
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2413
		StringBuilder sb = new StringBuilder();
2414
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2415
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2416
		sb.append("<tbody>\n" + "	    				<tr>\n"
2417
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2418
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2419
				+ "	    				</tr>");
2420
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2421
 
2422
			sb.append("<tr>");
2423
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2424
 
2425
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2426
 
2427
			sb.append("</tr>");
2428
 
2429
		}
2430
 
2431
		sb.append("</tbody></table></body></html>");
2432
 
2433
		return sb.toString();
2434
	}
2435
 
25927 amit.gupta 2436
	public void notifyLead() throws Exception {
2437
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(LocalDateTime.now().minusDays(15),
2438
				LocalDateTime.now().plusHours(4));
2439
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2440
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2441
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2442
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2443
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2444
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2445
 
27477 amit.gupta 2446
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2447
 
25927 amit.gupta 2448
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2449
 
2450
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2451
			int authId = authUserEmail.getKey();
2452
			String email = authUserEmail.getValue();
2453
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2454
		}
27477 amit.gupta 2455
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2456
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2457
 
25927 amit.gupta 2458
		String templateMessage = "Lead followup for %s %s, %s is due by %s";
2459
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2460
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2461
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2462
				continue;
2463
			}
2464
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
27795 amit.gupta 2465
					lead.getAddress(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
25927 amit.gupta 2466
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2467
			sendNotificationModel.setCampaignName("Lead Reminder");
2468
			sendNotificationModel.setTitle("Leads followup Reminder");
2469
			sendNotificationModel.setMessage(notificationMessage);
2470
			sendNotificationModel.setType("url");
27206 tejbeer 2471
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2472
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2473
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2474
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2475
			System.out.println(sendNotificationModel);
25927 amit.gupta 2476
			notificationService.sendNotification(sendNotificationModel);
2477
		}
2478
	}
26945 amit.gupta 2479
 
25927 amit.gupta 2480
	public void notifyVisits() throws Exception {
26945 amit.gupta 2481
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2482
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2483
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2484
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2485
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2486
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2487
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2488
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2489
 
25927 amit.gupta 2490
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2491
			int authId = authUserEmail.getKey();
2492
			String email = authUserEmail.getValue();
2493
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2494
		}
2495
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2496
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2497
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2498
		for (FranchiseeVisit visit : franchiseeVisits) {
2499
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2500
				continue;
2501
			}
2502
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2503
			String message = null;
26945 amit.gupta 2504
			if (visit.getFranchiseActivityId() == 0) {
2505
				message = String.format(visitTemplate, visit.getPartnerName(),
2506
						timeFormatter.format(visit.getSchelduleTimestamp()));
2507
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2508
			} else {
26945 amit.gupta 2509
				message = String.format(followupTemplate, visit.getPartnerName(),
2510
						timeFormatter.format(visit.getSchelduleTimestamp()));
25927 amit.gupta 2511
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2512
			}
2513
			sendNotificationModel.setMessage(message);
2514
			sendNotificationModel.setType("url");
26482 tejbeer 2515
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2516
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2517
			sendNotificationModel.setMessageType(MessageType.reminder);
2518
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2519
			notificationService.sendNotification(sendNotificationModel);
2520
		}
25910 amit.gupta 2521
	}
25982 amit.gupta 2522
 
26283 tejbeer 2523
	public void ticketClosed() throws Exception {
2524
 
2525
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2526
		for (Ticket ticket : tickets) {
2527
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2528
				ticket.setCloseTimestamp(LocalDateTime.now());
2529
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2530
				ticket.setUpdateTimestamp(LocalDateTime.now());
2531
				ticketRepository.persist(ticket);
2532
			}
2533
		}
2534
 
2535
	}
2536
 
26790 tejbeer 2537
	public void checkValidateReferral() throws Exception {
2538
 
2539
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2540
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2541
		if (!referrals.isEmpty()) {
2542
			String subject = "Referral Request";
2543
			String messageText = this.getMessageForReferral(referrals);
2544
 
26792 tejbeer 2545
			MimeMessage message = mailSender.createMimeMessage();
2546
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
2547
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
2548
			helper.setSubject(subject);
2549
			helper.setText(messageText, true);
2550
			helper.setTo(email);
2551
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2552
			helper.setFrom(senderAddress);
2553
			mailSender.send(message);
2554
 
26790 tejbeer 2555
		}
2556
	}
2557
 
2558
	private String getMessageForReferral(List<Refferal> referrals) {
2559
		StringBuilder sb = new StringBuilder();
2560
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2561
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2562
		sb.append("<tbody>\n" + "	    				<tr>\n"
2563
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2564
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2565
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2566
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2567
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2568
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2569
				+ "	    				</tr>");
2570
		for (Refferal entry : referrals) {
2571
 
2572
			sb.append("<tr>");
2573
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2574
 
2575
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2576
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2577
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2578
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2579
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2580
 
2581
			sb.append("</tr>");
2582
 
2583
		}
2584
 
2585
		sb.append("</tbody></table></body></html>");
2586
 
2587
		return sb.toString();
2588
	}
2589
 
27271 amit.gupta 2590
	public void reverseWallet() throws Exception {
2591
		LocalDate localDate = LocalDate.of(2020, 10, 28);
28205 tejbeer 2592
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(),
2593
				localDate.plusDays(1).atStartOfDay(),
27271 amit.gupta 2594
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2595
		for (UserWalletHistory uwh : uwhList) {
28205 tejbeer 2596
			if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2597
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
28205 tejbeer 2598
				// LOGGER.info("UWH - {}", uwh);
2599
				// amount += uwh.getAmount();
2600
				// System.out.println("Amount is - " + amount);
2601
				// walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2602
				// uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2603
				// run", uwh.getBusinessTimestamp());
27313 amit.gupta 2604
				int orderId = uwh.getReference();
2605
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2606
				int inventoryItemId = 0;
28205 tejbeer 2607
				// fofoOrderRepository.delete(fofoOrder);
27313 amit.gupta 2608
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
28205 tejbeer 2609
				/*
2610
				 * List<PaymentOptionTransaction> paymentOptionTransactions =
2611
				 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2612
				 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2613
				 * paymentOptionTransaction : paymentOptionTransactions) {
2614
				 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2615
				 */
2616
				for (FofoOrderItem foi : fofoOrderItems) {
2617
					// fofoOrderItemRepository.delete(foi);
27313 amit.gupta 2618
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
28205 tejbeer 2619
					for (FofoLineItem fli : flis) {
2620
						// fofoLineItemRepository.delete(fli);
27313 amit.gupta 2621
						inventoryItemId = fli.getInventoryItemId();
2622
					}
2623
				}
28205 tejbeer 2624
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2625
						java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2626
				for (SchemeInOut sio : schemeInOuts) {
2627
					if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2628
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2629
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2630
					}
2631
				}
28205 tejbeer 2632
 
27271 amit.gupta 2633
			}
2634
		}
28205 tejbeer 2635
 
27271 amit.gupta 2636
	}
28205 tejbeer 2637
 
2638
	public void partnerProblemAlert() throws Exception {
2639
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
2640
		Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2641
				curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
2642
		Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1),
2643
				curDate.with(LocalTime.MAX), 0, false);
2644
		Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream()
2645
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2646
 
2647
		for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
2648
 
2649
			double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2650
 
2651
			LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
2652
 
28211 tejbeer 2653
			double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28208 tejbeer 2654
 
2655
			LOGGER.info("mtdSale" + mtdSale);
2656
 
28209 tejbeer 2657
			double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0
2658
					: pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2659
 
28208 tejbeer 2660
			LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
2661
 
28209 tejbeer 2662
			double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28208 tejbeer 2663
 
2664
			LOGGER.info("stockInvestment" + stockInvestment);
2665
 
28205 tejbeer 2666
			boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
2667
 
2668
			PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
2669
 
28210 tejbeer 2670
			if (partnerProblem == null) {
28205 tejbeer 2671
				partnerProblem = new PartnerProblem();
2672
				partnerProblem.setFofoId(ls.getKey());
2673
				if (mtdSale < lmtdTwentyPercentSale) {
2674
					partnerProblem.setMtd(1);
2675
				}
2676
				if (Investmentvalue) {
2677
					partnerProblem.setInvestment(1);
2678
				}
2679
 
2680
				if (stockInvestment < totalSixtyPercentInvestment) {
2681
					partnerProblem.setInvestment(1);
2682
				}
2683
 
2684
				partnerProblemRepository.persist(partnerProblem);
2685
			} else {
2686
				if (mtdSale < lmtdTwentyPercentSale) {
2687
					partnerProblem.setMtd(partnerProblem.getMtd() + 1);
2688
 
2689
				} else {
2690
					partnerProblem.setMtd(0);
2691
 
2692
				}
2693
				if (Investmentvalue) {
2694
					partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2695
				} else {
2696
					partnerProblem.setInvestment(0);
2697
 
2698
				}
2699
				if (stockInvestment < totalSixtyPercentInvestment) {
2700
					partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2701
				} else {
2702
					partnerProblem.setStockInvestment(0);
2703
				}
2704
 
2705
			}
2706
 
2707
		}
2708
 
28213 tejbeer 2709
		List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream()
2710
				.filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
2711
 
28223 tejbeer 2712
		partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
28224 tejbeer 2713
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
28223 tejbeer 2714
					+ x2.getStockInvestment() ? 1 : -1;
2715
		}).collect(Collectors.toList());
28227 tejbeer 2716
 
2717
		Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
2718
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
2719
					+ x2.getStockInvestment() ? 1 : -1;
2720
		}).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2721
 
28212 tejbeer 2722
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28213 tejbeer 2723
 
28467 tejbeer 2724
		List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28213 tejbeer 2725
 
2726
		Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream()
2727
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2728
 
28286 tejbeer 2729
		List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 2730
				"niranjan.kala@smartdukaan.com", "sm@smartdukaan.com", "tejbeer.kaur@shop2020.in");
28208 tejbeer 2731
		LOGGER.info("partnerProblem" + partnerProblems);
28205 tejbeer 2732
		StringBuilder sb = new StringBuilder();
28218 tejbeer 2733
		sb.append("<htl><body>");
28222 tejbeer 2734
		sb.append(
2735
				"<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 2736
		sb.append("<tbody>\n" + "	    <tr>"
2737
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2738
				+ "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>"
2739
				+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2740
				+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2741
				+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
2742
				+ "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
2743
 
2744
				+ "	    				</tr>");
2745
 
2746
		for (PartnerProblem pp : partnerProblems) {
28467 tejbeer 2747
			int value = pp.getFofoId() % 4;
28205 tejbeer 2748
 
2749
			Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
28217 tejbeer 2750
			LOGGER.info("authUserMap" + authUserMap);
28205 tejbeer 2751
			sb.append("<tr>");
2752
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2753
					+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
28213 tejbeer 2754
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2755
					+ assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
28205 tejbeer 2756
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2757
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2758
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28216 tejbeer 2759
			sb.append("<td style='border:1px solid black;padding: 5px'>"
28224 tejbeer 2760
					+ (authUserMap.get(EscalationType.L1) == null ? "N/A"
28216 tejbeer 2761
							: authUserMap.get(EscalationType.L1).getFirstName())
28224 tejbeer 2762
					+ " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A"
28218 tejbeer 2763
							: authUserMap.get(EscalationType.L2).getFirstName())
28216 tejbeer 2764
					+ "</td>");
28205 tejbeer 2765
 
2766
			sb.append("</tr>");
2767
		}
2768
		sb.append("</tbody></table><br><br>");
2769
		String subject = "Partner Problem Alert!";
2770
		String[] email = sendTo.toArray(new String[sendTo.size()]);
2771
 
28222 tejbeer 2772
		this.sendMailHtmlFormat(email, sb.toString(), null, subject);
2773
 
28218 tejbeer 2774
		Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
2775
 
2776
		for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
28222 tejbeer 2777
			AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
28227 tejbeer 2778
			for (Integer patnerId : authUserPartner.getValue()) {
2779
				if (partnerProblemMap.get(patnerId) != null) {
28218 tejbeer 2780
 
28227 tejbeer 2781
					StringBuilder sbbuilder = new StringBuilder();
2782
					sbbuilder.append("<hml><body>");
2783
					sb.append(
2784
							"<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>");
2785
					sbbuilder.append("<tbody>\n" + "	    <tr>"
2786
							+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2787
							+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2788
							+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2789
							+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 2790
 
28227 tejbeer 2791
							+ "	    				</tr>");
28218 tejbeer 2792
 
28227 tejbeer 2793
					for (Integer partnerId : authUserPartner.getValue()) {
2794
						if (partnerProblemMap.get(partnerId) != null) {
2795
							PartnerProblem pp = partnerProblemMap.get(partnerId);
2796
							sbbuilder.append("<tr>");
2797
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2798
									+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2799
							sbbuilder
2800
									.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2801
							sbbuilder.append(
2802
									"<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2803
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2804
									+ pp.getStockInvestment() + "</td>");
2805
 
2806
							sbbuilder.append("</tr>");
2807
						}
2808
 
28224 tejbeer 2809
					}
28227 tejbeer 2810
					sbbuilder.append("</tbody></table><br><br>");
28224 tejbeer 2811
 
28286 tejbeer 2812
					this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
28230 tejbeer 2813
					break;
28218 tejbeer 2814
				}
28230 tejbeer 2815
 
28223 tejbeer 2816
			}
28222 tejbeer 2817
		}
2818
	}
28218 tejbeer 2819
 
28222 tejbeer 2820
	private void sendMailHtmlFormat(String email[], String body, String cc[], String subject)
2821
			throws MessagingException, ProfitMandiBusinessException, IOException {
2822
		MimeMessage message = mailSender.createMimeMessage();
2823
		MimeMessageHelper helper = new MimeMessageHelper(message);
2824
		helper.setSubject(subject);
2825
		helper.setText(body, true);
2826
		helper.setTo(email);
2827
		if (cc != null) {
2828
			helper.setCc(cc);
28218 tejbeer 2829
		}
28222 tejbeer 2830
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2831
		helper.setFrom(senderAddress);
2832
		mailSender.send(message);
28205 tejbeer 2833
	}
2834
 
28775 amit.gupta 2835
	@Autowired
2836
	WarehouseRepository warehouseRepository;
2837
	public void getVendorWarehouses(int warehouseId) {
28778 amit.gupta 2838
		LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
28775 amit.gupta 2839
 
2840
	}
2841
 
26418 tejbeer 2842
}
27438 amit.gupta 2843
//2284