Subversion Repositories SmartDukaan

Rev

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