Subversion Repositories SmartDukaan

Rev

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