Subversion Repositories SmartDukaan

Rev

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