Subversion Repositories SmartDukaan

Rev

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