Subversion Repositories SmartDukaan

Rev

Rev 30936 | Rev 30965 | 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
 
24542 amit.gupta 3
import com.google.common.collect.Lists;
25300 tejbeer 4
import com.google.gson.Gson;
29488 manish 5
import com.razorpay.Payment;
6
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationService;
7
import com.smartdukaan.cron.itelImeiActivation.TecnoImeiActivation;
25721 tejbeer 8
import com.spice.profitmandi.common.enumuration.MessageType;
23724 amit.gupta 9
import com.spice.profitmandi.common.enumuration.RechargeStatus;
24681 amit.gupta 10
import com.spice.profitmandi.common.enumuration.ReporticoProject;
24121 govind 11
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
30119 amit.gupta 12
import com.spice.profitmandi.common.model.*;
24681 amit.gupta 13
import com.spice.profitmandi.common.services.ReporticoService;
29814 tejbeer 14
import com.spice.profitmandi.common.services.mandii.AccountStatusResponseOut;
15
import com.spice.profitmandi.common.services.mandii.EligibilityStatusEnum;
16
import com.spice.profitmandi.common.services.mandii.MandiiService;
24002 amit.gupta 17
import com.spice.profitmandi.common.util.FileUtil;
23929 amit.gupta 18
import com.spice.profitmandi.common.util.FormattingUtils;
27678 amit.gupta 19
import com.spice.profitmandi.common.util.PdfUtils;
23929 amit.gupta 20
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 21
import com.spice.profitmandi.common.util.Utils.Attachment;
29308 tejbeer 22
import com.spice.profitmandi.common.web.client.RestClient;
25300 tejbeer 23
import com.spice.profitmandi.dao.Interface.Campaign;
25590 amit.gupta 24
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30421 tejbeer 25
import com.spice.profitmandi.dao.entity.auth.PartnerCollectionRemark;
25800 tejbeer 26
import com.spice.profitmandi.dao.entity.catalog.FocusedModel;
25609 amit.gupta 27
import com.spice.profitmandi.dao.entity.catalog.Item;
24590 amit.gupta 28
import com.spice.profitmandi.dao.entity.catalog.Scheme;
25590 amit.gupta 29
import com.spice.profitmandi.dao.entity.cs.Position;
26283 tejbeer 30
import com.spice.profitmandi.dao.entity.cs.Ticket;
28769 amit.gupta 31
import com.spice.profitmandi.dao.entity.dtr.User;
30119 amit.gupta 32
import com.spice.profitmandi.dao.entity.dtr.*;
33
import com.spice.profitmandi.dao.entity.fofo.*;
30390 amit.gupta 34
import com.spice.profitmandi.dao.entity.inventory.ReporticoCacheTable;
27208 tejbeer 35
import com.spice.profitmandi.dao.entity.inventory.SaholicCIS;
36
import com.spice.profitmandi.dao.entity.inventory.SaholicPOItem;
30119 amit.gupta 37
import com.spice.profitmandi.dao.entity.transaction.*;
38
import com.spice.profitmandi.dao.entity.user.*;
30421 tejbeer 39
import com.spice.profitmandi.dao.enumuration.auth.CollectionRemark;
24250 amit.gupta 40
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
25598 amit.gupta 41
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 42
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
29814 tejbeer 43
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
24242 amit.gupta 44
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
30913 tejbeer 45
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
30859 tejbeer 46
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
25609 amit.gupta 47
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
30390 amit.gupta 48
import com.spice.profitmandi.dao.model.PartnerDetailModel;
25300 tejbeer 49
import com.spice.profitmandi.dao.model.SimpleCampaign;
50
import com.spice.profitmandi.dao.model.SimpleCampaignParams;
25590 amit.gupta 51
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
30421 tejbeer 52
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
30119 amit.gupta 53
import com.spice.profitmandi.dao.repository.catalog.*;
54
import com.spice.profitmandi.dao.repository.cs.*;
55
import com.spice.profitmandi.dao.repository.dtr.*;
56
import com.spice.profitmandi.dao.repository.fofo.*;
30390 amit.gupta 57
import com.spice.profitmandi.dao.repository.inventory.ReporticoCacheTableRepository;
28990 amit.gupta 58
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
28775 amit.gupta 59
import com.spice.profitmandi.dao.repository.inventory.WarehouseRepository;
30119 amit.gupta 60
import com.spice.profitmandi.dao.repository.transaction.*;
24542 amit.gupta 61
import com.spice.profitmandi.dao.repository.user.AddressRepository;
25721 tejbeer 62
import com.spice.profitmandi.dao.repository.user.UserRepository;
25854 amit.gupta 63
import com.spice.profitmandi.service.NotificationService;
24337 amit.gupta 64
import com.spice.profitmandi.service.PartnerInvestmentService;
30390 amit.gupta 65
import com.spice.profitmandi.service.PartnerStatsService;
28368 tejbeer 66
import com.spice.profitmandi.service.integrations.RazorpayPaymentService;
30858 amit.gupta 67
import com.spice.profitmandi.service.integrations.bharti.model.BAGInsuranceModel;
25694 amit.gupta 68
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
23929 amit.gupta 69
import com.spice.profitmandi.service.inventory.InventoryService;
27208 tejbeer 70
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
25335 amit.gupta 71
import com.spice.profitmandi.service.order.OrderService;
24431 amit.gupta 72
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 73
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
74
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
75
import com.spice.profitmandi.service.scheme.SchemeService;
29668 tejbeer 76
import com.spice.profitmandi.service.serviceConfig.ServiceConfigService;
30859 tejbeer 77
import com.spice.profitmandi.service.transaction.SDCreditService;
23929 amit.gupta 78
import com.spice.profitmandi.service.transaction.TransactionService;
79
import com.spice.profitmandi.service.user.RetailerService;
23739 amit.gupta 80
import com.spice.profitmandi.service.wallet.WalletService;
25721 tejbeer 81
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 82
import in.shop2020.model.v1.order.WalletReferenceType;
83
import okhttp3.OkHttpClient;
84
import okhttp3.Request;
30119 amit.gupta 85
import okhttp3.Response;
86
import org.apache.commons.io.output.ByteArrayOutputStream;
87
import org.apache.commons.lang.StringUtils;
88
import org.apache.http.client.methods.CloseableHttpResponse;
89
import org.apache.http.client.methods.HttpPost;
90
import org.apache.http.entity.StringEntity;
91
import org.apache.http.impl.client.CloseableHttpClient;
92
import org.apache.http.impl.client.HttpClients;
93
import org.apache.logging.log4j.LogManager;
94
import org.apache.logging.log4j.Logger;
95
import org.json.JSONArray;
96
import org.json.JSONObject;
97
import org.springframework.beans.factory.annotation.Autowired;
98
import org.springframework.beans.factory.annotation.Qualifier;
99
import org.springframework.beans.factory.annotation.Value;
100
import org.springframework.core.io.ByteArrayResource;
101
import org.springframework.core.io.InputStreamSource;
102
import org.springframework.mail.javamail.JavaMailSender;
103
import org.springframework.mail.javamail.MimeMessageHelper;
104
import org.springframework.stereotype.Component;
105
import org.springframework.transaction.annotation.Transactional;
23739 amit.gupta 106
 
30119 amit.gupta 107
import javax.mail.MessagingException;
108
import javax.mail.internet.InternetAddress;
109
import javax.mail.internet.MimeMessage;
30574 amit.gupta 110
import java.io.*;
30859 tejbeer 111
import java.math.BigDecimal;
30119 amit.gupta 112
import java.nio.file.Files;
113
import java.nio.file.Paths;
114
import java.sql.Timestamp;
30936 tejbeer 115
import java.text.DecimalFormat;
30119 amit.gupta 116
import java.time.*;
117
import java.time.format.DateTimeFormatter;
118
import java.time.temporal.ChronoField;
119
import java.time.temporal.ChronoUnit;
120
import java.util.*;
121
import java.util.Map.Entry;
122
import java.util.stream.Collectors;
123
 
23723 amit.gupta 124
@Component
23724 amit.gupta 125
@Transactional(rollbackFor = Throwable.class)
23723 amit.gupta 126
public class ScheduledTasks {
127
 
23724 amit.gupta 128
	@Value("${oxigen.recharge.transaction.url}")
129
	private String oxigenRechargeTransactionUrl;
23723 amit.gupta 130
 
23724 amit.gupta 131
	@Value("${oxigen.recharge.enquiry.url}")
132
	private String oxigenRechargeEnquiryUrl;
24533 govind 133
 
24431 amit.gupta 134
	@Autowired
27088 tejbeer 135
	private RegionRepository regionRepository;
29668 tejbeer 136
 
29488 manish 137
	@Autowired
29801 manish 138
	private ServiceConfigService serviceConfigService;
139
 
140
	@Autowired
29488 manish 141
	private TecnoImeiActivation tecnoImeiActivation;
28205 tejbeer 142
 
27795 amit.gupta 143
	private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 144
 
145
	@Autowired
146
	private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 147
 
28769 amit.gupta 148
	@Autowired
149
	private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 150
 
151
	@Autowired
29451 manish 152
	VivoImeiActivationService vivoImeiActivationService;
29488 manish 153
 
29451 manish 154
	@Autowired
29488 manish 155
	ItelImeiActivationService itelImeiActivationService;
156
 
157
	@Autowired
25503 amit.gupta 158
	private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 159
 
25590 amit.gupta 160
	@Autowired
26408 amit.gupta 161
	private ActivatedImeiRepository activatedImeiRepository;
162
 
163
	@Autowired
29451 manish 164
	private LineItemRepository lineItemRepository;
165
 
166
	@Autowired
25910 amit.gupta 167
	private LeadRepository leadRepository;
25927 amit.gupta 168
 
25910 amit.gupta 169
	@Autowired
25590 amit.gupta 170
	private AuthRepository authRepository;
25503 amit.gupta 171
 
172
	@Autowired
24431 amit.gupta 173
	private PriceDropService priceDropService;
26283 tejbeer 174
 
25590 amit.gupta 175
	@Autowired
25927 amit.gupta 176
	private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 177
 
25927 amit.gupta 178
	@Autowired
179
	private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 180
 
25927 amit.gupta 181
	@Autowired
25982 amit.gupta 182
	private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 183
 
25982 amit.gupta 184
	@Autowired
25590 amit.gupta 185
	private CsService csService;
25846 amit.gupta 186
 
25837 amit.gupta 187
	@Autowired
27208 tejbeer 188
	private SaholicInventoryService saholicInventoryService;
189
 
190
	@Autowired
25837 amit.gupta 191
	private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 192
 
25694 amit.gupta 193
	@Autowired
194
	private ToffeeService toffeeService;
195
 
23724 amit.gupta 196
	@Value("${oxigen.recharge.auth.key}")
197
	private String oxigenRechargeAuthKey;
198
 
199
	@Value("${oxigen.recharge.validation.url}")
200
	private String oxigenRechargeValidationUrl;
201
 
202
	@Value("${oxigen.recharge.validation.auth.key}")
203
	private String oxigenRechargeValidationAuthKey;
204
 
205
	@Value("${think.walnut.digital.recharge.transaction.mobile.url}")
206
	private String thinkWalnutDigitalRechargeTransactionMobileUrl;
207
 
208
	@Value("${think.walnut.digital.recharge.transaction.dth.url}")
209
	private String thinkWalnutDigitalRechargeTransactionDthUrl;
210
 
211
	@Value("${think.walnut.digital.recharge.enquiry.url}")
212
	private String thinkWalnutDigitalRechargeEnquiryUrl;
213
 
214
	@Value("${think.walnut.digital.recharge.balance.url}")
215
	private String thinkWalnutDigitalRechargeBalanceUrl;
216
 
217
	@Value("${think.walnut.digital.recharge.username}")
218
	private String thinkWalnutDigitalRechargeUserName;
219
 
220
	@Value("${think.walnut.digital.recharge.password}")
221
	private String thinkWalnutDigitalRechargePassword;
222
 
223
	@Value("${think.walnut.digital.recharge.auth.key}")
224
	private String thinkWalnutDigitalRechargeAuthKey;
225
 
23723 amit.gupta 226
	@Autowired
23724 amit.gupta 227
	private PurchaseRepository purchaseRepository;
228
 
229
	@Autowired
25609 amit.gupta 230
	private PriceDropIMEIRepository priceDropIMEIRepository;
231
 
232
	@Autowired
233
	PriceDropRepository priceDropRepository;
234
 
235
	@Autowired
27086 tejbeer 236
	private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 237
 
27086 tejbeer 238
	@Autowired
23724 amit.gupta 239
	private SchemeService schemeService;
24683 amit.gupta 240
 
29668 tejbeer 241
	@Autowired
242
	private ServiceConfigRepository serviceConfigRepository;
243
 
29308 tejbeer 244
	@Value("${delhivery.tracking.token}")
245
	private String token;
246
 
30752 tejbeer 247
	private static final String[] STOCK_AGEING_MAIL_LIST = new String[] { "uday.singh@smartudkaan.com",
29160 amit.gupta 248
			"mohinder.mutreja@smartdukaan.com", "ankit.bhatia@smartdukaan.com", "tarun.verma@smartdukaan.com",
30752 tejbeer 249
			"kuldeep.kumar@smartdukaan.com", "manish.gupta@smartdukaan.com" };
25609 amit.gupta 250
 
30752 tejbeer 251
	private static final String[] ITEMWISE_PENDING_INDENT_MAIL_LIST = new String[] { "kamini.sharma@smartdukaan.com",
28205 tejbeer 252
			"tarun.verma@smartdukaan.com", "uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com",
30752 tejbeer 253
			"niranjan.kala@smartdukaan.com" };
25609 amit.gupta 254
 
30752 tejbeer 255
	private static final String[] INDENT_TERTIARY_MAIL_LIST = new String[] { "uday.singh@smartdukaan.com",
256
			"kuldeep.kumar@smartdukaan.com" };
28709 amit.gupta 257
 
30752 tejbeer 258
	private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[] { "sm@smartdukaan.com",
259
			"sm@smartdukaan.com" };
28790 amit.gupta 260
 
25721 tejbeer 261
	private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
262
 
24681 amit.gupta 263
	@Autowired
264
	private ReporticoService reporticoService;
23724 amit.gupta 265
 
266
	@Autowired
24337 amit.gupta 267
	private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 268
 
25590 amit.gupta 269
	@Autowired
270
	private PositionRepository positionRepository;
24337 amit.gupta 271
 
272
	@Autowired
24542 amit.gupta 273
	private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 274
 
25854 amit.gupta 275
	@Autowired
276
	private NotificationService notificationService;
24542 amit.gupta 277
 
278
	@Autowired
24277 amit.gupta 279
	private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
280
 
281
	@Autowired
24241 amit.gupta 282
	private SchemeInOutRepository schemeInOutRepository;
283
 
284
	@Autowired
23724 amit.gupta 285
	private RechargeTransactionRepository rechargeTransactionRepository;
286
 
287
	@Autowired
24542 amit.gupta 288
	private CustomerAddressRepository customerAddressRepository;
289
 
290
	@Autowired
23724 amit.gupta 291
	private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
292
 
293
	@Autowired
24590 amit.gupta 294
	private FofoLineItemRepository fofoLineItemRepository;
295
 
296
	@Autowired
23724 amit.gupta 297
	private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 298
 
24580 amit.gupta 299
	@Autowired
300
	private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 301
 
24249 amit.gupta 302
	@Autowired
24587 amit.gupta 303
	private UserWalletRepository userWalletRepository;
304
 
305
	@Autowired
24249 amit.gupta 306
	private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 307
 
23739 amit.gupta 308
	@Autowired
309
	private WalletService walletService;
23724 amit.gupta 310
 
311
	@Autowired
312
	private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
313
 
314
	@Autowired
315
	private OxigenRechargeProviderService oxigenRechargeProviderService;
316
 
317
	@Autowired
318
	private RechargeProviderRepository rechargeProviderRepository;
319
 
320
	@Autowired
24242 amit.gupta 321
	private ScanRecordRepository scanRecordRepository;
322
 
323
	@Autowired
23724 amit.gupta 324
	private DailyRechargeRepository dailyRechargeRepository;
325
 
23929 amit.gupta 326
	@Autowired
327
	private FofoStoreRepository fofoStoreRepository;
24177 govind 328
 
23724 amit.gupta 329
	@Value("${prod}")
330
	private boolean prod;
26945 amit.gupta 331
 
26929 amit.gupta 332
	@Autowired
333
	private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 334
 
23929 amit.gupta 335
	@Autowired
336
	private RetailerService retailerService;
337
 
338
	@Autowired
339
	private TransactionService transactionService;
24250 amit.gupta 340
 
24249 amit.gupta 341
	@Autowired
342
	private ItemRepository itemRepository;
23929 amit.gupta 343
 
344
	@Autowired
345
	private OrderRepository orderRepository;
25351 tejbeer 346
 
25335 amit.gupta 347
	@Autowired
348
	private OrderService orderService;
23929 amit.gupta 349
 
350
	@Autowired
24241 amit.gupta 351
	private SchemeRepository schemeRepository;
352
 
353
	@Autowired
23929 amit.gupta 354
	private JavaMailSender mailSender;
24177 govind 355
 
24174 govind 356
	@Autowired
357
	private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 358
 
359
	@Autowired
360
	@Qualifier(value = "googleMailSender")
23932 amit.gupta 361
	private JavaMailSender googleMailSender;
23929 amit.gupta 362
 
363
	@Autowired
364
	private InventoryService inventoryService;
365
 
24533 govind 366
	@Autowired
24542 amit.gupta 367
	private AddressRepository addressRepository;
368
 
369
	@Autowired
370
	private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
371
 
24653 govind 372
	@Autowired
373
	private Mongo mongoClient;
24683 amit.gupta 374
 
24669 govind 375
	@Autowired
25300 tejbeer 376
	private DeviceRepository deviceRepository;
377
 
378
	@Autowired
379
	private PushNotificationRepository pushNotificationRepository;
380
 
381
	@Autowired
382
	private NotificationCampaignRepository notificationCampaignRepository;
383
 
384
	@Autowired
25721 tejbeer 385
	private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
386
 
387
	@Autowired
388
	private FocusedModelRepository focusedModelRepository;
389
 
390
	@Autowired
24669 govind 391
	private UserAccountRepository userAccountRepository;
24653 govind 392
 
25721 tejbeer 393
	@Autowired
25927 amit.gupta 394
	private UserRepository userUserRepository;
25721 tejbeer 395
 
396
	@Autowired
25927 amit.gupta 397
	private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
398
 
399
	@Autowired
25721 tejbeer 400
	private UserCampaignRepository userCampaignRepository;
401
 
402
	@Autowired
403
	private Gson gson;
404
 
26283 tejbeer 405
	@Autowired
406
	private TicketRepository ticketRepository;
407
 
26790 tejbeer 408
	@Autowired
409
	private RefferalRepository refferalRepository;
410
 
28205 tejbeer 411
	@Autowired
412
	private PartnerProblemRepository partnerProblemRepository;
413
 
28368 tejbeer 414
	@Autowired
415
	private PendingOrderRepository pendingOrderRepository;
416
 
417
	@Autowired
418
	private PendingOrderItemRepository pendingOrderItemRepository;
419
 
420
	@Value("${razorpay.account.keyId}")
421
	private String keyId;
422
 
423
	@Value("${razorpay.account.keySecret}")
424
	private String keySecret;
425
 
28369 tejbeer 426
	@Autowired
427
	private RazorpayPaymentService razorPaymentService;
428
 
429
	@Autowired
430
	private RazorPayRepository razorPayRepository;
431
 
28377 tejbeer 432
	@Autowired
433
	private PendingOrderService pendingOrderService;
434
 
435
	@Autowired
436
	private CustomerRepository customerRepository;
437
 
29308 tejbeer 438
	@Autowired
439
	private RestClient restClient;
440
 
29814 tejbeer 441
	@Autowired
442
	private MandiiService mandiiService;
443
 
444
	@Autowired
445
	CreditAccountRepository creditAccountRepository;
23755 amit.gupta 446
	private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
23724 amit.gupta 447
 
25300 tejbeer 448
	private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
449
	private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
450
 
23724 amit.gupta 451
	public void generateDailyRecharge() {
452
		List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository
453
				.selectAll(0, 2000);
454
		List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
455
		rechargeProviders.stream().forEach(x -> x.setAmount(0));
456
 
457
		rechargeProviders.stream().forEach(x -> {
458
			Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory
459
					.stream().filter(z -> z.getProviderId() == x.getId())
460
					.collect(Collectors.groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
461
 
29252 amit.gupta 462
			LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
23724 amit.gupta 463
			LocalDate endDate = LocalDate.now().plusDays(1);
464
			float previousDayClosing = 0;
465
			LocalDate date = LocalDate.of(2018, 4, 6);
466
			while (date.isBefore(endDate)) {
467
				List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository
468
						.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(),
469
								date.plusDays(1).atStartOfDay());
470
 
471
				List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream()
472
						.filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
473
 
474
				float dailyAmount = 0;
475
				float totalCommission = 0;
476
				for (RechargeTransaction rechargeTransaction : successfulTransactions) {
477
					if (rechargeTransaction.getProviderId() == x.getId()) {
478
						dailyAmount += rechargeTransaction.getAmount();
479
						totalCommission += rechargeTransaction.getCommission();
480
					}
481
				}
482
 
483
				List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
484
				float dailyWalletRecharge = 0;
485
				if (rechargeHistoryList != null) {
486
					for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
487
						if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
488
							dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
489
						}
490
					}
491
				}
492
				if (dailyAmount > 0 || dailyWalletRecharge > 0) {
493
					DailyRecharge dailyRecharge = null;
494
					try {
495
						dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
496
					} catch (Exception e) {
497
						LOGGER.info("Could not find Recharge entry");
498
					}
499
					if (dailyRecharge == null) {
500
						dailyRecharge = new DailyRecharge();
501
						dailyRecharge.setCreateDate(date);
502
					}
503
					dailyRecharge.setOpeningBalance(previousDayClosing);
504
					dailyRecharge.setProviderId(x.getId());
505
					dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
506
					dailyRecharge.setTotalAmount(dailyAmount);
507
					dailyRecharge.setTotalCommission(totalCommission);
508
					float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
509
					dailyRecharge.setClosingBalance(closingBalance);
510
					dailyRechargeRepository.persist(dailyRecharge);
511
					x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
512
					previousDayClosing = dailyRecharge.getClosingBalance();
513
				}
514
				date = date.plusDays(1);
515
			}
516
			rechargeProviderRepository.persist(x);
517
		});
23761 amit.gupta 518
		LOGGER.info("finished generating daily recharge");
23724 amit.gupta 519
	}
520
 
23738 amit.gupta 521
	public void reconcileRecharge() throws Exception {
23724 amit.gupta 522
		LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
523
		LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
524
		List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
525
		LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
526
		nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
527
		nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
528
		RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
529
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
530
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
531
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
532
		thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
533
		Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
534
		List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository
535
				.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
536
		for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
537
			try {
538
				int providerId = rechargeTransaction.getProviderId();
539
				if (providerId == 1) {
540
					oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey,
541
							rechargeTransaction);
542
				} else if (providerId == 2) {
543
					thinkWalnutDigitalRechargeProviderService
544
							.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
545
				}
546
				if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS)
547
						|| rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
548
					requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(),
549
							rechargeTransaction.getStatus());
550
				}
551
			} catch (Exception e) {
552
				LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
553
			}
554
		}
23738 amit.gupta 555
		LOGGER.info("Reconcile recharge ran successfully");
23724 amit.gupta 556
	}
28205 tejbeer 557
 
27438 amit.gupta 558
	public void processActivation() throws Exception {
559
		schemeService.processActivation();
560
	}
24240 amit.gupta 561
 
562
	// TemporaryMethod
24237 amit.gupta 563
	public void migrateInvoice() {
564
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
565
		Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
24241 amit.gupta 566
		partnerOrdersMap = fofoOrders.stream()
567
				.collect(Collectors.groupingBy(FofoOrder::getFofoId, Collectors.toList()));
24237 amit.gupta 568
		for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
24240 amit.gupta 569
			int sequence = 0;
570
			String prefix = "";
24241 amit.gupta 571
			List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId())
572
					.collect(Collectors.toList());
573
			for (FofoOrder order : sortedList) {
574
 
24240 amit.gupta 575
				LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
24241 amit.gupta 576
				if (!order.getInvoiceNumber().contains("SEC")) {
24240 amit.gupta 577
					sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
578
					prefix = order.getInvoiceNumber().split("/")[0];
579
				} else {
580
					sequence += 1;
24241 amit.gupta 581
					String invoiceNumber = prefix + "/" + sequence;
24240 amit.gupta 582
					order.setInvoiceNumber(invoiceNumber);
583
					fofoOrderRepository.persist(order);
584
				}
585
			}
24241 amit.gupta 586
 
24237 amit.gupta 587
		}
588
	}
23724 amit.gupta 589
 
30393 amit.gupta 590
	@Autowired
591
	private ReporticoCacheTableRepository reporticoCacheTableRepository;
24252 amit.gupta 592
 
25584 amit.gupta 593
	public void processScheme(int offset, boolean dryRun) throws Exception {
24462 amit.gupta 594
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24259 amit.gupta 595
		LocalDateTime endDate = startDate.plusDays(30);
25584 amit.gupta 596
		processScheme(startDate, endDate, dryRun);
24256 amit.gupta 597
	}
28205 tejbeer 598
 
27892 amit.gupta 599
	public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
28205 tejbeer 600
		for (String invoiceNumber : invoiceNumbers) {
601
			System.out.println("Invoice Number - " + invoiceNumber);
27892 amit.gupta 602
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
603
			schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
604
		}
605
	}
28205 tejbeer 606
 
27987 amit.gupta 607
	public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
28205 tejbeer 608
		for (String invoiceNumber : invoiceNumbers) {
609
			System.out.println("Invoice Number - " + invoiceNumber);
27987 amit.gupta 610
			Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
611
			schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
612
		}
613
	}
24533 govind 614
 
25584 amit.gupta 615
	public void processScheme(int offset, int durationDays, boolean dryRun) throws Exception {
24462 amit.gupta 616
		LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
24461 amit.gupta 617
		LocalDateTime endDate = startDate.plusDays(durationDays);
25584 amit.gupta 618
		processScheme(startDate, endDate, dryRun);
24461 amit.gupta 619
	}
24271 amit.gupta 620
 
25584 amit.gupta 621
	public void processScheme(boolean dryRun) throws Exception {
24256 amit.gupta 622
		LocalDateTime fromDate = LocalDateTime.now().minusDays(30);
25584 amit.gupta 623
		processScheme(fromDate, LocalDateTime.now(), dryRun);
24256 amit.gupta 624
	}
24271 amit.gupta 625
 
25584 amit.gupta 626
	public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
23724 amit.gupta 627
		LOGGER.info("Started execution at {}", LocalDateTime.now());
25312 amit.gupta 628
		System.out.println(
629
				"InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
24561 amit.gupta 630
		try {
24587 amit.gupta 631
			List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
632
			for (Purchase purchase : purchases) {
633
				schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
634
			}
24271 amit.gupta 635
 
24587 amit.gupta 636
			List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
637
			for (FofoOrder fofoOrder : fofoOrders) {
638
				schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
639
			}
640
		} catch (Exception e) {
24561 amit.gupta 641
			e.printStackTrace();
24565 amit.gupta 642
			throw e;
24561 amit.gupta 643
		}
28205 tejbeer 644
		List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(),
645
				endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
25043 amit.gupta 646
		System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
25312 amit.gupta 647
		for (UserWalletHistory uwh : uwhs) {
648
			System.out.println(String.format("%d\t%d\t%s\t%s\t%s", uwh.getAmount(), uwh.getReference(),
649
					uwh.getReferenceType(), uwh.getTimestamp().toString(), uwh.getDescription()));
25043 amit.gupta 650
		}
30644 amit.gupta 651
		LOGGER.info("Schemes processed successfully.");
25598 amit.gupta 652
		if (dryRun) {
25584 amit.gupta 653
			throw new Exception();
654
		}
23724 amit.gupta 655
	}
23929 amit.gupta 656
 
23739 amit.gupta 657
	public void processRechargeCashback() throws Throwable {
23761 amit.gupta 658
		LocalDateTime cashbackTime = LocalDateTime.now();
23929 amit.gupta 659
		int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
660
		List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository
661
				.getPendingCashBackRehargeTransactions();
662
		Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
663
				Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
664
		for (Map.Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
665
			int retailerId = (Integer) totalRetailerCashback.getKey();
23739 amit.gupta 666
			float amount = totalRetailerCashback.getValue().floatValue();
23929 amit.gupta 667
			if (Math.round(amount) > 0) {
668
				walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK,
26565 amit.gupta 669
						"Recharge Cashback", Math.round(amount), LocalDateTime.now());
23762 amit.gupta 670
			}
23739 amit.gupta 671
		}
23929 amit.gupta 672
		for (RechargeTransaction rt : pendingTransactions) {
23761 amit.gupta 673
			rt.setCashbackTimestamp(cashbackTime);
674
			rt.setCashbackReference(referenceId);
675
			rechargeTransactionRepository.persist(rt);
676
		}
23739 amit.gupta 677
		LOGGER.info("Cashbacks for Recharge processed Successfully");
678
	}
29160 amit.gupta 679
 
680
	public void rollOutUpgardedMarginsNextMonth() throws Exception {
29107 amit.gupta 681
		LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
29160 amit.gupta 682
 
28971 amit.gupta 683
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
29160 amit.gupta 684
		for (FofoStore store : stores) {
685
			int fofoId = store.getId();
686
 
30752 tejbeer 687
			PartnerType startOfPreviousMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId,
688
					startOfPreviousMonth);
29160 amit.gupta 689
			PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId,
690
					YearMonth.from(startOfPreviousMonth.atStartOfDay()));
30119 amit.gupta 691
			if (!startOfPreviousMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
29160 amit.gupta 692
				continue;
693
			}
30119 amit.gupta 694
			if (!startOfPreviousMonthPartnerType.equals(todayPartnerType)) {
29160 amit.gupta 695
				LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(),
30119 amit.gupta 696
						startOfPreviousMonthPartnerType, todayPartnerType);
29160 amit.gupta 697
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId,
698
						startOfPreviousMonth.atStartOfDay(), startOfPreviousMonth.plusMonths(1).atStartOfDay(), 0, 0);
699
				for (FofoOrder fofoOrder : fofoOrders) {
700
					schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
28974 amit.gupta 701
				}
29160 amit.gupta 702
 
703
			}
28971 amit.gupta 704
		}
705
	}
29252 amit.gupta 706
 
29160 amit.gupta 707
	public void rollOutUpgardedMargins() throws Exception {
708
		LocalDate today = LocalDate.now();
709
		LocalDate yesterday = today.minusDays(1);
710
		int upgradedCount = 0;
711
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
712
		StringBuilder sb = new StringBuilder();
713
		for (FofoStore store : stores) {
714
			int fofoId = store.getId();
29252 amit.gupta 715
 
30215 amit.gupta 716
			PartnerType yesterdayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, yesterday);
717
			PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, today);
29160 amit.gupta 718
			if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
719
				continue;
720
			}
721
			if (!yesterdayPartnerType.equals(todayPartnerType)) {
722
				upgradedCount++;
29252 amit.gupta 723
				sb.append(String.format("Partner Type has been changed for code %s from %s to %s", store.getCode(),
724
						yesterdayPartnerType.toString(), todayPartnerType.toString()));
29160 amit.gupta 725
				sb.append("<br>");
726
				LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(),
727
						yesterdayPartnerType, todayPartnerType);
728
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId,
729
						yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
730
				for (FofoOrder fofoOrder : fofoOrders) {
731
					schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
732
				}
29252 amit.gupta 733
 
29160 amit.gupta 734
			}
735
		}
29252 amit.gupta 736
		if (upgradedCount > 0) {
737
			sendMailHtmlFormat(
30752 tejbeer 738
					new String[] { "amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com",
739
							"neeraj.gupta@smartdukaan.com" },
29252 amit.gupta 740
					sb.toString(), null, "Few Partners Category have been Upgraded");
29160 amit.gupta 741
		} else {
29252 amit.gupta 742
			sendMailHtmlFormat(
30752 tejbeer 743
					new String[] { "amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com",
744
							"neeraj.gupta@smartdukaan.com" },
29252 amit.gupta 745
					sb.toString(), null, "No partners Category have been upgraded today");
29160 amit.gupta 746
		}
747
	}
23724 amit.gupta 748
 
30390 amit.gupta 749
	@Autowired
750
	private PartnerStatsService partnerStatsService;
751
 
30393 amit.gupta 752
	// Temporary Method
753
	public void evaluateExcessSchemeOut() throws Exception {
754
		Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
755
		Map<Integer, Float> userAmountMap = new HashMap<>();
756
 
757
		List<List<?>> rows = new ArrayList<>();
758
		List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number",
759
				"Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
760
		schemeRepository.selectAll().stream().forEach(x -> {
761
			if (x.getType().equals(SchemeType.OUT)) {
762
				List<SchemeInOut> sioList = schemeInOutRepository
763
						.selectBySchemeIds(new HashSet<>(Arrays.asList(x.getId())));
764
				if (x.getActiveTimestamp() != null) {
765
					LocalDateTime endDateTime = x.getEndDateTime();
766
					if (x.getExpireTimestamp() != null && x.getExpireTimestamp().isBefore(x.getEndDateTime())) {
767
						endDateTime = x.getExpireTimestamp();
768
					}
769
					for (SchemeInOut sio : sioList) {
770
						InventoryItem inventoryItem = null;
771
						inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
772
						FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
773
								inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
774
						Optional<ScanRecord> record = scanRecordRepository
775
								.selectByInventoryItemId(sio.getInventoryItemId()).stream()
776
								.filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
777
						if (record.isPresent()) {
778
							int fofoId = record.get().getFofoId();
779
							if (record.get().getCreateTimestamp().isAfter(endDateTime)
780
									|| record.get().getCreateTimestamp().isBefore(x.getStartDateTime())) {
781
								if (!userAmountMap.containsKey(fofoId)) {
782
									userAmountMap.put(fofoId, 0f);
783
								}
784
								userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
785
								try {
786
									rows.add(Arrays.asList(x.getDescription(),
787
											itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(),
788
											userNameMap.get(fofoId), sio.getAmount(),
789
											FormattingUtils.formatDate(sio.getCreateTimestamp()),
790
											fofoOrder.getInvoiceNumber(),
791
											FormattingUtils.formatDate(record.get().getCreateTimestamp()),
792
											FormattingUtils.formatDate(x.getStartDateTime()),
793
											FormattingUtils.formatDate(x.getEndDateTime()),
794
											FormattingUtils.formatDate(x.getActiveTimestamp()),
795
											FormattingUtils.formatDate(x.getExpireTimestamp())));
796
								} catch (Exception e) {
797
									e.printStackTrace();
798
								}
799
							}
800
						}
801
					}
802
				}
803
			}
804
		});
805
		userAmountMap.entrySet().stream()
806
				.forEach(x -> LOGGER.info("{} to be deducted from {}({}) for wrongly disbursed due to technical error.",
807
						x.getValue(), userNameMap.get(x.getKey())));
808
 
809
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
810
		Utils.sendMailWithAttachment(googleMailSender,
30752 tejbeer 811
				new String[] { "amit.gupta@shop2020.in", "adeel.yazdani@smartdukaan.com" }, null,
30393 amit.gupta 812
				"Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
813
 
814
	}
815
 
30390 amit.gupta 816
	public void fetchParnterStats() throws Exception {
817
		Map<Integer, PartnerDetailModel> partnerStats = partnerStatsService.getAllPartnerStats();
818
		ObjectOutputStream oos = null;
819
		FileOutputStream fout = null;
820
		try {
821
			fout = new FileOutputStream("/tmp/partnerStat.tmp", false);
822
			oos = new ObjectOutputStream(fout);
823
			oos.writeObject(partnerStats);
824
 
825
		} catch (Exception ex) {
826
			ex.printStackTrace();
827
		} finally {
828
			if (oos != null) {
829
				oos.close();
830
			}
831
		}
832
		ReporticoCacheTable rct = reporticoCacheTableRepository.selectByTableName("partnerStat");
833
		if (rct == null) {
834
			rct = new ReporticoCacheTable();
835
			rct.setTableName("partnerStat");
30393 amit.gupta 836
			rct.setLastCreatedTimestamp(LocalDateTime.now());
837
			reporticoCacheTableRepository.persist(rct);
838
		} else {
839
			rct.setLastCreatedTimestamp(LocalDateTime.now());
30390 amit.gupta 840
		}
841
	}
842
 
30637 amit.gupta 843
	public void processPriceDrop() throws Exception {
30752 tejbeer 844
		List<PriceDrop> priceDrops = priceDropRepository.selectAllByDatesBetween(LocalDateTime.now(),
845
				LocalDateTime.now().minusYears(1));
30637 amit.gupta 846
		for (PriceDrop priceDrop : priceDrops) {
847
			if (priceDrop.getDropAmount() > 0) {
848
				priceDropService.processPriceDrop(priceDrop.getId(), true);
849
			}
850
		}
851
	}
852
 
25598 amit.gupta 853
	private class SaleRoles {
854
 
855
		private List<String> l1;
856
		private List<String> l2;
857
 
858
		public SaleRoles() {
859
			l1 = new ArrayList<>();
860
			l2 = new ArrayList<>();
861
		}
862
 
863
		public List<String> getL1() {
864
			return l1;
865
		}
866
 
867
		public List<String> getL2() {
868
			return l2;
869
		}
870
 
871
	}
872
 
26945 amit.gupta 873
	private class FofoReportingModel {
874
		private String code;
875
		private int fofoId;
876
		private String businessName;
877
		private String territoryManager;
878
		private String regionalManager;
879
 
880
		@Override
881
		public String toString() {
882
			return "FofoReportingModel [code=" + code + ", fofoId=" + fofoId + ", businessName=" + businessName
883
					+ ", territoryManager=" + territoryManager + ", regionalManager=" + regionalManager + "]";
884
		}
885
 
886
		public String getCode() {
887
			return code;
888
		}
889
 
890
		public void setCode(String code) {
891
			this.code = code;
892
		}
893
 
894
		public String getBusinessName() {
895
			return businessName;
896
		}
897
 
898
		public void setBusinessName(String businessName) {
899
			this.businessName = businessName;
900
		}
901
 
902
		public String getTerritoryManager() {
903
			return territoryManager;
904
		}
905
 
906
		public void setTerritoryManager(String territoryManager) {
907
			this.territoryManager = territoryManager;
908
		}
909
 
910
		public String getRegionalManager() {
911
			return regionalManager;
912
		}
913
 
914
		public void setRegionalManager(String regionalManager) {
915
			this.regionalManager = regionalManager;
916
		}
917
 
918
		private ScheduledTasks getOuterType() {
919
			return ScheduledTasks.this;
920
		}
921
 
922
		@Override
923
		public int hashCode() {
924
			final int prime = 31;
925
			int result = 1;
926
			result = prime * result + getOuterType().hashCode();
927
			result = prime * result + ((businessName == null) ? 0 : businessName.hashCode());
928
			result = prime * result + ((code == null) ? 0 : code.hashCode());
929
			result = prime * result + fofoId;
930
			result = prime * result + ((regionalManager == null) ? 0 : regionalManager.hashCode());
931
			result = prime * result + ((territoryManager == null) ? 0 : territoryManager.hashCode());
932
			return result;
933
		}
934
 
935
		@Override
936
		public boolean equals(Object obj) {
937
			if (this == obj)
938
				return true;
939
			if (obj == null)
940
				return false;
941
			if (getClass() != obj.getClass())
942
				return false;
943
			FofoReportingModel other = (FofoReportingModel) obj;
944
			if (!getOuterType().equals(other.getOuterType()))
945
				return false;
946
			if (businessName == null) {
947
				if (other.businessName != null)
948
					return false;
949
			} else if (!businessName.equals(other.businessName))
950
				return false;
951
			if (code == null) {
952
				if (other.code != null)
953
					return false;
954
			} else if (!code.equals(other.code))
955
				return false;
956
			if (fofoId != other.fofoId)
957
				return false;
958
			if (regionalManager == null) {
959
				if (other.regionalManager != null)
960
					return false;
961
			} else if (!regionalManager.equals(other.regionalManager))
962
				return false;
963
			if (territoryManager == null) {
964
				if (other.territoryManager != null)
965
					return false;
966
			} else if (!territoryManager.equals(other.territoryManager))
967
				return false;
968
			return true;
969
		}
970
 
971
		public int getFofoId() {
972
			return fofoId;
973
		}
974
 
975
		public void setFofoId(int fofoId) {
976
			this.fofoId = fofoId;
977
		}
978
 
979
	}
980
 
24271 amit.gupta 981
	public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
24277 amit.gupta 982
		LocalDate yesterDay = LocalDate.now().minusDays(1);
25267 amit.gupta 983
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
23929 amit.gupta 984
		Map<Integer, CustomRetailer> customRetailerMap = retailerService
985
				.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25351 tejbeer 986
 
26957 amit.gupta 987
		List<String> headers = Arrays.asList("Code", "Outlet name", "State Manager", "Teritory/Team Lead",
26945 amit.gupta 988
				"Wallet Amount", "In Stock Amount", "Activated Stock", "Return In Transit Stock", "Unbilled Amount",
989
				"Grn Pending Amount", "Min Investment", "Investment Amount", "Investment Short", "Unbilled Qty",
990
				"Short Days");
25837 amit.gupta 991
		List<List<?>> rows = new ArrayList<>();
25895 amit.gupta 992
		Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 993
 
26945 amit.gupta 994
		Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25598 amit.gupta 995
 
26945 amit.gupta 996
		Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository
997
				.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(Collectors.groupingBy(
998
						x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
999
 
24002 amit.gupta 1000
		for (FofoStore fofoStore : fofoStores) {
27750 amit.gupta 1001
			LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
26376 amit.gupta 1002
			int fofoId = fofoStore.getId();
26945 amit.gupta 1003
			PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
25598 amit.gupta 1004
			partnerDailyInvestment.setDate(yesterDay);
26945 amit.gupta 1005
 
25598 amit.gupta 1006
			try {
1007
				partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
26945 amit.gupta 1008
				shortDaysMap.put(fofoId,
1009
						shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
25598 amit.gupta 1010
			} catch (Exception e) {
1011
				// ignore the exceptions during persist
1012
			}
1013
 
24002 amit.gupta 1014
			CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
25837 amit.gupta 1015
			if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
24002 amit.gupta 1016
				LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1017
				continue;
1018
			}
26945 amit.gupta 1019
			FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1020
			List<Serializable> row = new ArrayList<>();
1021
			row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(),
1022
					reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
25927 amit.gupta 1023
			row.addAll(
1024
					Arrays.asList(partnerDailyInvestment.getWalletAmount(), partnerDailyInvestment.getInStockAmount(),
26945 amit.gupta 1025
							partnerDailyInvestment.getActivatedStockAmount() == 0 ? "-"
1026
									: "(" + partnerDailyInvestment.getActivatedStockAmount() + ")",
25927 amit.gupta 1027
							0, partnerDailyInvestment.getUnbilledAmount(), partnerDailyInvestment.getGrnPendingAmount(),
1028
							partnerDailyInvestment.getMinInvestment(), partnerDailyInvestment.getTotalInvestment(),
26945 amit.gupta 1029
							partnerDailyInvestment.getShortInvestment(), partnerDailyInvestment.getUnbilledQty(),
1030
							shortDaysMap.get(fofoId)));
25837 amit.gupta 1031
			partnerRowsMap.put(fofoStore.getId(), row);
24002 amit.gupta 1032
			rows.add(row);
1033
 
23929 amit.gupta 1034
		}
25312 amit.gupta 1035
 
24271 amit.gupta 1036
		String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25598 amit.gupta 1037
 
25927 amit.gupta 1038
		if (sendTo == null) {
30215 amit.gupta 1039
			for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
25895 amit.gupta 1040
				List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x))
1041
						.filter(x -> x != null).collect(Collectors.toList());
1042
				ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
30752 tejbeer 1043
				String[] sendToArray = new String[] { storeGuyEntry.getKey() };
25895 amit.gupta 1044
				Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
1045
						fileName, new ByteArrayResource(baos.toByteArray()));
1046
			}
27210 tejbeer 1047
			sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com",
28467 tejbeer 1048
					"neeraj.gupta@smartdukaan.com", "amit.gupta@shop2020.in", "manish.gupta@smartdukaan.com",
1049
					"niranjan.kala@smartdukaan.com");
25341 amit.gupta 1050
		}
25312 amit.gupta 1051
 
25604 amit.gupta 1052
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1053
		String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
25609 amit.gupta 1054
		Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA",
1055
				fileName, new ByteArrayResource(baos.toByteArray()));
24271 amit.gupta 1056
 
23929 amit.gupta 1057
	}
24177 govind 1058
 
26945 amit.gupta 1059
	private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() {
25598 amit.gupta 1060
		Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1061
 
1062
		List<Position> positions = positionRepository
1063
				.selectPositionByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_SALES);
1064
		Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream()
1065
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1066
		Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1067
		for (Position position : positions) {
1068
			List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
25609 amit.gupta 1069
			if (crList == null)
1070
				continue;
25598 amit.gupta 1071
			for (CustomRetailer cr : crList) {
1072
				if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1073
					partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1074
				}
1075
				SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1076
				AuthUser authUser = authUsersMap.get(position.getAuthUserId());
26945 amit.gupta 1077
				if (authUser == null) {
26059 amit.gupta 1078
					continue;
1079
				}
25598 amit.gupta 1080
				String name = authUser.getFirstName() + " " + authUser.getLastName();
1081
				if (position.getEscalationType().equals(EscalationType.L1)) {
1082
					saleRoles.getL1().add(name);
1083
				} else if (position.getEscalationType().equals(EscalationType.L2)) {
1084
					saleRoles.getL2().add(name);
1085
				}
1086
			}
1087
		}
25837 amit.gupta 1088
 
1089
		Set<CustomRetailer> allCrList = new HashSet<>();
1090
		for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1091
			allCrList.addAll(cr);
1092
		}
1093
 
1094
		Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream()
1095
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1096
 
26945 amit.gupta 1097
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25837 amit.gupta 1098
 
1099
		for (CustomRetailer cr : allCrList) {
1100
			FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
25927 amit.gupta 1101
			if (fofoStore == null) {
25870 amit.gupta 1102
				LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1103
				continue;
1104
			}
26945 amit.gupta 1105
			String code = fofoStore.getCode();
1106
			// String storeName = "SmartDukaan-" +
1107
			// fofoStore.getCode().replaceAll("[a-zA-Z]", "");
25837 amit.gupta 1108
			String businessName = cr.getBusinessName();
1109
			try {
1110
				String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1111
				String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
26945 amit.gupta 1112
				FofoReportingModel reportingModel = new FofoReportingModel();
1113
				reportingModel.setBusinessName(businessName);
1114
				reportingModel.setCode(code);
1115
				reportingModel.setFofoId(fofoStore.getId());
1116
				reportingModel.setRegionalManager(stateManager);
1117
				reportingModel.setTerritoryManager(territoryManager);
1118
				partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
25837 amit.gupta 1119
			} catch (Exception e) {
1120
				LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1121
			}
1122
		}
1123
		return partnerIdSalesHeadersMap;
1124
 
25598 amit.gupta 1125
	}
1126
 
24271 amit.gupta 1127
	public void sendPartnerInvestmentDetails() throws Exception {
25565 amit.gupta 1128
		this.sendPartnerInvestmentDetails(null);
24271 amit.gupta 1129
	}
1130
 
24697 amit.gupta 1131
	public void sendAgeingReport(String... sendTo) throws Exception {
24692 amit.gupta 1132
 
1133
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW,
1134
				"itemstockageing.xml");
24708 amit.gupta 1135
		InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
24754 amit.gupta 1136
				"ItemwiseOverallPendingIndent.xml");
24683 amit.gupta 1137
		Attachment attachment = new Attachment(
25445 amit.gupta 1138
				"ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
24707 amit.gupta 1139
		Attachment attachment1 = new Attachment(
25445 amit.gupta 1140
				"pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
25418 amit.gupta 1141
 
25609 amit.gupta 1142
		Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA",
1143
				attachment);
1144
		Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null,
1145
				"Itemwise Pending indent", "PFA", attachment1);
1146
 
25598 amit.gupta 1147
		// Reports to be sent to mapped partners
25597 amit.gupta 1148
		Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
25503 amit.gupta 1149
 
1150
		for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
25418 amit.gupta 1151
			Map<String, String> params = new HashMap<>();
25503 amit.gupta 1152
			if (storeGuyEntry.getValue().size() == 0)
1153
				continue;
25418 amit.gupta 1154
			params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
1155
			InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1156
					"focostockreport.xml", params);
1157
			Attachment attache = new Attachment(
25609 amit.gupta 1158
					"Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
25584 amit.gupta 1159
			System.out.println(storeGuyEntry.getValue());
30752 tejbeer 1160
			Utils.sendMailWithAttachments(googleMailSender, new String[] { storeGuyEntry.getKey() }, null,
25609 amit.gupta 1161
					"Franchise Stock Report", "PFA", attache);
25418 amit.gupta 1162
		}
25503 amit.gupta 1163
 
24681 amit.gupta 1164
	}
24533 govind 1165
 
28632 amit.gupta 1166
	public void sendIndentTertiary() throws Exception {
28709 amit.gupta 1167
 
28632 amit.gupta 1168
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1169
				"indentandtertiary.xml");
1170
		Attachment attachment = new Attachment(
28839 tejbeer 1171
				"indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
28709 amit.gupta 1172
		Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report",
1173
				"PFA", attachment);
1174
 
28632 amit.gupta 1175
	}
28790 amit.gupta 1176
 
28769 amit.gupta 1177
	public void sendAttendanceMorningAlert() throws Exception {
28793 amit.gupta 1178
		LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
28775 amit.gupta 1179
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
28790 amit.gupta 1180
		Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive())
1181
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1182
 
28769 amit.gupta 1183
		List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
28790 amit.gupta 1184
		Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1185
 
1186
		List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository
1187
				.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1188
 
1189
		Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream()
1190
				.collect(Collectors.groupingBy(EmployeeAttendance::getUserId,
1191
						Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
1192
		for (AuthUser authUser : authUsers) {
28769 amit.gupta 1193
			User user = userMap.get(authUser.getEmailId());
1194
			Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
28817 amit.gupta 1195
			LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
28839 tejbeer 1196
			if (employeeAttendanceOptional != null) {
28818 amit.gupta 1197
				LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
28839 tejbeer 1198
				if (employeeAttendanceOptional.orElse(null) != null) {
1199
					LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}",
1200
							employeeAttendanceOptional.get().getCreateTimestamp());
28818 amit.gupta 1201
				}
1202
			}
28790 amit.gupta 1203
			if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null
28769 amit.gupta 1204
					|| employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
28819 amit.gupta 1205
				LOGGER.info("Will Send Email to {}", authUser.getFullName());
28790 amit.gupta 1206
				String body = String.format(
28806 amit.gupta 1207
						"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 1208
						authUser.getFullName(),
1209
						(employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null) ? ""
1210
								: "(Punched at "
30752 tejbeer 1211
										+ FormattingUtils.format(employeeAttendanceOptional.get().getCreateTimestamp())
1212
										+ ")");
28839 tejbeer 1213
 
30752 tejbeer 1214
				Utils.sendMailWithAttachments(googleMailSender, new String[] { authUser.getEmailId() },
1215
						new String[] { "sm@smartdukaan.com" }, "Attendance Alert", body);
28839 tejbeer 1216
 
28769 amit.gupta 1217
			}
1218
		}
28790 amit.gupta 1219
 
28769 amit.gupta 1220
	}
28790 amit.gupta 1221
 
28775 amit.gupta 1222
	public void sendAttendanceEveningAlert() throws Exception {
1223
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
28790 amit.gupta 1224
		Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive())
1225
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
1226
 
28775 amit.gupta 1227
		List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
28790 amit.gupta 1228
		Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1229
 
28790 amit.gupta 1230
		Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository
1231
				.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream()
1232
				.collect(Collectors.groupingBy(x -> x.getUserId()));
1233
 
1234
		for (AuthUser authUser : authUsers) {
28775 amit.gupta 1235
			User user = userMap.get(authUser.getEmailId());
28784 amit.gupta 1236
			String body = null;
1237
			List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
28790 amit.gupta 1238
			if (employeeAttendances == null) {
1239
				body = String.format(
28806 amit.gupta 1240
						"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 1241
						authUser.getFullName());
28784 amit.gupta 1242
			} else {
28790 amit.gupta 1243
				List<LocalDateTime> punchTimes = employeeAttendances.stream()
1244
						.sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))
1245
						.map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
1246
				if (punchTimes.size() == 1) {
1247
					// body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1248
					// You have been marked absent for half the day. You may contact your manager
1249
					// and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
28784 amit.gupta 1250
				} else {
1251
					LocalDateTime firstPunch = punchTimes.get(0);
28790 amit.gupta 1252
					LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
28805 amit.gupta 1253
					Duration duration = Duration.between(firstPunch, lastPunch);
28784 amit.gupta 1254
					boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
28790 amit.gupta 1255
					if (!hoursCompleted) {
1256
						body = String.format(
28806 amit.gupta 1257
								"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 1258
								authUser.getFullName(), duration.toHours(),
1259
								duration.toMinutes() - duration.toHours() * 60);
28784 amit.gupta 1260
					}
1261
				}
1262
 
1263
			}
28790 amit.gupta 1264
			if (body != null) {
30752 tejbeer 1265
				Utils.sendMailWithAttachments(googleMailSender, new String[] { authUser.getEmailId() },
1266
						new String[] { "sm@smartdukaan.com" }, "Attendance Alert", body);
28775 amit.gupta 1267
			}
1268
		}
28790 amit.gupta 1269
 
1270
		this.sendMailToHR();
1271
 
28775 amit.gupta 1272
	}
28790 amit.gupta 1273
 
1274
	private void sendMailToHR() throws Exception {
1275
		Map<String, String> map = new HashMap<>();
1276
		String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1277
		map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1278
		map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1279
		InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO,
1280
				"employeeattendance.xml");
1281
		Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv",
1282
				isr);
1283
		Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null,
1284
				"Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
1285
	}
1286
 
28709 amit.gupta 1287
	public void checkPartnerActiveStore() throws Exception {
1288
 
1289
		List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
1290
 
1291
		LocalDateTime currentDate = LocalDate.now().atStartOfDay();
28712 amit.gupta 1292
		if (!fofoStores.isEmpty()) {
1293
			for (FofoStore fofoStore : fofoStores) {
28709 amit.gupta 1294
 
28712 amit.gupta 1295
				if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
28709 amit.gupta 1296
 
28712 amit.gupta 1297
					fofoStore.setActive(true);
1298
					fofoStoreRepository.persist(fofoStore);
1299
					LOGGER.info("inserted into InActiveFofoStore successfully");
28709 amit.gupta 1300
 
30393 amit.gupta 1301
				} else {
28712 amit.gupta 1302
					fofoStore.setActive(false);
1303
					fofoStore.setActiveTimeStamp(null);
1304
					fofoStoreRepository.persist(fofoStore);
1305
					LOGGER.info("inserted into InActiveFofoStore successfully");
1306
				}
28709 amit.gupta 1307
 
1308
			}
1309
		}
1310
 
1311
	}
1312
 
24697 amit.gupta 1313
	public void sendAgeingReport() throws Exception {
30593 amit.gupta 1314
		sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
28467 tejbeer 1315
				"niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
24697 amit.gupta 1316
	}
1317
 
24533 govind 1318
	public void moveImeisToPriceDropImeis() throws Exception {
24431 amit.gupta 1319
		List<PriceDrop> priceDrops = priceDropRepository.selectAll();
24533 govind 1320
		for (PriceDrop priceDrop : priceDrops) {
24431 amit.gupta 1321
			priceDropService.priceDropStatus(priceDrop.getId());
1322
		}
1323
	}
23929 amit.gupta 1324
 
24542 amit.gupta 1325
	public void walletmismatch() throws Exception {
1326
		LocalDate curDate = LocalDate.now();
24553 amit.gupta 1327
		List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
24552 amit.gupta 1328
		System.out.println(pdis.size());
24542 amit.gupta 1329
		for (PartnerDailyInvestment pdi : pdis) {
24549 amit.gupta 1330
			int fofoId = pdi.getFofoId();
24542 amit.gupta 1331
			for (PartnerDailyInvestment investment : Lists
1332
					.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
24552 amit.gupta 1333
				float statementAmount = walletService.getOpeningTill(fofoId,
24555 amit.gupta 1334
						investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
24552 amit.gupta 1335
				CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
24841 govind 1336
				LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(),
1337
						investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
24551 amit.gupta 1338
 
24542 amit.gupta 1339
			}
24549 amit.gupta 1340
		}
24542 amit.gupta 1341
 
1342
	}
29160 amit.gupta 1343
 
28990 amit.gupta 1344
	@Autowired
1345
	StateRepository stateRepository;
24542 amit.gupta 1346
 
1347
	public void gst() throws Exception {
28995 amit.gupta 1348
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(),
28990 amit.gupta 1349
				LocalDateTime.now());
24548 amit.gupta 1350
		for (FofoOrder fofoOrder : fofoOrders) {
1351
			int retailerAddressId = retailerRegisteredAddressRepository
1352
					.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24542 amit.gupta 1353
 
1354
			Address retailerAddress = addressRepository.selectById(retailerAddressId);
1355
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1356
			Integer stateId = null;
1357
			if (customerAddress.getState().equals(retailerAddress.getState())) {
1358
				try {
28990 amit.gupta 1359
					stateId = stateRepository.selectByName(customerAddress.getState()).getId();
24542 amit.gupta 1360
				} catch (Exception e) {
28990 amit.gupta 1361
					LOGGER.error("Cannot found state named {}", customerAddress.getState());
1362
					continue;
24542 amit.gupta 1363
				}
1364
			}
1365
			Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1366
			Map<Integer, Float> itemIdIgstTaxRateMap = null;
24548 amit.gupta 1367
 
1368
			List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
26929 amit.gupta 1369
			List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
24542 amit.gupta 1370
			if (stateId != null) {
26929 amit.gupta 1371
				itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
24542 amit.gupta 1372
			} else {
26929 amit.gupta 1373
				itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
24542 amit.gupta 1374
			}
1375
 
24548 amit.gupta 1376
			for (FofoOrderItem foi : fofoOrderItems) {
28990 amit.gupta 1377
				float sgstRate = foi.getSgstRate();
1378
				float cgstRate = foi.getCgstRate();
1379
				float igstRate = foi.getIgstRate();
29160 amit.gupta 1380
				if (stateId == null && igstRate == 0) {
1381
 
1382
					foi.setSgstRate(0);
1383
					foi.setCgstRate(0);
1384
					foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
1385
 
28993 amit.gupta 1386
					LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
29160 amit.gupta 1387
					LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}",
1388
							customerAddress.getState(), retailerAddress.getState());
28990 amit.gupta 1389
					LOGGER.info("Rates getIgstRate() {}", itemIdIgstTaxRateMap.get(foi.getItemId()));
29160 amit.gupta 1390
 
1391
				} else if (stateId != null && sgstRate == 0 && cgstRate == 0) {
1392
 
1393
					foi.setIgstRate(0);
1394
					foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1395
					foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1396
 
28993 amit.gupta 1397
					LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
29160 amit.gupta 1398
					LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}",
1399
							customerAddress.getState(), retailerAddress.getState());
1400
					LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}",
1401
							itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(),
1402
							itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24542 amit.gupta 1403
				}
1404
			}
1405
		}
24548 amit.gupta 1406
 
24542 amit.gupta 1407
	}
1408
 
24580 amit.gupta 1409
	public void schemewalletmismatch() {
1410
		LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
24587 amit.gupta 1411
		while (dateToReconcile.isBefore(LocalDate.now())) {
24580 amit.gupta 1412
			reconcileSchemes(dateToReconcile);
24587 amit.gupta 1413
			// reconcileOrders(dateTime);
1414
			// reconcileRecharges(dateTime);
24580 amit.gupta 1415
			dateToReconcile = dateToReconcile.plusDays(1);
1416
		}
1417
	}
1418
 
1419
	private void reconcileSchemes(LocalDate date) {
1420
		LocalDateTime startDate = date.atStartOfDay();
1421
		LocalDateTime endDate = startDate.plusDays(1);
1422
		List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1423
		List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
24587 amit.gupta 1424
		double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1425
		double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
24580 amit.gupta 1426
		double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
24587 amit.gupta 1427
		List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN,
1428
				WalletReferenceType.SCHEME_OUT);
1429
		List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate,
1430
				walletReferenceTypes);
1431
		double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1432
		if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
24580 amit.gupta 1433
			LOGGER.info("Scheme Amount mismatched for Date {}", date);
24587 amit.gupta 1434
 
1435
			Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(Collectors
1436
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1437
 
1438
			Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet())
1439
					.stream().collect(Collectors.groupingBy(x -> x.getFofoId(),
1440
							Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
1441
 
1442
			Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(Collectors
1443
					.groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
1444
 
1445
			Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository
1446
					.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream()
1447
					.collect(Collectors.groupingBy(x -> x.getFofoId(),
1448
							Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
1449
 
1450
			Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
26092 amit.gupta 1451
 
24587 amit.gupta 1452
			for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1453
				if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1454
					finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1455
				} else {
1456
					finalUserSchemeAmountMap.put(schemeAmount.getKey(),
1457
							finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
1458
				}
1459
			}
24590 amit.gupta 1460
			Map<Integer, Integer> userWalletMap = userWalletRepository
1461
					.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream()
1462
					.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1463
 
24587 amit.gupta 1464
			Map<Integer, Double> walletAmountMap = history.stream().collect(Collectors.groupingBy(
1465
					UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1466
			for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1467
				double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1468
				if (diff > 5) {
1469
					LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1470
				}
1471
			}
24580 amit.gupta 1472
		}
24587 amit.gupta 1473
 
24580 amit.gupta 1474
	}
24590 amit.gupta 1475
 
24592 amit.gupta 1476
	public void dryRunSchemeReco() throws Exception {
24635 amit.gupta 1477
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1478
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1479
 
24592 amit.gupta 1480
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1481
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24635 amit.gupta 1482
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1483
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1484
		Set<String> serialNumbersConsidered = new HashSet<>();
1485
 
25096 amit.gupta 1486
		LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
24635 amit.gupta 1487
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
1488
		List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
1489
 
24683 amit.gupta 1490
		Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
24635 amit.gupta 1491
		purchases.stream().forEach(purchase -> {
1492
			float amountToRollback = 0;
1493
			String description = "Adjustment of Duplicate Scheme for Purchase Invoice "
1494
					+ purchase.getPurchaseReference();
1495
			Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId())
1496
					.stream().filter(ii -> ii.getSerialNumber() != null)
1497
					.collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
1498
			if (inventorySerialNumberMap.size() > 0) {
1499
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1500
					String serialNumber = inventorySerialNumberEntry.getValue();
1501
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1502
					if (serialNumbersConsidered.contains(serialNumber)) {
1503
						// This will rollback scheme for differenct orders for same serial
1504
						List<SchemeInOut> sios = schemeInOutRepository
1505
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1506
								.filter(x -> x.getRolledBackTimestamp() == null
1507
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1508
								.collect(Collectors.toList());
1509
						Collections.reverse(sios);
1510
						for (SchemeInOut sio : sios) {
1511
							sio.setRolledBackTimestamp(LocalDateTime.now());
1512
							amountToRollback += sio.getAmount();
1513
							// sio.setSchemeType(SchemeType.OUT);
1514
							sio.setSerialNumber(serialNumber);
1515
							rolledbackSios.add(sio);
1516
						}
1517
						description = description.concat(" " + serialNumber + " ");
1518
					} else {
1519
						serialNumbersConsidered.add(serialNumber);
1520
						List<Integer> schemesConsidered = new ArrayList<>();
1521
						List<SchemeInOut> sios = schemeInOutRepository
1522
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
1523
								.filter(x -> x.getRolledBackTimestamp() == null
1524
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.IN))
1525
								.collect(Collectors.toList());
1526
						Collections.reverse(sios);
1527
						for (SchemeInOut sio : sios) {
1528
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1529
								schemesConsidered.add(sio.getSchemeId());
1530
								continue;
1531
							}
1532
							sio.setRolledBackTimestamp(LocalDateTime.now());
1533
							amountToRollback += sio.getAmount();
1534
							// sio.setSchemeType(SchemeType.OUT);
1535
							sio.setSerialNumber(serialNumber);
24681 amit.gupta 1536
							sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1537
							sio.setReference(purchase.getId());
24635 amit.gupta 1538
							rolledbackSios.add(sio);
1539
						}
1540
					}
1541
 
1542
				}
1543
			}
1544
			if (amountToRollback > 0) {
24683 amit.gupta 1545
				// Address address =
1546
				// addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
24635 amit.gupta 1547
				UserWalletHistory uwh = new UserWalletHistory();
1548
				uwh.setAmount(Math.round(amountToRollback));
1549
				uwh.setDescription(description);
1550
				uwh.setTimestamp(LocalDateTime.now());
24681 amit.gupta 1551
				uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
24635 amit.gupta 1552
				uwh.setReference(purchase.getId());
1553
				uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1554
				uwh.setFofoId(purchase.getFofoId());
24681 amit.gupta 1555
				uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
24635 amit.gupta 1556
				userWalletHistory.add(uwh);
1557
			}
1558
		});
1559
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1560
				Arrays.asList("User Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
1561
						"Timestamp"),
1562
				userWalletHistory.stream()
1563
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1564
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
1565
						.collect(Collectors.toList()));
1566
 
1567
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
24683 amit.gupta 1568
				Arrays.asList("Scheme ID", "SchemeType", "Reference", "Store Code", "Serial Number", "Amount",
1569
						"Created", "Rolledback"),
24635 amit.gupta 1570
				rolledbackSios.stream()
24681 amit.gupta 1571
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getReference(), x.getStoreCode(),
24635 amit.gupta 1572
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1573
						.collect(Collectors.toList()));
1574
 
30752 tejbeer 1575
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24636 amit.gupta 1576
				"Partner Excess Amount Scheme In", "PFA",
30752 tejbeer 1577
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1578
						new Attachment("SchemeInRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24635 amit.gupta 1579
 
25096 amit.gupta 1580
		throw new Exception();
24635 amit.gupta 1581
 
1582
	}
1583
 
1584
	public void dryRunOutSchemeReco() throws Exception {
1585
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1586
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
24606 amit.gupta 1587
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1588
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24590 amit.gupta 1589
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1590
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
25028 amit.gupta 1591
		LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
24632 amit.gupta 1592
		LocalDateTime endDate = LocalDate.now().atStartOfDay();
24631 amit.gupta 1593
		List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1594
		// Collections.reverse(allOrders);
1595
		// List<FofoOrder> allOrders =
24653 govind 1596
		// List<FofoOrder> allOrders =
24631 amit.gupta 1597
		// Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
24625 amit.gupta 1598
		Set<String> serialNumbersConsidered = new HashSet<>();
24590 amit.gupta 1599
		allOrders.stream().forEach(fofoOrder -> {
24592 amit.gupta 1600
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
24598 amit.gupta 1601
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
24592 amit.gupta 1602
			float amountToRollback = 0;
24590 amit.gupta 1603
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1604
			orderItems.forEach(x -> {
24606 amit.gupta 1605
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
24598 amit.gupta 1606
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
24590 amit.gupta 1607
			});
24606 amit.gupta 1608
			if (inventorySerialNumberMap.size() > 0) {
24631 amit.gupta 1609
				for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1610
					String serialNumber = inventorySerialNumberEntry.getValue();
1611
					int inventoryItemId = inventorySerialNumberEntry.getKey();
1612
					if (serialNumbersConsidered.contains(serialNumber)) {
1613
						// This will rollback scheme for differenct orders for same serial
1614
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1615
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1616
								.filter(x -> x.getRolledBackTimestamp() == null
1617
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1618
								.collect(Collectors.toList());
1619
						Collections.reverse(sios);
1620
						for (SchemeInOut sio : sios) {
1621
							sio.setRolledBackTimestamp(LocalDateTime.now());
1622
							amountToRollback += sio.getAmount();
1623
							// sio.setSchemeType(SchemeType.OUT);
1624
							sio.setSerialNumber(serialNumber);
1625
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
24681 amit.gupta 1626
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1627
							rolledbackSios.add(sio);
24623 amit.gupta 1628
						}
24635 amit.gupta 1629
						description = description.concat(" " + serialNumber + " ");
24631 amit.gupta 1630
					} else {
1631
						serialNumbersConsidered.add(serialNumber);
1632
						List<Integer> schemesConsidered = new ArrayList<>();
1633
						List<SchemeInOut> sios = schemeInOutRepository
24633 amit.gupta 1634
								.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId))).stream()
24635 amit.gupta 1635
								.filter(x -> x.getRolledBackTimestamp() == null
1636
										&& schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24631 amit.gupta 1637
								.collect(Collectors.toList());
1638
						Collections.reverse(sios);
1639
						for (SchemeInOut sio : sios) {
1640
							if (!schemesConsidered.contains(sio.getSchemeId())) {
1641
								schemesConsidered.add(sio.getSchemeId());
1642
								continue;
1643
							}
1644
							sio.setRolledBackTimestamp(LocalDateTime.now());
1645
							amountToRollback += sio.getAmount();
1646
							// sio.setSchemeType(SchemeType.OUT);
24681 amit.gupta 1647
							sio.setReference(fofoOrder.getId());
24631 amit.gupta 1648
							sio.setSerialNumber(serialNumber);
1649
							sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1650
							rolledbackSios.add(sio);
1651
						}
24615 amit.gupta 1652
					}
24631 amit.gupta 1653
 
24604 amit.gupta 1654
				}
24590 amit.gupta 1655
			}
24631 amit.gupta 1656
			if (amountToRollback > 0) {
1657
				UserWalletHistory uwh = new UserWalletHistory();
1658
				uwh.setAmount(Math.round(amountToRollback));
1659
				uwh.setDescription(description);
1660
				uwh.setTimestamp(LocalDateTime.now());
1661
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1662
				uwh.setReference(fofoOrder.getId());
1663
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1664
				uwh.setFofoId(fofoOrder.getFofoId());
1665
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1666
				userWalletHistory.add(uwh);
1667
			}
24590 amit.gupta 1668
		});
24598 amit.gupta 1669
 
24592 amit.gupta 1670
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
24681 amit.gupta 1671
				Arrays.asList("Wallet Id", "Store Code", "Reference Type", "Reference", "Amount", "Description",
24615 amit.gupta 1672
						"Timestamp"),
1673
				userWalletHistory.stream()
1674
						.map(x -> Arrays.asList(x.getWalletId(), x.getStoreCode(), x.getReferenceType(),
1675
								x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24592 amit.gupta 1676
						.collect(Collectors.toList()));
1677
 
1678
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1679
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1680
						"Rolledback"),
1681
				rolledbackSios.stream()
1682
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1683
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1684
						.collect(Collectors.toList()));
1685
 
30752 tejbeer 1686
		Utils.sendMailWithAttachments(googleMailSender, new String[] { "amit.gupta@shop2020.in" }, null,
24681 amit.gupta 1687
				"Partner Excess Amount Scheme Out", "PFA",
30752 tejbeer 1688
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1689
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1690
 
25267 amit.gupta 1691
		throw new Exception();
24590 amit.gupta 1692
	}
24615 amit.gupta 1693
 
24611 amit.gupta 1694
	public void dryRunSchemeOutReco1() throws Exception {
24615 amit.gupta 1695
		List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
24611 amit.gupta 1696
		List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1697
		List<SchemeInOut> rolledbackSios = new ArrayList<>();
1698
		Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream()
1699
				.collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1700
		Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream()
1701
				.collect(Collectors.toMap(Scheme::getId, Scheme::getType));
1702
		references.stream().forEach(reference -> {
1703
			FofoOrder fofoOrder = null;
1704
			try {
1705
				fofoOrder = fofoOrderRepository.selectByOrderId(reference);
24615 amit.gupta 1706
			} catch (Exception e) {
1707
 
24611 amit.gupta 1708
			}
1709
			String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1710
			Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1711
			float amountToRollback = 0;
1712
			List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1713
			orderItems.forEach(x -> {
1714
				inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null)
1715
						.collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
1716
			});
1717
			if (inventorySerialNumberMap.size() > 0) {
24615 amit.gupta 1718
				List<SchemeInOut> sios = schemeInOutRepository
1719
						.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream()
1720
						.filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT))
24611 amit.gupta 1721
						.collect(Collectors.toList());
1722
				LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1723
				UserWalletHistory uwh = new UserWalletHistory();
24615 amit.gupta 1724
				Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream()
1725
						.collect(Collectors.groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
24611 amit.gupta 1726
				for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1727
					List<SchemeInOut> outList = inventorySioEntry.getValue();
24615 amit.gupta 1728
					if (outList.size() > 1) {
1729
 
24611 amit.gupta 1730
					}
1731
				}
1732
				uwh.setAmount(Math.round(amountToRollback));
1733
				uwh.setDescription(description);
1734
				uwh.setTimestamp(LocalDateTime.now());
1735
				uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1736
				uwh.setReference(fofoOrder.getId());
1737
				uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1738
				uwh.setFofoId(fofoOrder.getFofoId());
1739
				uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1740
				userWalletHistory.add(uwh);
1741
			}
1742
		});
24615 amit.gupta 1743
 
24611 amit.gupta 1744
		ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
1745
				Arrays.asList("User Id", "Reference Type", "Reference", "Amount", "Description", "Timestamp"),
1746
				userWalletHistory.stream().map(x -> Arrays.asList(x.getWalletId(), x.getReferenceType(),
30752 tejbeer 1747
						x.getReference(), x.getAmount(), x.getDescription(), x.getTimestamp()))
24615 amit.gupta 1748
						.collect(Collectors.toList()));
1749
 
24611 amit.gupta 1750
		ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
1751
				Arrays.asList("Scheme ID", "SchemeType", "Store Code", "Serial Number", "Amount", "Created",
1752
						"Rolledback"),
1753
				rolledbackSios.stream()
24615 amit.gupta 1754
						.map(x -> Arrays.asList(x.getSchemeId(), x.getSchemeType(), x.getStoreCode(),
1755
								x.getSerialNumber(), x.getAmount(), x.getCreateTimestamp(), x.getRolledBackTimestamp()))
1756
						.collect(Collectors.toList()));
1757
 
24623 amit.gupta 1758
		Utils.sendMailWithAttachments(googleMailSender,
30752 tejbeer 1759
				new String[] { "amit.gupta@shop2020.in", "neeraj.gupta@smartdukaan.com" }, null,
24611 amit.gupta 1760
				"Partner Excess Amount", "PFA",
30752 tejbeer 1761
				new Attachment[] { new Attachment("WalletSummary.csv", new ByteArrayResource(baos.toByteArray())),
1762
						new Attachment("SchemeOutRolledback.csv", new ByteArrayResource(baosOuts.toByteArray())) });
24631 amit.gupta 1763
 
24628 amit.gupta 1764
		throw new Exception();
24615 amit.gupta 1765
 
24611 amit.gupta 1766
	}
24615 amit.gupta 1767
 
26945 amit.gupta 1768
	public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
25927 amit.gupta 1769
 
24653 govind 1770
		LocalDateTime now = LocalDateTime.now();
25837 amit.gupta 1771
		LocalDateTime from = now.with(LocalTime.MIN);
25925 amit.gupta 1772
		String timeString = "Today %s";
25927 amit.gupta 1773
		// Send yesterday's report
27007 amit.gupta 1774
		/*
1775
		 * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1776
		 * now.minusDays(1).; now = from.with(LocalTime.MAX);
30393 amit.gupta 1777
		 *
27007 amit.gupta 1778
		 * }
1779
		 */
24855 amit.gupta 1780
		List<Integer> fofoIds = null;
25043 amit.gupta 1781
		if (fofoIdInt == null) {
1782
			fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
1783
					.collect(Collectors.toList());
24856 amit.gupta 1784
		} else {
24855 amit.gupta 1785
			fofoIds = Arrays.asList(fofoIdInt);
1786
		}
25912 amit.gupta 1787
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
24683 amit.gupta 1788
 
25865 amit.gupta 1789
		Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now,
1790
				null);
1791
		Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
26945 amit.gupta 1792
 
1793
		Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1794
				true);
1795
 
1796
		Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository
1797
				.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
26941 amit.gupta 1798
		Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
1799
 
26945 amit.gupta 1800
		Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0,
1801
				false);
26941 amit.gupta 1802
		Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
26945 amit.gupta 1803
 
25865 amit.gupta 1804
		Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1805
		for (int fofoId : fofoIds) {
1806
			SaleTargetReportModel model = new SaleTargetReportModel();
25927 amit.gupta 1807
			model.setInsuranceSale(
1808
					partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
25865 amit.gupta 1809
			model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
26941 amit.gupta 1810
			model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1811
			model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1812
			model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1813
			model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
26945 amit.gupta 1814
			model.setPast3daysSale(
1815
					spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
25880 amit.gupta 1816
			model.setFofoId(fofoId);
25865 amit.gupta 1817
			saleTargetReportModelMap.put(fofoId, model);
1818
		}
25880 amit.gupta 1819
 
26945 amit.gupta 1820
		Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
24653 govind 1821
		for (Integer fofoId : fofoIds) {
25865 amit.gupta 1822
			SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
25821 amit.gupta 1823
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1824
			sendNotificationModel.setCampaignName("Sales update alert");
25884 tejbeer 1825
			sendNotificationModel.setTitle("Sale Update");
25927 amit.gupta 1826
			sendNotificationModel
1827
					.setMessage(String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1828
							model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1829
							String.format(timeString, now.format(timeFormatter))));
25821 amit.gupta 1830
			sendNotificationModel.setType("url");
27206 tejbeer 1831
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1832
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1833
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1834
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1835
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1836
			notificationService.sendNotification(sendNotificationModel);
24653 govind 1837
		}
26945 amit.gupta 1838
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1839
		// saleTargetReportModelMap);
1840
		String statewiseSaleReport = this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
30752 tejbeer 1841
		String cc[] = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "niranjan.kala@smartdukaan.com",
1842
				"sm@smartdukaan.com" };
25837 amit.gupta 1843
 
25912 amit.gupta 1844
		String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
26945 amit.gupta 1845
		// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
1846
		// subject);
1847
		this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com", statewiseSaleReport, cc, "Statewise" + subject);
24653 govind 1848
	}
1849
 
28377 tejbeer 1850
	public void checkRazorPayPaymentStatus() throws Exception {
28368 tejbeer 1851
		List<PendingOrder> pendingOrder = pendingOrderRepository
1852
				.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
1853
 
1854
		for (PendingOrder po : pendingOrder) {
1855
			RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
28377 tejbeer 1856
			List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28368 tejbeer 1857
 
28369 tejbeer 1858
			LOGGER.info("razorPay" + razorPay);
1859
			if (razorPay != null) {
1860
				List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28377 tejbeer 1861
 
28369 tejbeer 1862
				if (!payments.isEmpty()) {
28377 tejbeer 1863
					List<String> statusList = new ArrayList<>();
28369 tejbeer 1864
					for (Payment payment : payments) {
28368 tejbeer 1865
 
28377 tejbeer 1866
						JSONObject jsonObj = new JSONObject(payment.toString());
1867
 
1868
						String status = jsonObj.getString("status");
1869
 
1870
						statusList.add(status);
1871
 
28369 tejbeer 1872
					}
28377 tejbeer 1873
					LOGGER.info("statusList" + statusList);
28368 tejbeer 1874
 
28377 tejbeer 1875
					if (statusList.contains("authorized") || statusList.contains("captured")) {
1876
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1877
						po.setPaidAmount(po.getTotalAmount());
1878
						for (PendingOrderItem poi : poItems) {
1879
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1880
						}
1881
						Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
1882
 
1883
						CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1884
						Customer customer = customerRepository.selectById(po.getCustomerId());
1885
						String[] customerEmail = null;
1886
						if (customer.getEmailId() != null) {
30752 tejbeer 1887
							customerEmail = new String[] { customer.getEmailId() };
28377 tejbeer 1888
						}
1889
						List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com",
28467 tejbeer 1890
								"tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
1891
								"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28377 tejbeer 1892
						List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1893
						if (authUserEmails != null) {
1894
							authUserEmails = new ArrayList<>();
1895
						}
1896
						authUserEmails.addAll(bccTo);
1897
 
28382 tejbeer 1898
						// emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1899
						// "order-confirm.vm",
1900
						// emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
28377 tejbeer 1901
 
1902
					} else if (statusList.contains("refunded") || statusList.contains("failed")) {
1903
						for (PendingOrderItem poi : poItems) {
1904
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1905
						}
1906
 
1907
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1908
					}
1909
 
28369 tejbeer 1910
				}
28377 tejbeer 1911
				// LOGGER.info("payment" + payments);
28369 tejbeer 1912
 
1913
			}
28368 tejbeer 1914
		}
1915
	}
1916
 
25865 amit.gupta 1917
	public static class SaleTargetReportModel {
1918
		private double totalSale;
26941 amit.gupta 1919
		private long totalQty;
26945 amit.gupta 1920
		private double past3daysSale;
25880 amit.gupta 1921
		private int fofoId;
1922
 
1923
		public int getFofoId() {
1924
			return fofoId;
1925
		}
1926
 
1927
		public void setFofoId(int fofoId) {
1928
			this.fofoId = fofoId;
1929
		}
1930
 
25865 amit.gupta 1931
		private double smartphoneSale;
1932
		private long smartphoneQty;
1933
		private double insuranceSale;
1934
		private long insruanceQty;
1935
 
26941 amit.gupta 1936
		public long getTotalQty() {
1937
			return totalQty;
1938
		}
1939
 
1940
		public void setTotalQty(long totalQty) {
1941
			this.totalQty = totalQty;
1942
		}
1943
 
26945 amit.gupta 1944
		public double getPast3daysSale() {
1945
			return past3daysSale;
1946
		}
1947
 
1948
		public void setPast3daysSale(double past3daysSale) {
1949
			this.past3daysSale = past3daysSale;
1950
		}
1951
 
25865 amit.gupta 1952
		@Override
1953
		public int hashCode() {
1954
			final int prime = 31;
1955
			int result = 1;
25880 amit.gupta 1956
			result = prime * result + fofoId;
25865 amit.gupta 1957
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1958
			long temp;
1959
			temp = Double.doubleToLongBits(insuranceSale);
1960
			result = prime * result + (int) (temp ^ (temp >>> 32));
1961
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1962
			temp = Double.doubleToLongBits(smartphoneSale);
1963
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1964
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 1965
			temp = Double.doubleToLongBits(totalSale);
1966
			result = prime * result + (int) (temp ^ (temp >>> 32));
1967
			return result;
1968
		}
1969
 
1970
		@Override
1971
		public boolean equals(Object obj) {
1972
			if (this == obj)
1973
				return true;
1974
			if (obj == null)
1975
				return false;
1976
			if (getClass() != obj.getClass())
1977
				return false;
1978
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 1979
			if (fofoId != other.fofoId)
1980
				return false;
25865 amit.gupta 1981
			if (insruanceQty != other.insruanceQty)
1982
				return false;
1983
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
1984
				return false;
1985
			if (smartphoneQty != other.smartphoneQty)
1986
				return false;
1987
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
1988
				return false;
26941 amit.gupta 1989
			if (totalQty != other.totalQty)
1990
				return false;
25865 amit.gupta 1991
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
1992
				return false;
1993
			return true;
1994
		}
1995
 
1996
		public double getTotalSale() {
1997
			return totalSale;
1998
		}
1999
 
2000
		public void setTotalSale(double totalSale) {
2001
			this.totalSale = totalSale;
2002
		}
2003
 
2004
		public double getSmartphoneSale() {
2005
			return smartphoneSale;
2006
		}
2007
 
2008
		public void setSmartphoneSale(double smartphoneSale) {
2009
			this.smartphoneSale = smartphoneSale;
2010
		}
2011
 
2012
		public long getSmartphoneQty() {
2013
			return smartphoneQty;
2014
		}
2015
 
2016
		public void setSmartphoneQty(long smartphoneQty) {
2017
			this.smartphoneQty = smartphoneQty;
2018
		}
2019
 
2020
		public double getInsuranceSale() {
2021
			return insuranceSale;
2022
		}
2023
 
2024
		public void setInsuranceSale(double insuranceSale) {
2025
			this.insuranceSale = insuranceSale;
2026
		}
2027
 
2028
		public long getInsruanceQty() {
2029
			return insruanceQty;
2030
		}
2031
 
2032
		public void setInsruanceQty(long insruanceQty) {
2033
			this.insruanceQty = insruanceQty;
2034
		}
2035
 
2036
		@Override
2037
		public String toString() {
26945 amit.gupta 2038
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
2039
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
2040
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 2041
		}
2042
 
2043
	}
2044
 
26945 amit.gupta 2045
	private String getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
30752 tejbeer 2046
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
26940 amit.gupta 2047
		List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
26945 amit.gupta 2048
		Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors
2049
				.groupingBy(x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
26940 amit.gupta 2050
		List<List<Serializable>> stateWiseSales = new ArrayList<>();
2051
		for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
26945 amit.gupta 2052
			long totalQty = stateMapEntry.getValue().stream()
2053
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2054
			double totalSale = stateMapEntry.getValue().stream()
2055
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2056
			long smartPhoneQty = stateMapEntry.getValue().stream()
2057
					.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
2058
			double smartPhoneSale = stateMapEntry.getValue().stream()
2059
					.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2060
			stateWiseSales
2061
					.add(Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
26940 amit.gupta 2062
		}
2063
		StringBuilder sb = new StringBuilder();
26945 amit.gupta 2064
		sb.append("<html><body>");
2065
		sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
26940 amit.gupta 2066
		sb.append("<tbody>\n" + "	    <tr>"
2067
				+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
26941 amit.gupta 2068
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
2069
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
2070
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
2071
				+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
26940 amit.gupta 2072
				+ "	    				</tr>");
2073
		for (List<Serializable> stateSale : stateWiseSales) {
2074
			sb.append("<tr>");
2075
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2076
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2077
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
26941 amit.gupta 2078
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2079
			sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
26940 amit.gupta 2080
			sb.append("</tr>");
2081
		}
26945 amit.gupta 2082
		sb.append("</tbody></table><br><br>");
25872 tejbeer 2083
 
26945 amit.gupta 2084
		sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
24653 govind 2085
		sb.append("<tbody>\n" + "	    				<tr>\n"
26945 amit.gupta 2086
				+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
2087
				+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
2088
				+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
2089
				+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
2090
				+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
2091
				+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
2092
				+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
24653 govind 2093
				+ "	    				</tr>");
26945 amit.gupta 2094
 
30765 tejbeer 2095
		/*
2096
		 * List<Integer> sortedPartnerSalesHeaders =
2097
		 * partnerSalesHeadersMap.values().stream()
2098
		 * .sorted(Comparator.comparing(FofoReportingModel::getCode)
2099
		 * .thenComparing(FofoReportingModel::getRegionalManager)
2100
		 * .thenComparing(FofoReportingModel::getTerritoryManager))
2101
		 * .map(FofoReportingModel::getFofoId).collect(Collectors.toList());
2102
		 */
2103
 
2104
		List<Integer> sortedSaleTargetReport = saleTargetReportModelMap.values().stream()
2105
				.sorted(Comparator.comparing(SaleTargetReportModel::getTotalSale)).map(SaleTargetReportModel::getFofoId)
2106
				.collect(Collectors.toList());
2107
		for (Integer fofoId : sortedSaleTargetReport) {
27007 amit.gupta 2108
			if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
26947 amit.gupta 2109
				sb.append("<tr style='background-color:red'>");
2110
			} else {
26945 amit.gupta 2111
				sb.append("<tr>");
2112
			}
2113
			sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode()
25880 amit.gupta 2114
					+ "</td>");
2115
			sb.append("<td style='border:1px solid black;padding: 5px'>"
27007 amit.gupta 2116
					+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2117
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2118
					+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2119
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2120
					+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2121
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 2122
					+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
25880 amit.gupta 2123
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 2124
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
25880 amit.gupta 2125
			sb.append("<td style='border:1px solid black;padding: 5px'>"
26945 amit.gupta 2126
					+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
25865 amit.gupta 2127
			sb.append("</tr>");
24653 govind 2128
		}
24683 amit.gupta 2129
 
26945 amit.gupta 2130
		sb.append("</tr>");
2131
 
2132
		sb.append("</body></html>");
2133
 
2134
		return sb.toString();
24653 govind 2135
	}
24841 govind 2136
 
26945 amit.gupta 2137
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 2138
			throws MessagingException, ProfitMandiBusinessException, IOException {
2139
		MimeMessage message = mailSender.createMimeMessage();
2140
		MimeMessageHelper helper = new MimeMessageHelper(message);
2141
		helper.setSubject(subject);
2142
		helper.setText(body, true);
2143
		helper.setTo(email);
2144
		if (cc != null) {
2145
			helper.setCc(cc);
2146
		}
2147
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2148
		helper.setFrom(senderAddress);
2149
		mailSender.send(message);
2150
	}
25300 tejbeer 2151
 
25351 tejbeer 2152
	public void sendNotification() throws Exception {
25300 tejbeer 2153
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2154
		if (!pushNotifications.isEmpty()) {
2155
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 2156
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 2157
				NotificationCampaign notificationCampaign = notificationCampaignRepository
2158
						.selectById(pushNotification.getNotificationCampaignid());
2159
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
2160
						SimpleCampaignParams.class);
2161
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 2162
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 2163
				JSONObject json = new JSONObject();
25351 tejbeer 2164
				json.put("to", device.getFcmId());
25300 tejbeer 2165
				JSONObject jsonObj = new JSONObject();
2166
				jsonObj.put("message", campaign.getMessage());
2167
				jsonObj.put("title", campaign.getTitle());
2168
				jsonObj.put("type", campaign.getType());
2169
				jsonObj.put("url", result_url);
2170
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2171
				jsonObj.put("image", campaign.getImageUrl());
2172
				jsonObj.put("largeIcon", "large_icon");
2173
				jsonObj.put("smallIcon", "small_icon");
2174
				jsonObj.put("vibrate", 1);
2175
				jsonObj.put("pid", pushNotification.getId());
2176
				jsonObj.put("sound", 1);
2177
				jsonObj.put("priority", "high");
2178
				json.put("data", jsonObj);
25351 tejbeer 2179
				try {
2180
					CloseableHttpClient client = HttpClients.createDefault();
2181
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 2182
 
25351 tejbeer 2183
					httpPost.setHeader("Content-Type", "application/json; utf-8");
2184
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2185
					StringEntity entity = new StringEntity(json.toString());
2186
					httpPost.setEntity(entity);
2187
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 2188
 
25351 tejbeer 2189
					if (response.getStatusLine().getStatusCode() == 200) {
2190
						pushNotification.setSentTimestamp(LocalDateTime.now());
2191
					} else {
25356 tejbeer 2192
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 2193
						LOGGER.info("message" + "not sent");
26945 amit.gupta 2194
						response.toString();
25351 tejbeer 2195
					}
25300 tejbeer 2196
 
25351 tejbeer 2197
				} catch (Exception e) {
2198
					e.printStackTrace();
26443 amit.gupta 2199
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 2200
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 2201
				}
2202
			}
2203
		}
2204
	}
2205
 
25553 amit.gupta 2206
	public void grouping() throws Exception {
25609 amit.gupta 2207
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2208
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
2209
		System.out.println(String.join("\t",
2210
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 2211
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 2212
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 2213
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 2214
			if (priceDropIMEI.getPartnerId() == 0)
2215
				continue;
25609 amit.gupta 2216
			HashSet<String> imeis = new HashSet<>();
2217
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2218
			imeis.add(priceDropIMEI.getImei());
2219
			List<InventoryItem> inventoryItems = inventoryItemRepository
2220
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 2221
			if (inventoryItems.size() == 0) {
2222
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 2223
				continue;
25612 amit.gupta 2224
			}
25609 amit.gupta 2225
			InventoryItem inventoryItem = inventoryItems.get(0);
2226
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
2227
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
2228
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
2229
				// check if pricedrop has been rolled out
2230
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
2231
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
2232
				if (uwh.size() > 0) {
25615 amit.gupta 2233
					Item item = itemRepository.selectById(inventoryItem.getItemId());
26945 amit.gupta 2234
					System.out.println(String.join("\t", Arrays.asList(priceDropIMEI.getImei(),
2235
							inventoryItem.getItemId() + "", item.getBrand(), item.getModelName(), item.getModelNumber(),
2236
							inventoryItem.getFofoId() + "", customRetailer.getBusinessName(),
2237
							inventoryItem.getCreateTimestamp().format(dtf), priceDrop.getAffectedOn().format(dtf),
2238
							priceDropIMEI.getUpdateTimestamp().format(dtf),
30959 amit.gupta 2239
							inventoryItem.getUpdateTimestamp().format(dtf), priceDrop.getAutoPartnerPayout(inventoryItem.getUpdateTimestamp()) + "",
26945 amit.gupta 2240
							inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 2241
				}
2242
			}
2243
		}
25503 amit.gupta 2244
	}
29668 tejbeer 2245
 
29566 amit.gupta 2246
	public void toffeeRollback() throws Exception {
2247
		toffeeService.cancelPolicyCopy("110143521986");
2248
		toffeeService.getOrderId("110143521986");
2249
	}
25694 amit.gupta 2250
 
27686 amit.gupta 2251
	public void attachToffeeInvoices() throws Exception {
28205 tejbeer 2252
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3,
2253
				Optional.of(false));
2254
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
27678 amit.gupta 2255
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2256
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
30321 amit.gupta 2257
			InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
27678 amit.gupta 2258
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2259
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
28205 tejbeer 2260
			String pdfInvoiceString = "data:application/pdf;base64,"
2261
					+ Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2262
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1],
2263
					pdfInvoiceString);
2264
			if (attached) {
27678 amit.gupta 2265
				insurancePolicy.setPosted(true);
2266
			}
2267
		}
25694 amit.gupta 2268
	}
2269
 
30858 amit.gupta 2270
	public void sendBAGPendingPolicies() throws Exception {
2271
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4,
2272
				Optional.of(false));
2273
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
2274
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2275
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2276
			FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2277
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2278
			Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2279
			BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
30913 tejbeer 2280
			// bagInsuranceModel.setModelId();
30858 amit.gupta 2281
			bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2282
			bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2283
			bagInsuranceModel.setCity(customerAddress.getCity());
2284
			bagInsuranceModel.setBrandWarranty("1 Year");
2285
			Item item = itemRepository.selectById(fofoOrderItem.getId());
2286
			bagInsuranceModel.setModelName(item.getItemDescription());
2287
			bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2288
			bagInsuranceModel.setEmail(customer.getEmailId());
2289
			bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2290
			bagInsuranceModel.setFirstName(customer.getFirstName());
2291
			bagInsuranceModel.setLastName(customer.getLastName());
2292
			bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2293
			bagInsuranceModel.setPlanId("");
2294
			insurancePolicy.setPosted(true);
2295
		}
2296
	}
2297
 
25694 amit.gupta 2298
	public void schemeRollback(List<String> schemeIds) throws Exception {
2299
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 2300
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 2301
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2302
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2303
		for (SchemeInOut sio : schemeInOuts) {
2304
			Scheme scheme = schemesMap.get(sio.getSchemeId());
2305
			if (scheme.getType().equals(SchemeType.IN)) {
2306
 
2307
			} else if (scheme.getType().equals(SchemeType.OUT)) {
2308
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2309
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
2310
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
2311
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2312
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
2313
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
2314
					sio.setRolledBackTimestamp(LocalDateTime.now());
2315
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 2316
					String rollbackReason = "Scheme reversed for "
2317
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 2318
							+ fofoOrder.getInvoiceNumber();
2319
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 2320
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
2321
							LocalDateTime.now());
25694 amit.gupta 2322
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
2323
							rollbackReason);
2324
				}
2325
			}
2326
		}
25721 tejbeer 2327
		// throw new Exception();
25694 amit.gupta 2328
	}
25721 tejbeer 2329
 
2330
	public void checkfocusedModelInPartnerStock() throws Exception {
2331
 
2332
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
2333
				.collect(Collectors.toList());
27212 tejbeer 2334
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
2335
				.getSaholicStock();
27213 tejbeer 2336
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2337
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 2338
 
2339
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
2340
				.getSaholicPOItems();
25721 tejbeer 2341
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2342
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 2343
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2344
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 2345
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2346
			Map<Integer, Integer> processingOrderMap = null;
2347
			Map<Integer, Integer> catalogIdAndQtyMap = null;
2348
			Map<Integer, Integer> grnPendingOrdersMap = null;
2349
 
2350
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
2351
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
2352
 
2353
			if (!currentInventorySnapshot.isEmpty()) {
2354
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
2355
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2356
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
2357
 
2358
			}
2359
 
2360
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
2361
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2362
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2363
			if (!grnPendingOrders.isEmpty()) {
2364
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
2365
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2366
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
2367
 
2368
			}
2369
 
2370
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
2371
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2372
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2373
			if (!processingOrder.isEmpty()) {
2374
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
2375
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2376
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
2377
 
2378
			}
2379
 
25800 tejbeer 2380
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
2381
					.collect(Collectors.toList());
2382
 
27088 tejbeer 2383
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
2384
					.collect(Collectors.toList());
27095 tejbeer 2385
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 2386
			if (regionIds.size() == 0) {
2387
				LOGGER.info("No region found for partner {}", fofoId);
2388
				continue;
2389
			}
27100 amit.gupta 2390
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 2391
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
29668 tejbeer 2392
							Collectors.mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 2393
 
25721 tejbeer 2394
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
2395
 
27100 amit.gupta 2396
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2397
				int minQty = entry.getValue().get();
25721 tejbeer 2398
				int inStockQty = 0;
2399
				int processingQty = 0;
2400
				int grnPendingQty = 0;
27208 tejbeer 2401
				int allColorNetAvailability = 0;
27253 tejbeer 2402
				int allColorPoAvailability = 0;
25721 tejbeer 2403
				if (processingOrderMap != null) {
2404
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
2405
							: processingOrderMap.get(entry.getKey());
2406
 
2407
				}
2408
				if (grnPendingOrdersMap != null) {
2409
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2410
							: grnPendingOrdersMap.get(entry.getKey());
2411
 
2412
				}
2413
				if (catalogIdAndQtyMap != null) {
2414
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2415
							: catalogIdAndQtyMap.get(entry.getKey());
2416
 
2417
				}
28526 tejbeer 2418
 
2419
				int grnStockQty = grnPendingQty + inStockQty;
25721 tejbeer 2420
				int totalQty = processingQty + grnPendingQty + inStockQty;
2421
 
29801 manish 2422
				int shortageQty = minQty - totalQty;
2423
				List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
2424
				FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2425
 
29801 manish 2426
				Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2427
						.get(fofoStore.getWarehouseId());
27213 tejbeer 2428
 
29801 manish 2429
				Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2430
						.get(fofoStore.getWarehouseId());
25721 tejbeer 2431
 
29801 manish 2432
				for (Item it : item) {
2433
					List<SaholicCIS> currentAvailability = null;
2434
					List<SaholicPOItem> poItemAvailability = null;
2435
					if (itemAvailabilityMap != null) {
2436
						currentAvailability = itemAvailabilityMap.get(it.getId());
2437
					}
27208 tejbeer 2438
 
29801 manish 2439
					if (poItemAvailabilityMap != null) {
2440
						poItemAvailability = poItemAvailabilityMap.get(it.getId());
2441
					}
2442
					if (currentAvailability != null) {
2443
						allColorNetAvailability += currentAvailability.stream()
2444
								.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2445
					}
28528 tejbeer 2446
 
29801 manish 2447
					if (poItemAvailability != null) {
2448
						allColorPoAvailability += poItemAvailability.stream()
2449
								.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
27208 tejbeer 2450
					}
2451
 
25721 tejbeer 2452
				}
2453
 
29801 manish 2454
				FocusedModelShortageModel fm = new FocusedModelShortageModel();
2455
				fm.setFofoId(fofoId);
2456
				fm.setStoreCode(fofoStore.getCode());
2457
				fm.setStoreName(customRetailer.getBusinessName());
2458
				fm.setBrandName(item.get(0).getBrand());
2459
				fm.setModelName(item.get(0).getModelName());
2460
				fm.setModelNumber(item.get(0).getModelNumber());
2461
				fm.setGrnStockQty(grnStockQty);
2462
				fm.setPendingIndentQty(processingQty);
2463
				fm.setShortageQty(shortageQty);
2464
				fm.setPoAvailabitiy(allColorPoAvailability);
2465
				fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
2466
				fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2467
				fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
2468
				fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
2469
				fm.setAvailabitiy(allColorNetAvailability);
27233 tejbeer 2470
 
29801 manish 2471
				focusedModelShortageList.add(fm);
2472
			}
2473
 
29668 tejbeer 2474
			/*
2475
			 * if (!focusedModelShortageList.isEmpty()) { String subject = "Stock Alert";
2476
			 * String messageText = this.getMessage(focusedModelShortageList);
30393 amit.gupta 2477
			 *
29668 tejbeer 2478
			 * this.sendMailWithAttachments(subject, messageText,
2479
			 * customRetailer.getEmail()); String notificationMessage =
2480
			 * this.getNotificationMessage(focusedModelShortageList);
30393 amit.gupta 2481
			 *
29668 tejbeer 2482
			 * LOGGER.info("notificationMessage" + notificationMessage);
30393 amit.gupta 2483
			 *
29668 tejbeer 2484
			 * SendNotificationModel sendNotificationModel = new SendNotificationModel();
2485
			 * sendNotificationModel.setCampaignName("Stock Alert");
2486
			 * sendNotificationModel.setTitle("Alert");
2487
			 * sendNotificationModel.setMessage(notificationMessage);
2488
			 * sendNotificationModel.setType("url"); sendNotificationModel.setUrl(
2489
			 * "https://app.smartdukaan.com/pages/home/notifications");
2490
			 * sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2491
			 * sendNotificationModel.setMessageType(MessageType.notification); int userId =
2492
			 * userAccountRepository.selectUserIdByRetailerId(fofoId);
2493
			 * sendNotificationModel.setUserIds(Arrays.asList(userId));
2494
			 * notificationService.sendNotification(sendNotificationModel);
30393 amit.gupta 2495
			 *
29668 tejbeer 2496
			 * }
2497
			 */
27233 tejbeer 2498
 
25721 tejbeer 2499
		}
27102 amit.gupta 2500
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2501
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
30215 amit.gupta 2502
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2503
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2504
 
25800 tejbeer 2505
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2506
				storeGuyMap.entrySet().forEach(y -> {
2507
 
2508
					if (y.getValue().contains(x.getKey())) {
2509
						if (!emailRowsMap.containsKey(y.getKey())) {
2510
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2511
						}
27208 tejbeer 2512
						List<List<? extends Serializable>> fms = x.getValue().stream()
2513
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2514
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
28526 tejbeer 2515
										r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(),
2516
										r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2517
								.collect(Collectors.toList());
2518
						emailRowsMap.get(y.getKey()).addAll(fms);
2519
 
25721 tejbeer 2520
					}
2521
 
25800 tejbeer 2522
				});
25721 tejbeer 2523
 
2524
			});
2525
 
27212 tejbeer 2526
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
28526 tejbeer 2527
					"Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty",
2528
					"Availability");
25837 amit.gupta 2529
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2530
 
25800 tejbeer 2531
				ByteArrayOutputStream baos = null;
2532
				try {
25837 amit.gupta 2533
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2534
				} catch (Exception e2) {
2535
					e2.printStackTrace();
2536
				}
30752 tejbeer 2537
				String[] sendToArray = new String[] {
28526 tejbeer 2538
 
29996 tejbeer 2539
						entry.getKey()
29995 tejbeer 2540
 
2541
				};
2542
 
25800 tejbeer 2543
				try {
2544
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2545
							new ByteArrayResource(baos.toByteArray()));
2546
				} catch (Exception e1) { // TODO Auto-generated catch block
2547
					e1.printStackTrace();
2548
				}
25721 tejbeer 2549
 
25800 tejbeer 2550
			});
2551
		}
25721 tejbeer 2552
	}
2553
 
2554
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2555
		StringBuilder sb = new StringBuilder();
2556
		sb.append("Focused Model Shortage in Your Stock : \n");
2557
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2558
 
2559
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2560
			sb.append(String.format("%n", ""));
2561
		}
2562
		return sb.toString();
2563
	}
2564
 
2565
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2566
		MimeMessage message = mailSender.createMimeMessage();
2567
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2568
 
2569
		helper.setSubject(subject);
2570
		helper.setText(messageText, true);
2571
		helper.setTo(email);
27116 amit.gupta 2572
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2573
		helper.setFrom(senderAddress);
2574
		mailSender.send(message);
2575
 
2576
	}
2577
 
2578
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2579
		StringBuilder sb = new StringBuilder();
2580
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2581
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2582
		sb.append("<tbody>\n" + "	    				<tr>\n"
2583
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2584
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2585
				+ "	    				</tr>");
2586
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2587
 
2588
			sb.append("<tr>");
2589
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2590
 
2591
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2592
 
2593
			sb.append("</tr>");
2594
 
2595
		}
2596
 
2597
		sb.append("</tbody></table></body></html>");
2598
 
2599
		return sb.toString();
2600
	}
2601
 
25927 amit.gupta 2602
	public void notifyLead() throws Exception {
29488 manish 2603
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null,
2604
				LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2605
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2606
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2607
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2608
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2609
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2610
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2611
 
27477 amit.gupta 2612
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2613
 
25927 amit.gupta 2614
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2615
 
2616
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2617
			int authId = authUserEmail.getKey();
2618
			String email = authUserEmail.getValue();
2619
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2620
		}
27477 amit.gupta 2621
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2622
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2623
 
29308 tejbeer 2624
		String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
25927 amit.gupta 2625
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2626
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2627
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2628
				continue;
2629
			}
2630
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
29308 tejbeer 2631
					lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
25927 amit.gupta 2632
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2633
			sendNotificationModel.setCampaignName("Lead Reminder");
2634
			sendNotificationModel.setTitle("Leads followup Reminder");
2635
			sendNotificationModel.setMessage(notificationMessage);
2636
			sendNotificationModel.setType("url");
29317 tejbeer 2637
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId());
25927 amit.gupta 2638
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2639
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2640
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2641
			System.out.println(sendNotificationModel);
25927 amit.gupta 2642
			notificationService.sendNotification(sendNotificationModel);
2643
		}
2644
	}
26945 amit.gupta 2645
 
25927 amit.gupta 2646
	public void notifyVisits() throws Exception {
26945 amit.gupta 2647
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2648
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2649
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2650
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2651
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2652
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2653
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2654
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2655
 
25927 amit.gupta 2656
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2657
			int authId = authUserEmail.getKey();
2658
			String email = authUserEmail.getValue();
2659
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2660
		}
2661
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2662
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2663
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2664
		for (FranchiseeVisit visit : franchiseeVisits) {
2665
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2666
				continue;
2667
			}
2668
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2669
			String message = null;
26945 amit.gupta 2670
			if (visit.getFranchiseActivityId() == 0) {
2671
				message = String.format(visitTemplate, visit.getPartnerName(),
30574 amit.gupta 2672
						timeFormatter.format(visit.getScheduleTimestamp()));
26945 amit.gupta 2673
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2674
			} else {
26945 amit.gupta 2675
				message = String.format(followupTemplate, visit.getPartnerName(),
30574 amit.gupta 2676
						timeFormatter.format(visit.getScheduleTimestamp()));
25927 amit.gupta 2677
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2678
			}
2679
			sendNotificationModel.setMessage(message);
2680
			sendNotificationModel.setType("url");
26482 tejbeer 2681
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2682
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2683
			sendNotificationModel.setMessageType(MessageType.reminder);
2684
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2685
			notificationService.sendNotification(sendNotificationModel);
2686
		}
25910 amit.gupta 2687
	}
25982 amit.gupta 2688
 
26283 tejbeer 2689
	public void ticketClosed() throws Exception {
2690
 
2691
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2692
		for (Ticket ticket : tickets) {
2693
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2694
				ticket.setCloseTimestamp(LocalDateTime.now());
2695
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2696
				ticket.setUpdateTimestamp(LocalDateTime.now());
2697
				ticketRepository.persist(ticket);
2698
			}
2699
		}
2700
 
2701
	}
2702
 
26790 tejbeer 2703
	public void checkValidateReferral() throws Exception {
2704
 
2705
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2706
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2707
		if (!referrals.isEmpty()) {
2708
			String subject = "Referral Request";
2709
			String messageText = this.getMessageForReferral(referrals);
2710
 
26792 tejbeer 2711
			MimeMessage message = mailSender.createMimeMessage();
2712
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
30752 tejbeer 2713
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
26792 tejbeer 2714
			helper.setSubject(subject);
2715
			helper.setText(messageText, true);
2716
			helper.setTo(email);
2717
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2718
			helper.setFrom(senderAddress);
2719
			mailSender.send(message);
2720
 
26790 tejbeer 2721
		}
2722
	}
2723
 
2724
	private String getMessageForReferral(List<Refferal> referrals) {
2725
		StringBuilder sb = new StringBuilder();
2726
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2727
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2728
		sb.append("<tbody>\n" + "	    				<tr>\n"
2729
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2730
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2731
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2732
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2733
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2734
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2735
				+ "	    				</tr>");
2736
		for (Refferal entry : referrals) {
2737
 
2738
			sb.append("<tr>");
2739
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2740
 
2741
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2742
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2743
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2744
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2745
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2746
 
2747
			sb.append("</tr>");
2748
 
2749
		}
2750
 
2751
		sb.append("</tbody></table></body></html>");
2752
 
2753
		return sb.toString();
2754
	}
2755
 
30421 tejbeer 2756
	private String getMessageForUncontacblePartner(List<PartnerCollectionRemark> pcrs)
2757
			throws ProfitMandiBusinessException {
2758
		StringBuilder sb = new StringBuilder();
2759
		sb.append("<html><body><p>Alert</p><p>Not Responding Partner:-</p>"
2760
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2761
		sb.append("<tbody>\n" + "	    				<tr>\n"
2762
				+ "	    					<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n"
2763
				+ "	    					<th style='border:1px solid black;padding: 5px'>from</th>\n"
2764
 
2765
				+ "	    				</tr>");
2766
		for (PartnerCollectionRemark entry : pcrs) {
2767
 
2768
			CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
2769
 
2770
			sb.append("<tr>");
2771
			sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "("
2772
					+ customRetailer.getCode() + ")" + "</td>");
2773
 
2774
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2775
					+ entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
2776
 
2777
			sb.append("</tr>");
2778
 
2779
		}
2780
 
2781
		sb.append("</tbody></table></body></html>");
2782
 
2783
		return sb.toString();
2784
	}
2785
 
27271 amit.gupta 2786
	public void reverseWallet() throws Exception {
2787
		LocalDate localDate = LocalDate.of(2020, 10, 28);
28205 tejbeer 2788
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(),
2789
				localDate.plusDays(1).atStartOfDay(),
27271 amit.gupta 2790
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2791
		for (UserWalletHistory uwh : uwhList) {
28205 tejbeer 2792
			if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2793
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
28205 tejbeer 2794
				// LOGGER.info("UWH - {}", uwh);
2795
				// amount += uwh.getAmount();
2796
				// System.out.println("Amount is - " + amount);
2797
				// walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2798
				// uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2799
				// run", uwh.getBusinessTimestamp());
27313 amit.gupta 2800
				int orderId = uwh.getReference();
2801
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2802
				int inventoryItemId = 0;
28205 tejbeer 2803
				// fofoOrderRepository.delete(fofoOrder);
27313 amit.gupta 2804
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
28205 tejbeer 2805
				/*
2806
				 * List<PaymentOptionTransaction> paymentOptionTransactions =
2807
				 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2808
				 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2809
				 * paymentOptionTransaction : paymentOptionTransactions) {
2810
				 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2811
				 */
2812
				for (FofoOrderItem foi : fofoOrderItems) {
2813
					// fofoOrderItemRepository.delete(foi);
27313 amit.gupta 2814
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
28205 tejbeer 2815
					for (FofoLineItem fli : flis) {
2816
						// fofoLineItemRepository.delete(fli);
27313 amit.gupta 2817
						inventoryItemId = fli.getInventoryItemId();
2818
					}
2819
				}
28205 tejbeer 2820
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2821
						java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2822
				for (SchemeInOut sio : schemeInOuts) {
2823
					if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2824
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2825
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2826
					}
2827
				}
28205 tejbeer 2828
 
27271 amit.gupta 2829
			}
2830
		}
28205 tejbeer 2831
 
27271 amit.gupta 2832
	}
28205 tejbeer 2833
 
2834
	public void partnerProblemAlert() throws Exception {
2835
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
2836
		Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2837
				curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
2838
		Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1),
2839
				curDate.with(LocalTime.MAX), 0, false);
2840
		Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream()
2841
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2842
 
2843
		for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
2844
 
2845
			double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2846
 
2847
			LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
2848
 
28211 tejbeer 2849
			double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28208 tejbeer 2850
 
2851
			LOGGER.info("mtdSale" + mtdSale);
2852
 
28209 tejbeer 2853
			double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0
2854
					: pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2855
 
28208 tejbeer 2856
			LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
2857
 
28209 tejbeer 2858
			double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28208 tejbeer 2859
 
2860
			LOGGER.info("stockInvestment" + stockInvestment);
2861
 
28205 tejbeer 2862
			boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
2863
 
2864
			PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
2865
 
28210 tejbeer 2866
			if (partnerProblem == null) {
28205 tejbeer 2867
				partnerProblem = new PartnerProblem();
2868
				partnerProblem.setFofoId(ls.getKey());
2869
				if (mtdSale < lmtdTwentyPercentSale) {
2870
					partnerProblem.setMtd(1);
2871
				}
2872
				if (Investmentvalue) {
2873
					partnerProblem.setInvestment(1);
2874
				}
2875
 
2876
				if (stockInvestment < totalSixtyPercentInvestment) {
2877
					partnerProblem.setInvestment(1);
2878
				}
2879
 
2880
				partnerProblemRepository.persist(partnerProblem);
2881
			} else {
2882
				if (mtdSale < lmtdTwentyPercentSale) {
2883
					partnerProblem.setMtd(partnerProblem.getMtd() + 1);
2884
 
2885
				} else {
2886
					partnerProblem.setMtd(0);
2887
 
2888
				}
2889
				if (Investmentvalue) {
2890
					partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2891
				} else {
2892
					partnerProblem.setInvestment(0);
2893
 
2894
				}
2895
				if (stockInvestment < totalSixtyPercentInvestment) {
2896
					partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2897
				} else {
2898
					partnerProblem.setStockInvestment(0);
2899
				}
2900
 
2901
			}
2902
 
2903
		}
2904
 
28213 tejbeer 2905
		List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream()
2906
				.filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
2907
 
28223 tejbeer 2908
		partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
28224 tejbeer 2909
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
28223 tejbeer 2910
					+ x2.getStockInvestment() ? 1 : -1;
2911
		}).collect(Collectors.toList());
28227 tejbeer 2912
 
2913
		Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
2914
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
2915
					+ x2.getStockInvestment() ? 1 : -1;
2916
		}).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2917
 
28212 tejbeer 2918
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28213 tejbeer 2919
 
28467 tejbeer 2920
		List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28213 tejbeer 2921
 
2922
		Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream()
2923
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2924
 
28286 tejbeer 2925
		List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
30765 tejbeer 2926
				"niranjan.kala@smartdukaan.com", "sm@smartdukaan.com");
28208 tejbeer 2927
		LOGGER.info("partnerProblem" + partnerProblems);
28205 tejbeer 2928
		StringBuilder sb = new StringBuilder();
28218 tejbeer 2929
		sb.append("<htl><body>");
28222 tejbeer 2930
		sb.append(
2931
				"<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 2932
		sb.append("<tbody>\n" + "	    <tr>"
2933
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2934
				+ "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>"
2935
				+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2936
				+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2937
				+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
2938
				+ "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
2939
 
2940
				+ "	    				</tr>");
2941
 
2942
		for (PartnerProblem pp : partnerProblems) {
28467 tejbeer 2943
			int value = pp.getFofoId() % 4;
28205 tejbeer 2944
 
2945
			Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
28217 tejbeer 2946
			LOGGER.info("authUserMap" + authUserMap);
28205 tejbeer 2947
			sb.append("<tr>");
2948
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2949
					+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
28213 tejbeer 2950
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2951
					+ assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
28205 tejbeer 2952
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2953
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2954
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28216 tejbeer 2955
			sb.append("<td style='border:1px solid black;padding: 5px'>"
28224 tejbeer 2956
					+ (authUserMap.get(EscalationType.L1) == null ? "N/A"
30752 tejbeer 2957
							: authUserMap.get(EscalationType.L1).getFirstName())
28224 tejbeer 2958
					+ " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A"
30752 tejbeer 2959
							: authUserMap.get(EscalationType.L2).getFirstName())
28216 tejbeer 2960
					+ "</td>");
28205 tejbeer 2961
 
2962
			sb.append("</tr>");
2963
		}
2964
		sb.append("</tbody></table><br><br>");
2965
		String subject = "Partner Problem Alert!";
2966
		String[] email = sendTo.toArray(new String[sendTo.size()]);
2967
 
28222 tejbeer 2968
		this.sendMailHtmlFormat(email, sb.toString(), null, subject);
2969
 
28218 tejbeer 2970
		Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
2971
 
2972
		for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
28222 tejbeer 2973
			AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
28227 tejbeer 2974
			for (Integer patnerId : authUserPartner.getValue()) {
2975
				if (partnerProblemMap.get(patnerId) != null) {
28218 tejbeer 2976
 
28227 tejbeer 2977
					StringBuilder sbbuilder = new StringBuilder();
2978
					sbbuilder.append("<hml><body>");
2979
					sb.append(
2980
							"<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>");
2981
					sbbuilder.append("<tbody>\n" + "	    <tr>"
2982
							+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
2983
							+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
2984
							+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
2985
							+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 2986
 
28227 tejbeer 2987
							+ "	    				</tr>");
28218 tejbeer 2988
 
28227 tejbeer 2989
					for (Integer partnerId : authUserPartner.getValue()) {
2990
						if (partnerProblemMap.get(partnerId) != null) {
2991
							PartnerProblem pp = partnerProblemMap.get(partnerId);
2992
							sbbuilder.append("<tr>");
2993
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
2994
									+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2995
							sbbuilder
2996
									.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2997
							sbbuilder.append(
2998
									"<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2999
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
3000
									+ pp.getStockInvestment() + "</td>");
3001
 
3002
							sbbuilder.append("</tr>");
3003
						}
3004
 
28224 tejbeer 3005
					}
28227 tejbeer 3006
					sbbuilder.append("</tbody></table><br><br>");
28224 tejbeer 3007
 
28286 tejbeer 3008
					this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
28230 tejbeer 3009
					break;
28218 tejbeer 3010
				}
28230 tejbeer 3011
 
28223 tejbeer 3012
			}
28222 tejbeer 3013
		}
3014
	}
28218 tejbeer 3015
 
28222 tejbeer 3016
	private void sendMailHtmlFormat(String email[], String body, String cc[], String subject)
3017
			throws MessagingException, ProfitMandiBusinessException, IOException {
3018
		MimeMessage message = mailSender.createMimeMessage();
3019
		MimeMessageHelper helper = new MimeMessageHelper(message);
3020
		helper.setSubject(subject);
3021
		helper.setText(body, true);
3022
		helper.setTo(email);
3023
		if (cc != null) {
3024
			helper.setCc(cc);
28218 tejbeer 3025
		}
28222 tejbeer 3026
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
3027
		helper.setFrom(senderAddress);
3028
		mailSender.send(message);
28205 tejbeer 3029
	}
3030
 
28775 amit.gupta 3031
	@Autowired
3032
	WarehouseRepository warehouseRepository;
28790 amit.gupta 3033
 
28775 amit.gupta 3034
	public void getVendorWarehouses(int warehouseId) {
28778 amit.gupta 3035
		LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
28790 amit.gupta 3036
 
28775 amit.gupta 3037
	}
29488 manish 3038
 
29451 manish 3039
	public void checkImeiActivation() {
29488 manish 3040
 
29451 manish 3041
		try {
3042
			vivoImeiActivationService.checkImeiActivation();
3043
		} catch (ProfitMandiBusinessException e) {
3044
			// TODO Auto-generated catch block
3045
			e.printStackTrace();
3046
		} catch (IOException e) {
3047
			// TODO Auto-generated catch block
3048
			e.printStackTrace();
3049
		} catch (Exception e) {
3050
			// TODO Auto-generated catch block
3051
			e.printStackTrace();
3052
		}
28775 amit.gupta 3053
 
29451 manish 3054
	}
3055
 
29668 tejbeer 3056
	public void checkItelImeiActivation(LocalDate date, Integer day) {
29488 manish 3057
		LOGGER.info("Hello - {}", "hhh");
3058
 
3059
		try {
29668 tejbeer 3060
			itelImeiActivationService.checkItelImeiActivation(date, day);
29488 manish 3061
		} catch (ProfitMandiBusinessException e) {
3062
			// TODO Auto-generated catch block
3063
			e.printStackTrace();
3064
		} catch (IOException e) {
3065
			// TODO Auto-generated catch block
3066
			e.printStackTrace();
3067
		} catch (Exception e) {
3068
			// TODO Auto-generated catch block
3069
			e.printStackTrace();
3070
		}
3071
 
3072
	}
3073
 
29807 manish 3074
	public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate)
3075
			throws MessagingException, ProfitMandiBusinessException, IOException {
29801 manish 3076
		LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
3077
 
29807 manish 3078
		serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
3079
 
29801 manish 3080
	}
3081
 
29668 tejbeer 3082
	public void checkTecnoImeiActivation(LocalDate date, Integer day) {
29488 manish 3083
		LOGGER.info("Hello - {}", "hhh");
3084
 
3085
		try {
29668 tejbeer 3086
			tecnoImeiActivation.checkTecnoImeiActivation(date, day);
29488 manish 3087
		} catch (ProfitMandiBusinessException e) {
3088
			// TODO Auto-generated catch block
3089
			e.printStackTrace();
3090
		} catch (IOException e) {
3091
			// TODO Auto-generated catch block
3092
			e.printStackTrace();
3093
		} catch (Exception e) {
3094
			// TODO Auto-generated catch block
3095
			e.printStackTrace();
3096
		}
3097
 
3098
	}
3099
 
29252 amit.gupta 3100
	public void checkCancellationMargin() throws Exception {
3101
		LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3102
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3103
		LOGGER.info("Total Orders =  {}", fofoOrders.size());
29308 tejbeer 3104
		for (FofoOrder fofoOrder : fofoOrders) {
3105
			List<UserWalletHistory> history = userWalletHistoryRepository
3106
					.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3107
			history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(),
3108
					WalletReferenceType.ACTIVATION_SCHEME));
3109
			int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3110
			if (Math.abs(walletSum) > 1) {
3111
				// LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3112
				// = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
29252 amit.gupta 3113
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3114
				List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3115
				FofoLineItem fli = flis.get(0);
29308 tejbeer 3116
				if (StringUtils.isEmpty(fli.getSerialNumber()))
3117
					continue;
3118
				List<SchemeInOut> schemeInOuts = schemeInOutRepository
3119
						.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
29252 amit.gupta 3120
				InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
29308 tejbeer 3121
				double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null)
3122
						.mapToDouble(x -> x.getAmount()).sum();
3123
				/*
3124
				 * if(inventoryItem.getGoodQuantity()==1) {
3125
				 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3126
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3127
				 * inventoryItem.getUpdateTimestamp()); } else
3128
				 * if(inventoryItem.getBadQuantity()==1){
3129
				 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3130
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3131
				 * inventoryItem.getUpdateTimestamp()); } else if
3132
				 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3133
				 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3134
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3135
				 * inventoryItem.getUpdateTimestamp()); }
3136
				 */
3137
				if (inventoryItem.getLastScanType().equals(ScanType.SALE)
3138
						|| inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3139
					Map<String, Double> map = schemeInOuts.stream()
3140
							.collect(
3141
									Collectors.groupingBy(
3142
											x -> DateTimeFormatter.ofPattern("yyyyMMddHH")
3143
													.format(x.getCreateTimestamp()) + "- " + x.getSchemeId(),
3144
											Collectors.summingDouble(x -> x.getAmount())));
3145
					for (Map.Entry<String, Double> entry : map.entrySet()) {
3146
						LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
29252 amit.gupta 3147
					}
29308 tejbeer 3148
					LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(),
3149
							inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
29252 amit.gupta 3150
				}
3151
			}
3152
		}
29308 tejbeer 3153
 
29252 amit.gupta 3154
	}
3155
 
29488 manish 3156
	public static String readFileAsString(String file) throws Exception {
3157
		String data = "";
3158
		data = new String(Files.readAllBytes(Paths.get(file)));
3159
		return data;
3160
	}
29451 manish 3161
 
29308 tejbeer 3162
	public void markDelhiveryOrderDelivered() throws ProfitMandiBusinessException, IOException {
3163
		List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.DELHIVERY_PROVIDERID,
3164
				OrderStatus.SHIPPED_FROM_WH);
3165
 
3166
		if (!orders.isEmpty()) {
29441 tejbeer 3167
			Set<String> airwayBill = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 3168
 
29441 tejbeer 3169
			int arraylength = airwayBill.size();
3170
 
3171
			if (arraylength >= 75) {
3172
 
3173
				airwayBill = airwayBill.stream().limit(74).collect(Collectors.toSet());
3174
			}
29308 tejbeer 3175
			LOGGER.info("airwayBill" + airwayBill);
3176
			String url = "https://track.delhivery.com/api/v1/packages/json/";
3177
 
3178
			OkHttpClient client = new OkHttpClient();
3179
 
3180
			Request request1 = new Request.Builder()
3181
					.url(url + "?waybill=" + String.join(",", airwayBill) + "&token=" + token).get().build();
3182
 
3183
			LOGGER.info("request1" + request1);
3184
 
3185
			Response response = client.newCall(request1).execute();
3186
 
3187
			LOGGER.info("jsonbj" + response.body());
3188
 
3189
			JSONObject jsonObj = new JSONObject(response.body().string());
3190
 
3191
			LOGGER.info("jsonObj" + jsonObj);
3192
 
29403 tejbeer 3193
			JSONArray shipmentData = jsonObj.getJSONArray("ShipmentData");
29308 tejbeer 3194
			Set<String> airwaybillStatus = new HashSet<>();
29403 tejbeer 3195
			for (int i = 0; i < shipmentData.length(); i++) {
3196
				JSONObject jsonObject = shipmentData.getJSONObject(i);
29308 tejbeer 3197
				JSONObject shipment = jsonObject.getJSONObject("Shipment");
3198
 
3199
				LOGGER.info("shipment" + shipment);
3200
				JSONObject statusDescription = shipment.getJSONObject("Status");
3201
				String awb = shipment.getString("AWB");
3202
 
3203
				String status = statusDescription.getString("Status");
3204
				LOGGER.info("status" + status);
3205
 
3206
				LOGGER.info("awb" + awb);
3207
				if (status.equals("Delivered")) {
3208
					airwaybillStatus.add(awb);
3209
				}
3210
 
3211
			}
3212
			if (!airwaybillStatus.isEmpty()) {
3213
				for (String aws : airwaybillStatus) {
3214
 
3215
					List<Order> deliverdOrders = orderRepository.selectByAirwayBillNumber(aws);
3216
					for (Order dlo : deliverdOrders) {
3217
						dlo.setStatus(OrderStatus.DELIVERY_SUCCESS);
29403 tejbeer 3218
						dlo.setStatusDescription("Order Delivered");
29308 tejbeer 3219
						dlo.setDeliveryTimestamp(LocalDateTime.now());
3220
					}
3221
 
3222
					SendNotificationModel sendNotificationModel = new SendNotificationModel();
3223
					sendNotificationModel.setCampaignName("Order Delivered");
3224
					sendNotificationModel.setTitle("Order Delivered");
3225
					sendNotificationModel.setMessage(String.format("Dear partner, your SmartDukaan ORDER " + aws
29336 tejbeer 3226
							+ "has been delivered to you in a safe sealed bag" + "."));
29308 tejbeer 3227
					sendNotificationModel.setType("url");
3228
					sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3229
					sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
3230
					sendNotificationModel.setMessageType(MessageType.notification);
3231
					int userId = userAccountRepository.selectUserIdByRetailerId(orders.get(0).getRetailerId());
3232
					sendNotificationModel.setUserIds(Arrays.asList(userId));
3233
					notificationService.sendNotification(sendNotificationModel);
3234
 
3235
				}
3236
			}
3237
 
3238
		}
3239
	}
3240
 
29814 tejbeer 3241
	public void partnerWiseCreditAccount() throws Exception {
3242
 
3243
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
3244
 
3245
		for (FofoStore fs : fofoStores) {
3246
 
3247
			if (fs.getPan() != null) {
3248
				AccountStatusResponseOut accountStatusResponseOut = mandiiService.getStatus(fs.getPan());
29815 tejbeer 3249
 
3250
				LOGGER.info("accountStatusResponseOut" + accountStatusResponseOut);
29814 tejbeer 3251
				CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fs.getId(),
3252
						Gateway.MANDII);
3253
 
3254
				if (creditAccount == null) {
3255
 
3256
					creditAccount = new CreditAccount();
3257
 
3258
					creditAccount.setFofoId(fs.getId());
3259
					creditAccount.setGateway(Gateway.MANDII);
3260
 
3261
				}
29835 tejbeer 3262
 
3263
				if (accountStatusResponseOut == null) {
3264
					creditAccount.setCreditStatus(CreditStatus.UNKNOWN);
3265
					creditAccount.setDescription("User company not found");
3266
 
29817 tejbeer 3267
				} else {
29835 tejbeer 3268
					if (accountStatusResponseOut.getSanctionLimit() != null) {
3269
						creditAccount.setSanctionedAmount(accountStatusResponseOut.getSanctionLimit().floatValue());
3270
					} else {
3271
						creditAccount.setSanctionedAmount(0);
3272
					}
29817 tejbeer 3273
 
29835 tejbeer 3274
					creditAccount.setInterestRate(accountStatusResponseOut.getRateOfInterest());
3275
					if (accountStatusResponseOut.getBalanceAmount() != null) {
3276
						creditAccount.setAvailableAmount(accountStatusResponseOut.getBalanceAmount().floatValue());
3277
					} else {
3278
						creditAccount.setAvailableAmount(0);
3279
					}
3280
 
3281
					if (accountStatusResponseOut.getCurrentStage() != null) {
3282
						creditAccount.setDescription(accountStatusResponseOut.getCurrentStage().toString());
3283
					}
3284
					if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.SANCTION_AVAILABLE)) {
3285
						creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
3286
					} else if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.IN_ELIGIBLE)) {
3287
						creditAccount.setCreditStatus(CreditStatus.INELIGIBLE);
3288
					} else {
3289
 
3290
						creditAccount.setCreditStatus(CreditStatus.TO_BE_EVALUATED);
3291
					}
29817 tejbeer 3292
				}
3293
 
29814 tejbeer 3294
				creditAccount.setUpdatedOn(LocalDateTime.now());
3295
				creditAccountRepository.persist(creditAccount);
3296
			}
3297
		}
3298
	}
3299
 
30421 tejbeer 3300
	@Autowired
3301
	private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
3302
 
3303
	public void reviewUncontactablePartner()
3304
			throws ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3305
 
3306
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
3307
 
3308
		List<Integer> pcrms = partnerCollectionRemarkRepository
3309
				.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
3310
 
3311
		if (!pcrms.isEmpty()) {
3312
			Map<Integer, PartnerCollectionRemark> partnerCollectionRemarksMap = partnerCollectionRemarkRepository
3313
					.selectByIds(pcrms).stream().filter(x -> x.getRemark().equals(CollectionRemark.NOT_RESPONDING))
3314
					.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3315
 
3316
			if (!partnerCollectionRemarksMap.isEmpty()) {
3317
				for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping()
3318
						.entrySet()) {
3319
					List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3320
							.map(x -> partnerCollectionRemarksMap.get(x)).filter(x -> x != null)
3321
							.collect(Collectors.toList());
30752 tejbeer 3322
					String subject = "UNCONTACTABLE PARTNERS";
30421 tejbeer 3323
					String messageText = this.getMessageForUncontacblePartner(filteredRows);
3324
 
3325
					MimeMessage message = mailSender.createMimeMessage();
3326
					MimeMessageHelper helper = new MimeMessageHelper(message, true);
30752 tejbeer 3327
					String[] email = new String[] { storeGuyEntry.getKey() };
30421 tejbeer 3328
 
3329
					helper.setSubject(subject);
3330
					helper.setText(messageText, true);
3331
					helper.setTo(email);
3332
					InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com",
3333
							"Smartdukaan Alerts");
3334
					helper.setFrom(senderAddress);
3335
					mailSender.send(message);
3336
 
3337
					LOGGER.info("filteredRows {}", filteredRows);
3338
 
3339
				}
3340
			}
30859 tejbeer 3341
 
30421 tejbeer 3342
		}
3343
	}
3344
 
30859 tejbeer 3345
	@Autowired
3346
	private LoanRepository loanRepository;
3347
 
3348
	@Autowired
3349
	private LoanStatementRepository loanStatementRepository;
3350
 
3351
	@Autowired
3352
	private SDCreditService sdCreditService;
3353
 
3354
	@Autowired
3355
	private SDCreditRequirementRepository sdCreditRequirementRepository;
3356
 
30936 tejbeer 3357
	@Autowired
3358
	private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
3359
 
3360
	@Autowired
3361
	private TransactionRepository transactionRepository;
3362
 
3363
	@Autowired
3364
	private CreditAccountRepository crediRepository;
3365
 
30859 tejbeer 3366
	public void calculateInterestAccured() throws ProfitMandiBusinessException {
3367
 
3368
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3369
 
3370
		if (!loans.isEmpty()) {
3371
 
3372
			for (Loan loan : loans) {
3373
 
3374
				List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3375
 
3376
				Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(Collectors.groupingBy(
3377
						x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
3378
 
3379
				if (loan.getFreeDays() > 0) {
3380
					LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(loan.getFreeDays() - 1);
30936 tejbeer 3381
 
3382
					LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
30859 tejbeer 3383
					if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
30936 tejbeer 3384
						int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(),
3385
								loan.getId());
3386
						LOGGER.info("loanStatementId {}", loanStatementId);
30859 tejbeer 3387
 
30936 tejbeer 3388
						if (loanStatementId != 0) {
3389
 
3390
							this.calculateInterest(loan, loanStatusAmount, loanStatementId);
3391
 
3392
						} else {
3393
							sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan,
3394
									loanStatusAmount);
3395
						}
3396
 
30859 tejbeer 3397
					}
3398
				} else {
3399
 
3400
					int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(),
3401
							loan.getId());
30936 tejbeer 3402
					LOGGER.info("loanStatementId2 {}", loanStatementId);
30859 tejbeer 3403
 
30936 tejbeer 3404
					this.calculateInterest(loan, loanStatusAmount, loanStatementId);
30859 tejbeer 3405
 
3406
				}
3407
 
3408
			}
3409
		}
3410
 
3411
	}
3412
 
30936 tejbeer 3413
	private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount, int loanStatementId)
3414
			throws ProfitMandiBusinessException {
3415
		LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
3416
 
3417
		if (loanStatement.getLoanId() == loan.getId()) {
3418
 
3419
			sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan,
3420
					loanStatusAmount);
3421
 
3422
		} else {
3423
			throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3424
		}
3425
	}
3426
 
30859 tejbeer 3427
	public void loanSettlement() throws ProfitMandiBusinessException {
3428
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3429
 
3430
		if (!loans.isEmpty()) {
3431
 
3432
			for (Loan loan : loans) {
3433
 
3434
				UserWallet userWallet = userWalletRepository.selectByRetailerId(loan.getFofoId());
3435
				SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository
3436
						.selectByFofoId(loan.getFofoId());
3437
 
3438
				if (userWallet.getAmount() >= 100) {
3439
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3440
 
3441
					Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream()
3442
							.collect(Collectors.groupingBy(x -> x.getLoanReferenceType(),
3443
									Collectors.summingDouble(x -> x.getAmount().doubleValue())));
3444
 
3445
					LOGGER.info("loanStatusAmount {}", loanStatusAmount);
3446
					double interestAmount = loanStatusAmount.get(LoanReferenceType.INTEREST);
3447
 
3448
					double principalAmount = loanStatusAmount.get(LoanReferenceType.PRINCIPAL);
3449
					double paidAmount = 0;
3450
					if (userWallet.getAmount() > Math.abs(interestAmount)) {
3451
 
3452
						if (interestAmount != 0) {
3453
 
3454
							settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(interestAmount),
3455
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3456
									LocalDateTime.now());
3457
							loan.setInterestPaid(loan.getInterestPaid().add(BigDecimal.valueOf(interestAmount).abs()));
3458
 
3459
							paidAmount += Math.abs(interestAmount);
3460
						}
3461
 
3462
						double userWalletAmount = userWallet.getAmount() - Math.abs(interestAmount);
3463
 
3464
						if (userWalletAmount > Math.abs(principalAmount) && principalAmount != 0) {
3465
 
3466
							settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(principalAmount),
3467
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3468
									LocalDateTime.now());
3469
							double amount = userWalletAmount - Math.abs(principalAmount);
3470
 
3471
							paidAmount += Math.abs(principalAmount);
3472
 
3473
							userWallet.setAmount((int) amount);
3474
 
3475
							sdCreditRequirement.setAvailableLimit(sdCreditRequirement.getAvailableLimit()
3476
									.add(BigDecimal.valueOf(principalAmount).abs()));
3477
							sdCreditRequirement.setUtilizedAmount(sdCreditRequirement.getUtilizedAmount()
3478
									.subtract(BigDecimal.valueOf(principalAmount).abs()));
3479
 
3480
							loan.setPendingAmount(BigDecimal.ZERO);
3481
 
3482
						} else if (principalAmount != 0) {
3483
 
3484
							settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(userWalletAmount),
3485
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3486
									LocalDateTime.now());
3487
 
3488
							paidAmount += Math.abs(userWalletAmount);
3489
 
3490
							sdCreditRequirement.setAvailableLimit(sdCreditRequirement.getAvailableLimit()
3491
									.add(BigDecimal.valueOf(userWalletAmount)).abs());
3492
							sdCreditRequirement.setUtilizedAmount(sdCreditRequirement.getUtilizedAmount()
3493
									.subtract(BigDecimal.valueOf(userWalletAmount)).abs());
3494
							userWallet.setAmount(0);
3495
 
3496
							loan.setPendingAmount(
3497
									loan.getPendingAmount().subtract(BigDecimal.valueOf(userWalletAmount)));
3498
 
3499
						}
3500
 
3501
						createUserWalletHistory(userWallet.getId(), userWallet.getUserId(),
3502
								WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
3503
 
3504
					} else {
3505
 
3506
						settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(userWallet.getAmount()),
3507
								loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
3508
 
3509
						paidAmount += Math.abs(userWallet.getAmount());
3510
 
3511
						createUserWalletHistory(userWallet.getId(), userWallet.getUserId(),
3512
								WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
3513
 
3514
						loan.setInterestPaid(
3515
								loan.getInterestPaid().add(BigDecimal.valueOf(userWallet.getAmount()).abs()));
3516
 
3517
						userWallet.setAmount(0);
3518
					}
3519
 
3520
				}
3521
			}
3522
		}
3523
 
3524
	}
3525
 
3526
	private void settledLoanStatement(LoanReferenceType loanReferneceType, BigDecimal amount, int fofoId, int loanId,
3527
			String description, LocalDateTime now) {
3528
 
3529
		sdCreditService.createLoanStatement(loanReferneceType, amount.abs(), fofoId, loanId, description,
3530
				LocalDateTime.now());
3531
 
3532
	}
3533
 
3534
	private void createUserWalletHistory(int walletId, int userId, WalletReferenceType referenceType, int loanId,
3535
			double interestAmount) {
3536
		UserWalletHistory uwh = new UserWalletHistory();
3537
		uwh.setWalletId(walletId);
3538
		uwh.setFofoId(userId);
3539
		uwh.setBusinessTimestamp(LocalDateTime.now());
3540
		uwh.setReferenceType(referenceType);
3541
		uwh.setReference(loanId);
3542
		uwh.setTimestamp(LocalDateTime.now());
3543
		uwh.setAmount((int) -(interestAmount));
30908 tejbeer 3544
		uwh.setDescription("Amount adjusted against loan");
30859 tejbeer 3545
		userWalletHistoryRepository.persist(uwh);
3546
 
3547
	}
3548
 
3549
	public void dailyLoanAlert() throws ProfitMandiBusinessException {
3550
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3551
 
3552
		Map<Integer, Double> partnerLoanAmount = new HashMap<>();
3553
 
3554
		if (!loans.isEmpty()) {
3555
 
3556
			for (Loan loan : loans) {
3557
 
3558
				List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3559
 
3560
				double amount = loanStatements.stream().map(x -> x.getAmount())
3561
						.collect(Collectors.summingDouble(x -> x.doubleValue()));
3562
				if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3563
					amount += partnerLoanAmount.get(loan.getFofoId());
3564
					partnerLoanAmount.put(loan.getFofoId(), amount);
3565
				} else {
3566
					partnerLoanAmount.put(loan.getFofoId(), amount);
3567
				}
3568
 
3569
			}
3570
 
3571
		}
3572
 
3573
		if (!partnerLoanAmount.isEmpty()) {
3574
 
3575
			for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
3576
 
3577
				int fofoId = partnerLoanAmountEnrty.getKey();
3578
 
3579
				String title = "Alert! Credit o/s";
3580
				String url = "http://app.smartdukaan.com/pages/home/credit";
3581
				String message = "Your total pending Loan amount is Rs."
3582
						+ FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue()));
3583
				notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
3584
 
3585
			}
3586
 
3587
		}
3588
 
3589
	}
3590
 
30896 amit.gupta 3591
	public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3592
		schemeService.processActivatedImeisForSchemes();
3593
	}
3594
 
30913 tejbeer 3595
	public void updatePartnerLimit() throws ProfitMandiBusinessException {
3596
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
3597
 
3598
		Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream()
3599
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3600
		Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository
3601
				.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30933 tejbeer 3602
		double limitValue = 100000;
30913 tejbeer 3603
		for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3604
			int fofoId = customRetailerEntry.getKey();
3605
			SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
30929 tejbeer 3606
			LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
30913 tejbeer 3607
			CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
3608
			BigDecimal suggestedAmount = BigDecimal.ZERO;
3609
			if (currentPartnerDailyInvestment != null) {
3610
				suggestedAmount = BigDecimal.valueOf(currentPartnerDailyInvestment.getTotalInvestment() * 0.1);
3611
			}
3612
 
30933 tejbeer 3613
			if (suggestedAmount.doubleValue() > limitValue) {
30917 tejbeer 3614
 
30933 tejbeer 3615
				suggestedAmount = BigDecimal.valueOf(limitValue);
30917 tejbeer 3616
 
3617
			}
30920 tejbeer 3618
 
3619
			if (suggestedAmount.doubleValue() < 0) {
3620
				suggestedAmount = BigDecimal.ZERO;
3621
			}
3622
 
30913 tejbeer 3623
			LOGGER.info("suggestedAmount {} ", suggestedAmount);
3624
 
3625
			if (sdCreditRequirement == null) {
3626
				sdCreditRequirement = new SDCreditRequirement();
3627
				sdCreditRequirement.setFofoId(fofoId);
3628
				sdCreditRequirement.setCreditDays(15);
3629
				sdCreditRequirement.setInterestRate(BigDecimal.valueOf(0.05));
3630
				sdCreditRequirement.setSuggestedLimit(suggestedAmount);
30929 tejbeer 3631
				sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
30913 tejbeer 3632
				sdCreditRequirement.setLimit(suggestedAmount);
3633
				sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3634
				sdCreditRequirement.setAvailableLimit(suggestedAmount);
3635
				sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3636
				sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3637
				sdCreditRequirementRepository.persist(sdCreditRequirement);
3638
			}
30929 tejbeer 3639
 
30936 tejbeer 3640
			CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30929 tejbeer 3641
 
3642
			sdCreditRequirement.setRisk(creditRisk);
3643
 
30913 tejbeer 3644
			sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3645
			sdCreditRequirement.setLimit(suggestedAmount);
3646
			BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
3647
 
3648
			BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
3649
 
3650
			LOGGER.info("utilizedLimit {} ", utilizedLimit);
3651
 
3652
			LOGGER.info("availableLimit {} ", availableLimit);
3653
 
3654
			sdCreditRequirement.setUtilizedAmount(utilizedLimit);
3655
 
3656
			sdCreditRequirement.setAvailableLimit(availableLimit);
3657
 
3658
			sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3659
 
30934 tejbeer 3660
			CreditAccount creditAccount = creditAccountRepository
3661
					.selectByFofoIdAndGateway(sdCreditRequirement.getFofoId(), Gateway.SDDIRECT);
3662
			if (creditAccount == null) {
3663
				creditAccount = new CreditAccount();
3664
				creditAccount.setFofoId(sdCreditRequirement.getFofoId());
3665
				creditAccount.setGateway(Gateway.SDDIRECT);
3666
				creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
3667
				creditAccount.setActive(false);
3668
 
3669
				creditAccount.setUpdatedOn(LocalDateTime.now());
3670
 
3671
				creditAccountRepository.persist(creditAccount);
3672
			}
3673
 
3674
			creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3675
			creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3676
			creditAccount.setAvailableAmount(availableLimit.floatValue());
3677
			creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3678
			creditAccount.setUpdatedOn(LocalDateTime.now());
3679
 
30913 tejbeer 3680
		}
3681
 
3682
	}
3683
 
30936 tejbeer 3684
	public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 3685
 
30936 tejbeer 3686
		sdCreditService.updateRisk();
3687
		List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
3688
		if (!defaultLoans.isEmpty()) {
3689
			this.sendDefaultLoanAlert(defaultLoans);
30929 tejbeer 3690
		}
3691
 
3692
	}
3693
 
30936 tejbeer 3694
	public void sendDefaultLoanAlert(List<Loan> defaultLoans)
3695
			throws ProfitMandiBusinessException, MessagingException, IOException {
3696
		String subject = "Default Partners";
30929 tejbeer 3697
 
30936 tejbeer 3698
		List<AuthUser> authUsers = csService
3699
				.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_FINANCIAL_SERVICES);
3700
		if (!authUsers.isEmpty()) {
3701
			List<String> financeEmails = authUsers.stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3702
			String messageText = this.getMessageForDueDateExtend(defaultLoans);
30929 tejbeer 3703
 
30936 tejbeer 3704
			String[] email = financeEmails.toArray(new String[financeEmails.size()]);
30929 tejbeer 3705
 
30936 tejbeer 3706
			this.sendMailHtmlFormat(email, messageText, null, subject);
30929 tejbeer 3707
 
30936 tejbeer 3708
		}
30929 tejbeer 3709
 
30936 tejbeer 3710
		for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
3711
			List<Loan> filteredRows = new ArrayList<>();
3712
			for (Loan loan : defaultLoans) {
30929 tejbeer 3713
 
30936 tejbeer 3714
				if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 3715
 
30936 tejbeer 3716
					filteredRows.add(loan);
30929 tejbeer 3717
				}
3718
			}
30936 tejbeer 3719
			if (!filteredRows.isEmpty()) {
3720
				String messageText = this.getMessageForDueDateExtend(filteredRows);
3721
				String[] email = new String[] { storeGuyEntry.getKey() };
30929 tejbeer 3722
 
30936 tejbeer 3723
				this.sendMailHtmlFormat(email, messageText, null, subject);
30929 tejbeer 3724
 
30931 tejbeer 3725
			}
3726
 
30936 tejbeer 3727
		}
30929 tejbeer 3728
 
30936 tejbeer 3729
		for (Loan defaultLoan : defaultLoans) {
3730
			List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 3731
 
30936 tejbeer 3732
			double amount = loanStatements.stream().map(x -> x.getAmount())
3733
					.collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3734
 
30936 tejbeer 3735
			String title = "Loan amount overdue!";
3736
			String url = "http://app.smartdukaan.com/pages/home/credit";
3737
			String message = "Your loan due date ("
3738
					+ defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
3739
					+ ") has been exceeded. Additional penal interest of " + defaultLoan.getInterestRate()
3740
					+ "%  + Rs.100 shall be levied on daily basis. " + "Your total pending Loan amount is Rs."
3741
					+ FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
3742
			notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title,
3743
					message, url);
3744
 
30929 tejbeer 3745
		}
3746
	}
3747
 
3748
	private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
3749
		StringBuilder sb = new StringBuilder();
30936 tejbeer 3750
		sb.append(
3751
				"<html><body><p>Alert</p><p>Default Partners :-</p>" + "<br/><p>EveryDay Rs.100 charged as Penalty</p>"
3752
						+ "<br/><table style='border:1px solid black ;padding: 5px';>");
30929 tejbeer 3753
		sb.append("<tbody>\n" + "	    				<tr>\n"
3754
				+ "	    					<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n"
3755
				+ "	    					<th style='border:1px solid black;padding: 5px'>due date</th>\n"
3756
				+ "	    					<th style='border:1px solid black;padding: 5px'>Days</th>\n"
30936 tejbeer 3757
				+ "	    					<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n"
30929 tejbeer 3758
 
3759
				+ "	    				</tr>");
3760
		for (Loan entry : loans) {
30936 tejbeer 3761
 
3762
			List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
3763
 
3764
			double amount = loanStatements.stream().map(x -> x.getAmount())
3765
					.collect(Collectors.summingDouble(x -> x.doubleValue()));
3766
 
30929 tejbeer 3767
			long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
3768
 
3769
			CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3770
 
3771
			sb.append("<tr>");
3772
			sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "("
3773
					+ customRetailer.getCode() + ")" + "</td>");
3774
 
3775
			sb.append("<td style='border:1px solid black;padding: 5px'>"
3776
					+ entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3777
			sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
30936 tejbeer 3778
			sb.append("<td style='border:1px solid black;padding: 5px'>"
3779
					+ new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
30929 tejbeer 3780
 
3781
			sb.append("</tr>");
3782
 
3783
		}
3784
 
3785
		sb.append("</tbody></table></body></html>");
3786
 
3787
		return sb.toString();
3788
	}
3789
 
30936 tejbeer 3790
	public void notifyLoanDueDateCross() throws ProfitMandiBusinessException, MessagingException, IOException {
3791
 
3792
		List<Loan> loans = loanRepository.selectAllActiveLoan().stream()
3793
				.filter(x -> x.getDueDate().isBefore(LocalDateTime.now())).collect(Collectors.toList());
3794
		if (!loans.isEmpty()) {
3795
			for (Loan loan : loans) {
3796
 
3797
				long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
3798
 
3799
				LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
3800
 
3801
				if (noOfdaysBetween <= 15 && noOfdaysBetween >= 0) {
3802
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3803
 
3804
					double amount = loanStatements.stream().map(x -> x.getAmount())
3805
							.collect(Collectors.summingDouble(x -> x.doubleValue()));
3806
 
3807
					String title = "Alert! Credit o/s";
3808
					String url = "http://app.smartdukaan.com/pages/home/credit";
3809
					String message = "Your loan due date ("
3810
							+ loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
3811
							+ ") has been exceeded. Additional penal interest of " + loan.getInterestRate()
3812
							+ "% shall be levied on daily basis. Your total pending Loan amount is Rs."
3813
							+ FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
3814
					notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title,
3815
							message, url);
3816
				}
3817
			}
3818
		}
3819
 
3820
	}
3821
 
3822
	public void alertForDueDate() throws ProfitMandiBusinessException, MessagingException, IOException {
3823
 
3824
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3825
 
3826
		if (!loans.isEmpty()) {
3827
			for (Loan loan : loans) {
3828
 
3829
				long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
3830
 
3831
				LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
3832
 
3833
				if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
3834
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3835
					double amount = loanStatements.stream().map(x -> x.getAmount())
3836
							.collect(Collectors.summingDouble(x -> x.doubleValue()));
3837
 
3838
					String title = "Alert! Credit o/s";
3839
					String url = "http://app.smartdukaan.com/pages/home/credit";
3840
					String message = null;
3841
					if (noOfdaysBetween == 0) {
3842
 
3843
						message = "Your total pending Loan amount is Rs."
3844
								+ FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
3845
 
3846
					} else {
3847
 
3848
						message = "Your total pending Loan amount is Rs."
3849
								+ FormattingUtils.formatDecimal(Math.abs(amount)) + " is due by "
3850
								+ loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
3851
								+ ", Pay Now!!";
3852
 
3853
					}
3854
					notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title,
3855
							message, url);
3856
				}
3857
			}
3858
		}
3859
 
3860
	}
3861
 
26418 tejbeer 3862
}
29814 tejbeer 3863
 
27438 amit.gupta 3864
//2284