Subversion Repositories SmartDukaan

Rev

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

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