Subversion Repositories SmartDukaan

Rev

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