Subversion Repositories SmartDukaan

Rev

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