Subversion Repositories SmartDukaan

Rev

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