Subversion Repositories SmartDukaan

Rev

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

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