Subversion Repositories SmartDukaan

Rev

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