Subversion Repositories SmartDukaan

Rev

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

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