Subversion Repositories SmartDukaan

Rev

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