Subversion Repositories SmartDukaan

Rev

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