Subversion Repositories SmartDukaan

Rev

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