Subversion Repositories SmartDukaan

Rev

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