Subversion Repositories SmartDukaan

Rev

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