Subversion Repositories SmartDukaan

Rev

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

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