Subversion Repositories SmartDukaan

Rev

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