Subversion Repositories SmartDukaan

Rev

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