Subversion Repositories SmartDukaan

Rev

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