Subversion Repositories SmartDukaan

Rev

Rev 31177 | Rev 31207 | 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
 
31169 tejbeer 1836
			// com.spice.profitmandi.dao.entity.user.User user =
1837
			// userUserRepository.selectById(fofoId);
30982 tejbeer 1838
 
31169 tejbeer 1839
			// Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 1840
 
1841
			String title = "Sale Update";
1842
			String messageTemplate = String.format("Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1843
					model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1844
					String.format(timeString, now.format(timeFormatter)));
25821 amit.gupta 1845
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
1846
			sendNotificationModel.setCampaignName("Sales update alert");
30982 tejbeer 1847
			sendNotificationModel.setTitle(title);
1848
			sendNotificationModel.setMessage(messageTemplate);
25821 amit.gupta 1849
			sendNotificationModel.setType("url");
27206 tejbeer 1850
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25821 amit.gupta 1851
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1852
			sendNotificationModel.setMessageType(MessageType.notification);
25872 tejbeer 1853
			int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1854
			sendNotificationModel.setUserIds(Arrays.asList(userId));
25854 amit.gupta 1855
			notificationService.sendNotification(sendNotificationModel);
30999 tejbeer 1856
			String whatsappMessageTemplate = String.format(
1857
					"Dear Partner, Your sale update is Smartphones Rs.%.0f, Insurance Rs.%.0f, Total Rs.%.0f till %s.",
1858
					model.getSmartphoneSale(), model.getInsuranceSale(), model.getTotalSale(),
1859
					String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 1860
			// notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
1861
			// address.getPhoneNumber());
30982 tejbeer 1862
 
24653 govind 1863
		}
26945 amit.gupta 1864
		// String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1865
		// saleTargetReportModelMap);
31169 tejbeer 1866
		this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
1867
		/*
1868
		 * String cc[] = { "tarun.verma@smartdukaan.com",
1869
		 * "kamini.sharma@smartdukaan.com", "niranjan.kala@smartdukaan.com",
1870
		 * "sm@smartdukaan.com" };
1871
		 *
1872
		 * String subject = String.format("Sale till %s", String.format(timeString,
1873
		 * now.format(timeFormatter))); //
1874
		 * this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc, //
1875
		 * subject); this.sendMailOfHtmlFormat("amit.gupta@smartdukaan.com",
1876
		 * statewiseSaleReport, cc, "Statewise" + subject);
1877
		 */
24653 govind 1878
	}
1879
 
28377 tejbeer 1880
	public void checkRazorPayPaymentStatus() throws Exception {
28368 tejbeer 1881
		List<PendingOrder> pendingOrder = pendingOrderRepository
1882
				.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
1883
 
1884
		for (PendingOrder po : pendingOrder) {
1885
			RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
28377 tejbeer 1886
			List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28368 tejbeer 1887
 
28369 tejbeer 1888
			LOGGER.info("razorPay" + razorPay);
1889
			if (razorPay != null) {
1890
				List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28377 tejbeer 1891
 
28369 tejbeer 1892
				if (!payments.isEmpty()) {
28377 tejbeer 1893
					List<String> statusList = new ArrayList<>();
28369 tejbeer 1894
					for (Payment payment : payments) {
28368 tejbeer 1895
 
28377 tejbeer 1896
						JSONObject jsonObj = new JSONObject(payment.toString());
1897
 
1898
						String status = jsonObj.getString("status");
1899
 
1900
						statusList.add(status);
1901
 
28369 tejbeer 1902
					}
28377 tejbeer 1903
					LOGGER.info("statusList" + statusList);
28368 tejbeer 1904
 
28377 tejbeer 1905
					if (statusList.contains("authorized") || statusList.contains("captured")) {
1906
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1907
						po.setPaidAmount(po.getTotalAmount());
1908
						for (PendingOrderItem poi : poItems) {
1909
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1910
						}
1911
						Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
1912
 
1913
						CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1914
						Customer customer = customerRepository.selectById(po.getCustomerId());
1915
						String[] customerEmail = null;
1916
						if (customer.getEmailId() != null) {
30752 tejbeer 1917
							customerEmail = new String[] { customer.getEmailId() };
28377 tejbeer 1918
						}
1919
						List<String> bccTo = Arrays.asList("kamini.sharma@smartdukaan.com",
28467 tejbeer 1920
								"tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "sm@smartdukaan.com",
1921
								"tejbeer.kaur@shop2020.in", customRetailer.getEmail());
28377 tejbeer 1922
						List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1923
						if (authUserEmails != null) {
1924
							authUserEmails = new ArrayList<>();
1925
						}
1926
						authUserEmails.addAll(bccTo);
1927
 
28382 tejbeer 1928
						// emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1929
						// "order-confirm.vm",
1930
						// emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
28377 tejbeer 1931
 
1932
					} else if (statusList.contains("refunded") || statusList.contains("failed")) {
1933
						for (PendingOrderItem poi : poItems) {
1934
							poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1935
						}
1936
 
1937
						po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1938
					}
1939
 
28369 tejbeer 1940
				}
28377 tejbeer 1941
				// LOGGER.info("payment" + payments);
28369 tejbeer 1942
 
1943
			}
28368 tejbeer 1944
		}
1945
	}
1946
 
25865 amit.gupta 1947
	public static class SaleTargetReportModel {
1948
		private double totalSale;
26941 amit.gupta 1949
		private long totalQty;
26945 amit.gupta 1950
		private double past3daysSale;
25880 amit.gupta 1951
		private int fofoId;
1952
 
1953
		public int getFofoId() {
1954
			return fofoId;
1955
		}
1956
 
1957
		public void setFofoId(int fofoId) {
1958
			this.fofoId = fofoId;
1959
		}
1960
 
25865 amit.gupta 1961
		private double smartphoneSale;
1962
		private long smartphoneQty;
1963
		private double insuranceSale;
1964
		private long insruanceQty;
1965
 
26941 amit.gupta 1966
		public long getTotalQty() {
1967
			return totalQty;
1968
		}
1969
 
1970
		public void setTotalQty(long totalQty) {
1971
			this.totalQty = totalQty;
1972
		}
1973
 
26945 amit.gupta 1974
		public double getPast3daysSale() {
1975
			return past3daysSale;
1976
		}
1977
 
1978
		public void setPast3daysSale(double past3daysSale) {
1979
			this.past3daysSale = past3daysSale;
1980
		}
1981
 
25865 amit.gupta 1982
		@Override
1983
		public int hashCode() {
1984
			final int prime = 31;
1985
			int result = 1;
25880 amit.gupta 1986
			result = prime * result + fofoId;
25865 amit.gupta 1987
			result = prime * result + (int) (insruanceQty ^ (insruanceQty >>> 32));
1988
			long temp;
1989
			temp = Double.doubleToLongBits(insuranceSale);
1990
			result = prime * result + (int) (temp ^ (temp >>> 32));
1991
			result = prime * result + (int) (smartphoneQty ^ (smartphoneQty >>> 32));
1992
			temp = Double.doubleToLongBits(smartphoneSale);
1993
			result = prime * result + (int) (temp ^ (temp >>> 32));
26941 amit.gupta 1994
			result = prime * result + (int) (totalQty ^ (totalQty >>> 32));
25865 amit.gupta 1995
			temp = Double.doubleToLongBits(totalSale);
1996
			result = prime * result + (int) (temp ^ (temp >>> 32));
1997
			return result;
1998
		}
1999
 
2000
		@Override
2001
		public boolean equals(Object obj) {
2002
			if (this == obj)
2003
				return true;
2004
			if (obj == null)
2005
				return false;
2006
			if (getClass() != obj.getClass())
2007
				return false;
2008
			SaleTargetReportModel other = (SaleTargetReportModel) obj;
25880 amit.gupta 2009
			if (fofoId != other.fofoId)
2010
				return false;
25865 amit.gupta 2011
			if (insruanceQty != other.insruanceQty)
2012
				return false;
2013
			if (Double.doubleToLongBits(insuranceSale) != Double.doubleToLongBits(other.insuranceSale))
2014
				return false;
2015
			if (smartphoneQty != other.smartphoneQty)
2016
				return false;
2017
			if (Double.doubleToLongBits(smartphoneSale) != Double.doubleToLongBits(other.smartphoneSale))
2018
				return false;
26941 amit.gupta 2019
			if (totalQty != other.totalQty)
2020
				return false;
25865 amit.gupta 2021
			if (Double.doubleToLongBits(totalSale) != Double.doubleToLongBits(other.totalSale))
2022
				return false;
2023
			return true;
2024
		}
2025
 
2026
		public double getTotalSale() {
2027
			return totalSale;
2028
		}
2029
 
2030
		public void setTotalSale(double totalSale) {
2031
			this.totalSale = totalSale;
2032
		}
2033
 
2034
		public double getSmartphoneSale() {
2035
			return smartphoneSale;
2036
		}
2037
 
2038
		public void setSmartphoneSale(double smartphoneSale) {
2039
			this.smartphoneSale = smartphoneSale;
2040
		}
2041
 
2042
		public long getSmartphoneQty() {
2043
			return smartphoneQty;
2044
		}
2045
 
2046
		public void setSmartphoneQty(long smartphoneQty) {
2047
			this.smartphoneQty = smartphoneQty;
2048
		}
2049
 
2050
		public double getInsuranceSale() {
2051
			return insuranceSale;
2052
		}
2053
 
2054
		public void setInsuranceSale(double insuranceSale) {
2055
			this.insuranceSale = insuranceSale;
2056
		}
2057
 
2058
		public long getInsruanceQty() {
2059
			return insruanceQty;
2060
		}
2061
 
2062
		public void setInsruanceQty(long insruanceQty) {
2063
			this.insruanceQty = insruanceQty;
2064
		}
2065
 
2066
		@Override
2067
		public String toString() {
26945 amit.gupta 2068
			return "SaleTargetReportModel [totalSale=" + totalSale + ", totalQty=" + totalQty + ", past3daysSale="
2069
					+ past3daysSale + ", fofoId=" + fofoId + ", smartphoneSale=" + smartphoneSale + ", smartphoneQty="
2070
					+ smartphoneQty + ", insuranceSale=" + insuranceSale + ", insruanceQty=" + insruanceQty + "]";
25865 amit.gupta 2071
		}
2072
 
2073
	}
2074
 
31169 tejbeer 2075
	private void getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap,
30752 tejbeer 2076
			Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
31169 tejbeer 2077
		String timeString = "Today %s";
2078
		LocalDateTime now = LocalDateTime.now();
25872 tejbeer 2079
 
31169 tejbeer 2080
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
2081
		List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_LOGISTICS,
2082
				ProfitMandiConstants.TICKET_CATEGORY_FINANCIAL_SERVICES, ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
2083
				ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES,
2084
				ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
2085
				ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT,
2086
				ProfitMandiConstants.TICKET_CATEGORY_TECHNOLOGY);
26945 amit.gupta 2087
 
31169 tejbeer 2088
		Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds);
30765 tejbeer 2089
 
31169 tejbeer 2090
		for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2091
			String email = storeGuyEntry.getKey();
2092
			Set<Integer> fofoIds = storeGuyEntry.getValue();
2093
			LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2094
 
31169 tejbeer 2095
			if (!fofoIds.isEmpty()) {
2096
				List<FofoStore> stores = fofoStoreRepository
2097
						.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2098
 
31169 tejbeer 2099
				Map<String, List<Integer>> stateMap = stores.stream().collect(Collectors.groupingBy(
2100
						x -> x.getCode().substring(0, 2), Collectors.mapping(x -> x.getId(), Collectors.toList())));
2101
				List<List<Serializable>> stateWiseSales = new ArrayList<>();
2102
				for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
2103
					long totalQty = stateMapEntry.getValue().stream()
2104
							.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2105
					double totalSale = stateMapEntry.getValue().stream()
2106
							.collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2107
					long smartPhoneQty = stateMapEntry.getValue().stream()
2108
							.collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
2109
					double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2110
							Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2111
					stateWiseSales.add(
2112
							Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2113
				}
2114
				StringBuilder sb = new StringBuilder();
2115
				sb.append("<html><body>");
2116
				sb.append("<p>Statewise Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
2117
				sb.append("<tbody>\n" + "	    <tr>"
2118
						+ "	    					<th style='border:1px solid black;padding: 5px'>State</th>"
2119
						+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
2120
						+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Value</th>"
2121
						+ "	    					<th style='border:1px solid black;padding: 5px'>Total Qty</th>"
2122
						+ "	    					<th style='border:1px solid black;padding: 5px'>Total Value</th>"
2123
						+ "	    				</tr>");
2124
				for (List<Serializable> stateSale : stateWiseSales) {
2125
					sb.append("<tr>");
2126
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2127
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2128
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2129
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2130
					sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2131
					sb.append("</tr>");
2132
				}
2133
				sb.append("</tbody></table><br><br>");
26945 amit.gupta 2134
 
31169 tejbeer 2135
				sb.append("<p>Sale Report:</p><br/><table style='border:1px solid black';cellspacing=0>");
2136
				sb.append("<tbody>\n" + "	    				<tr>\n"
2137
						+ "	    					<th style='border:1px solid black;padding: 5px'>Code</th>"
2138
						+ "	    					<th style='border:1px solid black;padding: 5px'>Business Name</th>"
2139
						+ "	    					<th style='border:1px solid black;padding: 5px'>Regional Manager</th>"
2140
						+ "	    					<th style='border:1px solid black;padding: 5px'>Territory Manager</th>"
2141
						+ "	    					<th style='border:1px solid black;padding: 5px'>Sale</th>"
2142
						+ "	    					<th style='border:1px solid black;padding: 5px'>Smartphone Sale</th>"
2143
						+ "	    					<th style='border:1px solid black;padding: 5px'>SmartPhone Qty</th>"
2144
						+ "	    				</tr>");
2145
 
2146
				/*
2147
				 * List<Integer> sortedPartnerSalesHeaders =
2148
				 * partnerSalesHeadersMap.values().stream()
2149
				 * .sorted(Comparator.comparing(FofoReportingModel::getCode)
2150
				 * .thenComparing(FofoReportingModel::getRegionalManager)
2151
				 * .thenComparing(FofoReportingModel::getTerritoryManager))
2152
				 * .map(FofoReportingModel::getFofoId).collect(Collectors.toList());
2153
				 */
2154
 
2155
				List<Integer> sortedSaleTargetReport = saleTargetReportModelMap.values().stream()
2156
						.filter(x -> fofoIds.contains(x.getFofoId()))
2157
						.sorted(Comparator.comparing(SaleTargetReportModel::getTotalSale))
2158
						.map(SaleTargetReportModel::getFofoId).collect(Collectors.toList());
2159
				for (Integer fofoId : sortedSaleTargetReport) {
2160
					if (saleTargetReportModelMap.get(fofoId).getPast3daysSale() == 0) {
2161
						sb.append("<tr style='background-color:red'>");
2162
					} else {
2163
						sb.append("<tr>");
2164
					}
2165
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2166
							+ partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2167
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2168
							+ partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2169
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2170
							+ partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2171
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2172
							+ partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2173
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2174
							+ saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2175
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2176
							+ saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2177
					sb.append("<td style='border:1px solid black;padding: 5px'>"
2178
							+ saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
2179
					sb.append("</tr>");
2180
				}
2181
 
2182
				sb.append("</tr>");
2183
 
2184
				sb.append("</body></html>");
2185
 
2186
				String statewiseSaleReport = sb.toString();
2187
 
2188
				String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
2189
				// this.sendMailOfHtmlFomat("amit.gupta@smartukaan.com", saleReport, cc,
2190
				// subject);
2191
				this.sendMailOfHtmlFormat(email, statewiseSaleReport, null, "Statewise" + subject);
2192
			}
2193
		}
24653 govind 2194
	}
24841 govind 2195
 
26945 amit.gupta 2196
	private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject)
24841 govind 2197
			throws MessagingException, ProfitMandiBusinessException, IOException {
2198
		MimeMessage message = mailSender.createMimeMessage();
2199
		MimeMessageHelper helper = new MimeMessageHelper(message);
2200
		helper.setSubject(subject);
2201
		helper.setText(body, true);
2202
		helper.setTo(email);
2203
		if (cc != null) {
2204
			helper.setCc(cc);
2205
		}
2206
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2207
		helper.setFrom(senderAddress);
2208
		mailSender.send(message);
2209
	}
25300 tejbeer 2210
 
25351 tejbeer 2211
	public void sendNotification() throws Exception {
25300 tejbeer 2212
		List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2213
		if (!pushNotifications.isEmpty()) {
2214
			for (PushNotifications pushNotification : pushNotifications) {
25351 tejbeer 2215
				Device device = deviceRepository.selectById(pushNotification.getDeviceId());
25300 tejbeer 2216
				NotificationCampaign notificationCampaign = notificationCampaignRepository
2217
						.selectById(pushNotification.getNotificationCampaignid());
2218
				SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(),
2219
						SimpleCampaignParams.class);
2220
				Campaign campaign = new SimpleCampaign(scp);
25351 tejbeer 2221
				String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
25300 tejbeer 2222
				JSONObject json = new JSONObject();
25351 tejbeer 2223
				json.put("to", device.getFcmId());
25300 tejbeer 2224
				JSONObject jsonObj = new JSONObject();
2225
				jsonObj.put("message", campaign.getMessage());
2226
				jsonObj.put("title", campaign.getTitle());
2227
				jsonObj.put("type", campaign.getType());
2228
				jsonObj.put("url", result_url);
2229
				jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2230
				jsonObj.put("image", campaign.getImageUrl());
2231
				jsonObj.put("largeIcon", "large_icon");
2232
				jsonObj.put("smallIcon", "small_icon");
2233
				jsonObj.put("vibrate", 1);
2234
				jsonObj.put("pid", pushNotification.getId());
2235
				jsonObj.put("sound", 1);
2236
				jsonObj.put("priority", "high");
2237
				json.put("data", jsonObj);
25351 tejbeer 2238
				try {
2239
					CloseableHttpClient client = HttpClients.createDefault();
2240
					HttpPost httpPost = new HttpPost(FCM_URL);
25300 tejbeer 2241
 
25351 tejbeer 2242
					httpPost.setHeader("Content-Type", "application/json; utf-8");
2243
					httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2244
					StringEntity entity = new StringEntity(json.toString());
2245
					httpPost.setEntity(entity);
2246
					CloseableHttpResponse response = client.execute(httpPost);
25300 tejbeer 2247
 
25351 tejbeer 2248
					if (response.getStatusLine().getStatusCode() == 200) {
2249
						pushNotification.setSentTimestamp(LocalDateTime.now());
2250
					} else {
25356 tejbeer 2251
						pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
25778 amit.gupta 2252
						LOGGER.info("message" + "not sent");
26945 amit.gupta 2253
						response.toString();
25351 tejbeer 2254
					}
25300 tejbeer 2255
 
25351 tejbeer 2256
				} catch (Exception e) {
2257
					e.printStackTrace();
26443 amit.gupta 2258
					pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
26436 amit.gupta 2259
					LOGGER.info("message " + "not sent " + e.getMessage());
25300 tejbeer 2260
				}
2261
			}
2262
		}
2263
	}
2264
 
25553 amit.gupta 2265
	public void grouping() throws Exception {
25609 amit.gupta 2266
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2267
		List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
2268
		System.out.println(String.join("\t",
2269
				Arrays.asList("IMEI", "ItemId", "Brand", "Model Name", "Model Number", "Franchise Id", "Franchise Name",
25694 amit.gupta 2270
						"Grn On", "Price Dropped On", "Approved On", "Returned On", "Price Drop Paid", "Is Doa")));
26963 amit.gupta 2271
		Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
25609 amit.gupta 2272
		for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
25694 amit.gupta 2273
			if (priceDropIMEI.getPartnerId() == 0)
2274
				continue;
25609 amit.gupta 2275
			HashSet<String> imeis = new HashSet<>();
2276
			PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2277
			imeis.add(priceDropIMEI.getImei());
2278
			List<InventoryItem> inventoryItems = inventoryItemRepository
2279
					.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
25694 amit.gupta 2280
			if (inventoryItems.size() == 0) {
2281
				LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
25613 amit.gupta 2282
				continue;
25612 amit.gupta 2283
			}
25609 amit.gupta 2284
			InventoryItem inventoryItem = inventoryItems.get(0);
2285
			CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
2286
			if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT)
2287
					|| inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
2288
				// check if pricedrop has been rolled out
2289
				List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(),
2290
						priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
2291
				if (uwh.size() > 0) {
25615 amit.gupta 2292
					Item item = itemRepository.selectById(inventoryItem.getItemId());
30965 tejbeer 2293
					System.out.println(String.join("\t",
2294
							Arrays.asList(priceDropIMEI.getImei(), inventoryItem.getItemId() + "", item.getBrand(),
2295
									item.getModelName(), item.getModelNumber(), inventoryItem.getFofoId() + "",
2296
									customRetailer.getBusinessName(), inventoryItem.getCreateTimestamp().format(dtf),
2297
									priceDrop.getAffectedOn().format(dtf),
2298
									priceDropIMEI.getUpdateTimestamp().format(dtf),
2299
									inventoryItem.getUpdateTimestamp().format(dtf),
2300
									priceDrop.getAutoPartnerPayout(inventoryItem.getUpdateTimestamp()) + "",
2301
									inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) + "")));
25609 amit.gupta 2302
				}
2303
			}
2304
		}
25503 amit.gupta 2305
	}
29668 tejbeer 2306
 
29566 amit.gupta 2307
	public void toffeeRollback() throws Exception {
2308
		toffeeService.cancelPolicyCopy("110143521986");
2309
		toffeeService.getOrderId("110143521986");
2310
	}
25694 amit.gupta 2311
 
27686 amit.gupta 2312
	public void attachToffeeInvoices() throws Exception {
28205 tejbeer 2313
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3,
2314
				Optional.of(false));
2315
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
27678 amit.gupta 2316
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2317
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
30321 amit.gupta 2318
			InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
27678 amit.gupta 2319
			java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2320
			PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
28205 tejbeer 2321
			String pdfInvoiceString = "data:application/pdf;base64,"
2322
					+ Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2323
			boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1],
2324
					pdfInvoiceString);
2325
			if (attached) {
27678 amit.gupta 2326
				insurancePolicy.setPosted(true);
2327
			}
2328
		}
25694 amit.gupta 2329
	}
2330
 
30858 amit.gupta 2331
	public void sendBAGPendingPolicies() throws Exception {
2332
		List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4,
2333
				Optional.of(false));
2334
		for (InsurancePolicy insurancePolicy : insurancePolicies) {
2335
			String invoiceNumber = insurancePolicy.getInvoiceNumber();
2336
			FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2337
			FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2338
			CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2339
			Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2340
			BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
30913 tejbeer 2341
			// bagInsuranceModel.setModelId();
30858 amit.gupta 2342
			bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2343
			bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2344
			bagInsuranceModel.setCity(customerAddress.getCity());
2345
			bagInsuranceModel.setBrandWarranty("1 Year");
2346
			Item item = itemRepository.selectById(fofoOrderItem.getId());
2347
			bagInsuranceModel.setModelName(item.getItemDescription());
2348
			bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2349
			bagInsuranceModel.setEmail(customer.getEmailId());
2350
			bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2351
			bagInsuranceModel.setFirstName(customer.getFirstName());
2352
			bagInsuranceModel.setLastName(customer.getLastName());
2353
			bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2354
			bagInsuranceModel.setPlanId("");
2355
			insurancePolicy.setPosted(true);
2356
		}
2357
	}
2358
 
25694 amit.gupta 2359
	public void schemeRollback(List<String> schemeIds) throws Exception {
2360
		List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
25708 amit.gupta 2361
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream()
25694 amit.gupta 2362
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2363
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2364
		for (SchemeInOut sio : schemeInOuts) {
2365
			Scheme scheme = schemesMap.get(sio.getSchemeId());
2366
			if (scheme.getType().equals(SchemeType.IN)) {
2367
 
2368
			} else if (scheme.getType().equals(SchemeType.OUT)) {
2369
				InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2370
				List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
2371
				ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE))
2372
						.max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2373
				if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime())
2374
						|| scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
2375
					sio.setRolledBackTimestamp(LocalDateTime.now());
2376
					FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
25709 amit.gupta 2377
					String rollbackReason = "Scheme reversed for "
2378
							+ itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - "
25694 amit.gupta 2379
							+ fofoOrder.getInvoiceNumber();
2380
					walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(),
26945 amit.gupta 2381
							scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason,
2382
							LocalDateTime.now());
25694 amit.gupta 2383
					System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(),
2384
							rollbackReason);
2385
				}
2386
			}
2387
		}
25721 tejbeer 2388
		// throw new Exception();
25694 amit.gupta 2389
	}
25721 tejbeer 2390
 
2391
	public void checkfocusedModelInPartnerStock() throws Exception {
2392
 
2393
		List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId())
2394
				.collect(Collectors.toList());
27212 tejbeer 2395
		Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService
2396
				.getSaholicStock();
27213 tejbeer 2397
		Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2398
		Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
27212 tejbeer 2399
 
2400
		Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService
2401
				.getSaholicPOItems();
25721 tejbeer 2402
		Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2403
		for (Integer fofoId : fofoIds) {
27102 amit.gupta 2404
			List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2405
			focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
25721 tejbeer 2406
			CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2407
			Map<Integer, Integer> processingOrderMap = null;
2408
			Map<Integer, Integer> catalogIdAndQtyMap = null;
2409
			Map<Integer, Integer> grnPendingOrdersMap = null;
2410
 
2411
			Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId)
2412
					.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
2413
 
2414
			if (!currentInventorySnapshot.isEmpty()) {
2415
				catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream()
2416
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2417
								Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
2418
 
2419
			}
2420
 
2421
			Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
2422
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2423
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2424
			if (!grnPendingOrders.isEmpty()) {
2425
				grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream()
2426
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2427
								Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
2428
 
2429
			}
2430
 
2431
			Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream()
2432
					.collect(Collectors.groupingBy(x -> x.getLineItem().getItemId(),
2433
							Collectors.summingInt(x -> x.getLineItem().getQuantity())));
2434
			if (!processingOrder.isEmpty()) {
2435
				processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream()
2436
						.collect(Collectors.groupingBy(x -> x.getCatalogItemId(),
2437
								Collectors.summingInt(x -> processingOrder.get(x.getId()))));
2438
 
2439
			}
2440
 
25800 tejbeer 2441
			List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
2442
					.collect(Collectors.toList());
2443
 
27088 tejbeer 2444
			List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId())
2445
					.collect(Collectors.toList());
27095 tejbeer 2446
			LOGGER.info("regionIds" + regionIds);
27102 amit.gupta 2447
			if (regionIds.size() == 0) {
2448
				LOGGER.info("No region found for partner {}", fofoId);
2449
				continue;
2450
			}
27100 amit.gupta 2451
			Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository
27102 amit.gupta 2452
					.selectAllByRegionIds(regionIds).stream().collect(Collectors.groupingBy(FocusedModel::getCatalogId,
29668 tejbeer 2453
							Collectors.mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25800 tejbeer 2454
 
25721 tejbeer 2455
			LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
2456
 
27100 amit.gupta 2457
			for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2458
				int minQty = entry.getValue().get();
25721 tejbeer 2459
				int inStockQty = 0;
2460
				int processingQty = 0;
2461
				int grnPendingQty = 0;
27208 tejbeer 2462
				int allColorNetAvailability = 0;
27253 tejbeer 2463
				int allColorPoAvailability = 0;
25721 tejbeer 2464
				if (processingOrderMap != null) {
2465
					processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0
2466
							: processingOrderMap.get(entry.getKey());
2467
 
2468
				}
2469
				if (grnPendingOrdersMap != null) {
2470
					grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0
2471
							: grnPendingOrdersMap.get(entry.getKey());
2472
 
2473
				}
2474
				if (catalogIdAndQtyMap != null) {
2475
					inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0
2476
							: catalogIdAndQtyMap.get(entry.getKey());
2477
 
2478
				}
28526 tejbeer 2479
 
2480
				int grnStockQty = grnPendingQty + inStockQty;
25721 tejbeer 2481
				int totalQty = processingQty + grnPendingQty + inStockQty;
2482
 
29801 manish 2483
				int shortageQty = minQty - totalQty;
2484
				List<Item> item = itemRepository.selectAllByCatalogItemId(entry.getKey());
2485
				FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2486
 
29801 manish 2487
				Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap
2488
						.get(fofoStore.getWarehouseId());
27213 tejbeer 2489
 
29801 manish 2490
				Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap
2491
						.get(fofoStore.getWarehouseId());
25721 tejbeer 2492
 
29801 manish 2493
				for (Item it : item) {
2494
					List<SaholicCIS> currentAvailability = null;
2495
					List<SaholicPOItem> poItemAvailability = null;
2496
					if (itemAvailabilityMap != null) {
2497
						currentAvailability = itemAvailabilityMap.get(it.getId());
2498
					}
27208 tejbeer 2499
 
29801 manish 2500
					if (poItemAvailabilityMap != null) {
2501
						poItemAvailability = poItemAvailabilityMap.get(it.getId());
2502
					}
2503
					if (currentAvailability != null) {
2504
						allColorNetAvailability += currentAvailability.stream()
2505
								.collect(Collectors.summingInt(SaholicCIS::getNetavailability));
2506
					}
28528 tejbeer 2507
 
29801 manish 2508
					if (poItemAvailability != null) {
2509
						allColorPoAvailability += poItemAvailability.stream()
2510
								.collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
27208 tejbeer 2511
					}
2512
 
25721 tejbeer 2513
				}
2514
 
29801 manish 2515
				FocusedModelShortageModel fm = new FocusedModelShortageModel();
2516
				fm.setFofoId(fofoId);
2517
				fm.setStoreCode(fofoStore.getCode());
2518
				fm.setStoreName(customRetailer.getBusinessName());
2519
				fm.setBrandName(item.get(0).getBrand());
2520
				fm.setModelName(item.get(0).getModelName());
2521
				fm.setModelNumber(item.get(0).getModelNumber());
2522
				fm.setGrnStockQty(grnStockQty);
2523
				fm.setPendingIndentQty(processingQty);
2524
				fm.setShortageQty(shortageQty);
2525
				fm.setPoAvailabitiy(allColorPoAvailability);
2526
				fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
2527
				fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2528
				fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
2529
				fm.setItemName(item.get(0).getBrand() + item.get(0).getModelNumber() + item.get(0).getModelName());
2530
				fm.setAvailabitiy(allColorNetAvailability);
27233 tejbeer 2531
 
29801 manish 2532
				focusedModelShortageList.add(fm);
2533
			}
2534
 
29668 tejbeer 2535
			/*
2536
			 * if (!focusedModelShortageList.isEmpty()) { String subject = "Stock Alert";
2537
			 * String messageText = this.getMessage(focusedModelShortageList);
30393 amit.gupta 2538
			 *
29668 tejbeer 2539
			 * this.sendMailWithAttachments(subject, messageText,
2540
			 * customRetailer.getEmail()); String notificationMessage =
2541
			 * this.getNotificationMessage(focusedModelShortageList);
30393 amit.gupta 2542
			 *
29668 tejbeer 2543
			 * LOGGER.info("notificationMessage" + notificationMessage);
30393 amit.gupta 2544
			 *
29668 tejbeer 2545
			 * SendNotificationModel sendNotificationModel = new SendNotificationModel();
2546
			 * sendNotificationModel.setCampaignName("Stock Alert");
2547
			 * sendNotificationModel.setTitle("Alert");
2548
			 * sendNotificationModel.setMessage(notificationMessage);
2549
			 * sendNotificationModel.setType("url"); sendNotificationModel.setUrl(
2550
			 * "https://app.smartdukaan.com/pages/home/notifications");
2551
			 * sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2552
			 * sendNotificationModel.setMessageType(MessageType.notification); int userId =
2553
			 * userAccountRepository.selectUserIdByRetailerId(fofoId);
2554
			 * sendNotificationModel.setUserIds(Arrays.asList(userId));
2555
			 * notificationService.sendNotification(sendNotificationModel);
30393 amit.gupta 2556
			 *
29668 tejbeer 2557
			 * }
2558
			 */
27233 tejbeer 2559
 
25721 tejbeer 2560
		}
27102 amit.gupta 2561
		if (!focusedModelShortageReportMap.isEmpty()) {
25800 tejbeer 2562
			String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
30215 amit.gupta 2563
			Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
25837 amit.gupta 2564
			Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2565
 
25800 tejbeer 2566
			focusedModelShortageReportMap.entrySet().forEach(x -> {
2567
				storeGuyMap.entrySet().forEach(y -> {
2568
 
2569
					if (y.getValue().contains(x.getKey())) {
2570
						if (!emailRowsMap.containsKey(y.getKey())) {
2571
							emailRowsMap.put(y.getKey(), new ArrayList<>());
2572
						}
27208 tejbeer 2573
						List<List<? extends Serializable>> fms = x.getValue().stream()
2574
								.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
27213 tejbeer 2575
										r.getModelName(), r.getModelNumber(), r.getWarehouseName(), r.getStateManager(),
28526 tejbeer 2576
										r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(),
2577
										r.getShortageQty(), r.getAvailabitiy()))
25800 tejbeer 2578
								.collect(Collectors.toList());
2579
						emailRowsMap.get(y.getKey()).addAll(fms);
2580
 
25721 tejbeer 2581
					}
2582
 
25800 tejbeer 2583
				});
25721 tejbeer 2584
 
2585
			});
2586
 
27212 tejbeer 2587
			List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
28526 tejbeer 2588
					"Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty",
2589
					"Availability");
25837 amit.gupta 2590
			emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2591
 
25800 tejbeer 2592
				ByteArrayOutputStream baos = null;
2593
				try {
25837 amit.gupta 2594
					baos = FileUtil.getCSVByteStream(headers, entry.getValue());
25800 tejbeer 2595
				} catch (Exception e2) {
2596
					e2.printStackTrace();
2597
				}
30752 tejbeer 2598
				String[] sendToArray = new String[] {
28526 tejbeer 2599
 
29996 tejbeer 2600
						entry.getKey()
29995 tejbeer 2601
 
2602
				};
2603
 
25800 tejbeer 2604
				try {
2605
					Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName,
2606
							new ByteArrayResource(baos.toByteArray()));
2607
				} catch (Exception e1) { // TODO Auto-generated catch block
2608
					e1.printStackTrace();
2609
				}
25721 tejbeer 2610
 
25800 tejbeer 2611
			});
2612
		}
25721 tejbeer 2613
	}
2614
 
2615
	private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2616
		StringBuilder sb = new StringBuilder();
2617
		sb.append("Focused Model Shortage in Your Stock : \n");
2618
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2619
 
2620
			sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2621
			sb.append(String.format("%n", ""));
2622
		}
2623
		return sb.toString();
2624
	}
2625
 
2626
	private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2627
		MimeMessage message = mailSender.createMimeMessage();
2628
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
2629
 
2630
		helper.setSubject(subject);
2631
		helper.setText(messageText, true);
2632
		helper.setTo(email);
27116 amit.gupta 2633
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
25721 tejbeer 2634
		helper.setFrom(senderAddress);
2635
		mailSender.send(message);
2636
 
2637
	}
2638
 
2639
	private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2640
		StringBuilder sb = new StringBuilder();
2641
		sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>"
2642
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2643
		sb.append("<tbody>\n" + "	    				<tr>\n"
2644
				+ "	    					<th style='border:1px solid black;padding: 5px'>Item</th>\n"
2645
				+ "	    					<th style='border:1px solid black;padding: 5px'>Shortage Qty</th>\n"
2646
				+ "	    				</tr>");
2647
		for (FocusedModelShortageModel entry : focusedModelShortageModel) {
2648
 
2649
			sb.append("<tr>");
2650
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
2651
 
2652
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
2653
 
2654
			sb.append("</tr>");
2655
 
2656
		}
2657
 
2658
		sb.append("</tbody></table></body></html>");
2659
 
2660
		return sb.toString();
2661
	}
2662
 
25927 amit.gupta 2663
	public void notifyLead() throws Exception {
29488 manish 2664
		List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null,
2665
				LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2666
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2667
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
27477 amit.gupta 2668
		LOGGER.info("authUserEmailMap {}", authUserEmailMap);
25927 amit.gupta 2669
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2670
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2671
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25936 amit.gupta 2672
 
27477 amit.gupta 2673
		LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26790 tejbeer 2674
 
25927 amit.gupta 2675
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
2676
 
2677
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2678
			int authId = authUserEmail.getKey();
2679
			String email = authUserEmail.getValue();
2680
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2681
		}
27477 amit.gupta 2682
		LOGGER.info("authUserKeyMap", authUserKeyMap);
2683
		LOGGER.info("leadsToNotify {}", leadsToNotify);
26790 tejbeer 2684
 
29308 tejbeer 2685
		String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
25927 amit.gupta 2686
		for (Lead lead : leadsToNotify) {
27217 amit.gupta 2687
			if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2688
				LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
25927 amit.gupta 2689
				continue;
2690
			}
30982 tejbeer 2691
			String title = "Leads followup Reminder";
25927 amit.gupta 2692
			String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(),
29308 tejbeer 2693
					lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
30982 tejbeer 2694
			String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
25927 amit.gupta 2695
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2696
			sendNotificationModel.setCampaignName("Lead Reminder");
30982 tejbeer 2697
			sendNotificationModel.setTitle(title);
25927 amit.gupta 2698
			sendNotificationModel.setMessage(notificationMessage);
2699
			sendNotificationModel.setType("url");
30982 tejbeer 2700
			sendNotificationModel.setUrl(url);
25927 amit.gupta 2701
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2702
			sendNotificationModel.setMessageType(MessageType.reminder);
26320 tejbeer 2703
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
25929 amit.gupta 2704
			System.out.println(sendNotificationModel);
25927 amit.gupta 2705
			notificationService.sendNotification(sendNotificationModel);
30982 tejbeer 2706
			AuthUser authUser = authRepository.selectById(lead.getAssignTo());
30991 tejbeer 2707
			// notificationService.sendWhatsappMessage(notificationMessage, title,
2708
			// authUser.getMobileNumber());
25927 amit.gupta 2709
		}
2710
	}
26945 amit.gupta 2711
 
25927 amit.gupta 2712
	public void notifyVisits() throws Exception {
26945 amit.gupta 2713
		List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository
2714
				.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
25927 amit.gupta 2715
		Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream()
2716
				.collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2717
		Map<String, Integer> dtrEmailMap = dtrUserRepository
2718
				.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream()
2719
				.collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
2720
		Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26945 amit.gupta 2721
 
25927 amit.gupta 2722
		for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2723
			int authId = authUserEmail.getKey();
2724
			String email = authUserEmail.getValue();
2725
			authUserKeyMap.put(authId, dtrEmailMap.get(email));
2726
		}
2727
		String visitTemplate = "Planned visit to franchisee %s is due by %s";
2728
		String followupTemplate = "Lead followup for franchisee %s is due by %s";
2729
		DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2730
		for (FranchiseeVisit visit : franchiseeVisits) {
2731
			if (authUserKeyMap.containsKey(visit.getAuthId())) {
2732
				continue;
2733
			}
2734
			SendNotificationModel sendNotificationModel = new SendNotificationModel();
2735
			String message = null;
26945 amit.gupta 2736
			if (visit.getFranchiseActivityId() == 0) {
2737
				message = String.format(visitTemplate, visit.getPartnerName(),
30574 amit.gupta 2738
						timeFormatter.format(visit.getScheduleTimestamp()));
26945 amit.gupta 2739
				sendNotificationModel.setCampaignName("Franchisee visit Reminder");
25927 amit.gupta 2740
			} else {
26945 amit.gupta 2741
				message = String.format(followupTemplate, visit.getPartnerName(),
30574 amit.gupta 2742
						timeFormatter.format(visit.getScheduleTimestamp()));
25927 amit.gupta 2743
				sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2744
			}
2745
			sendNotificationModel.setMessage(message);
2746
			sendNotificationModel.setType("url");
26482 tejbeer 2747
			sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
25927 amit.gupta 2748
			sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2749
			sendNotificationModel.setMessageType(MessageType.reminder);
2750
			sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
30991 tejbeer 2751
			// notificationService.sendNotification(sendNotificationModel);
25927 amit.gupta 2752
		}
25910 amit.gupta 2753
	}
25982 amit.gupta 2754
 
26283 tejbeer 2755
	public void ticketClosed() throws Exception {
2756
 
2757
		List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2758
		for (Ticket ticket : tickets) {
2759
			if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2760
				ticket.setCloseTimestamp(LocalDateTime.now());
2761
				ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2762
				ticket.setUpdateTimestamp(LocalDateTime.now());
2763
				ticketRepository.persist(ticket);
2764
			}
2765
		}
2766
 
2767
	}
2768
 
26790 tejbeer 2769
	public void checkValidateReferral() throws Exception {
2770
 
2771
		List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
26791 tejbeer 2772
		LOGGER.info("referrals" + referrals);
26790 tejbeer 2773
		if (!referrals.isEmpty()) {
2774
			String subject = "Referral Request";
2775
			String messageText = this.getMessageForReferral(referrals);
2776
 
26792 tejbeer 2777
			MimeMessage message = mailSender.createMimeMessage();
2778
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
30752 tejbeer 2779
			String[] email = { "kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com" };
26792 tejbeer 2780
			helper.setSubject(subject);
2781
			helper.setText(messageText, true);
2782
			helper.setTo(email);
2783
			InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2784
			helper.setFrom(senderAddress);
2785
			mailSender.send(message);
2786
 
26790 tejbeer 2787
		}
2788
	}
2789
 
2790
	private String getMessageForReferral(List<Refferal> referrals) {
2791
		StringBuilder sb = new StringBuilder();
2792
		sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>"
2793
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2794
		sb.append("<tbody>\n" + "	    				<tr>\n"
2795
				+ "	    					<th style='border:1px solid black;padding: 5px'>RefereeName</th>\n"
2796
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referee Email</th>\n"
2797
				+ "	    					<th style='border:1px solid black;padding: 5px'>Referral Name</th>\n"
2798
				+ "	    					<th style='border:1px solid black;padding: 5px'>Refferal Mobile</th>\n"
2799
				+ "	    					<th style='border:1px solid black;padding: 5px'>city</th>\n"
2800
				+ "	    					<th style='border:1px solid black;padding: 5px'>state</th>\n"
2801
				+ "	    				</tr>");
2802
		for (Refferal entry : referrals) {
2803
 
2804
			sb.append("<tr>");
2805
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
2806
 
2807
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2808
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2809
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2810
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2811
			sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
2812
 
2813
			sb.append("</tr>");
2814
 
2815
		}
2816
 
2817
		sb.append("</tbody></table></body></html>");
2818
 
2819
		return sb.toString();
2820
	}
2821
 
30421 tejbeer 2822
	private String getMessageForUncontacblePartner(List<PartnerCollectionRemark> pcrs)
2823
			throws ProfitMandiBusinessException {
2824
		StringBuilder sb = new StringBuilder();
2825
		sb.append("<html><body><p>Alert</p><p>Not Responding Partner:-</p>"
2826
				+ "<br/><table style='border:1px solid black ;padding: 5px';>");
2827
		sb.append("<tbody>\n" + "	    				<tr>\n"
2828
				+ "	    					<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n"
2829
				+ "	    					<th style='border:1px solid black;padding: 5px'>from</th>\n"
2830
 
2831
				+ "	    				</tr>");
2832
		for (PartnerCollectionRemark entry : pcrs) {
2833
 
2834
			CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
2835
 
2836
			sb.append("<tr>");
2837
			sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "("
2838
					+ customRetailer.getCode() + ")" + "</td>");
2839
 
2840
			sb.append("<td style='border:1px solid black;padding: 5px'>"
2841
					+ entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
2842
 
2843
			sb.append("</tr>");
2844
 
2845
		}
2846
 
2847
		sb.append("</tbody></table></body></html>");
2848
 
2849
		return sb.toString();
2850
	}
2851
 
27271 amit.gupta 2852
	public void reverseWallet() throws Exception {
2853
		LocalDate localDate = LocalDate.of(2020, 10, 28);
28205 tejbeer 2854
		List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(),
2855
				localDate.plusDays(1).atStartOfDay(),
27271 amit.gupta 2856
				Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
2857
		for (UserWalletHistory uwh : uwhList) {
28205 tejbeer 2858
			if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
27275 amit.gupta 2859
				UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
28205 tejbeer 2860
				// LOGGER.info("UWH - {}", uwh);
2861
				// amount += uwh.getAmount();
2862
				// System.out.println("Amount is - " + amount);
2863
				// walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2864
				// uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2865
				// run", uwh.getBusinessTimestamp());
27313 amit.gupta 2866
				int orderId = uwh.getReference();
2867
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2868
				int inventoryItemId = 0;
28205 tejbeer 2869
				// fofoOrderRepository.delete(fofoOrder);
27313 amit.gupta 2870
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
28205 tejbeer 2871
				/*
2872
				 * List<PaymentOptionTransaction> paymentOptionTransactions =
2873
				 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2874
				 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2875
				 * paymentOptionTransaction : paymentOptionTransactions) {
2876
				 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2877
				 */
2878
				for (FofoOrderItem foi : fofoOrderItems) {
2879
					// fofoOrderItemRepository.delete(foi);
27313 amit.gupta 2880
					List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
28205 tejbeer 2881
					for (FofoLineItem fli : flis) {
2882
						// fofoLineItemRepository.delete(fli);
27313 amit.gupta 2883
						inventoryItemId = fli.getInventoryItemId();
2884
					}
2885
				}
28205 tejbeer 2886
				List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2887
						java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2888
				for (SchemeInOut sio : schemeInOuts) {
2889
					if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
27314 amit.gupta 2890
						LOGGER.info("SIO - {}", sio);
27315 amit.gupta 2891
						sio.setRolledBackTimestamp(LocalDateTime.now());
27313 amit.gupta 2892
					}
2893
				}
28205 tejbeer 2894
 
27271 amit.gupta 2895
			}
2896
		}
28205 tejbeer 2897
 
27271 amit.gupta 2898
	}
28205 tejbeer 2899
 
2900
	public void partnerProblemAlert() throws Exception {
2901
		LocalDateTime curDate = LocalDate.now().atStartOfDay();
2902
		Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2903
				curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
2904
		Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1),
2905
				curDate.with(LocalTime.MAX), 0, false);
2906
		Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream()
2907
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2908
 
2909
		for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
2910
 
2911
			double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2912
 
2913
			LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
2914
 
28211 tejbeer 2915
			double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28208 tejbeer 2916
 
2917
			LOGGER.info("mtdSale" + mtdSale);
2918
 
28209 tejbeer 2919
			double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0
2920
					: pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2921
 
28208 tejbeer 2922
			LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
2923
 
28209 tejbeer 2924
			double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28208 tejbeer 2925
 
2926
			LOGGER.info("stockInvestment" + stockInvestment);
2927
 
28205 tejbeer 2928
			boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
2929
 
2930
			PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
2931
 
28210 tejbeer 2932
			if (partnerProblem == null) {
28205 tejbeer 2933
				partnerProblem = new PartnerProblem();
2934
				partnerProblem.setFofoId(ls.getKey());
2935
				if (mtdSale < lmtdTwentyPercentSale) {
2936
					partnerProblem.setMtd(1);
2937
				}
2938
				if (Investmentvalue) {
2939
					partnerProblem.setInvestment(1);
2940
				}
2941
 
2942
				if (stockInvestment < totalSixtyPercentInvestment) {
2943
					partnerProblem.setInvestment(1);
2944
				}
2945
 
2946
				partnerProblemRepository.persist(partnerProblem);
2947
			} else {
2948
				if (mtdSale < lmtdTwentyPercentSale) {
2949
					partnerProblem.setMtd(partnerProblem.getMtd() + 1);
2950
 
2951
				} else {
2952
					partnerProblem.setMtd(0);
2953
 
2954
				}
2955
				if (Investmentvalue) {
2956
					partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2957
				} else {
2958
					partnerProblem.setInvestment(0);
2959
 
2960
				}
2961
				if (stockInvestment < totalSixtyPercentInvestment) {
2962
					partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2963
				} else {
2964
					partnerProblem.setStockInvestment(0);
2965
				}
2966
 
2967
			}
2968
 
2969
		}
2970
 
28213 tejbeer 2971
		List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream()
2972
				.filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
2973
 
28223 tejbeer 2974
		partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
28224 tejbeer 2975
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
28223 tejbeer 2976
					+ x2.getStockInvestment() ? 1 : -1;
2977
		}).collect(Collectors.toList());
28227 tejbeer 2978
 
2979
		Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
2980
			return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment()
2981
					+ x2.getStockInvestment() ? 1 : -1;
2982
		}).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
2983
 
28212 tejbeer 2984
		Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28213 tejbeer 2985
 
28467 tejbeer 2986
		List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28213 tejbeer 2987
 
2988
		Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream()
2989
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
2990
 
28286 tejbeer 2991
		List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com",
30765 tejbeer 2992
				"niranjan.kala@smartdukaan.com", "sm@smartdukaan.com");
28208 tejbeer 2993
		LOGGER.info("partnerProblem" + partnerProblems);
28205 tejbeer 2994
		StringBuilder sb = new StringBuilder();
28218 tejbeer 2995
		sb.append("<htl><body>");
28222 tejbeer 2996
		sb.append(
2997
				"<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 2998
		sb.append("<tbody>\n" + "	    <tr>"
2999
				+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
3000
				+ "                         <th style='border:1px solid black;padding: 5px'>Assign TO</th>"
3001
				+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
3002
				+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
3003
				+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
3004
				+ "	    					<th style='border:1px solid black;padding: 5px'>Manager</th>"
3005
 
3006
				+ "	    				</tr>");
3007
 
3008
		for (PartnerProblem pp : partnerProblems) {
28467 tejbeer 3009
			int value = pp.getFofoId() % 4;
28205 tejbeer 3010
 
3011
			Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
28217 tejbeer 3012
			LOGGER.info("authUserMap" + authUserMap);
28205 tejbeer 3013
			sb.append("<tr>");
3014
			sb.append("<td style='border:1px solid black;padding: 5px'>"
3015
					+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
28213 tejbeer 3016
			sb.append("<td style='border:1px solid black;padding: 5px'>"
3017
					+ assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
28205 tejbeer 3018
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3019
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3020
			sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28216 tejbeer 3021
			sb.append("<td style='border:1px solid black;padding: 5px'>"
28224 tejbeer 3022
					+ (authUserMap.get(EscalationType.L1) == null ? "N/A"
30752 tejbeer 3023
							: authUserMap.get(EscalationType.L1).getFirstName())
28224 tejbeer 3024
					+ " ," + (authUserMap.get(EscalationType.L2) == null ? "N/A"
30752 tejbeer 3025
							: authUserMap.get(EscalationType.L2).getFirstName())
28216 tejbeer 3026
					+ "</td>");
28205 tejbeer 3027
 
3028
			sb.append("</tr>");
3029
		}
3030
		sb.append("</tbody></table><br><br>");
3031
		String subject = "Partner Problem Alert!";
3032
		String[] email = sendTo.toArray(new String[sendTo.size()]);
3033
 
28222 tejbeer 3034
		this.sendMailHtmlFormat(email, sb.toString(), null, subject);
3035
 
28218 tejbeer 3036
		Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
3037
 
3038
		for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
28222 tejbeer 3039
			AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
28227 tejbeer 3040
			for (Integer patnerId : authUserPartner.getValue()) {
3041
				if (partnerProblemMap.get(patnerId) != null) {
28218 tejbeer 3042
 
28227 tejbeer 3043
					StringBuilder sbbuilder = new StringBuilder();
3044
					sbbuilder.append("<hml><body>");
3045
					sb.append(
3046
							"<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>");
3047
					sbbuilder.append("<tbody>\n" + "	    <tr>"
3048
							+ "	    					<th style='border:1px solid black;padding: 5px'>Partner Name</th>"
3049
							+ "	    					<th style='border:1px solid black;padding: 5px'>Mtd</th>"
3050
							+ "	    					<th style='border:1px solid black;padding: 5px'>Investment</th>"
3051
							+ "	    					<th style='border:1px solid black;padding: 5px'>Stock</th>"
28218 tejbeer 3052
 
28227 tejbeer 3053
							+ "	    				</tr>");
28218 tejbeer 3054
 
28227 tejbeer 3055
					for (Integer partnerId : authUserPartner.getValue()) {
3056
						if (partnerProblemMap.get(partnerId) != null) {
3057
							PartnerProblem pp = partnerProblemMap.get(partnerId);
3058
							sbbuilder.append("<tr>");
3059
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
3060
									+ customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3061
							sbbuilder
3062
									.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3063
							sbbuilder.append(
3064
									"<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3065
							sbbuilder.append("<td style='border:1px solid black;padding: 5px'>"
3066
									+ pp.getStockInvestment() + "</td>");
3067
 
3068
							sbbuilder.append("</tr>");
3069
						}
3070
 
28224 tejbeer 3071
					}
28227 tejbeer 3072
					sbbuilder.append("</tbody></table><br><br>");
28224 tejbeer 3073
 
28286 tejbeer 3074
					this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
28230 tejbeer 3075
					break;
28218 tejbeer 3076
				}
28230 tejbeer 3077
 
28223 tejbeer 3078
			}
28222 tejbeer 3079
		}
3080
	}
28218 tejbeer 3081
 
28222 tejbeer 3082
	private void sendMailHtmlFormat(String email[], String body, String cc[], String subject)
3083
			throws MessagingException, ProfitMandiBusinessException, IOException {
3084
		MimeMessage message = mailSender.createMimeMessage();
3085
		MimeMessageHelper helper = new MimeMessageHelper(message);
3086
		helper.setSubject(subject);
3087
		helper.setText(body, true);
3088
		helper.setTo(email);
3089
		if (cc != null) {
3090
			helper.setCc(cc);
28218 tejbeer 3091
		}
28222 tejbeer 3092
		InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
3093
		helper.setFrom(senderAddress);
3094
		mailSender.send(message);
28205 tejbeer 3095
	}
3096
 
28775 amit.gupta 3097
	@Autowired
3098
	WarehouseRepository warehouseRepository;
28790 amit.gupta 3099
 
28775 amit.gupta 3100
	public void getVendorWarehouses(int warehouseId) {
28778 amit.gupta 3101
		LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
28790 amit.gupta 3102
 
28775 amit.gupta 3103
	}
29488 manish 3104
 
29451 manish 3105
	public void checkImeiActivation() {
29488 manish 3106
 
29451 manish 3107
		try {
3108
			vivoImeiActivationService.checkImeiActivation();
3109
		} catch (ProfitMandiBusinessException e) {
3110
			// TODO Auto-generated catch block
3111
			e.printStackTrace();
3112
		} catch (IOException e) {
3113
			// TODO Auto-generated catch block
3114
			e.printStackTrace();
3115
		} catch (Exception e) {
3116
			// TODO Auto-generated catch block
3117
			e.printStackTrace();
3118
		}
28775 amit.gupta 3119
 
29451 manish 3120
	}
3121
 
29668 tejbeer 3122
	public void checkItelImeiActivation(LocalDate date, Integer day) {
29488 manish 3123
		LOGGER.info("Hello - {}", "hhh");
3124
 
3125
		try {
29668 tejbeer 3126
			itelImeiActivationService.checkItelImeiActivation(date, day);
29488 manish 3127
		} catch (ProfitMandiBusinessException e) {
3128
			// TODO Auto-generated catch block
3129
			e.printStackTrace();
3130
		} catch (IOException e) {
3131
			// TODO Auto-generated catch block
3132
			e.printStackTrace();
3133
		} catch (Exception e) {
3134
			// TODO Auto-generated catch block
3135
			e.printStackTrace();
3136
		}
3137
 
3138
	}
3139
 
29807 manish 3140
	public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate)
3141
			throws MessagingException, ProfitMandiBusinessException, IOException {
29801 manish 3142
		LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
3143
 
29807 manish 3144
		serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
3145
 
29801 manish 3146
	}
3147
 
29668 tejbeer 3148
	public void checkTecnoImeiActivation(LocalDate date, Integer day) {
29488 manish 3149
		LOGGER.info("Hello - {}", "hhh");
3150
 
3151
		try {
29668 tejbeer 3152
			tecnoImeiActivation.checkTecnoImeiActivation(date, day);
29488 manish 3153
		} catch (ProfitMandiBusinessException e) {
3154
			// TODO Auto-generated catch block
3155
			e.printStackTrace();
3156
		} catch (IOException e) {
3157
			// TODO Auto-generated catch block
3158
			e.printStackTrace();
3159
		} catch (Exception e) {
3160
			// TODO Auto-generated catch block
3161
			e.printStackTrace();
3162
		}
3163
 
3164
	}
3165
 
29252 amit.gupta 3166
	public void checkCancellationMargin() throws Exception {
3167
		LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3168
		List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3169
		LOGGER.info("Total Orders =  {}", fofoOrders.size());
29308 tejbeer 3170
		for (FofoOrder fofoOrder : fofoOrders) {
3171
			List<UserWalletHistory> history = userWalletHistoryRepository
3172
					.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3173
			history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(),
3174
					WalletReferenceType.ACTIVATION_SCHEME));
3175
			int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3176
			if (Math.abs(walletSum) > 1) {
3177
				// LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3178
				// = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
29252 amit.gupta 3179
				List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3180
				List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3181
				FofoLineItem fli = flis.get(0);
29308 tejbeer 3182
				if (StringUtils.isEmpty(fli.getSerialNumber()))
3183
					continue;
3184
				List<SchemeInOut> schemeInOuts = schemeInOutRepository
3185
						.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
29252 amit.gupta 3186
				InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
29308 tejbeer 3187
				double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null)
3188
						.mapToDouble(x -> x.getAmount()).sum();
3189
				/*
3190
				 * if(inventoryItem.getGoodQuantity()==1) {
3191
				 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3192
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3193
				 * inventoryItem.getUpdateTimestamp()); } else
3194
				 * if(inventoryItem.getBadQuantity()==1){
3195
				 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3196
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3197
				 * inventoryItem.getUpdateTimestamp()); } else if
3198
				 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3199
				 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3200
				 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3201
				 * inventoryItem.getUpdateTimestamp()); }
3202
				 */
3203
				if (inventoryItem.getLastScanType().equals(ScanType.SALE)
3204
						|| inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3205
					Map<String, Double> map = schemeInOuts.stream()
3206
							.collect(
3207
									Collectors.groupingBy(
3208
											x -> DateTimeFormatter.ofPattern("yyyyMMddHH")
3209
													.format(x.getCreateTimestamp()) + "- " + x.getSchemeId(),
3210
											Collectors.summingDouble(x -> x.getAmount())));
3211
					for (Map.Entry<String, Double> entry : map.entrySet()) {
3212
						LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
29252 amit.gupta 3213
					}
29308 tejbeer 3214
					LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(),
3215
							inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
29252 amit.gupta 3216
				}
3217
			}
3218
		}
29308 tejbeer 3219
 
29252 amit.gupta 3220
	}
3221
 
29488 manish 3222
	public static String readFileAsString(String file) throws Exception {
3223
		String data = "";
3224
		data = new String(Files.readAllBytes(Paths.get(file)));
3225
		return data;
3226
	}
29451 manish 3227
 
29308 tejbeer 3228
	public void markDelhiveryOrderDelivered() throws ProfitMandiBusinessException, IOException {
3229
		List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.DELHIVERY_PROVIDERID,
3230
				OrderStatus.SHIPPED_FROM_WH);
3231
 
3232
		if (!orders.isEmpty()) {
29441 tejbeer 3233
			Set<String> airwayBill = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 3234
 
29441 tejbeer 3235
			int arraylength = airwayBill.size();
3236
 
3237
			if (arraylength >= 75) {
3238
 
3239
				airwayBill = airwayBill.stream().limit(74).collect(Collectors.toSet());
3240
			}
29308 tejbeer 3241
			LOGGER.info("airwayBill" + airwayBill);
3242
			String url = "https://track.delhivery.com/api/v1/packages/json/";
3243
 
3244
			OkHttpClient client = new OkHttpClient();
3245
 
3246
			Request request1 = new Request.Builder()
3247
					.url(url + "?waybill=" + String.join(",", airwayBill) + "&token=" + token).get().build();
3248
 
3249
			LOGGER.info("request1" + request1);
3250
 
3251
			Response response = client.newCall(request1).execute();
3252
 
3253
			LOGGER.info("jsonbj" + response.body());
3254
 
3255
			JSONObject jsonObj = new JSONObject(response.body().string());
3256
 
3257
			LOGGER.info("jsonObj" + jsonObj);
3258
 
29403 tejbeer 3259
			JSONArray shipmentData = jsonObj.getJSONArray("ShipmentData");
29308 tejbeer 3260
			Set<String> airwaybillStatus = new HashSet<>();
29403 tejbeer 3261
			for (int i = 0; i < shipmentData.length(); i++) {
3262
				JSONObject jsonObject = shipmentData.getJSONObject(i);
29308 tejbeer 3263
				JSONObject shipment = jsonObject.getJSONObject("Shipment");
3264
 
3265
				LOGGER.info("shipment" + shipment);
3266
				JSONObject statusDescription = shipment.getJSONObject("Status");
3267
				String awb = shipment.getString("AWB");
3268
 
3269
				String status = statusDescription.getString("Status");
3270
				LOGGER.info("status" + status);
3271
 
3272
				LOGGER.info("awb" + awb);
3273
				if (status.equals("Delivered")) {
3274
					airwaybillStatus.add(awb);
3275
				}
3276
 
3277
			}
31117 tejbeer 3278
			markOrderDelivered(airwaybillStatus);
3279
		}
3280
	}
29308 tejbeer 3281
 
31117 tejbeer 3282
	public void markBlueDartOrderDelivered() throws ProfitMandiBusinessException, IOException {
29308 tejbeer 3283
 
31117 tejbeer 3284
		String loginId = "DEL81122";
30982 tejbeer 3285
 
31117 tejbeer 3286
		String licencekey = "uhfhlg2jpmnqfhfrlsgzfr1nhu1qfvel";
30982 tejbeer 3287
 
31117 tejbeer 3288
		List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.BLUEDART_PROVIDERID,
3289
				OrderStatus.SHIPPED_FROM_WH);
30982 tejbeer 3290
 
31117 tejbeer 3291
		if (!orders.isEmpty()) {
30982 tejbeer 3292
 
31118 tejbeer 3293
			Set<String> airwayBillNo = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 3294
 
31117 tejbeer 3295
			LOGGER.info("airwayBill" + airwayBillNo);
3296
			String url = "https://api.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery";
30982 tejbeer 3297
 
31117 tejbeer 3298
			String response = restClient.get(url + "&loginid=" + loginId + "&awb=awb&numbers="
3299
					+ String.join(",", airwayBillNo) + "&format=xml&lickey=" + licencekey + "&verno=1.3&scan=1", null,
3300
					null);
3301
 
3302
			JSONObject updateJson = XML.toJSONObject(response);
3303
 
3304
			JSONObject shipmentData = updateJson.getJSONObject("ShipmentData");
3305
			Object shipmentObject = shipmentData.get("Shipment");
3306
 
3307
			Set<String> airwaybillStatus = new HashSet<>();
3308
 
3309
			if (shipmentObject instanceof JSONArray) {
3310
				JSONArray shipments = (JSONArray) shipmentObject;
3311
				for (int i = 0; i < shipments.length(); i++) {
3312
					JSONObject jsonObject = shipments.getJSONObject(i);
3313
 
3314
					Number awb = jsonObject.getNumber("WaybillNo");
3315
					String status = jsonObject.getString("Status");
3316
 
3317
					if (status.equals("SHIPMENT DELIVERED")) {
3318
						airwaybillStatus.add(awb.toString());
3319
					}
3320
 
29308 tejbeer 3321
				}
31117 tejbeer 3322
			} else {
3323
				JSONObject jsonObject = (JSONObject) shipmentObject;
3324
				Number awb = jsonObject.getNumber("WaybillNo");
3325
				String status = jsonObject.getString("Status");
3326
 
3327
				if (status.equals("SHIPMENT DELIVERED")) {
3328
					airwaybillStatus.add(awb.toString());
3329
				}
3330
 
29308 tejbeer 3331
			}
3332
 
31117 tejbeer 3333
			LOGGER.info("airwaybillStatus" + airwaybillStatus);
3334
 
31118 tejbeer 3335
			markOrderDelivered(airwaybillStatus);
29308 tejbeer 3336
		}
31117 tejbeer 3337
 
29308 tejbeer 3338
	}
3339
 
31117 tejbeer 3340
	private void markOrderDelivered(Set<String> airwaybillStatus)
3341
			throws ProfitMandiBusinessException, HttpHostConnectException {
3342
		if (!airwaybillStatus.isEmpty()) {
3343
			for (String aws : airwaybillStatus) {
3344
 
3345
				List<Order> deliverdOrders = orderRepository.selectByAirwayBillNumber(aws);
3346
 
3347
				int fofoId = deliverdOrders.get(0).getRetailerId();
3348
				for (Order dlo : deliverdOrders) {
3349
					dlo.setStatus(OrderStatus.DELIVERY_SUCCESS);
3350
					dlo.setStatusDescription("Order Delivered");
3351
					dlo.setDeliveryTimestamp(LocalDateTime.now());
3352
				}
3353
 
3354
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
3355
 
3356
				Address address = addressRepository.selectById(user.getAddressId());
3357
 
3358
				String title = "Order Delivered";
3359
 
3360
				String message = String.format("Dear partner, Your SmartDukaan Order " + aws
3361
						+ " has been delivered to you in a safe sealed bag.");
3362
 
3363
				SendNotificationModel sendNotificationModel = new SendNotificationModel();
3364
				sendNotificationModel.setCampaignName("Order Delivered");
3365
				sendNotificationModel.setTitle(title);
3366
				sendNotificationModel.setMessage(message);
3367
				sendNotificationModel.setType("url");
3368
				sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3369
				sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
3370
				sendNotificationModel.setMessageType(MessageType.notification);
3371
				int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
3372
				sendNotificationModel.setUserIds(Arrays.asList(userId));
3373
				notificationService.sendNotification(sendNotificationModel);
3374
 
3375
				notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
3376
 
3377
			}
3378
		}
3379
	}
3380
 
29814 tejbeer 3381
	public void partnerWiseCreditAccount() throws Exception {
3382
 
3383
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
3384
 
3385
		for (FofoStore fs : fofoStores) {
3386
 
3387
			if (fs.getPan() != null) {
3388
				AccountStatusResponseOut accountStatusResponseOut = mandiiService.getStatus(fs.getPan());
29815 tejbeer 3389
 
3390
				LOGGER.info("accountStatusResponseOut" + accountStatusResponseOut);
29814 tejbeer 3391
				CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fs.getId(),
3392
						Gateway.MANDII);
3393
 
3394
				if (creditAccount == null) {
3395
 
3396
					creditAccount = new CreditAccount();
3397
 
3398
					creditAccount.setFofoId(fs.getId());
3399
					creditAccount.setGateway(Gateway.MANDII);
3400
 
3401
				}
29835 tejbeer 3402
 
3403
				if (accountStatusResponseOut == null) {
3404
					creditAccount.setCreditStatus(CreditStatus.UNKNOWN);
3405
					creditAccount.setDescription("User company not found");
3406
 
29817 tejbeer 3407
				} else {
29835 tejbeer 3408
					if (accountStatusResponseOut.getSanctionLimit() != null) {
3409
						creditAccount.setSanctionedAmount(accountStatusResponseOut.getSanctionLimit().floatValue());
3410
					} else {
3411
						creditAccount.setSanctionedAmount(0);
3412
					}
29817 tejbeer 3413
 
29835 tejbeer 3414
					creditAccount.setInterestRate(accountStatusResponseOut.getRateOfInterest());
3415
					if (accountStatusResponseOut.getBalanceAmount() != null) {
3416
						creditAccount.setAvailableAmount(accountStatusResponseOut.getBalanceAmount().floatValue());
3417
					} else {
3418
						creditAccount.setAvailableAmount(0);
3419
					}
3420
 
3421
					if (accountStatusResponseOut.getCurrentStage() != null) {
3422
						creditAccount.setDescription(accountStatusResponseOut.getCurrentStage().toString());
3423
					}
3424
					if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.SANCTION_AVAILABLE)) {
3425
						creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
3426
					} else if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.IN_ELIGIBLE)) {
3427
						creditAccount.setCreditStatus(CreditStatus.INELIGIBLE);
3428
					} else {
3429
 
3430
						creditAccount.setCreditStatus(CreditStatus.TO_BE_EVALUATED);
3431
					}
29817 tejbeer 3432
				}
3433
 
29814 tejbeer 3434
				creditAccount.setUpdatedOn(LocalDateTime.now());
3435
				creditAccountRepository.persist(creditAccount);
3436
			}
3437
		}
3438
	}
3439
 
30421 tejbeer 3440
	@Autowired
3441
	private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
3442
 
3443
	public void reviewUncontactablePartner()
3444
			throws ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3445
 
3446
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
3447
 
3448
		List<Integer> pcrms = partnerCollectionRemarkRepository
3449
				.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
3450
 
3451
		if (!pcrms.isEmpty()) {
3452
			Map<Integer, PartnerCollectionRemark> partnerCollectionRemarksMap = partnerCollectionRemarkRepository
3453
					.selectByIds(pcrms).stream().filter(x -> x.getRemark().equals(CollectionRemark.NOT_RESPONDING))
3454
					.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3455
 
3456
			if (!partnerCollectionRemarksMap.isEmpty()) {
3457
				for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping()
3458
						.entrySet()) {
3459
					List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3460
							.map(x -> partnerCollectionRemarksMap.get(x)).filter(x -> x != null)
3461
							.collect(Collectors.toList());
30752 tejbeer 3462
					String subject = "UNCONTACTABLE PARTNERS";
30421 tejbeer 3463
					String messageText = this.getMessageForUncontacblePartner(filteredRows);
3464
 
3465
					MimeMessage message = mailSender.createMimeMessage();
3466
					MimeMessageHelper helper = new MimeMessageHelper(message, true);
30752 tejbeer 3467
					String[] email = new String[] { storeGuyEntry.getKey() };
30421 tejbeer 3468
 
3469
					helper.setSubject(subject);
3470
					helper.setText(messageText, true);
3471
					helper.setTo(email);
3472
					InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com",
3473
							"Smartdukaan Alerts");
3474
					helper.setFrom(senderAddress);
3475
					mailSender.send(message);
3476
 
3477
					LOGGER.info("filteredRows {}", filteredRows);
3478
 
3479
				}
3480
			}
30859 tejbeer 3481
 
30421 tejbeer 3482
		}
3483
	}
3484
 
30859 tejbeer 3485
	@Autowired
3486
	private LoanRepository loanRepository;
3487
 
3488
	@Autowired
3489
	private LoanStatementRepository loanStatementRepository;
3490
 
3491
	@Autowired
3492
	private SDCreditService sdCreditService;
3493
 
3494
	@Autowired
3495
	private SDCreditRequirementRepository sdCreditRequirementRepository;
3496
 
30936 tejbeer 3497
	@Autowired
3498
	private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
3499
 
3500
	@Autowired
3501
	private TransactionRepository transactionRepository;
3502
 
3503
	@Autowired
31020 tejbeer 3504
	private SanctionRequestRepository sanctionRequestRepository;
3505
 
30859 tejbeer 3506
	public void calculateInterestAccured() throws ProfitMandiBusinessException {
3507
 
3508
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3509
 
3510
		if (!loans.isEmpty()) {
3511
 
3512
			for (Loan loan : loans) {
3513
 
3514
				List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3515
 
3516
				Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(Collectors.groupingBy(
3517
						x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
3518
 
3519
				if (loan.getFreeDays() > 0) {
3520
					LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(loan.getFreeDays() - 1);
30936 tejbeer 3521
 
3522
					LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
30859 tejbeer 3523
					if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
30936 tejbeer 3524
						int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(),
3525
								loan.getId());
3526
						LOGGER.info("loanStatementId {}", loanStatementId);
30859 tejbeer 3527
 
30936 tejbeer 3528
						if (loanStatementId != 0) {
3529
 
3530
							this.calculateInterest(loan, loanStatusAmount, loanStatementId);
3531
 
3532
						} else {
3533
							sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan,
3534
									loanStatusAmount);
3535
						}
3536
 
30859 tejbeer 3537
					}
3538
				} else {
3539
 
3540
					int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(),
3541
							loan.getId());
30936 tejbeer 3542
					LOGGER.info("loanStatementId2 {}", loanStatementId);
30859 tejbeer 3543
 
30936 tejbeer 3544
					this.calculateInterest(loan, loanStatusAmount, loanStatementId);
30859 tejbeer 3545
 
3546
				}
3547
 
3548
			}
3549
		}
3550
 
3551
	}
3552
 
30936 tejbeer 3553
	private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount, int loanStatementId)
3554
			throws ProfitMandiBusinessException {
3555
		LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
3556
 
3557
		if (loanStatement.getLoanId() == loan.getId()) {
3558
 
3559
			sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan,
3560
					loanStatusAmount);
3561
 
3562
		} else {
3563
			throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3564
		}
3565
	}
3566
 
31020 tejbeer 3567
	public void loanSettlement() throws Exception {
30859 tejbeer 3568
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3569
 
3570
		if (!loans.isEmpty()) {
3571
 
3572
			for (Loan loan : loans) {
3573
 
3574
				UserWallet userWallet = userWalletRepository.selectByRetailerId(loan.getFofoId());
3575
				SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository
3576
						.selectByFofoId(loan.getFofoId());
3577
 
3578
				if (userWallet.getAmount() >= 100) {
3579
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3580
 
31175 tejbeer 3581
					LOGGER.info("loanStatements {}", loanStatements);
3582
 
30859 tejbeer 3583
					Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream()
3584
							.collect(Collectors.groupingBy(x -> x.getLoanReferenceType(),
31177 tejbeer 3585
									Collectors.summingDouble(x -> FormattingUtils.serialize(x.getAmount()))));
30859 tejbeer 3586
 
3587
					LOGGER.info("loanStatusAmount {}", loanStatusAmount);
31020 tejbeer 3588
					Double interestAmount = loanStatusAmount.get(LoanReferenceType.INTEREST);
30859 tejbeer 3589
 
31020 tejbeer 3590
					if (interestAmount == null) {
3591
						interestAmount = (double) 0;
3592
					}
3593
 
30859 tejbeer 3594
					double principalAmount = loanStatusAmount.get(LoanReferenceType.PRINCIPAL);
3595
					double paidAmount = 0;
3596
					if (userWallet.getAmount() > Math.abs(interestAmount)) {
3597
 
31175 tejbeer 3598
						LOGGER.info("interestAmount b {}", interestAmount);
3599
 
31177 tejbeer 3600
						if (interestAmount < 0) {
31175 tejbeer 3601
							LOGGER.info("interestAmount a {}", interestAmount);
30859 tejbeer 3602
 
3603
							settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(interestAmount),
3604
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3605
									LocalDateTime.now());
3606
							loan.setInterestPaid(loan.getInterestPaid().add(BigDecimal.valueOf(interestAmount).abs()));
3607
 
3608
							paidAmount += Math.abs(interestAmount);
3609
						}
3610
 
3611
						double userWalletAmount = userWallet.getAmount() - Math.abs(interestAmount);
3612
 
31177 tejbeer 3613
						if (userWalletAmount > Math.abs(principalAmount) && principalAmount < 0) {
30859 tejbeer 3614
 
3615
							settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(principalAmount),
3616
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3617
									LocalDateTime.now());
3618
							double amount = userWalletAmount - Math.abs(principalAmount);
3619
 
3620
							paidAmount += Math.abs(principalAmount);
3621
 
3622
							userWallet.setAmount((int) amount);
3623
 
31020 tejbeer 3624
							BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount()
3625
									.subtract(BigDecimal.valueOf(principalAmount).abs());
3626
 
31110 tejbeer 3627
							sdCreditRequirement.setUtilizedAmount(utilizationAmount);
3628
 
3629
							CreditAccount creditAccount = creditAccountRepository
3630
									.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
3631
 
3632
							creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3633
							creditAccount.setUpdatedOn(LocalDateTime.now());
3634
 
30859 tejbeer 3635
							loan.setPendingAmount(BigDecimal.ZERO);
3636
 
31177 tejbeer 3637
						} else if (principalAmount < 0) {
30859 tejbeer 3638
 
3639
							settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(userWalletAmount),
3640
									loan.getFofoId(), loan.getId(), "Amount adjusted against loan",
3641
									LocalDateTime.now());
3642
 
3643
							paidAmount += Math.abs(userWalletAmount);
3644
 
31020 tejbeer 3645
							BigDecimal availableLimit = sdCreditRequirement.getAvailableLimit()
3646
									.add(BigDecimal.valueOf(userWalletAmount)).abs();
3647
 
3648
							BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount()
3649
									.subtract(BigDecimal.valueOf(userWalletAmount)).abs();
3650
 
31110 tejbeer 3651
							sdCreditRequirement.setUtilizedAmount(utilizationAmount);
31020 tejbeer 3652
 
31110 tejbeer 3653
							CreditAccount creditAccount = creditAccountRepository
3654
									.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
3655
 
3656
							creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3657
							creditAccount.setUpdatedOn(LocalDateTime.now());
30859 tejbeer 3658
							userWallet.setAmount(0);
3659
 
3660
							loan.setPendingAmount(
3661
									loan.getPendingAmount().subtract(BigDecimal.valueOf(userWalletAmount)));
3662
 
3663
						}
3664
 
3665
						createUserWalletHistory(userWallet.getId(), userWallet.getUserId(),
3666
								WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
3667
 
3668
					} else {
3669
 
3670
						settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(userWallet.getAmount()),
3671
								loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
3672
 
3673
						paidAmount += Math.abs(userWallet.getAmount());
3674
 
3675
						createUserWalletHistory(userWallet.getId(), userWallet.getUserId(),
3676
								WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
3677
 
3678
						loan.setInterestPaid(
3679
								loan.getInterestPaid().add(BigDecimal.valueOf(userWallet.getAmount()).abs()));
3680
 
3681
						userWallet.setAmount(0);
3682
					}
3683
 
3684
				}
3685
			}
30999 tejbeer 3686
 
31020 tejbeer 3687
			List<Order> allOrders = orderRepository.selectHoldOrder();
3688
 
3689
			LOGGER.info("allOrders {}", allOrders);
3690
 
3691
			if (!allOrders.isEmpty()) {
3692
				Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream()
3693
						.collect(Collectors.groupingBy(Order::getTransactionId, Collectors.toList()));
3694
				LinkedHashMap<Integer, List<Order>> sortedTransactionOrdersMap = new LinkedHashMap<>();
3695
				transactionOrdersMap.entrySet().stream().sorted(Map.Entry.comparingByKey())
3696
						.forEachOrdered(x -> sortedTransactionOrdersMap.put(x.getKey(), x.getValue()));
3697
				LOGGER.info("sortedTransactionOrdersMap {}", sortedTransactionOrdersMap);
3698
 
3699
				for (Entry<Integer, List<Order>> transactionOrdersEntry : sortedTransactionOrdersMap.entrySet()) {
3700
 
3701
					List<Order> orders = transactionOrdersEntry.getValue();
3702
 
3703
					double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
3704
 
3705
					LocalDateTime createDate = orders.get(0).getCreateTimestamp();
3706
 
3707
					int fofoId = orders.get(0).getRetailerId();
3708
 
3709
					int transactionId = transactionOrdersEntry.getKey();
3710
 
3711
					SanctionRequest sanctionRequest = sanctionRequestRepository.selectByTransactionId(transactionId);
3712
 
3713
					double loanSettleAmount = loanStatementRepository.selectByDateAndFofoId(createDate, fofoId).stream()
3714
							.filter(x -> x.getAmount().doubleValue() > 0)
3715
							.collect(Collectors.summingDouble(x -> x.getAmount().doubleValue()));
3716
 
3717
					LOGGER.info("loanSettleAmount {}", loanSettleAmount);
3718
 
3719
					LOGGER.info("totalAmount {}", totalAmount);
3720
					if (loanSettleAmount >= sanctionRequest.getUtilizationAmount().doubleValue()) {
3721
 
3722
						LOGGER.info("totalAmount {}", totalAmount);
3723
 
3724
						orders.forEach(x -> x.setShipmentHold(false));
3725
 
3726
						List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId())
3727
								.stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3728
						authUserEmail.add("vinay.p@smartdukaan.com");
3729
						authUserEmail.add("shivam.gupta@smartdukaan.com");
3730
 
3731
						String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
3732
 
3733
						String[] ccTo = { "tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com" };
3734
 
3735
						String subject = "Dispatched " + (orders.get(0).getRetailerName());
3736
						String message = String.format("Dear Team, \n" + "kindly note the meterial for the "
3737
								+ orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is dispatched.");
3738
 
3739
						Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
3740
 
3741
					}
3742
 
3743
				}
3744
			}
3745
 
30859 tejbeer 3746
		}
3747
 
3748
	}
3749
 
3750
	private void settledLoanStatement(LoanReferenceType loanReferneceType, BigDecimal amount, int fofoId, int loanId,
3751
			String description, LocalDateTime now) {
3752
 
3753
		sdCreditService.createLoanStatement(loanReferneceType, amount.abs(), fofoId, loanId, description,
3754
				LocalDateTime.now());
3755
 
3756
	}
3757
 
3758
	private void createUserWalletHistory(int walletId, int userId, WalletReferenceType referenceType, int loanId,
3759
			double interestAmount) {
3760
		UserWalletHistory uwh = new UserWalletHistory();
3761
		uwh.setWalletId(walletId);
3762
		uwh.setFofoId(userId);
3763
		uwh.setBusinessTimestamp(LocalDateTime.now());
3764
		uwh.setReferenceType(referenceType);
3765
		uwh.setReference(loanId);
3766
		uwh.setTimestamp(LocalDateTime.now());
3767
		uwh.setAmount((int) -(interestAmount));
30908 tejbeer 3768
		uwh.setDescription("Amount adjusted against loan");
30859 tejbeer 3769
		userWalletHistoryRepository.persist(uwh);
3770
 
3771
	}
3772
 
30965 tejbeer 3773
	public void dailyLoanAlert()
3774
			throws ProfitMandiBusinessException, HttpHostConnectException, UnsupportedEncodingException {
30859 tejbeer 3775
		List<Loan> loans = loanRepository.selectAllActiveLoan();
3776
 
3777
		Map<Integer, Double> partnerLoanAmount = new HashMap<>();
3778
 
3779
		if (!loans.isEmpty()) {
3780
 
3781
			for (Loan loan : loans) {
3782
 
3783
				List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3784
 
3785
				double amount = loanStatements.stream().map(x -> x.getAmount())
3786
						.collect(Collectors.summingDouble(x -> x.doubleValue()));
3787
				if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3788
					amount += partnerLoanAmount.get(loan.getFofoId());
3789
					partnerLoanAmount.put(loan.getFofoId(), amount);
3790
				} else {
3791
					partnerLoanAmount.put(loan.getFofoId(), amount);
3792
				}
3793
 
3794
			}
3795
 
3796
		}
3797
 
3798
		if (!partnerLoanAmount.isEmpty()) {
3799
 
3800
			for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
3801
 
3802
				int fofoId = partnerLoanAmountEnrty.getKey();
3803
 
30965 tejbeer 3804
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
3805
 
3806
				Address address = addressRepository.selectById(user.getAddressId());
3807
 
3808
				String title = "Alert Credit Outstanding!";
30859 tejbeer 3809
				String url = "http://app.smartdukaan.com/pages/home/credit";
30989 tejbeer 3810
				String message = "Your total pending Loan amount is Rs."
3811
						+ FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
30859 tejbeer 3812
				notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
3813
 
30989 tejbeer 3814
				notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30965 tejbeer 3815
 
30859 tejbeer 3816
			}
3817
 
3818
		}
3819
 
3820
	}
3821
 
30896 amit.gupta 3822
	public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3823
		schemeService.processActivatedImeisForSchemes();
3824
	}
3825
 
30913 tejbeer 3826
	public void updatePartnerLimit() throws ProfitMandiBusinessException {
3827
		Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
3828
 
3829
		Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream()
3830
				.collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3831
		Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository
3832
				.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30933 tejbeer 3833
		double limitValue = 100000;
30913 tejbeer 3834
		for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3835
			int fofoId = customRetailerEntry.getKey();
3836
			SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
30929 tejbeer 3837
			LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
30913 tejbeer 3838
			CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
3839
			BigDecimal suggestedAmount = BigDecimal.ZERO;
3840
			if (currentPartnerDailyInvestment != null) {
3841
				suggestedAmount = BigDecimal.valueOf(currentPartnerDailyInvestment.getTotalInvestment() * 0.1);
3842
			}
3843
 
30933 tejbeer 3844
			if (suggestedAmount.doubleValue() > limitValue) {
30917 tejbeer 3845
 
30933 tejbeer 3846
				suggestedAmount = BigDecimal.valueOf(limitValue);
30917 tejbeer 3847
 
3848
			}
30920 tejbeer 3849
 
3850
			if (suggestedAmount.doubleValue() < 0) {
3851
				suggestedAmount = BigDecimal.ZERO;
3852
			}
3853
 
30913 tejbeer 3854
			LOGGER.info("suggestedAmount {} ", suggestedAmount);
3855
 
3856
			if (sdCreditRequirement == null) {
3857
				sdCreditRequirement = new SDCreditRequirement();
3858
				sdCreditRequirement.setFofoId(fofoId);
3859
				sdCreditRequirement.setCreditDays(15);
3860
				sdCreditRequirement.setInterestRate(BigDecimal.valueOf(0.05));
3861
				sdCreditRequirement.setSuggestedLimit(suggestedAmount);
30929 tejbeer 3862
				sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
30913 tejbeer 3863
				sdCreditRequirement.setLimit(suggestedAmount);
3864
				sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3865
				sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3866
				sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3867
				sdCreditRequirementRepository.persist(sdCreditRequirement);
3868
			}
30929 tejbeer 3869
 
30936 tejbeer 3870
			CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30929 tejbeer 3871
 
3872
			sdCreditRequirement.setRisk(creditRisk);
3873
 
30913 tejbeer 3874
			sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3875
			sdCreditRequirement.setLimit(suggestedAmount);
3876
			BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
3877
 
3878
			BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
3879
 
3880
			LOGGER.info("utilizedLimit {} ", utilizedLimit);
3881
 
3882
			LOGGER.info("availableLimit {} ", availableLimit);
3883
 
3884
			sdCreditRequirement.setUtilizedAmount(utilizedLimit);
3885
 
3886
			sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3887
 
30934 tejbeer 3888
			CreditAccount creditAccount = creditAccountRepository
3889
					.selectByFofoIdAndGateway(sdCreditRequirement.getFofoId(), Gateway.SDDIRECT);
30965 tejbeer 3890
			if (creditAccount != null) {
30934 tejbeer 3891
 
30965 tejbeer 3892
				creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3893
				creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3894
				creditAccount.setAvailableAmount(availableLimit.floatValue());
3895
				creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
30934 tejbeer 3896
				creditAccount.setUpdatedOn(LocalDateTime.now());
3897
			}
3898
 
30913 tejbeer 3899
		}
3900
 
3901
	}
3902
 
30936 tejbeer 3903
	public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 3904
 
30936 tejbeer 3905
		sdCreditService.updateRisk();
3906
		List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
3907
		if (!defaultLoans.isEmpty()) {
3908
			this.sendDefaultLoanAlert(defaultLoans);
30929 tejbeer 3909
		}
3910
 
3911
	}
3912
 
30936 tejbeer 3913
	public void sendDefaultLoanAlert(List<Loan> defaultLoans)
3914
			throws ProfitMandiBusinessException, MessagingException, IOException {
3915
		String subject = "Default Partners";
30929 tejbeer 3916
 
30936 tejbeer 3917
		List<AuthUser> authUsers = csService
3918
				.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_FINANCIAL_SERVICES);
31177 tejbeer 3919
 
3920
		authUsers.addAll(csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS));
30936 tejbeer 3921
		if (!authUsers.isEmpty()) {
3922
			List<String> financeEmails = authUsers.stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3923
			String messageText = this.getMessageForDueDateExtend(defaultLoans);
30929 tejbeer 3924
 
30936 tejbeer 3925
			String[] email = financeEmails.toArray(new String[financeEmails.size()]);
30929 tejbeer 3926
 
30936 tejbeer 3927
			this.sendMailHtmlFormat(email, messageText, null, subject);
30929 tejbeer 3928
 
30936 tejbeer 3929
		}
30929 tejbeer 3930
 
30936 tejbeer 3931
		for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
3932
			List<Loan> filteredRows = new ArrayList<>();
3933
			for (Loan loan : defaultLoans) {
30929 tejbeer 3934
 
30936 tejbeer 3935
				if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 3936
 
30936 tejbeer 3937
					filteredRows.add(loan);
30929 tejbeer 3938
				}
3939
			}
30936 tejbeer 3940
			if (!filteredRows.isEmpty()) {
3941
				String messageText = this.getMessageForDueDateExtend(filteredRows);
3942
				String[] email = new String[] { storeGuyEntry.getKey() };
30929 tejbeer 3943
 
30936 tejbeer 3944
				this.sendMailHtmlFormat(email, messageText, null, subject);
30929 tejbeer 3945
 
30931 tejbeer 3946
			}
3947
 
30936 tejbeer 3948
		}
30929 tejbeer 3949
 
30936 tejbeer 3950
		for (Loan defaultLoan : defaultLoans) {
3951
			List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 3952
 
30936 tejbeer 3953
			double amount = loanStatements.stream().map(x -> x.getAmount())
3954
					.collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3955
 
30982 tejbeer 3956
			com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
3957
 
3958
			Address address = addressRepository.selectById(user.getAddressId());
3959
 
30989 tejbeer 3960
			String title = "Loan Amount Overdue!";
30936 tejbeer 3961
			String url = "http://app.smartdukaan.com/pages/home/credit";
30989 tejbeer 3962
			String message = "Your loan due date "
30936 tejbeer 3963
					+ defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
30991 tejbeer 3964
					+ " has been exceeded. Additional penal interest of "
3965
					+ defaultLoan.getInterestRate().setScale(2, RoundingMode.HALF_UP)
30989 tejbeer 3966
					+ "%  and Rs.100 shall be levied on daily basis." + " Your total pending Loan amount is Rs."
30991 tejbeer 3967
					+ FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
30936 tejbeer 3968
			notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title,
3969
					message, url);
3970
 
30989 tejbeer 3971
			notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 3972
 
30929 tejbeer 3973
		}
3974
	}
3975
 
3976
	private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
3977
		StringBuilder sb = new StringBuilder();
30936 tejbeer 3978
		sb.append(
3979
				"<html><body><p>Alert</p><p>Default Partners :-</p>" + "<br/><p>EveryDay Rs.100 charged as Penalty</p>"
3980
						+ "<br/><table style='border:1px solid black ;padding: 5px';>");
30929 tejbeer 3981
		sb.append("<tbody>\n" + "	    				<tr>\n"
3982
				+ "	    					<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n"
3983
				+ "	    					<th style='border:1px solid black;padding: 5px'>due date</th>\n"
3984
				+ "	    					<th style='border:1px solid black;padding: 5px'>Days</th>\n"
30936 tejbeer 3985
				+ "	    					<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n"
30929 tejbeer 3986
 
3987
				+ "	    				</tr>");
3988
		for (Loan entry : loans) {
30936 tejbeer 3989
 
3990
			List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
3991
 
3992
			double amount = loanStatements.stream().map(x -> x.getAmount())
3993
					.collect(Collectors.summingDouble(x -> x.doubleValue()));
3994
 
30929 tejbeer 3995
			long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
3996
 
3997
			CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3998
 
3999
			sb.append("<tr>");
4000
			sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "("
4001
					+ customRetailer.getCode() + ")" + "</td>");
4002
 
4003
			sb.append("<td style='border:1px solid black;padding: 5px'>"
4004
					+ entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
4005
			sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
30936 tejbeer 4006
			sb.append("<td style='border:1px solid black;padding: 5px'>"
4007
					+ new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
30929 tejbeer 4008
 
4009
			sb.append("</tr>");
4010
 
4011
		}
4012
 
4013
		sb.append("</tbody></table></body></html>");
4014
 
4015
		return sb.toString();
4016
	}
4017
 
30936 tejbeer 4018
	public void notifyLoanDueDateCross() throws ProfitMandiBusinessException, MessagingException, IOException {
4019
 
4020
		List<Loan> loans = loanRepository.selectAllActiveLoan().stream()
4021
				.filter(x -> x.getDueDate().isBefore(LocalDateTime.now())).collect(Collectors.toList());
4022
		if (!loans.isEmpty()) {
4023
			for (Loan loan : loans) {
4024
 
4025
				long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
4026
 
30982 tejbeer 4027
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
4028
 
4029
				Address address = addressRepository.selectById(user.getAddressId());
4030
 
30936 tejbeer 4031
				LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
4032
 
4033
				if (noOfdaysBetween <= 15 && noOfdaysBetween >= 0) {
4034
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
4035
 
4036
					double amount = loanStatements.stream().map(x -> x.getAmount())
4037
							.collect(Collectors.summingDouble(x -> x.doubleValue()));
4038
 
30989 tejbeer 4039
					String url = "http://app.smartdukaan.com/pages/home/credit";
4040
 
30982 tejbeer 4041
					String title = "Alert!";
30989 tejbeer 4042
					String message = "Your loan due date "
30936 tejbeer 4043
							+ loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
30991 tejbeer 4044
							+ " has been exceeded. Additional penal interest of "
4045
							+ loan.getInterestRate().setScale(2, RoundingMode.HALF_UP)
30989 tejbeer 4046
							+ "% shall be levied on daily basis. Your total pending loan amount is Rs."
30936 tejbeer 4047
							+ FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
30989 tejbeer 4048
 
30936 tejbeer 4049
					notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title,
4050
							message, url);
30982 tejbeer 4051
 
30989 tejbeer 4052
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4053
 
30936 tejbeer 4054
				}
4055
			}
4056
		}
4057
 
4058
	}
4059
 
4060
	public void alertForDueDate() throws ProfitMandiBusinessException, MessagingException, IOException {
4061
 
4062
		List<Loan> loans = loanRepository.selectAllActiveLoan();
4063
 
4064
		if (!loans.isEmpty()) {
4065
			for (Loan loan : loans) {
4066
 
30982 tejbeer 4067
				com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
4068
 
4069
				Address address = addressRepository.selectById(user.getAddressId());
4070
 
30936 tejbeer 4071
				long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
4072
 
4073
				LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
4074
 
4075
				if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
4076
					List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
4077
					double amount = loanStatements.stream().map(x -> x.getAmount())
4078
							.collect(Collectors.summingDouble(x -> x.doubleValue()));
4079
 
30965 tejbeer 4080
					String title = "Alert!";
30936 tejbeer 4081
					String url = "http://app.smartdukaan.com/pages/home/credit";
4082
					String message = null;
4083
					if (noOfdaysBetween == 0) {
4084
 
4085
						message = "Your total pending Loan amount is Rs."
4086
								+ FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
4087
 
4088
					} else {
4089
 
4090
						message = "Your total pending Loan amount is Rs."
4091
								+ FormattingUtils.formatDecimal(Math.abs(amount)) + " is due by "
4092
								+ loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))
30989 tejbeer 4093
								+ " , Pay Now!!";
30936 tejbeer 4094
 
4095
					}
4096
					notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title,
4097
							message, url);
30989 tejbeer 4098
					notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4099
 
30936 tejbeer 4100
				}
4101
			}
4102
		}
4103
 
4104
	}
4105
 
30982 tejbeer 4106
	public void userMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
4107
 
4108
		List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
4109
 
4110
		List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository
4111
				.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
4112
 
4113
		List<Address> addresses = addressRepository
4114
				.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
4115
 
30984 tejbeer 4116
		LOGGER.info("addresses" + addresses);
4117
 
30982 tejbeer 4118
		for (Address address : addresses) {
4119
			Map<String, String> requestheaders = new HashMap<>();
4120
			requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4121
			Map<String, String> requestParams = new HashMap<>();
4122
			requestParams.put("userid", String.valueOf(2000215976));
4123
			requestParams.put("password", "MFRd!BBL");
30983 tejbeer 4124
			requestParams.put("phone_number", address.getPhoneNumber());
30982 tejbeer 4125
			requestParams.put("auth_scheme", "plain");
4126
			requestParams.put("v", "1.1");
30983 tejbeer 4127
			requestParams.put("format", "json");
30982 tejbeer 4128
 
4129
			requestParams.put("method", "OPT_IN");
4130
 
4131
			requestParams.put("channel", "WHATSAPP");
4132
			String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams,
4133
					requestheaders);
4134
			LOGGER.info("response" + response);
4135
		}
4136
 
4137
	}
4138
 
4139
	public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
4140
 
4141
		List<AuthUser> authUsers = authRepository.selectAllActiveUser();
30984 tejbeer 4142
		LOGGER.info("authUsers" + authUsers);
4143
 
30982 tejbeer 4144
		for (AuthUser authUser : authUsers) {
4145
			Map<String, String> requestheaders = new HashMap<>();
4146
			requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4147
			Map<String, String> requestParams = new HashMap<>();
4148
			requestParams.put("userid", String.valueOf(2000215976));
4149
			requestParams.put("password", "MFRd!BBL");
30983 tejbeer 4150
			requestParams.put("phone_number", authUser.getMobileNumber());
30982 tejbeer 4151
			requestParams.put("auth_scheme", "plain");
4152
			requestParams.put("v", "1.1");
30983 tejbeer 4153
			requestParams.put("format", "json");
30982 tejbeer 4154
 
4155
			requestParams.put("method", "OPT_IN");
4156
 
4157
			requestParams.put("channel", "WHATSAPP");
4158
			String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams,
4159
					requestheaders);
4160
			LOGGER.info("response" + response);
4161
		}
4162
 
4163
	}
4164
 
31206 tejbeer 4165
	@Autowired
4166
	private HygieneDataRepository hygieneDataRepository;
4167
 
4168
	public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
4169
 
4170
		List<String> remarks = new ArrayList<>();
4171
		remarks.add("Out of Service");
4172
		remarks.add("Duplicate number");
4173
		remarks.add("Partner number");
4174
		List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(),
4175
				remarks);
4176
 
4177
		if (!hygieneData.isEmpty()) {
4178
 
4179
			Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream()
4180
					.collect(Collectors.groupingBy(x -> x.getFofoId()));
4181
 
4182
			for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
4183
 
4184
				StringBuilder sb = new StringBuilder();
4185
				sb.append("<html><body><p>Dear Partner,"
4186
						+ "</p><br/><p>It has been observed in our calls to the respective customers that the contact no is either not correct or does not have incoming calls.\n"
4187
 
4188
						+ " </p>"
4189
						+ "<p>We would like to inform you that this will hinder all our marketing initiatives to bring this customer back to our smartdukaan or cross sell any product from your inventory."
4190
						+ "</p><p>Kindly ensure going forward that the details are correct so to avoid 1% margin loss.\n"
4191
						+ "</p><p>In case the data is found to be incorrect there is a loss of 1% margin on this sales under SmartDukaan hygiene guidelines.\n"
4192
						+ "				" + "</p>"
4193
 
4194
						+ "<br/><table style='border:1px solid black ;padding: 5px';>");
4195
				sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4196
				sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4197
				sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4198
				sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4199
				sb.append("</tr>\n");
4200
 
4201
				List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
4202
 
4203
				List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
4204
 
4205
				List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
4206
 
4207
				for (FofoOrder fofoOrder : fofoOrders) {
4208
					Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4209
					sb.append("<tr>");
4210
					sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber()
4211
							+ "</td>\n");
4212
					sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + ""
4213
							+ customer.getLastName() + "</td>\n");
4214
					sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber()
4215
							+ "</td>\n");
4216
 
4217
					sb.append("</tr>\n");
4218
				}
4219
 
4220
				sb.append("</tbody></table></body></html>");
4221
				String subject = "Customer Info - Hygiene Alert";
4222
 
4223
				this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(), null, subject);
4224
 
4225
			}
4226
 
4227
		}
4228
 
4229
	}
4230
 
4231
	public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
4232
 
4233
		List<String> remarks = new ArrayList<>();
4234
		remarks.add("Out of Service");
4235
		remarks.add("Duplicate number");
4236
		remarks.add("Partner number");
4237
		List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository
4238
				.selectDisposedDateAndRemarks(
4239
						LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1)
4240
								.withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX),
4241
						remarks);
4242
 
4243
		List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository
4244
				.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
4245
		Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4246
		Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
4247
 
4248
		Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
4249
 
4250
		if (!hygieneDataLastThreeMonth.isEmpty()) {
4251
			partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream()
4252
					.collect(Collectors.groupingBy(x -> x.getFofoId()));
4253
 
4254
		}
4255
 
4256
		if (!hygieneDataRecentMonth.isEmpty()) {
4257
			partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream()
4258
					.collect(Collectors.groupingBy(x -> x.getFofoId()));
4259
		}
4260
 
4261
		for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
4262
 
4263
			String email = storeGuyEntry.getKey();
4264
 
4265
			List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4266
 
4267
			Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4268
			Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4269
			for (Integer fofoId : fofoIds) {
4270
 
4271
				partnerYearMonthData.put(fofoId, null);
4272
				partnerDateWiseData.put(fofoId, null);
4273
				if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4274
					List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
4275
 
4276
					if (hygienes != null) {
4277
						Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream()
4278
								.collect(Collectors.groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
4279
 
4280
						partnerYearMonthData.put(fofoId, yearMonthData);
4281
 
4282
					}
4283
					List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
4284
 
4285
					if (dateWiseHygienes != null) {
4286
 
4287
						Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream()
4288
								.collect(Collectors.groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
4289
 
4290
						partnerDateWiseData.put(fofoId, dateWiseData);
4291
 
4292
					}
4293
 
4294
				}
4295
 
4296
			}
4297
 
4298
			String subject = "Customer Info - Hygiene Alert";
4299
 
4300
			LOGGER.info("hygieneData {}", partnerDateWiseData.values());
4301
 
4302
			boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
4303
 
4304
			boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
4305
 
4306
			if (!partnerDateWise && !partnerYearMonth) {
4307
				String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
4308
				this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb, null, subject);
4309
			}
4310
 
4311
		}
4312
 
4313
	}
4314
 
4315
	private String getMessageHygieneAlertForPartner(
4316
			Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData,
4317
			Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData) {
4318
 
4319
		Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
4320
 
4321
		LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4322
		LocalDateTime endDate = LocalDateTime.now();
4323
 
4324
		LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
4325
		LocalDateTime endYearMonth = LocalDate.now().minusMonths(1)
4326
				.withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
4327
 
4328
		DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
4329
 
4330
		List<YearMonth> yearMonthRange = new ArrayList<>();
4331
		yearMonthRange.add(YearMonth.from(startYearMonth));
4332
 
4333
		yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
4334
 
4335
		yearMonthRange.add(YearMonth.from(endYearMonth));
4336
 
4337
		long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
4338
 
4339
		List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1))
4340
				.limit(noOfDaysBetween).collect(Collectors.toList());
4341
 
4342
		StringBuilder sb = new StringBuilder();
4343
		sb.append("<html><body><p>Hi,"
4344
				+ "</p><br/><p>Kindly advise below mentioned partner to input correct details in the system else this will hinder all our marketing initiatives to bring this customer back to our smartdukaan or cross sell any product from partner's inventory.\n"
4345
				+ " </p>" + "<p>Kindly ensure going forward that the details are correct so to avoid 1% margin loss.\n"
4346
				+ "</p><p>In case the data is found to be incorrect there is a loss of 1% margin on this sales under SmartDukaan hygiene guidelines.\n</p>"
4347
 
4348
				+ "<table style='border:1px solid black ;padding: 5px';>");
4349
		sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4350
		sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
4351
 
4352
		for (YearMonth yearMonth : yearMonthRange) {
4353
			sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter)
4354
					+ "</th>\n");
4355
		}
4356
 
4357
		for (LocalDate localDate : dateRange) {
4358
			sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4359
		}
4360
 
4361
		sb.append("</tr>\n");
4362
 
4363
		for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData
4364
				.entrySet()) {
4365
 
4366
			int fofoId = partnerYearMonthEntry.getKey();
4367
 
4368
			Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
4369
 
4370
			Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
4371
 
4372
			if (yearMonthData == null && dateWiseData == null) {
4373
				continue;
4374
			}
4375
 
4376
			sb.append("<tr>");
4377
			sb.append("<td style='border:1px solid black;padding: 5px'>"
4378
					+ customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
4379
			for (YearMonth yearMonth : yearMonthRange) {
4380
 
4381
				if (yearMonthData == null) {
4382
					sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4383
 
4384
				} else {
4385
					List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
4386
 
4387
					if (hygieneList != null) {
4388
						sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
4389
 
4390
					} else {
4391
						sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4392
 
4393
					}
4394
				}
4395
			}
4396
 
4397
			for (LocalDate localDate : dateRange) {
4398
 
4399
				if (dateWiseData == null) {
4400
					sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4401
 
4402
				} else {
4403
					List<HygieneData> hygieneList = dateWiseData.get(localDate);
4404
 
4405
					if (hygieneList != null) {
4406
						sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
4407
 
4408
					} else {
4409
						sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
4410
 
4411
					}
4412
				}
4413
			}
4414
			sb.append("</tr>");
4415
 
4416
		}
4417
 
4418
		sb.append("</tbody></table></body></html>");
4419
 
4420
		return sb.toString();
4421
	}
4422
 
26418 tejbeer 4423
}
31206 tejbeer 4424
// 2284'