Subversion Repositories SmartDukaan

Rev

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