Subversion Repositories SmartDukaan

Rev

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