Subversion Repositories SmartDukaan

Rev

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

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