Subversion Repositories SmartDukaan

Rev

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