Subversion Repositories SmartDukaan

Rev

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