Subversion Repositories SmartDukaan

Rev

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

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