Subversion Repositories SmartDukaan

Rev

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