Subversion Repositories SmartDukaan

Rev

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

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