Subversion Repositories SmartDukaan

Rev

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

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