Subversion Repositories SmartDukaan

Rev

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