Subversion Repositories SmartDukaan

Rev

Rev 31604 | Rev 31618 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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