Subversion Repositories SmartDukaan

Rev

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