Subversion Repositories SmartDukaan

Rev

Rev 32005 | Rev 32007 | 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");
32005 amit.gupta 994
        processScheme(LocalDate.of(2023,05, 01).atStartOfDay(), LocalDate.of(2023, 05, 2).atStartOfDay(), true);
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
    }
25598 amit.gupta 1014
 
31697 amit.gupta 1015
    public void sendMailForSamsungRebilling() throws Exception {
1016
        List<BilledImeiModel> samsungModels = warehouseInventoryItemRepository.findByBillingDateBrand(LocalDate.now(), "Samsung");
1017
        LOGGER.info("SamsungModels {}", samsungModels);
1018
        samsungModels = samsungModels.stream().sorted(Comparator.comparing(x -> x.getPcmDate() == null ? -1 : 1)).collect(Collectors.toList());
1019
        if (samsungModels.size() > 0) {
1020
            List<String> headers = Arrays.asList("Partner Id", "Code", "Name", "City", "Brand", "Model Name", "Model Number", "Color", "Serial Number", "Remarks");
1021
            List<List<?>> rows = new ArrayList<>();
1022
            for (BilledImeiModel billedImeiModel : samsungModels) {
31886 tejbeer 1023
                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 1024
                rows.add(row);
1025
            }
1026
            ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1027
            String[] sendToArray = new String[]{"kamini.sharma@smartdukaan.com", "praveen.sharma@smartdukaan.com"};
1028
            String fileName = "Imeis need Rebilling -" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
31886 tejbeer 1029
            Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{"tarun.verma@smartdukaan.com"}, "Samsung Rebilling IMEI Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1030
        }
1031
    }
24002 amit.gupta 1032
 
31697 amit.gupta 1033
    public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
1034
        LocalDate yesterDay = LocalDate.now().minusDays(1);
1035
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
31886 tejbeer 1036
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25312 amit.gupta 1037
 
31886 tejbeer 1038
        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 1039
        List<List<?>> rows = new ArrayList<>();
1040
        Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1041
 
31697 amit.gupta 1042
        Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25312 amit.gupta 1043
 
31886 tejbeer 1044
        Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(groupingBy(
1045
                x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
24271 amit.gupta 1046
 
31697 amit.gupta 1047
        for (FofoStore fofoStore : fofoStores) {
1048
            LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
1049
            int fofoId = fofoStore.getId();
1050
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
1051
            partnerDailyInvestment.setDate(yesterDay);
24177 govind 1052
 
31697 amit.gupta 1053
            try {
1054
                partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
31886 tejbeer 1055
                shortDaysMap.put(fofoId, shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
31697 amit.gupta 1056
            } catch (Exception e) {
1057
                // ignore the exceptions during persist
1058
            }
25598 amit.gupta 1059
 
31697 amit.gupta 1060
            CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
1061
            if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
1062
                LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1063
                continue;
1064
            }
1065
            FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1066
            List<Serializable> row = new ArrayList<>();
31886 tejbeer 1067
            row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(), reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
31697 amit.gupta 1068
            row.addAll(
31886 tejbeer 1069
                    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 1070
            partnerRowsMap.put(fofoStore.getId(), row);
1071
            rows.add(row);
25837 amit.gupta 1072
 
31697 amit.gupta 1073
        }
25837 amit.gupta 1074
 
31697 amit.gupta 1075
        String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25837 amit.gupta 1076
 
31697 amit.gupta 1077
        if (sendTo == null) {
1078
            for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
31886 tejbeer 1079
                List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 1080
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1081
                String[] sendToArray = new String[]{storeGuyEntry.getKey()};
31886 tejbeer 1082
                Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1083
            }
31886 tejbeer 1084
            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 1085
        }
25837 amit.gupta 1086
 
31697 amit.gupta 1087
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1088
        String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
31886 tejbeer 1089
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
25837 amit.gupta 1090
 
31697 amit.gupta 1091
    }
25598 amit.gupta 1092
 
31697 amit.gupta 1093
    private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() {
1094
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1095
        Map<String, SaleRoles> partnerEmailRBMMap = new HashMap<>();
24271 amit.gupta 1096
 
31886 tejbeer 1097
        List<Position> positions = positionRepository.selectPositionByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM));
1098
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 1099
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1100
        for (Position position : positions) {
1101
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
1102
            if (crList == null)
1103
                continue;
1104
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES) {
1105
                for (CustomRetailer cr : crList) {
1106
                    if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1107
                        partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1108
                    }
1109
                    SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1110
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1111
                    if (authUser == null) {
1112
                        continue;
1113
                    }
1114
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1115
                    if (position.getEscalationType().equals(EscalationType.L1)) {
1116
                        saleRoles.getL1().add(name);
1117
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
1118
                        saleRoles.getL2().add(name);
1119
                    }
1120
                }
1121
            }
1122
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM) {
1123
                for (CustomRetailer cr : crList) {
1124
                    if (!partnerEmailRBMMap.containsKey(cr.getEmail())) {
1125
                        partnerEmailRBMMap.put(cr.getEmail(), new SaleRoles());
1126
                    }
1127
                    SaleRoles saleRoles = partnerEmailRBMMap.get(cr.getEmail());
1128
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1129
                    if (authUser == null) {
1130
                        continue;
1131
                    }
1132
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1133
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1134
                        saleRoles.getL1().add(name);
1135
                    }
1136
                    /*else if (position.getEscalationType().equals(EscalationType.L2)) {
1137
                        saleRoles.getL2().add(name);
1138
                    }*/
1139
                }
1140
            }
24692 amit.gupta 1141
 
31697 amit.gupta 1142
        }
25418 amit.gupta 1143
 
31697 amit.gupta 1144
        Set<CustomRetailer> allCrList = new HashSet<>();
1145
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1146
            allCrList.addAll(cr);
1147
        }
25609 amit.gupta 1148
 
31886 tejbeer 1149
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25503 amit.gupta 1150
 
31697 amit.gupta 1151
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25503 amit.gupta 1152
 
31697 amit.gupta 1153
        for (CustomRetailer cr : allCrList) {
1154
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
1155
            if (fofoStore == null) {
1156
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1157
                continue;
1158
            }
1159
            String code = fofoStore.getCode();
1160
            // String storeName = "SmartDukaan-" +
1161
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
1162
            String businessName = cr.getBusinessName();
1163
            try {
1164
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1165
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
1166
                String bdm = StringUtils.join(partnerEmailRBMMap.get(cr.getEmail()).getL1(), ", ");
1167
                FofoReportingModel reportingModel = new FofoReportingModel();
1168
                reportingModel.setBusinessName(businessName);
1169
                reportingModel.setCode(code);
1170
                reportingModel.setFofoId(fofoStore.getId());
1171
                reportingModel.setRegionalManager(stateManager);
1172
                reportingModel.setTerritoryManager(territoryManager);
1173
                reportingModel.setBusinessManager(bdm);
1174
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
1175
            } catch (Exception e) {
1176
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1177
            }
1178
        }
1179
        return partnerIdSalesHeadersMap;
24533 govind 1180
 
31697 amit.gupta 1181
    }
28709 amit.gupta 1182
 
31697 amit.gupta 1183
    public void sendPartnerInvestmentDetails() throws Exception {
1184
        this.sendPartnerInvestmentDetails(null);
1185
    }
28709 amit.gupta 1186
 
31697 amit.gupta 1187
    public void sendAgeingReport(String... sendTo) throws Exception {
28790 amit.gupta 1188
 
31886 tejbeer 1189
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW, "itemstockageing.xml");
1190
        InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "ItemwiseOverallPendingIndent.xml");
31697 amit.gupta 1191
        Attachment attachment = new Attachment(
1192
                "ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
1193
        Attachment attachment1 = new Attachment(
1194
                "pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
28790 amit.gupta 1195
 
31886 tejbeer 1196
        Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA", attachment);
1197
        Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null, "Itemwise Pending indent", "PFA", attachment1);
28790 amit.gupta 1198
 
31697 amit.gupta 1199
        // Reports to be sent to mapped partners
1200
        Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
28790 amit.gupta 1201
 
31697 amit.gupta 1202
        for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
1203
            Map<String, String> params = new HashMap<>();
1204
            if (storeGuyEntry.getValue().size() == 0)
1205
                continue;
1206
            params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
31886 tejbeer 1207
            InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "focostockreport.xml", params);
31697 amit.gupta 1208
            Attachment attache = new Attachment(
1209
                    "Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
1210
            System.out.println(storeGuyEntry.getValue());
31886 tejbeer 1211
            Utils.sendMailWithAttachments(googleMailSender, new String[]{storeGuyEntry.getKey()}, null, "Franchise Stock Report", "PFA", attache);
31697 amit.gupta 1212
        }
28839 tejbeer 1213
 
31697 amit.gupta 1214
    }
28839 tejbeer 1215
 
31697 amit.gupta 1216
    public void sendIndentTertiary() throws Exception {
28790 amit.gupta 1217
 
31886 tejbeer 1218
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "indentandtertiary.xml");
31697 amit.gupta 1219
        Attachment attachment = new Attachment(
1220
                "indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
31886 tejbeer 1221
        Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report", "PFA", attachment);
28790 amit.gupta 1222
 
31697 amit.gupta 1223
    }
28790 amit.gupta 1224
 
31697 amit.gupta 1225
    public void sendAttendanceMorningAlert() throws Exception {
1226
        LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
1227
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1228
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1229
 
31697 amit.gupta 1230
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1231
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28790 amit.gupta 1232
 
31886 tejbeer 1233
        List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
28784 amit.gupta 1234
 
31886 tejbeer 1235
        Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream().collect(groupingBy(EmployeeAttendance::getUserId, Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
31697 amit.gupta 1236
        for (AuthUser authUser : authUsers) {
1237
            User user = userMap.get(authUser.getEmailId());
1238
            Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
1239
            LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
1240
            if (employeeAttendanceOptional != null) {
1241
                LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
1242
                if (employeeAttendanceOptional.orElse(null) != null) {
31886 tejbeer 1243
                    LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}", employeeAttendanceOptional.get().getCreateTimestamp());
31697 amit.gupta 1244
                }
1245
            }
31886 tejbeer 1246
            if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null || employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
31697 amit.gupta 1247
                LOGGER.info("Will Send Email to {}", authUser.getFullName());
1248
                String body = String.format(
31886 tejbeer 1249
                        "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 1250
 
31886 tejbeer 1251
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
28790 amit.gupta 1252
 
31697 amit.gupta 1253
            }
1254
        }
28790 amit.gupta 1255
 
31697 amit.gupta 1256
    }
28790 amit.gupta 1257
 
31697 amit.gupta 1258
    public void sendAttendanceEveningAlert() throws Exception {
1259
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1260
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1261
 
31697 amit.gupta 1262
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1263
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1264
 
31886 tejbeer 1265
        Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream().collect(groupingBy(x -> x.getUserId()));
28709 amit.gupta 1266
 
31697 amit.gupta 1267
        for (AuthUser authUser : authUsers) {
1268
            User user = userMap.get(authUser.getEmailId());
1269
            String body = null;
1270
            List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1271
            if (employeeAttendances == null) {
1272
                body = String.format(
31886 tejbeer 1273
                        "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 1274
            } else {
31886 tejbeer 1275
                List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
31697 amit.gupta 1276
                if (punchTimes.size() == 1) {
1277
                    // body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1278
                    // You have been marked absent for half the day. You may contact your manager
1279
                    // and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
1280
                } else {
1281
                    LocalDateTime firstPunch = punchTimes.get(0);
1282
                    LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
1283
                    Duration duration = Duration.between(firstPunch, lastPunch);
1284
                    boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1285
                    if (!hoursCompleted) {
1286
                        body = String.format(
31886 tejbeer 1287
                                "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 1288
                    }
1289
                }
28709 amit.gupta 1290
 
31697 amit.gupta 1291
            }
1292
            if (body != null) {
31886 tejbeer 1293
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
31697 amit.gupta 1294
            }
1295
        }
28709 amit.gupta 1296
 
31697 amit.gupta 1297
        this.sendMailToHR();
28709 amit.gupta 1298
 
31697 amit.gupta 1299
    }
28709 amit.gupta 1300
 
31697 amit.gupta 1301
    private void sendMailToHR() throws Exception {
1302
        Map<String, String> map = new HashMap<>();
1303
        String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1304
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1305
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
31886 tejbeer 1306
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "employeeattendance.xml");
1307
        Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
1308
        Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null, "Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
31697 amit.gupta 1309
    }
28709 amit.gupta 1310
 
31697 amit.gupta 1311
    public void checkPartnerActiveStore() throws Exception {
24697 amit.gupta 1312
 
31697 amit.gupta 1313
        List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
23929 amit.gupta 1314
 
31697 amit.gupta 1315
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1316
        if (!fofoStores.isEmpty()) {
1317
            for (FofoStore fofoStore : fofoStores) {
24551 amit.gupta 1318
 
31697 amit.gupta 1319
                if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
24542 amit.gupta 1320
 
31697 amit.gupta 1321
                    fofoStore.setActive(true);
1322
                    fofoStoreRepository.persist(fofoStore);
1323
                    LOGGER.info("inserted into InActiveFofoStore successfully");
29160 amit.gupta 1324
 
31697 amit.gupta 1325
                } else {
1326
                    fofoStore.setActive(false);
1327
                    fofoStore.setActiveTimeStamp(null);
1328
                    fofoStoreRepository.persist(fofoStore);
1329
                    LOGGER.info("inserted into InActiveFofoStore successfully");
1330
                }
24542 amit.gupta 1331
 
31697 amit.gupta 1332
            }
1333
        }
24542 amit.gupta 1334
 
31697 amit.gupta 1335
    }
24548 amit.gupta 1336
 
31697 amit.gupta 1337
    public void sendAgeingReport() throws Exception {
31886 tejbeer 1338
        sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
31697 amit.gupta 1339
    }
24542 amit.gupta 1340
 
31697 amit.gupta 1341
    public void moveImeisToPriceDropImeis() throws Exception {
1342
        List<PriceDrop> priceDrops = priceDropRepository.selectAll();
1343
        for (PriceDrop priceDrop : priceDrops) {
1344
            priceDropService.priceDropStatus(priceDrop.getId());
1345
        }
1346
    }
29160 amit.gupta 1347
 
31697 amit.gupta 1348
    public void walletmismatch() throws Exception {
1349
        LocalDate curDate = LocalDate.now();
1350
        List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
1351
        System.out.println(pdis.size());
1352
        for (PartnerDailyInvestment pdi : pdis) {
1353
            int fofoId = pdi.getFofoId();
31886 tejbeer 1354
            for (PartnerDailyInvestment investment : Lists.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
1355
                float statementAmount = walletService.getOpeningTill(fofoId, investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
31697 amit.gupta 1356
                CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
31886 tejbeer 1357
                LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(), investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
29160 amit.gupta 1358
 
31697 amit.gupta 1359
            }
1360
        }
29160 amit.gupta 1361
 
31697 amit.gupta 1362
    }
29160 amit.gupta 1363
 
31697 amit.gupta 1364
    @Autowired
1365
    StateRepository stateRepository;
29160 amit.gupta 1366
 
31697 amit.gupta 1367
    public void gst() throws Exception {
31886 tejbeer 1368
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(), LocalDateTime.now());
31697 amit.gupta 1369
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 1370
            int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24548 amit.gupta 1371
 
31697 amit.gupta 1372
            Address retailerAddress = addressRepository.selectById(retailerAddressId);
1373
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1374
            Integer stateId = null;
1375
            if (customerAddress.getState().equals(retailerAddress.getState())) {
1376
                try {
1377
                    stateId = stateRepository.selectByName(customerAddress.getState()).getId();
1378
                } catch (Exception e) {
1379
                    LOGGER.error("Cannot found state named {}", customerAddress.getState());
1380
                    continue;
1381
                }
1382
            }
1383
            Map<Integer, GstRate> itemIdStateTaxRateMap = null;
1384
            Map<Integer, Float> itemIdIgstTaxRateMap = null;
24542 amit.gupta 1385
 
31697 amit.gupta 1386
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1387
            List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
1388
            if (stateId != null) {
1389
                itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
1390
            } else {
1391
                itemIdIgstTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
1392
            }
24580 amit.gupta 1393
 
31697 amit.gupta 1394
            for (FofoOrderItem foi : fofoOrderItems) {
1395
                float sgstRate = foi.getSgstRate();
1396
                float cgstRate = foi.getCgstRate();
1397
                float igstRate = foi.getIgstRate();
1398
                if (stateId == null && igstRate == 0) {
24587 amit.gupta 1399
 
31697 amit.gupta 1400
                    foi.setSgstRate(0);
1401
                    foi.setCgstRate(0);
1402
                    foi.setIgstRate(itemIdIgstTaxRateMap.get(foi.getItemId()));
24587 amit.gupta 1403
 
31697 amit.gupta 1404
                    LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
31886 tejbeer 1405
                    LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
31697 amit.gupta 1406
                    LOGGER.info("Rates getIgstRate() {}", itemIdIgstTaxRateMap.get(foi.getItemId()));
24587 amit.gupta 1407
 
31697 amit.gupta 1408
                } else if (stateId != null && sgstRate == 0 && cgstRate == 0) {
24587 amit.gupta 1409
 
31697 amit.gupta 1410
                    foi.setIgstRate(0);
1411
                    foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1412
                    foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24587 amit.gupta 1413
 
31697 amit.gupta 1414
                    LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
31886 tejbeer 1415
                    LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
1416
                    LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(), itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
31697 amit.gupta 1417
                }
1418
            }
1419
        }
26092 amit.gupta 1420
 
31697 amit.gupta 1421
    }
24590 amit.gupta 1422
 
31697 amit.gupta 1423
    public void schemewalletmismatch() {
1424
        LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
1425
        while (dateToReconcile.isBefore(LocalDate.now())) {
1426
            reconcileSchemes(dateToReconcile);
1427
            // reconcileOrders(dateTime);
1428
            // reconcileRecharges(dateTime);
1429
            dateToReconcile = dateToReconcile.plusDays(1);
1430
        }
1431
    }
24587 amit.gupta 1432
 
31697 amit.gupta 1433
    private void reconcileSchemes(LocalDate date) {
1434
        LocalDateTime startDate = date.atStartOfDay();
1435
        LocalDateTime endDate = startDate.plusDays(1);
1436
        List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1437
        List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
1438
        double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1439
        double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
1440
        double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
31886 tejbeer 1441
        List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT);
1442
        List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate, walletReferenceTypes);
31697 amit.gupta 1443
        double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1444
        if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
1445
            LOGGER.info("Scheme Amount mismatched for Date {}", date);
24590 amit.gupta 1446
 
31724 amit.gupta 1447
            Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1448
 
31886 tejbeer 1449
            Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
24635 amit.gupta 1450
 
31724 amit.gupta 1451
            Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1452
 
31886 tejbeer 1453
            Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
24635 amit.gupta 1454
 
31697 amit.gupta 1455
            Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
24635 amit.gupta 1456
 
31697 amit.gupta 1457
            for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1458
                if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1459
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1460
                } else {
31886 tejbeer 1461
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
31697 amit.gupta 1462
                }
1463
            }
31886 tejbeer 1464
            Map<Integer, Integer> userWalletMap = userWalletRepository.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1465
 
31724 amit.gupta 1466
            Map<Integer, Double> walletAmountMap = history.stream().collect(groupingBy(
31697 amit.gupta 1467
                    UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1468
            for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1469
                double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1470
                if (diff > 5) {
1471
                    LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1472
                }
1473
            }
1474
        }
24635 amit.gupta 1475
 
31697 amit.gupta 1476
    }
24635 amit.gupta 1477
 
31697 amit.gupta 1478
    public void dryRunSchemeReco() throws Exception {
31886 tejbeer 1479
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1480
 
31697 amit.gupta 1481
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1482
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1483
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1484
        Set<String> serialNumbersConsidered = new HashSet<>();
24631 amit.gupta 1485
 
31697 amit.gupta 1486
        LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
1487
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1488
        List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
24598 amit.gupta 1489
 
31697 amit.gupta 1490
        Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
1491
        purchases.stream().forEach(purchase -> {
1492
            float amountToRollback = 0;
31886 tejbeer 1493
            String description = "Adjustment of Duplicate Scheme for Purchase Invoice " + purchase.getPurchaseReference();
1494
            Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId()).stream().filter(ii -> ii.getSerialNumber() != null).collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
31697 amit.gupta 1495
            if (inventorySerialNumberMap.size() > 0) {
1496
                for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1497
                    String serialNumber = inventorySerialNumberEntry.getValue();
1498
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
1499
                    if (serialNumbersConsidered.contains(serialNumber)) {
1500
                        // This will rollback scheme for differenct orders for same serial
31886 tejbeer 1501
                        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 1502
                        Collections.reverse(sios);
1503
                        for (SchemeInOut sio : sios) {
1504
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1505
                            amountToRollback += sio.getAmount();
1506
                            // sio.setSchemeType(SchemeType.OUT);
1507
                            sio.setSerialNumber(serialNumber);
1508
                            rolledbackSios.add(sio);
1509
                        }
1510
                        description = description.concat(" " + serialNumber + " ");
1511
                    } else {
1512
                        serialNumbersConsidered.add(serialNumber);
1513
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 1514
                        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 1515
                        Collections.reverse(sios);
1516
                        for (SchemeInOut sio : sios) {
1517
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
1518
                                schemesConsidered.add(sio.getSchemeId());
1519
                                continue;
1520
                            }
1521
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1522
                            amountToRollback += sio.getAmount();
1523
                            // sio.setSchemeType(SchemeType.OUT);
1524
                            sio.setSerialNumber(serialNumber);
1525
                            sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1526
                            sio.setReference(purchase.getId());
1527
                            rolledbackSios.add(sio);
1528
                        }
1529
                    }
24592 amit.gupta 1530
 
31697 amit.gupta 1531
                }
1532
            }
1533
            if (amountToRollback > 0) {
1534
                // Address address =
1535
                // addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
1536
                UserWalletHistory uwh = new UserWalletHistory();
1537
                uwh.setAmount(Math.round(amountToRollback));
1538
                uwh.setDescription(description);
1539
                uwh.setTimestamp(LocalDateTime.now());
1540
                uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
1541
                uwh.setReference(purchase.getId());
1542
                uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1543
                uwh.setFofoId(purchase.getFofoId());
1544
                uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1545
                userWalletHistory.add(uwh);
1546
            }
1547
        });
1548
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 1549
                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 1550
 
31697 amit.gupta 1551
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 1552
                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 1553
 
31886 tejbeer 1554
        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 1555
 
31697 amit.gupta 1556
        throw new Exception();
24615 amit.gupta 1557
 
31697 amit.gupta 1558
    }
24615 amit.gupta 1559
 
31697 amit.gupta 1560
    public void dryRunOutSchemeReco() throws Exception {
1561
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1562
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1563
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1564
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1565
        LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
1566
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1567
        List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1568
        // Collections.reverse(allOrders);
1569
        // List<FofoOrder> allOrders =
1570
        // List<FofoOrder> allOrders =
1571
        // Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
1572
        Set<String> serialNumbersConsidered = new HashSet<>();
1573
        allOrders.stream().forEach(fofoOrder -> {
1574
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1575
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1576
            float amountToRollback = 0;
1577
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1578
            orderItems.forEach(x -> {
31886 tejbeer 1579
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 1580
            });
1581
            if (inventorySerialNumberMap.size() > 0) {
1582
                for (Map.Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
1583
                    String serialNumber = inventorySerialNumberEntry.getValue();
1584
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
1585
                    if (serialNumbersConsidered.contains(serialNumber)) {
1586
                        // This will rollback scheme for differenct orders for same serial
31886 tejbeer 1587
                        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 1588
                        Collections.reverse(sios);
1589
                        for (SchemeInOut sio : sios) {
1590
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1591
                            amountToRollback += sio.getAmount();
1592
                            // sio.setSchemeType(SchemeType.OUT);
1593
                            sio.setSerialNumber(serialNumber);
1594
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1595
                            sio.setReference(fofoOrder.getId());
1596
                            rolledbackSios.add(sio);
1597
                        }
1598
                        description = description.concat(" " + serialNumber + " ");
1599
                    } else {
1600
                        serialNumbersConsidered.add(serialNumber);
1601
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 1602
                        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 1603
                        Collections.reverse(sios);
1604
                        for (SchemeInOut sio : sios) {
1605
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
1606
                                schemesConsidered.add(sio.getSchemeId());
1607
                                continue;
1608
                            }
1609
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1610
                            amountToRollback += sio.getAmount();
1611
                            // sio.setSchemeType(SchemeType.OUT);
1612
                            sio.setReference(fofoOrder.getId());
1613
                            sio.setSerialNumber(serialNumber);
1614
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1615
                            rolledbackSios.add(sio);
1616
                        }
1617
                    }
24615 amit.gupta 1618
 
31697 amit.gupta 1619
                }
1620
            }
1621
            if (amountToRollback > 0) {
1622
                UserWalletHistory uwh = new UserWalletHistory();
1623
                uwh.setAmount(Math.round(amountToRollback));
1624
                uwh.setDescription(description);
1625
                uwh.setTimestamp(LocalDateTime.now());
1626
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1627
                uwh.setReference(fofoOrder.getId());
1628
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1629
                uwh.setFofoId(fofoOrder.getFofoId());
1630
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1631
                userWalletHistory.add(uwh);
1632
            }
1633
        });
24615 amit.gupta 1634
 
31697 amit.gupta 1635
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 1636
                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 1637
 
31697 amit.gupta 1638
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 1639
                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 1640
 
31886 tejbeer 1641
        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 1642
 
31697 amit.gupta 1643
        throw new Exception();
1644
    }
24615 amit.gupta 1645
 
31697 amit.gupta 1646
    public void dryRunSchemeOutReco1() throws Exception {
1647
        List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
1648
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1649
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1650
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1651
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1652
        references.stream().forEach(reference -> {
1653
            FofoOrder fofoOrder = null;
1654
            try {
1655
                fofoOrder = fofoOrderRepository.selectByOrderId(reference);
1656
            } catch (Exception e) {
25927 amit.gupta 1657
 
31697 amit.gupta 1658
            }
1659
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1660
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1661
            float amountToRollback = 0;
1662
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1663
            orderItems.forEach(x -> {
31886 tejbeer 1664
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 1665
            });
1666
            if (inventorySerialNumberMap.size() > 0) {
31886 tejbeer 1667
                List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream().filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT)).collect(Collectors.toList());
31697 amit.gupta 1668
                LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
1669
                UserWalletHistory uwh = new UserWalletHistory();
31886 tejbeer 1670
                Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream().collect(groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
31697 amit.gupta 1671
                for (Map.Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
1672
                    List<SchemeInOut> outList = inventorySioEntry.getValue();
1673
                    if (outList.size() > 1) {
24683 amit.gupta 1674
 
31697 amit.gupta 1675
                    }
1676
                }
1677
                uwh.setAmount(Math.round(amountToRollback));
1678
                uwh.setDescription(description);
1679
                uwh.setTimestamp(LocalDateTime.now());
1680
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
1681
                uwh.setReference(fofoOrder.getId());
1682
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
1683
                uwh.setFofoId(fofoOrder.getFofoId());
1684
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
1685
                userWalletHistory.add(uwh);
1686
            }
1687
        });
26945 amit.gupta 1688
 
31697 amit.gupta 1689
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 1690
                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 1691
 
31697 amit.gupta 1692
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 1693
                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 1694
 
31886 tejbeer 1695
        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 1696
 
31697 amit.gupta 1697
        throw new Exception();
25880 amit.gupta 1698
 
31697 amit.gupta 1699
    }
30982 tejbeer 1700
 
31697 amit.gupta 1701
    public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
30982 tejbeer 1702
 
31697 amit.gupta 1703
        LocalDateTime now = LocalDateTime.now();
1704
        LocalDateTime from = now.with(LocalTime.MIN);
1705
        String timeString = "Today %s";
1706
        // Send yesterday's report
1707
        /*
1708
         * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
1709
         * now.minusDays(1).; now = from.with(LocalTime.MAX);
1710
         *
1711
         * }
1712
         */
30982 tejbeer 1713
 
31697 amit.gupta 1714
        List<Integer> fofoIds = null;
31886 tejbeer 1715
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getId(), x -> x));
30982 tejbeer 1716
 
24653 govind 1717
 
31697 amit.gupta 1718
        if (fofoIdInt == null) {
1719
            fofoIds = new ArrayList<>(fofoStoreMap.keySet());
1720
        } else {
1721
            fofoIds = Arrays.asList(fofoIdInt);
1722
        }
1723
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
28368 tejbeer 1724
 
31886 tejbeer 1725
        Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now, null);
31697 amit.gupta 1726
        Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
28368 tejbeer 1727
 
31886 tejbeer 1728
        Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, true);
28377 tejbeer 1729
 
31886 tejbeer 1730
        Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
31697 amit.gupta 1731
        Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
28368 tejbeer 1732
 
31886 tejbeer 1733
        Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, false);
31697 amit.gupta 1734
        Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
28377 tejbeer 1735
 
31697 amit.gupta 1736
        //4 days + current day running
1737
        Map<Integer, Double> partnerBilledValueMap = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(from.minusDays(4), now);
28377 tejbeer 1738
 
31697 amit.gupta 1739
        Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
1740
        for (int fofoId : fofoIds) {
1741
            SaleTargetReportModel model = new SaleTargetReportModel();
1742
            model.setInsuranceSale(
1743
                    partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
1744
            model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
1745
            model.setSecondary(partnerBilledValueMap.containsKey(fofoId) ? partnerBilledValueMap.get(fofoId) : 0);
1746
            model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
1747
            model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
1748
            model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
1749
            model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
1750
            model.setPast3daysSale(
1751
                    spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
1752
            model.setFofoId(fofoId);
1753
            model.setCode(fofoStoreMap.get(fofoId).getCode());
31724 amit.gupta 1754
            model.setActivationType(fofoStoreMap.get(fofoId).getActivationType());
31697 amit.gupta 1755
            saleTargetReportModelMap.put(fofoId, model);
1756
        }
28377 tejbeer 1757
 
31697 amit.gupta 1758
        Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
1759
        for (Integer fofoId : fofoIds) {
1760
            SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
28368 tejbeer 1761
 
31697 amit.gupta 1762
            // com.spice.profitmandi.dao.entity.user.User user =
1763
            // userUserRepository.selectById(fofoId);
28377 tejbeer 1764
 
31697 amit.gupta 1765
            // Address address = addressRepository.selectById(user.getAddressId());
28377 tejbeer 1766
 
31697 amit.gupta 1767
            String title = "Sale Update";
31886 tejbeer 1768
            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 1769
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
1770
            sendNotificationModel.setCampaignName("Sales update alert");
1771
            sendNotificationModel.setTitle(title);
1772
            sendNotificationModel.setMessage(messageTemplate);
1773
            sendNotificationModel.setType("url");
1774
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
1775
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1776
            sendNotificationModel.setMessageType(MessageType.notification);
1777
            int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
1778
            sendNotificationModel.setUserIds(Arrays.asList(userId));
1779
            notificationService.sendNotification(sendNotificationModel);
1780
            String whatsappMessageTemplate = String.format(
31886 tejbeer 1781
                    "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 1782
            // notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
1783
            // address.getPhoneNumber());
28377 tejbeer 1784
 
31697 amit.gupta 1785
        }
1786
        // String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
1787
        // saleTargetReportModelMap);
1788
        this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
1789
    }
28377 tejbeer 1790
 
31697 amit.gupta 1791
    public void checkRazorPayPaymentStatus() throws Exception {
31886 tejbeer 1792
        List<PendingOrder> pendingOrder = pendingOrderRepository.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
28377 tejbeer 1793
 
31697 amit.gupta 1794
        for (PendingOrder po : pendingOrder) {
1795
            RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
1796
            List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28369 tejbeer 1797
 
31697 amit.gupta 1798
            LOGGER.info("razorPay" + razorPay);
1799
            if (razorPay != null) {
1800
                List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28368 tejbeer 1801
 
31697 amit.gupta 1802
                if (!payments.isEmpty()) {
1803
                    List<String> statusList = new ArrayList<>();
1804
                    for (Payment payment : payments) {
25880 amit.gupta 1805
 
31697 amit.gupta 1806
                        JSONObject jsonObj = new JSONObject(payment.toString());
25880 amit.gupta 1807
 
31697 amit.gupta 1808
                        String status = jsonObj.getString("status");
25880 amit.gupta 1809
 
31697 amit.gupta 1810
                        statusList.add(status);
25865 amit.gupta 1811
 
31697 amit.gupta 1812
                    }
1813
                    LOGGER.info("statusList" + statusList);
26941 amit.gupta 1814
 
31697 amit.gupta 1815
                    if (statusList.contains("authorized") || statusList.contains("captured")) {
1816
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1817
                        po.setPaidAmount(po.getTotalAmount());
1818
                        for (PendingOrderItem poi : poItems) {
1819
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
1820
                        }
1821
                        Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
26941 amit.gupta 1822
 
31697 amit.gupta 1823
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
1824
                        Customer customer = customerRepository.selectById(po.getCustomerId());
1825
                        String[] customerEmail = null;
1826
                        if (customer.getEmailId() != null) {
1827
                            customerEmail = new String[]{customer.getEmailId()};
1828
                        }
31886 tejbeer 1829
                        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 1830
                        List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
1831
                        if (authUserEmails != null) {
1832
                            authUserEmails = new ArrayList<>();
1833
                        }
1834
                        authUserEmails.addAll(bccTo);
26945 amit.gupta 1835
 
31697 amit.gupta 1836
                        // emailService.sendMailWithAttachments("Order Created with SmartDukaan",
1837
                        // "order-confirm.vm",
1838
                        // emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
26945 amit.gupta 1839
 
31697 amit.gupta 1840
                    } else if (statusList.contains("refunded") || statusList.contains("failed")) {
1841
                        for (PendingOrderItem poi : poItems) {
1842
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1843
                        }
25865 amit.gupta 1844
 
31697 amit.gupta 1845
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
1846
                    }
25865 amit.gupta 1847
 
31697 amit.gupta 1848
                }
1849
                // LOGGER.info("payment" + payments);
25865 amit.gupta 1850
 
31697 amit.gupta 1851
            }
1852
        }
1853
    }
25865 amit.gupta 1854
 
31697 amit.gupta 1855
    public static class SaleTargetReportModel {
1856
        private double totalSale;
1857
        private long totalQty;
1858
        private double past3daysSale;
1859
        private int fofoId;
1860
        private String code;
31724 amit.gupta 1861
        private ActivationType activationType;
25865 amit.gupta 1862
 
31724 amit.gupta 1863
 
1864
        @Override
1865
        public boolean equals(Object o) {
1866
            if (this == o) return true;
1867
            if (o == null || getClass() != o.getClass()) return false;
1868
            SaleTargetReportModel that = (SaleTargetReportModel) o;
1869
            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;
1870
        }
1871
 
1872
        @Override
1873
        public int hashCode() {
1874
            return Objects.hash(totalSale, totalQty, past3daysSale, fofoId, code, activationType, secondary, smartphoneSale, smartphoneQty, insuranceSale, insruanceQty);
1875
        }
1876
 
1877
        public ActivationType getActivationType() {
1878
            return activationType;
1879
        }
1880
 
1881
        public void setActivationType(ActivationType activationType) {
1882
            this.activationType = activationType;
1883
        }
1884
 
31697 amit.gupta 1885
        public double getSecondary() {
1886
            return secondary;
1887
        }
25865 amit.gupta 1888
 
31697 amit.gupta 1889
        public void setSecondary(double secondary) {
1890
            this.secondary = secondary;
1891
        }
25865 amit.gupta 1892
 
31697 amit.gupta 1893
        private double secondary;
25865 amit.gupta 1894
 
31697 amit.gupta 1895
        public int getFofoId() {
1896
            return fofoId;
1897
        }
25865 amit.gupta 1898
 
31697 amit.gupta 1899
        @Override
1900
        public String toString() {
31886 tejbeer 1901
            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 1902
        }
25865 amit.gupta 1903
 
31697 amit.gupta 1904
        public String getCode() {
1905
            return code;
1906
        }
25865 amit.gupta 1907
 
31697 amit.gupta 1908
        public void setCode(String code) {
1909
            this.code = code;
1910
        }
25865 amit.gupta 1911
 
31697 amit.gupta 1912
        public void setFofoId(int fofoId) {
1913
            this.fofoId = fofoId;
1914
        }
25872 tejbeer 1915
 
31697 amit.gupta 1916
        private double smartphoneSale;
1917
        private long smartphoneQty;
1918
        private double insuranceSale;
1919
        private long insruanceQty;
26945 amit.gupta 1920
 
31697 amit.gupta 1921
        public long getTotalQty() {
1922
            return totalQty;
1923
        }
30765 tejbeer 1924
 
31697 amit.gupta 1925
        public void setTotalQty(long totalQty) {
1926
            this.totalQty = totalQty;
1927
        }
1928
 
1929
        public double getPast3daysSale() {
1930
            return past3daysSale;
1931
        }
1932
 
1933
        public void setPast3daysSale(double past3daysSale) {
1934
            this.past3daysSale = past3daysSale;
1935
        }
1936
 
1937
        public double getTotalSale() {
1938
            return totalSale;
1939
        }
1940
 
1941
        public void setTotalSale(double totalSale) {
1942
            this.totalSale = totalSale;
1943
        }
1944
 
1945
        public double getSmartphoneSale() {
1946
            return smartphoneSale;
1947
        }
1948
 
1949
        public void setSmartphoneSale(double smartphoneSale) {
1950
            this.smartphoneSale = smartphoneSale;
1951
        }
1952
 
1953
        public long getSmartphoneQty() {
1954
            return smartphoneQty;
1955
        }
1956
 
1957
        public void setSmartphoneQty(long smartphoneQty) {
1958
            this.smartphoneQty = smartphoneQty;
1959
        }
1960
 
1961
        public double getInsuranceSale() {
1962
            return insuranceSale;
1963
        }
1964
 
1965
        public void setInsuranceSale(double insuranceSale) {
1966
            this.insuranceSale = insuranceSale;
1967
        }
1968
 
1969
        public long getInsruanceQty() {
1970
            return insruanceQty;
1971
        }
1972
 
1973
        public void setInsruanceQty(long insruanceQty) {
1974
            this.insruanceQty = insruanceQty;
1975
        }
1976
 
1977
    }
1978
 
31886 tejbeer 1979
    private void getStateWiseSales(Map<Integer, SaleTargetReportModel> saleTargetReportModelMap, Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws Exception {
31697 amit.gupta 1980
        String timeString = "Today %s";
1981
        LocalDateTime now = LocalDateTime.now();
1982
 
1983
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
31886 tejbeer 1984
        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 1985
 
1986
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
1987
 
31746 amit.gupta 1988
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
1989
            String email = storeGuyEntry.getKey();
1990
            Set<Integer> fofoIds = storeGuyEntry.getValue();
1991
            LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 1992
 
31746 amit.gupta 1993
            if (!fofoIds.isEmpty()) {
31886 tejbeer 1994
                List<FofoStore> stores = fofoStoreRepository.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 1995
 
31724 amit.gupta 1996
                Map<String, List<Integer>> stateMap = stores.stream().collect(groupingBy(
1997
                        x -> x.getCode().substring(0, 2), mapping(x -> x.getId(), Collectors.toList())));
31697 amit.gupta 1998
                List<List<Serializable>> stateWiseSales = new ArrayList<>();
1999
                for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
31886 tejbeer 2000
                    long totalQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2001
                    double totalSale = stateMapEntry.getValue().stream().collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2002
                    long smartPhoneQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
31697 amit.gupta 2003
                    double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2004
                            Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2005
                    stateWiseSales.add(
2006
                            Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2007
                }
2008
                StringBuilder sb = new StringBuilder();
2009
                sb.append("<html><body>");
2010
                sb.append("<p>Statewise Sale Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2011
                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 2012
                for (List<Serializable> stateSale : stateWiseSales) {
2013
                    sb.append("<tr>");
2014
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2015
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2016
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2017
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2018
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2019
                    sb.append("</tr>");
2020
                }
2021
                sb.append("</tbody></table><br><br>");
26945 amit.gupta 2022
 
31697 amit.gupta 2023
                sb.append("<p>Partnerwise Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2024
                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 2025
 
2026
 
31886 tejbeer 2027
                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 2028
 
31697 amit.gupta 2029
                String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 2030
 
31886 tejbeer 2031
                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 2032
                List<List<?>> rows = new ArrayList<>();
2033
                for (Integer fofoId : sortedSaleTargetReport) {
2034
                    FofoReportingModel fofoReportingModel = partnerSalesHeadersMap.get(fofoId);
31886 tejbeer 2035
                    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 2036
                    ));
31169 tejbeer 2037
 
31724 amit.gupta 2038
                    //Now try to populate html rows
2039
                    if (!saleTargetReportModelMap.get(fofoId).getActivationType().equals(ActivationType.ACTIVE)) {
31697 amit.gupta 2040
                        continue;
2041
                    }
2042
                    if (saleTargetReportModelMap.get(fofoId).getSecondary() == 0) {
2043
                        sb.append("<tr style='background-color:#D21F3C;color:white'>");
2044
                    } else {
2045
                        sb.append("<tr>");
2046
                    }
31886 tejbeer 2047
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2048
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2049
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessManager() + "</td>");
2050
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2051
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2052
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSecondary() + "</td>");
2053
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2054
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2055
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
31697 amit.gupta 2056
                    sb.append("</tr>");
24841 govind 2057
 
25300 tejbeer 2058
 
31697 amit.gupta 2059
                }
2060
                sb.append("</tr>");
2061
                sb.append("</body></html>");
2062
                String statewiseSaleReport = sb.toString();
25300 tejbeer 2063
 
2064
 
31697 amit.gupta 2065
                ByteArrayOutputStream baos = null;
2066
                try {
2067
                    baos = FileUtil.getCSVByteStream(headers, rows);
2068
                } catch (Exception e2) {
2069
                    e2.printStackTrace();
2070
                }
2071
                Attachment attachment = new Attachment("PartnerSalePerformance.csv", new ByteArrayResource(baos.toByteArray()));
2072
                Utils.sendHtmlMailWithAttachments(googleMailSender, new String[]{email}, null, "Statewise " + subject, statewiseSaleReport, attachment);
2073
            }
2074
        }
2075
    }
29668 tejbeer 2076
 
31886 tejbeer 2077
    private void sendMailOfHtmlFormat(String email, String body, String cc[], String subject) throws MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 2078
        MimeMessage message = mailSender.createMimeMessage();
2079
        MimeMessageHelper helper = new MimeMessageHelper(message);
2080
        helper.setSubject(subject);
2081
        helper.setText(body, true);
2082
        helper.setTo(email);
2083
        if (cc != null) {
2084
            helper.setCc(cc);
2085
        }
2086
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2087
        helper.setFrom(senderAddress);
2088
        mailSender.send(message);
2089
    }
25694 amit.gupta 2090
 
31697 amit.gupta 2091
    public void sendNotification() throws Exception {
2092
        List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllByTimestamp();
2093
        if (!pushNotifications.isEmpty()) {
2094
            for (PushNotifications pushNotification : pushNotifications) {
2095
                Device device = deviceRepository.selectById(pushNotification.getDeviceId());
31886 tejbeer 2096
                NotificationCampaign notificationCampaign = notificationCampaignRepository.selectById(pushNotification.getNotificationCampaignid());
2097
                SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(), SimpleCampaignParams.class);
31697 amit.gupta 2098
                Campaign campaign = new SimpleCampaign(scp);
2099
                String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
2100
                JSONObject json = new JSONObject();
2101
                json.put("to", device.getFcmId());
2102
                JSONObject jsonObj = new JSONObject();
2103
                jsonObj.put("message", campaign.getMessage());
2104
                jsonObj.put("title", campaign.getTitle());
2105
                jsonObj.put("type", campaign.getType());
2106
                jsonObj.put("url", result_url);
2107
                jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2108
                jsonObj.put("image", campaign.getImageUrl());
2109
                jsonObj.put("largeIcon", "large_icon");
2110
                jsonObj.put("smallIcon", "small_icon");
2111
                jsonObj.put("vibrate", 1);
2112
                jsonObj.put("pid", pushNotification.getId());
2113
                jsonObj.put("sound", 1);
2114
                jsonObj.put("priority", "high");
2115
                json.put("data", jsonObj);
2116
                try {
2117
                    CloseableHttpClient client = HttpClients.createDefault();
2118
                    HttpPost httpPost = new HttpPost(FCM_URL);
25694 amit.gupta 2119
 
31697 amit.gupta 2120
                    httpPost.setHeader("Content-Type", "application/json; utf-8");
2121
                    httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2122
                    StringEntity entity = new StringEntity(json.toString());
2123
                    httpPost.setEntity(entity);
2124
                    CloseableHttpResponse response = client.execute(httpPost);
30858 amit.gupta 2125
 
31697 amit.gupta 2126
                    if (response.getStatusLine().getStatusCode() == 200) {
2127
                        pushNotification.setSentTimestamp(LocalDateTime.now());
2128
                    } else {
2129
                        pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2130
                        LOGGER.info("message" + "not sent");
2131
                        response.toString();
2132
                    }
25694 amit.gupta 2133
 
31697 amit.gupta 2134
                } catch (Exception e) {
2135
                    e.printStackTrace();
2136
                    pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2137
                    LOGGER.info("message " + "not sent " + e.getMessage());
2138
                }
2139
            }
2140
        }
2141
    }
25721 tejbeer 2142
 
31697 amit.gupta 2143
    public void grouping() throws Exception {
2144
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2145
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
31886 tejbeer 2146
        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 2147
        Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
2148
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
2149
            if (priceDropIMEI.getPartnerId() == 0)
2150
                continue;
2151
            HashSet<String> imeis = new HashSet<>();
2152
            PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2153
            imeis.add(priceDropIMEI.getImei());
31886 tejbeer 2154
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
31697 amit.gupta 2155
            if (inventoryItems.size() == 0) {
2156
                LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
2157
                continue;
2158
            }
2159
            InventoryItem inventoryItem = inventoryItems.get(0);
2160
            CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
31886 tejbeer 2161
            if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) || inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
31697 amit.gupta 2162
                // check if pricedrop has been rolled out
31886 tejbeer 2163
                List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(), priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
31697 amit.gupta 2164
                if (uwh.size() > 0) {
2165
                    Item item = itemRepository.selectById(inventoryItem.getItemId());
31886 tejbeer 2166
                    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 2167
                }
2168
            }
2169
        }
2170
    }
25721 tejbeer 2171
 
31697 amit.gupta 2172
    public void toffeeRollback() throws Exception {
2173
        toffeeService.cancelPolicyCopy("110143521986");
2174
        toffeeService.getOrderId("110143521986");
2175
    }
27212 tejbeer 2176
 
31697 amit.gupta 2177
    public void attachToffeeInvoices() throws Exception {
31886 tejbeer 2178
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
31697 amit.gupta 2179
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2180
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2181
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2182
            InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2183
            java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2184
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
31886 tejbeer 2185
            String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2186
            boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
31697 amit.gupta 2187
            if (attached) {
2188
                insurancePolicy.setPosted(true);
2189
            }
2190
        }
2191
    }
25721 tejbeer 2192
 
31697 amit.gupta 2193
    public void sendBAGPendingPolicies() throws Exception {
31886 tejbeer 2194
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4, Optional.of(false));
31697 amit.gupta 2195
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2196
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2197
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2198
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2199
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2200
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2201
            BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
2202
            // bagInsuranceModel.setModelId();
2203
            bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2204
            bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2205
            bagInsuranceModel.setCity(customerAddress.getCity());
2206
            bagInsuranceModel.setBrandWarranty("1 Year");
2207
            Item item = itemRepository.selectById(fofoOrderItem.getId());
2208
            bagInsuranceModel.setModelName(item.getItemDescription());
2209
            bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2210
            bagInsuranceModel.setEmail(customer.getEmailId());
2211
            bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2212
            bagInsuranceModel.setFirstName(customer.getFirstName());
2213
            bagInsuranceModel.setLastName(customer.getLastName());
2214
            bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2215
            bagInsuranceModel.setPlanId("");
2216
            insurancePolicy.setPosted(true);
2217
        }
2218
    }
25721 tejbeer 2219
 
31697 amit.gupta 2220
    public void schemeRollback(List<String> schemeIds) throws Exception {
2221
        List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
31886 tejbeer 2222
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 2223
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2224
        for (SchemeInOut sio : schemeInOuts) {
2225
            Scheme scheme = schemesMap.get(sio.getSchemeId());
2226
            if (scheme.getType().equals(SchemeType.IN)) {
25721 tejbeer 2227
 
31697 amit.gupta 2228
            } else if (scheme.getType().equals(SchemeType.OUT)) {
2229
                InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2230
                List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
31886 tejbeer 2231
                ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE)).max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2232
                if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime()) || scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 2233
                    sio.setRolledBackTimestamp(LocalDateTime.now());
2234
                    FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
31886 tejbeer 2235
                    String rollbackReason = "Scheme reversed for " + itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - " + fofoOrder.getInvoiceNumber();
2236
                    walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(), scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason, LocalDateTime.now());
2237
                    System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(), rollbackReason);
31697 amit.gupta 2238
                }
2239
            }
2240
        }
2241
        // throw new Exception();
2242
    }
25721 tejbeer 2243
 
31697 amit.gupta 2244
    public void checkfocusedModelInPartnerStock() throws Exception {
25721 tejbeer 2245
 
31886 tejbeer 2246
        List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
2247
        Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
31697 amit.gupta 2248
        Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2249
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
25721 tejbeer 2250
 
31886 tejbeer 2251
        Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
31697 amit.gupta 2252
        Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2253
        for (Integer fofoId : fofoIds) {
2254
            List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2255
            focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
2256
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2257
            Map<Integer, Integer> processingOrderMap = null;
2258
            Map<Integer, Integer> catalogIdAndQtyMap = null;
2259
            Map<Integer, Integer> grnPendingOrdersMap = null;
25721 tejbeer 2260
 
31886 tejbeer 2261
            Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
25721 tejbeer 2262
 
31697 amit.gupta 2263
            if (!currentInventorySnapshot.isEmpty()) {
31886 tejbeer 2264
                catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
25800 tejbeer 2265
 
31697 amit.gupta 2266
            }
25800 tejbeer 2267
 
31886 tejbeer 2268
            Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2269
            if (!grnPendingOrders.isEmpty()) {
31886 tejbeer 2270
                grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
25721 tejbeer 2271
 
31697 amit.gupta 2272
            }
25721 tejbeer 2273
 
31886 tejbeer 2274
            Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2275
            if (!processingOrder.isEmpty()) {
31886 tejbeer 2276
                processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> processingOrder.get(x.getId()))));
25721 tejbeer 2277
 
31697 amit.gupta 2278
            }
25721 tejbeer 2279
 
31886 tejbeer 2280
            List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
28526 tejbeer 2281
 
31886 tejbeer 2282
            List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
31697 amit.gupta 2283
            LOGGER.info("regionIds" + regionIds);
2284
            if (regionIds.size() == 0) {
2285
                LOGGER.info("No region found for partner {}", fofoId);
2286
                continue;
2287
            }
31886 tejbeer 2288
            Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream().collect(groupingBy(FocusedModel::getCatalogId, mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25721 tejbeer 2289
 
31697 amit.gupta 2290
            LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
31388 amit.gupta 2291
 
31697 amit.gupta 2292
            for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2293
                int minQty = entry.getValue().get();
2294
                int inStockQty = 0;
2295
                int processingQty = 0;
2296
                int grnPendingQty = 0;
2297
                int allColorNetAvailability = 0;
2298
                int allColorPoAvailability = 0;
2299
                if (processingOrderMap != null) {
31886 tejbeer 2300
                    processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0 : processingOrderMap.get(entry.getKey());
31388 amit.gupta 2301
 
31697 amit.gupta 2302
                }
2303
                if (grnPendingOrdersMap != null) {
31886 tejbeer 2304
                    grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0 : grnPendingOrdersMap.get(entry.getKey());
25721 tejbeer 2305
 
31697 amit.gupta 2306
                }
2307
                if (catalogIdAndQtyMap != null) {
31886 tejbeer 2308
                    inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0 : catalogIdAndQtyMap.get(entry.getKey());
27213 tejbeer 2309
 
31697 amit.gupta 2310
                }
25721 tejbeer 2311
 
31697 amit.gupta 2312
                int grnStockQty = grnPendingQty + inStockQty;
2313
                int totalQty = processingQty + grnPendingQty + inStockQty;
27208 tejbeer 2314
 
31697 amit.gupta 2315
                int shortageQty = minQty - totalQty;
2316
                List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
28528 tejbeer 2317
 
31697 amit.gupta 2318
                TagListing tagListing = tagListingRepository.selectByCatalogId(entry.getKey());
27208 tejbeer 2319
 
31697 amit.gupta 2320
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2321
 
31886 tejbeer 2322
                Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
27233 tejbeer 2323
 
31886 tejbeer 2324
                Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
29801 manish 2325
 
31697 amit.gupta 2326
                for (Item item : items) {
2327
                    List<SaholicCIS> currentAvailability = null;
2328
                    List<SaholicPOItem> poItemAvailability = null;
2329
                    if (itemAvailabilityMap != null) {
2330
                        currentAvailability = itemAvailabilityMap.get(item.getId());
2331
                    }
25721 tejbeer 2332
 
31697 amit.gupta 2333
                    if (poItemAvailabilityMap != null) {
2334
                        poItemAvailability = poItemAvailabilityMap.get(item.getId());
2335
                    }
2336
                    if (currentAvailability != null) {
31886 tejbeer 2337
                        allColorNetAvailability += currentAvailability.stream().collect(Collectors.summingInt(SaholicCIS::getNetavailability));
31697 amit.gupta 2338
                    }
25800 tejbeer 2339
 
31697 amit.gupta 2340
                    if (poItemAvailability != null) {
31886 tejbeer 2341
                        allColorPoAvailability += poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
31697 amit.gupta 2342
                    }
25800 tejbeer 2343
 
31697 amit.gupta 2344
                }
25721 tejbeer 2345
 
31697 amit.gupta 2346
                FocusedModelShortageModel fm = new FocusedModelShortageModel();
2347
                fm.setFofoId(fofoId);
2348
                fm.setStoreCode(fofoStore.getCode());
2349
                fm.setStoreName(customRetailer.getBusinessName());
2350
                fm.setBrandName(items.get(0).getBrand());
2351
                fm.setModelName(items.get(0).getModelName());
2352
                fm.setModelNumber(items.get(0).getModelNumber());
2353
                fm.setGrnStockQty(grnStockQty);
2354
                fm.setPendingIndentQty(processingQty);
2355
                fm.setShortageQty(shortageQty);
2356
                fm.setPoAvailability(allColorPoAvailability);
2357
                fm.setDp(tagListing.getSellingPrice());
2358
                fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
2359
                fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2360
                fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
2361
                fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
2362
                fm.setAvailability(allColorNetAvailability);
25721 tejbeer 2363
 
31697 amit.gupta 2364
                focusedModelShortageList.add(fm);
2365
            }
25721 tejbeer 2366
 
31697 amit.gupta 2367
        }
2368
        if (!focusedModelShortageReportMap.isEmpty()) {
2369
            String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2370
            Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
2371
            Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2372
 
31697 amit.gupta 2373
            focusedModelShortageReportMap.entrySet().forEach(x -> {
2374
                storeGuyMap.entrySet().forEach(y -> {
28526 tejbeer 2375
 
31697 amit.gupta 2376
                    if (y.getValue().contains(x.getKey())) {
2377
                        if (!emailRowsMap.containsKey(y.getKey())) {
2378
                            emailRowsMap.put(y.getKey(), new ArrayList<>());
2379
                        }
31886 tejbeer 2380
                        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 2381
                        emailRowsMap.get(y.getKey()).addAll(fms);
29995 tejbeer 2382
 
31697 amit.gupta 2383
                    }
29995 tejbeer 2384
 
31697 amit.gupta 2385
                });
25721 tejbeer 2386
 
31697 amit.gupta 2387
            });
25721 tejbeer 2388
 
31886 tejbeer 2389
            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 2390
            emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2391
 
31697 amit.gupta 2392
                ByteArrayOutputStream baos = null;
2393
                try {
2394
                    baos = FileUtil.getCSVByteStream(headers, entry.getValue());
2395
                } catch (Exception e2) {
2396
                    e2.printStackTrace();
2397
                }
2398
                String[] sendToArray = new String[]{
25721 tejbeer 2399
 
31886 tejbeer 2400
                        entry.getKey(), "apurve.shrivastava@smartdukaan.com", "puneet.bisht@smartdukaan.com"
25721 tejbeer 2401
 
31697 amit.gupta 2402
                };
25721 tejbeer 2403
 
31886 tejbeer 2404
 
31697 amit.gupta 2405
                try {
31886 tejbeer 2406
                    Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 2407
                } catch (Exception e1) { // TODO Auto-generated catch block
2408
                    e1.printStackTrace();
2409
                }
25721 tejbeer 2410
 
31697 amit.gupta 2411
            });
2412
        }
2413
    }
25721 tejbeer 2414
 
31697 amit.gupta 2415
    private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2416
        StringBuilder sb = new StringBuilder();
2417
        sb.append("Focused Model Shortage in Your Stock : \n");
2418
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2419
 
31697 amit.gupta 2420
            sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2421
            sb.append(String.format("%n", ""));
2422
        }
2423
        return sb.toString();
2424
    }
25721 tejbeer 2425
 
31697 amit.gupta 2426
    private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2427
        MimeMessage message = mailSender.createMimeMessage();
2428
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
25721 tejbeer 2429
 
31697 amit.gupta 2430
        helper.setSubject(subject);
2431
        helper.setText(messageText, true);
2432
        helper.setTo(email);
2433
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2434
        helper.setFrom(senderAddress);
2435
        mailSender.send(message);
25721 tejbeer 2436
 
31697 amit.gupta 2437
    }
25721 tejbeer 2438
 
31697 amit.gupta 2439
    private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2440
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2441
        sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2442
        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 2443
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2444
 
31697 amit.gupta 2445
            sb.append("<tr>");
2446
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
25936 amit.gupta 2447
 
31697 amit.gupta 2448
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
26790 tejbeer 2449
 
31697 amit.gupta 2450
            sb.append("</tr>");
25927 amit.gupta 2451
 
31697 amit.gupta 2452
        }
26790 tejbeer 2453
 
31697 amit.gupta 2454
        sb.append("</tbody></table></body></html>");
26945 amit.gupta 2455
 
31697 amit.gupta 2456
        return sb.toString();
2457
    }
26945 amit.gupta 2458
 
31697 amit.gupta 2459
    public void notifyLead() throws Exception {
31886 tejbeer 2460
        List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2461
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
31697 amit.gupta 2462
        LOGGER.info("authUserEmailMap {}", authUserEmailMap);
31886 tejbeer 2463
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25982 amit.gupta 2464
 
31697 amit.gupta 2465
        LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26283 tejbeer 2466
 
31697 amit.gupta 2467
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26283 tejbeer 2468
 
31697 amit.gupta 2469
        for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2470
            int authId = authUserEmail.getKey();
2471
            String email = authUserEmail.getValue();
2472
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2473
        }
2474
        LOGGER.info("authUserKeyMap", authUserKeyMap);
2475
        LOGGER.info("leadsToNotify {}", leadsToNotify);
26283 tejbeer 2476
 
31697 amit.gupta 2477
        String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
2478
        for (Lead lead : leadsToNotify) {
2479
            if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2480
                LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
2481
                continue;
2482
            }
2483
            String title = "Leads followup Reminder";
31886 tejbeer 2484
            String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(), lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
31697 amit.gupta 2485
            String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
2486
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2487
            sendNotificationModel.setCampaignName("Lead Reminder");
2488
            sendNotificationModel.setTitle(title);
2489
            sendNotificationModel.setMessage(notificationMessage);
2490
            sendNotificationModel.setType("url");
2491
            sendNotificationModel.setUrl(url);
2492
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2493
            sendNotificationModel.setMessageType(MessageType.reminder);
2494
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
2495
            System.out.println(sendNotificationModel);
2496
            notificationService.sendNotification(sendNotificationModel);
2497
            AuthUser authUser = authRepository.selectById(lead.getAssignTo());
2498
            // notificationService.sendWhatsappMessage(notificationMessage, title,
2499
            // authUser.getMobileNumber());
2500
        }
2501
    }
26790 tejbeer 2502
 
31697 amit.gupta 2503
    public void notifyVisits() throws Exception {
31886 tejbeer 2504
        List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2505
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2506
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
31697 amit.gupta 2507
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26790 tejbeer 2508
 
31697 amit.gupta 2509
        for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2510
            int authId = authUserEmail.getKey();
2511
            String email = authUserEmail.getValue();
2512
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2513
        }
2514
        String visitTemplate = "Planned visit to franchisee %s is due by %s";
2515
        String followupTemplate = "Lead followup for franchisee %s is due by %s";
2516
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2517
        for (FranchiseeVisit visit : franchiseeVisits) {
2518
            if (authUserKeyMap.containsKey(visit.getAuthId())) {
2519
                continue;
2520
            }
2521
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2522
            String message = null;
2523
            if (visit.getFranchiseActivityId() == 0) {
31886 tejbeer 2524
                message = String.format(visitTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 2525
                sendNotificationModel.setCampaignName("Franchisee visit Reminder");
2526
            } else {
31886 tejbeer 2527
                message = String.format(followupTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 2528
                sendNotificationModel.setCampaignName("Franchisee followup Reminder");
2529
            }
2530
            sendNotificationModel.setMessage(message);
2531
            sendNotificationModel.setType("url");
2532
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2533
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2534
            sendNotificationModel.setMessageType(MessageType.reminder);
2535
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
2536
            // notificationService.sendNotification(sendNotificationModel);
2537
        }
2538
    }
26792 tejbeer 2539
 
31697 amit.gupta 2540
    public void ticketClosed() throws Exception {
26790 tejbeer 2541
 
31697 amit.gupta 2542
        List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
2543
        for (Ticket ticket : tickets) {
2544
            if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
2545
                ticket.setCloseTimestamp(LocalDateTime.now());
2546
                ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
2547
                ticket.setUpdateTimestamp(LocalDateTime.now());
2548
                ticketRepository.persist(ticket);
2549
            }
2550
        }
26790 tejbeer 2551
 
31697 amit.gupta 2552
    }
26790 tejbeer 2553
 
31697 amit.gupta 2554
    public void checkValidateReferral() throws Exception {
26790 tejbeer 2555
 
31697 amit.gupta 2556
        List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
2557
        LOGGER.info("referrals" + referrals);
2558
        if (!referrals.isEmpty()) {
2559
            String subject = "Referral Request";
2560
            String messageText = this.getMessageForReferral(referrals);
26790 tejbeer 2561
 
31697 amit.gupta 2562
            MimeMessage message = mailSender.createMimeMessage();
2563
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
2564
            String[] email = {"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com"};
2565
            helper.setSubject(subject);
2566
            helper.setText(messageText, true);
2567
            helper.setTo(email);
2568
            InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2569
            helper.setFrom(senderAddress);
2570
            mailSender.send(message);
26790 tejbeer 2571
 
31697 amit.gupta 2572
        }
2573
    }
26790 tejbeer 2574
 
31697 amit.gupta 2575
    private String getMessageForReferral(List<Refferal> referrals) {
2576
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2577
        sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2578
        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 2579
        for (Refferal entry : referrals) {
26790 tejbeer 2580
 
31697 amit.gupta 2581
            sb.append("<tr>");
2582
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
30421 tejbeer 2583
 
31697 amit.gupta 2584
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
2585
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
2586
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
2587
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
2588
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
30421 tejbeer 2589
 
31697 amit.gupta 2590
            sb.append("</tr>");
30421 tejbeer 2591
 
31697 amit.gupta 2592
        }
30421 tejbeer 2593
 
31697 amit.gupta 2594
        sb.append("</tbody></table></body></html>");
30421 tejbeer 2595
 
31697 amit.gupta 2596
        return sb.toString();
2597
    }
30421 tejbeer 2598
 
31886 tejbeer 2599
    private String getMessageForUncontacblePartner(List<PartnerCollectionRemark> pcrs) throws ProfitMandiBusinessException {
31697 amit.gupta 2600
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2601
        sb.append("<html><body><p>Alert</p><p>Not Responding Partner:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2602
        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 2603
 
31697 amit.gupta 2604
                + "	    				</tr>");
2605
        for (PartnerCollectionRemark entry : pcrs) {
30421 tejbeer 2606
 
31697 amit.gupta 2607
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30421 tejbeer 2608
 
31697 amit.gupta 2609
            sb.append("<tr>");
31886 tejbeer 2610
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
28205 tejbeer 2611
 
31886 tejbeer 2612
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
28205 tejbeer 2613
 
31697 amit.gupta 2614
            sb.append("</tr>");
28205 tejbeer 2615
 
31697 amit.gupta 2616
        }
28205 tejbeer 2617
 
31697 amit.gupta 2618
        sb.append("</tbody></table></body></html>");
28205 tejbeer 2619
 
31697 amit.gupta 2620
        return sb.toString();
2621
    }
28208 tejbeer 2622
 
31697 amit.gupta 2623
    public void reverseWallet() throws Exception {
2624
        LocalDate localDate = LocalDate.of(2020, 10, 28);
31886 tejbeer 2625
        List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 2626
        for (UserWalletHistory uwh : uwhList) {
2627
            if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
2628
                UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
2629
                // LOGGER.info("UWH - {}", uwh);
2630
                // amount += uwh.getAmount();
2631
                // System.out.println("Amount is - " + amount);
2632
                // walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
2633
                // uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
2634
                // run", uwh.getBusinessTimestamp());
2635
                int orderId = uwh.getReference();
2636
                FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
2637
                int inventoryItemId = 0;
2638
                // fofoOrderRepository.delete(fofoOrder);
2639
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2640
                /*
2641
                 * List<PaymentOptionTransaction> paymentOptionTransactions =
2642
                 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
2643
                 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
2644
                 * paymentOptionTransaction : paymentOptionTransactions) {
2645
                 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
2646
                 */
2647
                for (FofoOrderItem foi : fofoOrderItems) {
2648
                    // fofoOrderItemRepository.delete(foi);
2649
                    List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
2650
                    for (FofoLineItem fli : flis) {
2651
                        // fofoLineItemRepository.delete(fli);
2652
                        inventoryItemId = fli.getInventoryItemId();
2653
                    }
2654
                }
2655
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
2656
                        java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
2657
                for (SchemeInOut sio : schemeInOuts) {
2658
                    if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
2659
                        LOGGER.info("SIO - {}", sio);
2660
                        sio.setRolledBackTimestamp(LocalDateTime.now());
2661
                    }
2662
                }
28208 tejbeer 2663
 
31697 amit.gupta 2664
            }
2665
        }
28208 tejbeer 2666
 
31697 amit.gupta 2667
    }
28208 tejbeer 2668
 
31697 amit.gupta 2669
    public void partnerProblemAlert() throws Exception {
2670
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
2671
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
2672
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
31886 tejbeer 2673
        Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
2674
        Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 2675
 
31697 amit.gupta 2676
        for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
28208 tejbeer 2677
 
31697 amit.gupta 2678
            double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 2679
 
31697 amit.gupta 2680
            LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
28208 tejbeer 2681
 
31697 amit.gupta 2682
            double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28205 tejbeer 2683
 
31697 amit.gupta 2684
            LOGGER.info("mtdSale" + mtdSale);
28205 tejbeer 2685
 
31886 tejbeer 2686
            double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 2687
 
31697 amit.gupta 2688
            LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
28205 tejbeer 2689
 
31697 amit.gupta 2690
            double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28205 tejbeer 2691
 
31697 amit.gupta 2692
            LOGGER.info("stockInvestment" + stockInvestment);
28205 tejbeer 2693
 
31697 amit.gupta 2694
            boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
28205 tejbeer 2695
 
31697 amit.gupta 2696
            PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
28205 tejbeer 2697
 
31697 amit.gupta 2698
            if (partnerProblem == null) {
2699
                partnerProblem = new PartnerProblem();
2700
                partnerProblem.setFofoId(ls.getKey());
2701
                if (mtdSale < lmtdTwentyPercentSale) {
2702
                    partnerProblem.setMtd(1);
2703
                }
2704
                if (Investmentvalue) {
2705
                    partnerProblem.setInvestment(1);
2706
                }
28205 tejbeer 2707
 
31697 amit.gupta 2708
                if (stockInvestment < totalSixtyPercentInvestment) {
2709
                    partnerProblem.setInvestment(1);
2710
                }
28205 tejbeer 2711
 
31697 amit.gupta 2712
                partnerProblemRepository.persist(partnerProblem);
2713
            } else {
2714
                if (mtdSale < lmtdTwentyPercentSale) {
2715
                    partnerProblem.setMtd(partnerProblem.getMtd() + 1);
28213 tejbeer 2716
 
31697 amit.gupta 2717
                } else {
2718
                    partnerProblem.setMtd(0);
28227 tejbeer 2719
 
31697 amit.gupta 2720
                }
2721
                if (Investmentvalue) {
2722
                    partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
2723
                } else {
2724
                    partnerProblem.setInvestment(0);
28227 tejbeer 2725
 
31697 amit.gupta 2726
                }
2727
                if (stockInvestment < totalSixtyPercentInvestment) {
2728
                    partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
2729
                } else {
2730
                    partnerProblem.setStockInvestment(0);
2731
                }
28213 tejbeer 2732
 
31697 amit.gupta 2733
            }
28213 tejbeer 2734
 
31697 amit.gupta 2735
        }
28213 tejbeer 2736
 
31886 tejbeer 2737
        List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream().filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
28205 tejbeer 2738
 
31697 amit.gupta 2739
        partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 2740
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 2741
        }).collect(Collectors.toList());
28205 tejbeer 2742
 
31697 amit.gupta 2743
        Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 2744
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 2745
        }).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 2746
 
31697 amit.gupta 2747
        Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28205 tejbeer 2748
 
31697 amit.gupta 2749
        List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28205 tejbeer 2750
 
31886 tejbeer 2751
        Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
28222 tejbeer 2752
 
31886 tejbeer 2753
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "sm@smartdukaan.com");
31697 amit.gupta 2754
        LOGGER.info("partnerProblem" + partnerProblems);
2755
        StringBuilder sb = new StringBuilder();
2756
        sb.append("<htl><body>");
2757
        sb.append(
2758
                "<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 2759
        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 2760
 
31697 amit.gupta 2761
                + "	    				</tr>");
28218 tejbeer 2762
 
31697 amit.gupta 2763
        for (PartnerProblem pp : partnerProblems) {
2764
            int value = pp.getFofoId() % 4;
28218 tejbeer 2765
 
31697 amit.gupta 2766
            Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
2767
            LOGGER.info("authUserMap" + authUserMap);
2768
            sb.append("<tr>");
31886 tejbeer 2769
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2770
            sb.append("<td style='border:1px solid black;padding: 5px'>" + assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
31697 amit.gupta 2771
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
2772
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
2773
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
31886 tejbeer 2774
            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 2775
 
31697 amit.gupta 2776
            sb.append("</tr>");
2777
        }
2778
        sb.append("</tbody></table><br><br>");
2779
        String subject = "Partner Problem Alert!";
2780
        String[] email = sendTo.toArray(new String[sendTo.size()]);
28227 tejbeer 2781
 
31697 amit.gupta 2782
        this.sendMailHtmlFormat(email, sb.toString(), null, subject);
28227 tejbeer 2783
 
31697 amit.gupta 2784
        Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
28224 tejbeer 2785
 
31697 amit.gupta 2786
        for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
2787
            AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
2788
            for (Integer patnerId : authUserPartner.getValue()) {
2789
                if (partnerProblemMap.get(patnerId) != null) {
28230 tejbeer 2790
 
31697 amit.gupta 2791
                    StringBuilder sbbuilder = new StringBuilder();
2792
                    sbbuilder.append("<hml><body>");
2793
                    sb.append(
2794
                            "<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 2795
                    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 2796
 
31697 amit.gupta 2797
                            + "	    				</tr>");
28205 tejbeer 2798
 
31697 amit.gupta 2799
                    for (Integer partnerId : authUserPartner.getValue()) {
2800
                        if (partnerProblemMap.get(partnerId) != null) {
2801
                            PartnerProblem pp = partnerProblemMap.get(partnerId);
2802
                            sbbuilder.append("<tr>");
31886 tejbeer 2803
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
2804
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
31697 amit.gupta 2805
                            sbbuilder.append(
2806
                                    "<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
31886 tejbeer 2807
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28790 amit.gupta 2808
 
31697 amit.gupta 2809
                            sbbuilder.append("</tr>");
2810
                        }
28790 amit.gupta 2811
 
31697 amit.gupta 2812
                    }
2813
                    sbbuilder.append("</tbody></table><br><br>");
29488 manish 2814
 
31697 amit.gupta 2815
                    this.sendMailOfHtmlFormat(authUser.getEmailId(), sbbuilder.toString(), null, subject);
2816
                }
29488 manish 2817
 
31697 amit.gupta 2818
            }
2819
        }
2820
    }
28775 amit.gupta 2821
 
31886 tejbeer 2822
    private void sendMailHtmlFormat(String email[], String body, String cc[], String subject) throws MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 2823
        MimeMessage message = mailSender.createMimeMessage();
2824
        MimeMessageHelper helper = new MimeMessageHelper(message);
2825
        helper.setSubject(subject);
2826
        helper.setText(body, true);
2827
        helper.setTo(email);
2828
        if (cc != null) {
2829
            helper.setCc(cc);
2830
        }
2831
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2832
        helper.setFrom(senderAddress);
2833
        mailSender.send(message);
2834
    }
29451 manish 2835
 
31697 amit.gupta 2836
    @Autowired
2837
    WarehouseRepository warehouseRepository;
29488 manish 2838
 
31697 amit.gupta 2839
    public void getVendorWarehouses(int warehouseId) {
2840
        LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
29488 manish 2841
 
31697 amit.gupta 2842
    }
29488 manish 2843
 
31697 amit.gupta 2844
    public void checkImeiActivation() {
29801 manish 2845
 
31697 amit.gupta 2846
        try {
2847
            vivoImeiActivationService.checkImeiActivation();
2848
        } catch (ProfitMandiBusinessException e) {
2849
            // TODO Auto-generated catch block
2850
            e.printStackTrace();
2851
        } catch (IOException e) {
2852
            // TODO Auto-generated catch block
2853
            e.printStackTrace();
2854
        } catch (Exception e) {
2855
            // TODO Auto-generated catch block
2856
            e.printStackTrace();
2857
        }
29807 manish 2858
 
31697 amit.gupta 2859
    }
29801 manish 2860
 
31697 amit.gupta 2861
    public void checkItelImeiActivation(LocalDate date, Integer day) {
2862
        LOGGER.info("Hello - {}", "hhh");
29488 manish 2863
 
31697 amit.gupta 2864
        try {
2865
            itelImeiActivationService.checkItelImeiActivation(date, day);
2866
        } catch (ProfitMandiBusinessException e) {
2867
            // TODO Auto-generated catch block
2868
            e.printStackTrace();
2869
        } catch (IOException e) {
2870
            // TODO Auto-generated catch block
2871
            e.printStackTrace();
2872
        } catch (Exception e) {
2873
            // TODO Auto-generated catch block
2874
            e.printStackTrace();
2875
        }
29488 manish 2876
 
31697 amit.gupta 2877
    }
29488 manish 2878
 
31886 tejbeer 2879
    public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate) throws MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 2880
        LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
29308 tejbeer 2881
 
31697 amit.gupta 2882
        serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
29252 amit.gupta 2883
 
31697 amit.gupta 2884
    }
29451 manish 2885
 
31697 amit.gupta 2886
    public void checkTecnoImeiActivation(LocalDate date, Integer day) {
2887
        LOGGER.info("Hello - {}", "hhh");
29308 tejbeer 2888
 
31697 amit.gupta 2889
        try {
2890
            tecnoImeiActivation.checkTecnoImeiActivation(date, day);
2891
        } catch (ProfitMandiBusinessException e) {
2892
            // TODO Auto-generated catch block
2893
            e.printStackTrace();
2894
        } catch (IOException e) {
2895
            // TODO Auto-generated catch block
2896
            e.printStackTrace();
2897
        } catch (Exception e) {
2898
            // TODO Auto-generated catch block
2899
            e.printStackTrace();
2900
        }
29308 tejbeer 2901
 
31697 amit.gupta 2902
    }
29441 tejbeer 2903
 
31697 amit.gupta 2904
    public void checkCancellationMargin() throws Exception {
2905
        LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
2906
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
2907
        LOGGER.info("Total Orders =  {}", fofoOrders.size());
2908
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 2909
            List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
2910
            history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.ACTIVATION_SCHEME));
31697 amit.gupta 2911
            int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
2912
            if (Math.abs(walletSum) > 1) {
2913
                // LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
2914
                // = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
2915
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2916
                List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
2917
                FofoLineItem fli = flis.get(0);
2918
                if (StringUtils.isEmpty(fli.getSerialNumber()))
2919
                    continue;
31886 tejbeer 2920
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
31697 amit.gupta 2921
                InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
31886 tejbeer 2922
                double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).mapToDouble(x -> x.getAmount()).sum();
31697 amit.gupta 2923
                /*
2924
                 * if(inventoryItem.getGoodQuantity()==1) {
2925
                 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
2926
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
2927
                 * inventoryItem.getUpdateTimestamp()); } else
2928
                 * if(inventoryItem.getBadQuantity()==1){
2929
                 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
2930
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
2931
                 * inventoryItem.getUpdateTimestamp()); } else if
2932
                 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
2933
                 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
2934
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
2935
                 * inventoryItem.getUpdateTimestamp()); }
2936
                 */
31886 tejbeer 2937
                if (inventoryItem.getLastScanType().equals(ScanType.SALE) || inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
2938
                    Map<String, Double> map = schemeInOuts.stream().collect(
2939
                            groupingBy(
2940
                                    x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x.getCreateTimestamp()) + "- " + x.getSchemeId(), Collectors.summingDouble(x -> x.getAmount())));
31697 amit.gupta 2941
                    for (Map.Entry<String, Double> entry : map.entrySet()) {
2942
                        LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
2943
                    }
31886 tejbeer 2944
                    LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(), inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
31697 amit.gupta 2945
                }
2946
            }
2947
        }
29441 tejbeer 2948
 
31697 amit.gupta 2949
    }
29308 tejbeer 2950
 
31697 amit.gupta 2951
    public static String readFileAsString(String file) throws Exception {
2952
        String data = "";
2953
        data = new String(Files.readAllBytes(Paths.get(file)));
2954
        return data;
2955
    }
29308 tejbeer 2956
 
31697 amit.gupta 2957
    public void markDelhiveryOrderDelivered() throws ProfitMandiBusinessException, IOException {
31886 tejbeer 2958
        List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.DELHIVERY_PROVIDERID, OrderStatus.SHIPPED_FROM_WH);
29308 tejbeer 2959
 
31697 amit.gupta 2960
        if (!orders.isEmpty()) {
2961
            Set<String> airwayBill = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
29308 tejbeer 2962
 
31697 amit.gupta 2963
            int arraylength = airwayBill.size();
29308 tejbeer 2964
 
31697 amit.gupta 2965
            if (arraylength >= 75) {
29308 tejbeer 2966
 
31697 amit.gupta 2967
                airwayBill = airwayBill.stream().limit(74).collect(Collectors.toSet());
2968
            }
2969
            LOGGER.info("airwayBill" + airwayBill);
2970
            String url = "https://track.delhivery.com/api/v1/packages/json/";
29308 tejbeer 2971
 
31697 amit.gupta 2972
            OkHttpClient client = new OkHttpClient();
29308 tejbeer 2973
 
31886 tejbeer 2974
            Request request1 = new Request.Builder().url(url + "?waybill=" + String.join(",", airwayBill) + "&token=" + token).get().build();
29308 tejbeer 2975
 
31697 amit.gupta 2976
            LOGGER.info("request1" + request1);
29308 tejbeer 2977
 
31697 amit.gupta 2978
            Response response = client.newCall(request1).execute();
29308 tejbeer 2979
 
31697 amit.gupta 2980
            LOGGER.info("jsonbj" + response.body());
29308 tejbeer 2981
 
31697 amit.gupta 2982
            JSONObject jsonObj = new JSONObject(response.body().string());
29308 tejbeer 2983
 
31697 amit.gupta 2984
            LOGGER.info("jsonObj" + jsonObj);
29308 tejbeer 2985
 
31697 amit.gupta 2986
            JSONArray shipmentData = jsonObj.getJSONArray("ShipmentData");
2987
            Set<String> airwaybillStatus = new HashSet<>();
2988
            for (int i = 0; i < shipmentData.length(); i++) {
2989
                JSONObject jsonObject = shipmentData.getJSONObject(i);
2990
                JSONObject shipment = jsonObject.getJSONObject("Shipment");
30982 tejbeer 2991
 
31697 amit.gupta 2992
                LOGGER.info("shipment" + shipment);
2993
                JSONObject statusDescription = shipment.getJSONObject("Status");
2994
                String awb = shipment.getString("AWB");
30982 tejbeer 2995
 
31697 amit.gupta 2996
                String status = statusDescription.getString("Status");
2997
                LOGGER.info("status" + status);
30982 tejbeer 2998
 
31697 amit.gupta 2999
                LOGGER.info("awb" + awb);
3000
                if (status.equals("Delivered")) {
3001
                    airwaybillStatus.add(awb);
3002
                }
30982 tejbeer 3003
 
31697 amit.gupta 3004
            }
3005
            markOrderDelivered(airwaybillStatus);
3006
        }
3007
    }
29308 tejbeer 3008
 
31697 amit.gupta 3009
    public void markBlueDartOrderDelivered() throws ProfitMandiBusinessException, IOException {
30982 tejbeer 3010
 
31697 amit.gupta 3011
        String loginId = "DEL81122";
31117 tejbeer 3012
 
31697 amit.gupta 3013
        String licencekey = "uhfhlg2jpmnqfhfrlsgzfr1nhu1qfvel";
31117 tejbeer 3014
 
31886 tejbeer 3015
        List<Order> orders = orderRepository.selectOrderByProviderIdAndStatus(ProfitMandiConstants.BLUEDART_PROVIDERID, OrderStatus.SHIPPED_FROM_WH);
31117 tejbeer 3016
 
31697 amit.gupta 3017
        if (!orders.isEmpty()) {
31117 tejbeer 3018
 
31697 amit.gupta 3019
            Set<String> airwayBillNo = orders.stream().map(x -> x.getAirwayBillNumber()).collect(Collectors.toSet());
31117 tejbeer 3020
 
31697 amit.gupta 3021
            LOGGER.info("airwayBill" + airwayBillNo);
3022
            String url = "https://api.bluedart.com/servlet/RoutingServlet?handler=tnt&action=custawbquery";
31117 tejbeer 3023
 
31886 tejbeer 3024
            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 3025
 
31697 amit.gupta 3026
            JSONObject updateJson = XML.toJSONObject(response);
31117 tejbeer 3027
 
31697 amit.gupta 3028
            JSONObject shipmentData = updateJson.getJSONObject("ShipmentData");
3029
            Object shipmentObject = shipmentData.get("Shipment");
31117 tejbeer 3030
 
31697 amit.gupta 3031
            Set<String> airwaybillStatus = new HashSet<>();
29308 tejbeer 3032
 
31697 amit.gupta 3033
            if (shipmentObject instanceof JSONArray) {
3034
                JSONArray shipments = (JSONArray) shipmentObject;
3035
                for (int i = 0; i < shipments.length(); i++) {
3036
                    JSONObject jsonObject = shipments.getJSONObject(i);
31117 tejbeer 3037
 
31697 amit.gupta 3038
                    Number awb = jsonObject.getNumber("WaybillNo");
3039
                    String status = jsonObject.getString("Status");
31117 tejbeer 3040
 
31697 amit.gupta 3041
                    if (status.equals("SHIPMENT DELIVERED")) {
3042
                        airwaybillStatus.add(awb.toString());
3043
                    }
29308 tejbeer 3044
 
31697 amit.gupta 3045
                }
3046
            } else {
3047
                JSONObject jsonObject = (JSONObject) shipmentObject;
3048
                Number awb = jsonObject.getNumber("WaybillNo");
3049
                String status = jsonObject.getString("Status");
31117 tejbeer 3050
 
31697 amit.gupta 3051
                if (status.equals("SHIPMENT DELIVERED")) {
3052
                    airwaybillStatus.add(awb.toString());
3053
                }
31117 tejbeer 3054
 
31697 amit.gupta 3055
            }
31117 tejbeer 3056
 
31697 amit.gupta 3057
            LOGGER.info("airwaybillStatus" + airwaybillStatus);
31117 tejbeer 3058
 
31697 amit.gupta 3059
            markOrderDelivered(airwaybillStatus);
3060
        }
31117 tejbeer 3061
 
31697 amit.gupta 3062
    }
31117 tejbeer 3063
 
31886 tejbeer 3064
    private void markOrderDelivered(Set<String> airwaybillStatus) throws ProfitMandiBusinessException, HttpHostConnectException {
31697 amit.gupta 3065
        if (!airwaybillStatus.isEmpty()) {
3066
            for (String aws : airwaybillStatus) {
31117 tejbeer 3067
 
31697 amit.gupta 3068
                List<Order> deliverdOrders = orderRepository.selectByAirwayBillNumber(aws);
31117 tejbeer 3069
 
31697 amit.gupta 3070
                int fofoId = deliverdOrders.get(0).getRetailerId();
3071
                for (Order dlo : deliverdOrders) {
3072
                    dlo.setStatus(OrderStatus.DELIVERY_SUCCESS);
3073
                    dlo.setStatusDescription("Order Delivered");
3074
                    dlo.setDeliveryTimestamp(LocalDateTime.now());
3075
                }
31117 tejbeer 3076
 
31697 amit.gupta 3077
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
31117 tejbeer 3078
 
31697 amit.gupta 3079
                Address address = addressRepository.selectById(user.getAddressId());
29814 tejbeer 3080
 
31697 amit.gupta 3081
                String title = "Order Delivered";
29814 tejbeer 3082
 
31886 tejbeer 3083
                String message = String.format("Dear partner, Your SmartDukaan Order " + aws + " has been delivered to you in a safe sealed bag.");
29814 tejbeer 3084
 
31697 amit.gupta 3085
                SendNotificationModel sendNotificationModel = new SendNotificationModel();
3086
                sendNotificationModel.setCampaignName("Order Delivered");
3087
                sendNotificationModel.setTitle(title);
3088
                sendNotificationModel.setMessage(message);
3089
                sendNotificationModel.setType("url");
3090
                sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3091
                sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
3092
                sendNotificationModel.setMessageType(MessageType.notification);
3093
                int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
3094
                sendNotificationModel.setUserIds(Arrays.asList(userId));
3095
                notificationService.sendNotification(sendNotificationModel);
29815 tejbeer 3096
 
31697 amit.gupta 3097
                notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
29814 tejbeer 3098
 
31697 amit.gupta 3099
            }
3100
        }
3101
    }
29814 tejbeer 3102
 
31697 amit.gupta 3103
    public void partnerWiseCreditAccount() throws Exception {
29814 tejbeer 3104
 
31697 amit.gupta 3105
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
29814 tejbeer 3106
 
31697 amit.gupta 3107
        for (FofoStore fs : fofoStores) {
29835 tejbeer 3108
 
31697 amit.gupta 3109
            if (fs.getPan() != null) {
3110
                AccountStatusResponseOut accountStatusResponseOut = mandiiService.getStatus(fs.getPan());
29835 tejbeer 3111
 
31697 amit.gupta 3112
                LOGGER.info("accountStatusResponseOut" + accountStatusResponseOut);
31886 tejbeer 3113
                CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fs.getId(), Gateway.MANDII);
29817 tejbeer 3114
 
31697 amit.gupta 3115
                if (creditAccount == null) {
29835 tejbeer 3116
 
31697 amit.gupta 3117
                    creditAccount = new CreditAccount();
29835 tejbeer 3118
 
31697 amit.gupta 3119
                    creditAccount.setFofoId(fs.getId());
3120
                    creditAccount.setGateway(Gateway.MANDII);
29817 tejbeer 3121
 
31697 amit.gupta 3122
                }
29814 tejbeer 3123
 
31697 amit.gupta 3124
                if (accountStatusResponseOut == null) {
3125
                    creditAccount.setCreditStatus(CreditStatus.UNKNOWN);
3126
                    creditAccount.setDescription("User company not found");
30421 tejbeer 3127
 
31697 amit.gupta 3128
                } else {
3129
                    if (accountStatusResponseOut.getSanctionLimit() != null) {
3130
                        creditAccount.setSanctionedAmount(accountStatusResponseOut.getSanctionLimit().floatValue());
3131
                    } else {
3132
                        creditAccount.setSanctionedAmount(0);
3133
                    }
30421 tejbeer 3134
 
31697 amit.gupta 3135
                    creditAccount.setInterestRate(accountStatusResponseOut.getRateOfInterest());
3136
                    if (accountStatusResponseOut.getBalanceAmount() != null) {
3137
                        creditAccount.setAvailableAmount(accountStatusResponseOut.getBalanceAmount().floatValue());
3138
                    } else {
3139
                        creditAccount.setAvailableAmount(0);
3140
                    }
30421 tejbeer 3141
 
31697 amit.gupta 3142
                    if (accountStatusResponseOut.getCurrentStage() != null) {
3143
                        creditAccount.setDescription(accountStatusResponseOut.getCurrentStage().toString());
3144
                    }
3145
                    if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.SANCTION_AVAILABLE)) {
3146
                        creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
3147
                    } else if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.IN_ELIGIBLE)) {
3148
                        creditAccount.setCreditStatus(CreditStatus.INELIGIBLE);
3149
                    } else {
30421 tejbeer 3150
 
31697 amit.gupta 3151
                        creditAccount.setCreditStatus(CreditStatus.TO_BE_EVALUATED);
3152
                    }
3153
                }
30421 tejbeer 3154
 
31697 amit.gupta 3155
                creditAccount.setUpdatedOn(LocalDateTime.now());
3156
                creditAccountRepository.persist(creditAccount);
3157
            }
3158
        }
3159
    }
30421 tejbeer 3160
 
31697 amit.gupta 3161
    @Autowired
3162
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30421 tejbeer 3163
 
31886 tejbeer 3164
    public void reviewUncontactablePartner() throws ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
30421 tejbeer 3165
 
31697 amit.gupta 3166
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30421 tejbeer 3167
 
31886 tejbeer 3168
        List<Integer> pcrms = partnerCollectionRemarkRepository.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
30859 tejbeer 3169
 
31697 amit.gupta 3170
        if (!pcrms.isEmpty()) {
31886 tejbeer 3171
            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 3172
 
31697 amit.gupta 3173
            if (!partnerCollectionRemarksMap.isEmpty()) {
31886 tejbeer 3174
                for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
3175
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerCollectionRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 3176
                    String subject = "UNCONTACTABLE PARTNERS";
3177
                    String messageText = this.getMessageForUncontacblePartner(filteredRows);
30859 tejbeer 3178
 
31697 amit.gupta 3179
                    MimeMessage message = mailSender.createMimeMessage();
3180
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3181
                    String[] email = new String[]{storeGuyEntry.getKey()};
30859 tejbeer 3182
 
31697 amit.gupta 3183
                    helper.setSubject(subject);
3184
                    helper.setText(messageText, true);
3185
                    helper.setTo(email);
31886 tejbeer 3186
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
31697 amit.gupta 3187
                    helper.setFrom(senderAddress);
3188
                    mailSender.send(message);
30859 tejbeer 3189
 
31697 amit.gupta 3190
                    LOGGER.info("filteredRows {}", filteredRows);
30859 tejbeer 3191
 
31697 amit.gupta 3192
                }
3193
            }
30936 tejbeer 3194
 
31697 amit.gupta 3195
        }
3196
    }
30936 tejbeer 3197
 
31697 amit.gupta 3198
    @Autowired
3199
    private LoanRepository loanRepository;
31020 tejbeer 3200
 
31697 amit.gupta 3201
    @Autowired
3202
    private LoanStatementRepository loanStatementRepository;
30859 tejbeer 3203
 
31697 amit.gupta 3204
    @Autowired
3205
    private SDCreditService sdCreditService;
30859 tejbeer 3206
 
31697 amit.gupta 3207
    @Autowired
3208
    private SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 3209
 
31697 amit.gupta 3210
    @Autowired
3211
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30859 tejbeer 3212
 
31697 amit.gupta 3213
    @Autowired
3214
    private TransactionRepository transactionRepository;
30859 tejbeer 3215
 
31697 amit.gupta 3216
    @Autowired
3217
    private SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 3218
 
31697 amit.gupta 3219
    public void calculateInterestAccured() throws ProfitMandiBusinessException {
30936 tejbeer 3220
 
31697 amit.gupta 3221
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3222
 
31697 amit.gupta 3223
        if (!loans.isEmpty()) {
30936 tejbeer 3224
 
31697 amit.gupta 3225
            for (Loan loan : loans) {
30936 tejbeer 3226
 
31697 amit.gupta 3227
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 3228
 
31724 amit.gupta 3229
                Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(
31697 amit.gupta 3230
                        x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
30859 tejbeer 3231
 
31697 amit.gupta 3232
                if (loan.getFreeDays() > 0) {
3233
                    LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(loan.getFreeDays() - 1);
30859 tejbeer 3234
 
31697 amit.gupta 3235
                    LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
3236
                    if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
31886 tejbeer 3237
                        int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
31697 amit.gupta 3238
                        LOGGER.info("loanStatementId {}", loanStatementId);
30859 tejbeer 3239
 
31697 amit.gupta 3240
                        if (loanStatementId != 0) {
30859 tejbeer 3241
 
31697 amit.gupta 3242
                            this.calculateInterest(loan, loanStatusAmount, loanStatementId);
30859 tejbeer 3243
 
31697 amit.gupta 3244
                        } else {
31886 tejbeer 3245
                            sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3246
                        }
30859 tejbeer 3247
 
31697 amit.gupta 3248
                    }
3249
                } else {
31332 amit.gupta 3250
 
31886 tejbeer 3251
                    int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
31697 amit.gupta 3252
                    LOGGER.info("loanStatementId2 {}", loanStatementId);
31604 tejbeer 3253
 
31697 amit.gupta 3254
                    this.calculateInterest(loan, loanStatusAmount, loanStatementId);
31332 amit.gupta 3255
 
31697 amit.gupta 3256
                }
31518 amit.gupta 3257
 
31697 amit.gupta 3258
            }
3259
        }
30936 tejbeer 3260
 
31697 amit.gupta 3261
    }
30936 tejbeer 3262
 
31697 amit.gupta 3263
    @Autowired
3264
    FofoPaymentRepository fofoPaymentRepository;
30936 tejbeer 3265
 
31697 amit.gupta 3266
    @Autowired
3267
    CCAvenuePaymentService ccAvenuePaymentService;
30936 tejbeer 3268
 
31697 amit.gupta 3269
    public void settleCCAvePayments() throws Exception {
31886 tejbeer 3270
        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 3271
        for (FofoPayment fofoPayment : fofoPayments) {
3272
            ccAvenuePaymentService.updatePayment(fofoPayment);
3273
        }
3274
    }
30859 tejbeer 3275
 
31697 amit.gupta 3276
    /*
3277
     * public void getCCAvenuePendingOrderStatus(int pendingOrderId) { PendingOrder
3278
     * pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
3279
     * ccAvenuePaymentService.getPaymentStatusMap(pendingOrder); }
3280
     */
30859 tejbeer 3281
 
31886 tejbeer 3282
    private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount, int loanStatementId) throws ProfitMandiBusinessException {
31697 amit.gupta 3283
        LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
30859 tejbeer 3284
 
31697 amit.gupta 3285
        if (loanStatement.getLoanId() == loan.getId()) {
30859 tejbeer 3286
 
31886 tejbeer 3287
            sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
30859 tejbeer 3288
 
31697 amit.gupta 3289
        } else {
3290
            throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3291
        }
3292
    }
31175 tejbeer 3293
 
31697 amit.gupta 3294
    public void loanSettlement() throws Exception {
3295
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3296
 
31697 amit.gupta 3297
        if (!loans.isEmpty()) {
30859 tejbeer 3298
 
31697 amit.gupta 3299
            for (Loan loan : loans) {
31020 tejbeer 3300
 
31697 amit.gupta 3301
                UserWallet userWallet = userWalletRepository.selectByRetailerId(loan.getFofoId());
31886 tejbeer 3302
                SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(loan.getFofoId());
30859 tejbeer 3303
 
31697 amit.gupta 3304
                if (userWallet.getAmount() >= 100) {
3305
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31175 tejbeer 3306
 
31697 amit.gupta 3307
                    LOGGER.info("loanStatements {}", loanStatements);
30859 tejbeer 3308
 
31886 tejbeer 3309
                    Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> FormattingUtils.serialize(x.getAmount()))));
30859 tejbeer 3310
 
31697 amit.gupta 3311
                    LOGGER.info("loanStatusAmount {}", loanStatusAmount);
3312
                    Double interestAmount = loanStatusAmount.get(LoanReferenceType.INTEREST);
30859 tejbeer 3313
 
31697 amit.gupta 3314
                    if (interestAmount == null) {
3315
                        interestAmount = (double) 0;
3316
                    }
30859 tejbeer 3317
 
31697 amit.gupta 3318
                    double principalAmount = loanStatusAmount.get(LoanReferenceType.PRINCIPAL);
3319
                    double paidAmount = 0;
3320
                    if (userWallet.getAmount() > Math.abs(interestAmount)) {
30859 tejbeer 3321
 
31697 amit.gupta 3322
                        LOGGER.info("interestAmount b {}", interestAmount);
30859 tejbeer 3323
 
31697 amit.gupta 3324
                        if (interestAmount < 0) {
3325
                            LOGGER.info("interestAmount a {}", interestAmount);
30859 tejbeer 3326
 
31886 tejbeer 3327
                            settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(interestAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31697 amit.gupta 3328
                            loan.setInterestPaid(loan.getInterestPaid().add(BigDecimal.valueOf(interestAmount).abs()));
30859 tejbeer 3329
 
31697 amit.gupta 3330
                            paidAmount += Math.abs(interestAmount);
3331
                        }
31020 tejbeer 3332
 
31697 amit.gupta 3333
                        double userWalletAmount = userWallet.getAmount() - Math.abs(interestAmount);
31110 tejbeer 3334
 
31697 amit.gupta 3335
                        if (userWalletAmount > Math.abs(principalAmount) && principalAmount < 0) {
31110 tejbeer 3336
 
31886 tejbeer 3337
                            settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(principalAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31697 amit.gupta 3338
                            double amount = userWalletAmount - Math.abs(principalAmount);
31110 tejbeer 3339
 
31697 amit.gupta 3340
                            paidAmount += Math.abs(principalAmount);
30859 tejbeer 3341
 
31697 amit.gupta 3342
                            userWallet.setAmount((int) amount);
30859 tejbeer 3343
 
31886 tejbeer 3344
                            BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount().subtract(BigDecimal.valueOf(principalAmount).abs());
30859 tejbeer 3345
 
31697 amit.gupta 3346
                            sdCreditRequirement.setUtilizedAmount(utilizationAmount);
30859 tejbeer 3347
 
31886 tejbeer 3348
                            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
31020 tejbeer 3349
 
31697 amit.gupta 3350
                            creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3351
                            creditAccount.setUpdatedOn(LocalDateTime.now());
31020 tejbeer 3352
 
31697 amit.gupta 3353
                            loan.setPendingAmount(BigDecimal.ZERO);
31020 tejbeer 3354
 
31697 amit.gupta 3355
                        } else if (principalAmount < 0) {
31110 tejbeer 3356
 
31886 tejbeer 3357
                            settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(userWalletAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
30859 tejbeer 3358
 
31697 amit.gupta 3359
                            paidAmount += Math.abs(userWalletAmount);
30859 tejbeer 3360
 
31886 tejbeer 3361
                            BigDecimal availableLimit = sdCreditRequirement.getAvailableLimit().add(BigDecimal.valueOf(userWalletAmount)).abs();
30859 tejbeer 3362
 
31886 tejbeer 3363
                            BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount().subtract(BigDecimal.valueOf(userWalletAmount)).abs();
30859 tejbeer 3364
 
31697 amit.gupta 3365
                            sdCreditRequirement.setUtilizedAmount(utilizationAmount);
30859 tejbeer 3366
 
31886 tejbeer 3367
                            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
30859 tejbeer 3368
 
31697 amit.gupta 3369
                            creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3370
                            creditAccount.setUpdatedOn(LocalDateTime.now());
3371
                            userWallet.setAmount(0);
30859 tejbeer 3372
 
31697 amit.gupta 3373
                            loan.setPendingAmount(
3374
                                    loan.getPendingAmount().subtract(BigDecimal.valueOf(userWalletAmount)));
30859 tejbeer 3375
 
31697 amit.gupta 3376
                        }
30859 tejbeer 3377
 
31886 tejbeer 3378
                        createUserWalletHistory(userWallet.getId(), userWallet.getUserId(), WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
30859 tejbeer 3379
 
31697 amit.gupta 3380
                    } else {
30999 tejbeer 3381
 
31886 tejbeer 3382
                        settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(userWallet.getAmount()), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31020 tejbeer 3383
 
31697 amit.gupta 3384
                        paidAmount += Math.abs(userWallet.getAmount());
31020 tejbeer 3385
 
31886 tejbeer 3386
                        createUserWalletHistory(userWallet.getId(), userWallet.getUserId(), WalletReferenceType.LOAN_REPAYMENT, loan.getId(), Math.abs(paidAmount));
31020 tejbeer 3387
 
31697 amit.gupta 3388
                        loan.setInterestPaid(
3389
                                loan.getInterestPaid().add(BigDecimal.valueOf(userWallet.getAmount()).abs()));
31020 tejbeer 3390
 
31697 amit.gupta 3391
                        userWallet.setAmount(0);
3392
                    }
31020 tejbeer 3393
 
31697 amit.gupta 3394
                }
3395
            }
31020 tejbeer 3396
 
31697 amit.gupta 3397
            List<Order> allOrders = orderRepository.selectHoldOrder();
31020 tejbeer 3398
 
31697 amit.gupta 3399
            LOGGER.info("allOrders {}", allOrders);
31020 tejbeer 3400
 
31697 amit.gupta 3401
            if (!allOrders.isEmpty()) {
31886 tejbeer 3402
                Map<Integer, List<Order>> transactionOrdersMap = allOrders.stream().collect(groupingBy(Order::getTransactionId, Collectors.toList()));
31697 amit.gupta 3403
                LinkedHashMap<Integer, List<Order>> sortedTransactionOrdersMap = new LinkedHashMap<>();
31886 tejbeer 3404
                transactionOrdersMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(x -> sortedTransactionOrdersMap.put(x.getKey(), x.getValue()));
31697 amit.gupta 3405
                LOGGER.info("sortedTransactionOrdersMap {}", sortedTransactionOrdersMap);
31020 tejbeer 3406
 
31697 amit.gupta 3407
                for (Entry<Integer, List<Order>> transactionOrdersEntry : sortedTransactionOrdersMap.entrySet()) {
31020 tejbeer 3408
 
31697 amit.gupta 3409
                    List<Order> orders = transactionOrdersEntry.getValue();
31020 tejbeer 3410
 
31697 amit.gupta 3411
                    double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
31020 tejbeer 3412
 
31697 amit.gupta 3413
                    LocalDateTime createDate = orders.get(0).getCreateTimestamp();
31020 tejbeer 3414
 
31697 amit.gupta 3415
                    int fofoId = orders.get(0).getRetailerId();
31020 tejbeer 3416
 
31697 amit.gupta 3417
                    int transactionId = transactionOrdersEntry.getKey();
31020 tejbeer 3418
 
31697 amit.gupta 3419
                    SanctionRequest sanctionRequest = sanctionRequestRepository.selectByTransactionId(transactionId);
31020 tejbeer 3420
 
31886 tejbeer 3421
                    double loanSettleAmount = loanStatementRepository.selectByDateAndFofoId(createDate, fofoId).stream().filter(x -> x.getAmount().doubleValue() > 0).collect(Collectors.summingDouble(x -> x.getAmount().doubleValue()));
31020 tejbeer 3422
 
31697 amit.gupta 3423
                    LOGGER.info("loanSettleAmount {}", loanSettleAmount);
31020 tejbeer 3424
 
31697 amit.gupta 3425
                    LOGGER.info("totalAmount {}", totalAmount);
3426
                    if (loanSettleAmount >= sanctionRequest.getUtilizationAmount().doubleValue()) {
31020 tejbeer 3427
 
31697 amit.gupta 3428
                        LOGGER.info("totalAmount {}", totalAmount);
31020 tejbeer 3429
 
31697 amit.gupta 3430
                        orders.forEach(x -> x.setShipmentHold(false));
31020 tejbeer 3431
 
31886 tejbeer 3432
                        List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
31697 amit.gupta 3433
                        authUserEmail.add("vinay.p@smartdukaan.com");
3434
                        authUserEmail.add("shivam.gupta@smartdukaan.com");
31020 tejbeer 3435
 
31697 amit.gupta 3436
                        String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
30859 tejbeer 3437
 
31697 amit.gupta 3438
                        String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
30859 tejbeer 3439
 
31697 amit.gupta 3440
                        String subject = "Dispatched " + (orders.get(0).getRetailerName());
31886 tejbeer 3441
                        String message = String.format("Dear Team, \n" + "kindly note the material for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is dispatched.");
30859 tejbeer 3442
 
31697 amit.gupta 3443
                        Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
30859 tejbeer 3444
 
31697 amit.gupta 3445
                    }
30859 tejbeer 3446
 
31697 amit.gupta 3447
                }
3448
            }
30859 tejbeer 3449
 
31697 amit.gupta 3450
        }
30859 tejbeer 3451
 
31697 amit.gupta 3452
    }
30859 tejbeer 3453
 
31886 tejbeer 3454
    private void settledLoanStatement(LoanReferenceType loanReferneceType, BigDecimal amount, int fofoId, int loanId, String description, LocalDateTime now) {
30859 tejbeer 3455
 
31886 tejbeer 3456
        sdCreditService.createLoanStatement(loanReferneceType, amount.abs(), fofoId, loanId, description, LocalDateTime.now());
30859 tejbeer 3457
 
31697 amit.gupta 3458
    }
30859 tejbeer 3459
 
31886 tejbeer 3460
    private void createUserWalletHistory(int walletId, int userId, WalletReferenceType referenceType, int loanId, double interestAmount) {
31697 amit.gupta 3461
        UserWalletHistory uwh = new UserWalletHistory();
3462
        uwh.setWalletId(walletId);
3463
        uwh.setFofoId(userId);
3464
        uwh.setBusinessTimestamp(LocalDateTime.now());
3465
        uwh.setReferenceType(referenceType);
3466
        uwh.setReference(loanId);
3467
        uwh.setTimestamp(LocalDateTime.now());
3468
        uwh.setAmount((int) -(interestAmount));
3469
        uwh.setDescription("Amount adjusted against loan");
3470
        userWalletHistoryRepository.persist(uwh);
30859 tejbeer 3471
 
31697 amit.gupta 3472
    }
30859 tejbeer 3473
 
31886 tejbeer 3474
    public void dailyLoanAlert() throws ProfitMandiBusinessException, HttpHostConnectException, UnsupportedEncodingException {
31697 amit.gupta 3475
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3476
 
31697 amit.gupta 3477
        Map<Integer, Double> partnerLoanAmount = new HashMap<>();
30859 tejbeer 3478
 
31697 amit.gupta 3479
        if (!loans.isEmpty()) {
30859 tejbeer 3480
 
31697 amit.gupta 3481
            for (Loan loan : loans) {
30859 tejbeer 3482
 
31697 amit.gupta 3483
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30859 tejbeer 3484
 
31886 tejbeer 3485
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31697 amit.gupta 3486
                if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3487
                    amount += partnerLoanAmount.get(loan.getFofoId());
3488
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3489
                } else {
3490
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3491
                }
30965 tejbeer 3492
 
31697 amit.gupta 3493
            }
30965 tejbeer 3494
 
31697 amit.gupta 3495
        }
30859 tejbeer 3496
 
31697 amit.gupta 3497
        if (!partnerLoanAmount.isEmpty()) {
30965 tejbeer 3498
 
31697 amit.gupta 3499
            for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
30859 tejbeer 3500
 
31697 amit.gupta 3501
                int fofoId = partnerLoanAmountEnrty.getKey();
30859 tejbeer 3502
 
31697 amit.gupta 3503
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
30859 tejbeer 3504
 
31697 amit.gupta 3505
                Address address = addressRepository.selectById(user.getAddressId());
30896 amit.gupta 3506
 
31697 amit.gupta 3507
                String title = "Alert Credit Outstanding!";
3508
                String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3509
                String message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
31697 amit.gupta 3510
                notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
30913 tejbeer 3511
 
31697 amit.gupta 3512
                notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30913 tejbeer 3513
 
31697 amit.gupta 3514
            }
30917 tejbeer 3515
 
31697 amit.gupta 3516
        }
30917 tejbeer 3517
 
31697 amit.gupta 3518
    }
30920 tejbeer 3519
 
31697 amit.gupta 3520
    public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3521
        schemeService.processActivatedImeisForSchemes();
3522
    }
30920 tejbeer 3523
 
31697 amit.gupta 3524
    public void updatePartnerLimit() throws ProfitMandiBusinessException {
3525
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30913 tejbeer 3526
 
31886 tejbeer 3527
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3528
        Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31697 amit.gupta 3529
        double limitValue = 100000;
3530
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3531
            int fofoId = customRetailerEntry.getKey();
3532
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(customRetailerEntry.getKey());
3533
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
3534
            CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
3535
            BigDecimal suggestedAmount = BigDecimal.ZERO;
3536
            if (currentPartnerDailyInvestment != null) {
3537
                suggestedAmount = BigDecimal.valueOf(currentPartnerDailyInvestment.getTotalInvestment() * 0.1);
3538
            }
30929 tejbeer 3539
 
31697 amit.gupta 3540
            if (suggestedAmount.doubleValue() > limitValue) {
30929 tejbeer 3541
 
31697 amit.gupta 3542
                suggestedAmount = BigDecimal.valueOf(limitValue);
30929 tejbeer 3543
 
31697 amit.gupta 3544
            }
30913 tejbeer 3545
 
31697 amit.gupta 3546
            if (suggestedAmount.doubleValue() < 0) {
3547
                suggestedAmount = BigDecimal.ZERO;
3548
            }
30913 tejbeer 3549
 
31697 amit.gupta 3550
            LOGGER.info("suggestedAmount {} ", suggestedAmount);
30913 tejbeer 3551
 
31697 amit.gupta 3552
            if (sdCreditRequirement == null) {
3553
                sdCreditRequirement = new SDCreditRequirement();
3554
                sdCreditRequirement.setFofoId(fofoId);
3555
                sdCreditRequirement.setCreditDays(15);
3556
                sdCreditRequirement.setInterestRate(BigDecimal.valueOf(0.05));
3557
                sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3558
                sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3559
                sdCreditRequirement.setLimit(suggestedAmount);
3560
                sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3561
                sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3562
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3563
                sdCreditRequirementRepository.persist(sdCreditRequirement);
3564
            }
30913 tejbeer 3565
 
31697 amit.gupta 3566
            CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30913 tejbeer 3567
 
31697 amit.gupta 3568
            sdCreditRequirement.setRisk(creditRisk);
30913 tejbeer 3569
 
31697 amit.gupta 3570
            sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3571
            sdCreditRequirement.setLimit(suggestedAmount);
3572
            BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30934 tejbeer 3573
 
31697 amit.gupta 3574
            BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30934 tejbeer 3575
 
31697 amit.gupta 3576
            LOGGER.info("utilizedLimit {} ", utilizedLimit);
30913 tejbeer 3577
 
31697 amit.gupta 3578
            LOGGER.info("availableLimit {} ", availableLimit);
30913 tejbeer 3579
 
31697 amit.gupta 3580
            sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30929 tejbeer 3581
 
31697 amit.gupta 3582
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30929 tejbeer 3583
 
31886 tejbeer 3584
            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(sdCreditRequirement.getFofoId(), Gateway.SDDIRECT);
31697 amit.gupta 3585
            if (creditAccount != null) {
30929 tejbeer 3586
 
31697 amit.gupta 3587
                creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3588
                creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3589
                creditAccount.setAvailableAmount(availableLimit.floatValue());
3590
                creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3591
                creditAccount.setUpdatedOn(LocalDateTime.now());
3592
            }
30929 tejbeer 3593
 
31697 amit.gupta 3594
        }
31177 tejbeer 3595
 
31697 amit.gupta 3596
    }
30929 tejbeer 3597
 
31697 amit.gupta 3598
    public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 3599
 
31697 amit.gupta 3600
        sdCreditService.updateRisk();
3601
        List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
3602
        if (!defaultLoans.isEmpty()) {
3603
            this.sendDefaultLoanAlert(defaultLoans);
3604
        }
30929 tejbeer 3605
 
31697 amit.gupta 3606
    }
30929 tejbeer 3607
 
31886 tejbeer 3608
    public void sendDefaultLoanAlert(List<Loan> defaultLoans) throws ProfitMandiBusinessException, MessagingException, IOException {
31697 amit.gupta 3609
        String subject = "Default Partners";
30931 tejbeer 3610
 
31886 tejbeer 3611
        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 3612
 
31886 tejbeer 3613
        for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 3614
            List<Loan> filteredRows = new ArrayList<>();
3615
            for (Loan loan : defaultLoans) {
30929 tejbeer 3616
 
31697 amit.gupta 3617
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 3618
 
31697 amit.gupta 3619
                    filteredRows.add(loan);
3620
                }
3621
            }
3622
            if (!filteredRows.isEmpty()) {
3623
                String messageText = this.getMessageForDueDateExtend(filteredRows);
3624
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 3625
 
31697 amit.gupta 3626
                this.sendMailHtmlFormat(email, messageText, null, subject);
30982 tejbeer 3627
 
31697 amit.gupta 3628
            }
30936 tejbeer 3629
 
31697 amit.gupta 3630
        }
30982 tejbeer 3631
 
31697 amit.gupta 3632
        for (Loan defaultLoan : defaultLoans) {
3633
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 3634
 
31886 tejbeer 3635
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3636
 
31697 amit.gupta 3637
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
30936 tejbeer 3638
 
31697 amit.gupta 3639
            Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 3640
 
31697 amit.gupta 3641
            String title = "Loan Amount Overdue!";
3642
            String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3643
            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!!";
3644
            notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 3645
 
31697 amit.gupta 3646
            // notificationService.sendWhatsappMessage(message, title,
3647
            // address.getPhoneNumber());
30929 tejbeer 3648
 
31697 amit.gupta 3649
        }
3650
    }
30929 tejbeer 3651
 
31697 amit.gupta 3652
    private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
3653
        StringBuilder sb = new StringBuilder();
3654
        sb.append(
31886 tejbeer 3655
                "<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';>");
3656
        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 3657
 
31697 amit.gupta 3658
                + "	    				</tr>");
3659
        for (Loan entry : loans) {
30929 tejbeer 3660
 
31697 amit.gupta 3661
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
30929 tejbeer 3662
 
31886 tejbeer 3663
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 3664
 
31697 amit.gupta 3665
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
30929 tejbeer 3666
 
31697 amit.gupta 3667
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30929 tejbeer 3668
 
31697 amit.gupta 3669
            sb.append("<tr>");
31886 tejbeer 3670
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
31397 tejbeer 3671
 
31886 tejbeer 3672
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 3673
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 3674
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
31397 tejbeer 3675
 
31697 amit.gupta 3676
            sb.append("</tr>");
31397 tejbeer 3677
 
31697 amit.gupta 3678
        }
31397 tejbeer 3679
 
31697 amit.gupta 3680
        sb.append("</tbody></table></body></html>");
31397 tejbeer 3681
 
31697 amit.gupta 3682
        return sb.toString();
3683
    }
31397 tejbeer 3684
 
31697 amit.gupta 3685
    private String getMessageForDueDateCross(List<Loan> loans) throws ProfitMandiBusinessException {
3686
        StringBuilder sb = new StringBuilder();
31886 tejbeer 3687
        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';>");
3688
        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 3689
 
31697 amit.gupta 3690
                + "	    				</tr>");
3691
        for (Loan entry : loans) {
31397 tejbeer 3692
 
31697 amit.gupta 3693
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
31397 tejbeer 3694
 
31886 tejbeer 3695
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31397 tejbeer 3696
 
31697 amit.gupta 3697
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
31397 tejbeer 3698
 
31697 amit.gupta 3699
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
31397 tejbeer 3700
 
31697 amit.gupta 3701
            sb.append("<tr>");
31886 tejbeer 3702
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
30936 tejbeer 3703
 
31886 tejbeer 3704
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 3705
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 3706
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
30936 tejbeer 3707
 
31697 amit.gupta 3708
            sb.append("</tr>");
31397 tejbeer 3709
 
31697 amit.gupta 3710
        }
31397 tejbeer 3711
 
31697 amit.gupta 3712
        sb.append("</tbody></table></body></html>");
31397 tejbeer 3713
 
31697 amit.gupta 3714
        return sb.toString();
3715
    }
31397 tejbeer 3716
 
31697 amit.gupta 3717
    public void notifyLoanDueDateCross() throws ProfitMandiBusinessException, MessagingException, IOException {
31397 tejbeer 3718
 
31697 amit.gupta 3719
        List<Loan> dueDateCrossLoans = sdCreditService.getDueDateCrossLoan();
3720
        if (!dueDateCrossLoans.isEmpty()) {
3721
            this.sendDueDateCrossLoanAlert(dueDateCrossLoans);
3722
        }
31397 tejbeer 3723
 
31697 amit.gupta 3724
    }
31397 tejbeer 3725
 
31886 tejbeer 3726
    private void sendDueDateCrossLoanAlert(List<Loan> dueDateCrossLoans) throws ProfitMandiBusinessException, MessagingException, IOException {
3727
        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 3728
 
31886 tejbeer 3729
        for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 3730
            List<Loan> filteredRows = new ArrayList<>();
3731
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 3732
 
31697 amit.gupta 3733
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30982 tejbeer 3734
 
31697 amit.gupta 3735
                    filteredRows.add(loan);
3736
                }
3737
            }
3738
            if (!filteredRows.isEmpty()) {
3739
                String messageText = this.getMessageForDueDateCross(filteredRows);
3740
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 3741
 
31697 amit.gupta 3742
                this.sendMailHtmlFormat(email, messageText, null, "Due Date Cross");
30936 tejbeer 3743
 
31697 amit.gupta 3744
            }
30936 tejbeer 3745
 
31697 amit.gupta 3746
        }
3747
        if (!dueDateCrossLoans.isEmpty()) {
3748
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 3749
 
31697 amit.gupta 3750
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
30989 tejbeer 3751
 
31697 amit.gupta 3752
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30989 tejbeer 3753
 
31697 amit.gupta 3754
                Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 3755
 
31697 amit.gupta 3756
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 3757
 
31697 amit.gupta 3758
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 3759
 
31886 tejbeer 3760
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 3761
 
31697 amit.gupta 3762
                String url = "http://app.smartdukaan.com/pages/home/credit";
30936 tejbeer 3763
 
31697 amit.gupta 3764
                String title = "Alert!";
31886 tejbeer 3765
                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 3766
 
31886 tejbeer 3767
                notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 3768
 
31697 amit.gupta 3769
                notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 3770
 
31697 amit.gupta 3771
            }
3772
        }
30982 tejbeer 3773
 
31697 amit.gupta 3774
    }
30936 tejbeer 3775
 
31697 amit.gupta 3776
    public void alertForDueDate() throws ProfitMandiBusinessException, MessagingException, IOException {
30936 tejbeer 3777
 
31697 amit.gupta 3778
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30936 tejbeer 3779
 
31697 amit.gupta 3780
        if (!loans.isEmpty()) {
3781
            for (Loan loan : loans) {
30936 tejbeer 3782
 
31697 amit.gupta 3783
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30936 tejbeer 3784
 
31697 amit.gupta 3785
                Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 3786
 
31697 amit.gupta 3787
                long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
30936 tejbeer 3788
 
31697 amit.gupta 3789
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 3790
 
31697 amit.gupta 3791
                if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
3792
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31886 tejbeer 3793
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 3794
 
31697 amit.gupta 3795
                    String title = "Alert!";
3796
                    String url = "http://app.smartdukaan.com/pages/home/credit";
3797
                    String message = null;
3798
                    if (noOfdaysBetween == 0) {
30936 tejbeer 3799
 
31886 tejbeer 3800
                        message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
30982 tejbeer 3801
 
31697 amit.gupta 3802
                    } else {
30982 tejbeer 3803
 
31886 tejbeer 3804
                        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 3805
 
31697 amit.gupta 3806
                    }
31886 tejbeer 3807
                    notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
31697 amit.gupta 3808
                    notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 3809
 
31697 amit.gupta 3810
                }
3811
            }
3812
        }
30984 tejbeer 3813
 
31697 amit.gupta 3814
    }
30982 tejbeer 3815
 
31697 amit.gupta 3816
    public void userMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
30982 tejbeer 3817
 
31697 amit.gupta 3818
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
30982 tejbeer 3819
 
31886 tejbeer 3820
        List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
30982 tejbeer 3821
 
31886 tejbeer 3822
        List<Address> addresses = addressRepository.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
30982 tejbeer 3823
 
31697 amit.gupta 3824
        LOGGER.info("addresses" + addresses);
30984 tejbeer 3825
 
31697 amit.gupta 3826
        for (Address address : addresses) {
3827
            Map<String, String> requestheaders = new HashMap<>();
3828
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
3829
            Map<String, String> requestParams = new HashMap<>();
3830
            requestParams.put("userid", String.valueOf(2000215976));
3831
            requestParams.put("password", "MFRd!BBL");
3832
            requestParams.put("phone_number", address.getPhoneNumber());
3833
            requestParams.put("auth_scheme", "plain");
3834
            requestParams.put("v", "1.1");
3835
            requestParams.put("format", "json");
30982 tejbeer 3836
 
31697 amit.gupta 3837
            requestParams.put("method", "OPT_IN");
30982 tejbeer 3838
 
31697 amit.gupta 3839
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 3840
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 3841
            LOGGER.info("response" + response);
3842
        }
30982 tejbeer 3843
 
31697 amit.gupta 3844
    }
30982 tejbeer 3845
 
31697 amit.gupta 3846
    public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
31206 tejbeer 3847
 
31697 amit.gupta 3848
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
3849
        LOGGER.info("authUsers" + authUsers);
31206 tejbeer 3850
 
31697 amit.gupta 3851
        for (AuthUser authUser : authUsers) {
3852
            Map<String, String> requestheaders = new HashMap<>();
3853
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
3854
            Map<String, String> requestParams = new HashMap<>();
3855
            requestParams.put("userid", String.valueOf(2000215976));
3856
            requestParams.put("password", "MFRd!BBL");
3857
            requestParams.put("phone_number", authUser.getMobileNumber());
3858
            requestParams.put("auth_scheme", "plain");
3859
            requestParams.put("v", "1.1");
3860
            requestParams.put("format", "json");
31206 tejbeer 3861
 
31697 amit.gupta 3862
            requestParams.put("method", "OPT_IN");
31206 tejbeer 3863
 
31697 amit.gupta 3864
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 3865
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 3866
            LOGGER.info("response" + response);
3867
        }
31206 tejbeer 3868
 
31697 amit.gupta 3869
    }
31206 tejbeer 3870
 
31697 amit.gupta 3871
    @Autowired
3872
    private HygieneDataRepository hygieneDataRepository;
31209 tejbeer 3873
 
31697 amit.gupta 3874
    public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 3875
 
31697 amit.gupta 3876
        List<String> remarks = new ArrayList<>();
3877
        remarks.add("Out of Service");
3878
        remarks.add("Duplicate number");
3879
        remarks.add("Partner number");
31886 tejbeer 3880
        List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(), remarks);
31206 tejbeer 3881
 
31697 amit.gupta 3882
        if (!hygieneData.isEmpty()) {
31206 tejbeer 3883
 
31886 tejbeer 3884
            Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 3885
 
31697 amit.gupta 3886
            for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
31206 tejbeer 3887
 
31697 amit.gupta 3888
                CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
31206 tejbeer 3889
 
31697 amit.gupta 3890
                StringBuilder sb = new StringBuilder();
31886 tejbeer 3891
                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 3892
 
31886 tejbeer 3893
                        + " </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 3894
 
31697 amit.gupta 3895
                        + "<br/><table style='border:1px solid black ;padding: 5px';>");
3896
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
3897
                sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
3898
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
3899
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
3900
                sb.append("</tr>\n");
31206 tejbeer 3901
 
31697 amit.gupta 3902
                List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
31206 tejbeer 3903
 
31697 amit.gupta 3904
                List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
31206 tejbeer 3905
 
31697 amit.gupta 3906
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
31206 tejbeer 3907
 
31697 amit.gupta 3908
                for (FofoOrder fofoOrder : fofoOrders) {
3909
                    Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
3910
                    sb.append("<tr>");
31886 tejbeer 3911
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber() + "</td>\n");
3912
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + "" + customer.getLastName() + "</td>\n");
3913
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber() + "</td>\n");
31206 tejbeer 3914
 
31697 amit.gupta 3915
                    sb.append("</tr>\n");
3916
                }
31206 tejbeer 3917
 
31697 amit.gupta 3918
                sb.append("</tbody></table></body></html>");
3919
                String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 3920
 
31697 amit.gupta 3921
                this.sendMailOfHtmlFormat(customRetailer.getEmail(), sb.toString(), null, subject);
31206 tejbeer 3922
 
31697 amit.gupta 3923
            }
31206 tejbeer 3924
 
31697 amit.gupta 3925
        }
31206 tejbeer 3926
 
31697 amit.gupta 3927
    }
31206 tejbeer 3928
 
31697 amit.gupta 3929
    public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 3930
 
31697 amit.gupta 3931
        List<String> remarks = new ArrayList<>();
3932
        remarks.add("Out of Service");
3933
        remarks.add("Duplicate number");
3934
        remarks.add("Partner number");
31886 tejbeer 3935
        List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository.selectDisposedDateAndRemarks(
3936
                LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX), remarks);
31206 tejbeer 3937
 
31886 tejbeer 3938
        List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
31697 amit.gupta 3939
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
3940
        Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
31206 tejbeer 3941
 
31697 amit.gupta 3942
        Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
31206 tejbeer 3943
 
31697 amit.gupta 3944
        if (!hygieneDataLastThreeMonth.isEmpty()) {
31886 tejbeer 3945
            partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 3946
 
31697 amit.gupta 3947
        }
31206 tejbeer 3948
 
31697 amit.gupta 3949
        if (!hygieneDataRecentMonth.isEmpty()) {
31886 tejbeer 3950
            partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31697 amit.gupta 3951
        }
31206 tejbeer 3952
 
31697 amit.gupta 3953
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31206 tejbeer 3954
 
31697 amit.gupta 3955
            String email = storeGuyEntry.getKey();
31206 tejbeer 3956
 
31697 amit.gupta 3957
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
31206 tejbeer 3958
 
31697 amit.gupta 3959
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
3960
            Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
3961
            for (Integer fofoId : fofoIds) {
31206 tejbeer 3962
 
31697 amit.gupta 3963
                partnerYearMonthData.put(fofoId, null);
3964
                partnerDateWiseData.put(fofoId, null);
3965
                if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
3966
                    List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
31206 tejbeer 3967
 
31697 amit.gupta 3968
                    if (hygienes != null) {
31886 tejbeer 3969
                        Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream().collect(groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
31206 tejbeer 3970
 
31697 amit.gupta 3971
                        partnerYearMonthData.put(fofoId, yearMonthData);
31206 tejbeer 3972
 
31697 amit.gupta 3973
                    }
3974
                    List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
31206 tejbeer 3975
 
31697 amit.gupta 3976
                    if (dateWiseHygienes != null) {
31206 tejbeer 3977
 
31886 tejbeer 3978
                        Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream().collect(groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
31206 tejbeer 3979
 
31697 amit.gupta 3980
                        partnerDateWiseData.put(fofoId, dateWiseData);
31206 tejbeer 3981
 
31697 amit.gupta 3982
                    }
31206 tejbeer 3983
 
31697 amit.gupta 3984
                }
31206 tejbeer 3985
 
31697 amit.gupta 3986
            }
31206 tejbeer 3987
 
31697 amit.gupta 3988
            String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 3989
 
31697 amit.gupta 3990
            LOGGER.info("hygieneData {}", partnerDateWiseData.values());
31206 tejbeer 3991
 
31697 amit.gupta 3992
            boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 3993
 
31697 amit.gupta 3994
            boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 3995
 
31697 amit.gupta 3996
            if (!partnerDateWise && !partnerYearMonth) {
3997
                String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
3998
                this.sendMailOfHtmlFormat(email, sb, null, subject);
3999
            }
31206 tejbeer 4000
 
31697 amit.gupta 4001
        }
31206 tejbeer 4002
 
31697 amit.gupta 4003
    }
31206 tejbeer 4004
 
31697 amit.gupta 4005
    private String getMessageHygieneAlertForPartner(
31886 tejbeer 4006
                                                    Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData, Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData) {
31206 tejbeer 4007
 
31697 amit.gupta 4008
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31206 tejbeer 4009
 
31697 amit.gupta 4010
        LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4011
        LocalDateTime endDate = LocalDateTime.now();
31206 tejbeer 4012
 
31697 amit.gupta 4013
        LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
31886 tejbeer 4014
        LocalDateTime endYearMonth = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
31206 tejbeer 4015
 
31697 amit.gupta 4016
        DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
31206 tejbeer 4017
 
31697 amit.gupta 4018
        List<YearMonth> yearMonthRange = new ArrayList<>();
4019
        yearMonthRange.add(YearMonth.from(startYearMonth));
31206 tejbeer 4020
 
31697 amit.gupta 4021
        yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
31206 tejbeer 4022
 
31697 amit.gupta 4023
        yearMonthRange.add(YearMonth.from(endYearMonth));
31206 tejbeer 4024
 
31697 amit.gupta 4025
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
31206 tejbeer 4026
 
31886 tejbeer 4027
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
31206 tejbeer 4028
 
31697 amit.gupta 4029
        StringBuilder sb = new StringBuilder();
31886 tejbeer 4030
        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 4031
 
31697 amit.gupta 4032
                + "<table style='border:1px solid black ;padding: 5px';>");
4033
        sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4034
        sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31206 tejbeer 4035
 
31697 amit.gupta 4036
        for (YearMonth yearMonth : yearMonthRange) {
31886 tejbeer 4037
            sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter) + "</th>\n");
31697 amit.gupta 4038
        }
31206 tejbeer 4039
 
31697 amit.gupta 4040
        for (LocalDate localDate : dateRange) {
4041
            sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4042
        }
31206 tejbeer 4043
 
31697 amit.gupta 4044
        sb.append("</tr>\n");
31206 tejbeer 4045
 
31886 tejbeer 4046
        for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData.entrySet()) {
31206 tejbeer 4047
 
31697 amit.gupta 4048
            int fofoId = partnerYearMonthEntry.getKey();
31206 tejbeer 4049
 
31697 amit.gupta 4050
            Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
31206 tejbeer 4051
 
31697 amit.gupta 4052
            Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
31206 tejbeer 4053
 
31697 amit.gupta 4054
            if (yearMonthData == null && dateWiseData == null) {
4055
                continue;
4056
            }
31206 tejbeer 4057
 
31697 amit.gupta 4058
            sb.append("<tr>");
31886 tejbeer 4059
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31697 amit.gupta 4060
            for (YearMonth yearMonth : yearMonthRange) {
31206 tejbeer 4061
 
31697 amit.gupta 4062
                if (yearMonthData == null) {
4063
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4064
 
31697 amit.gupta 4065
                } else {
4066
                    List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
31206 tejbeer 4067
 
31697 amit.gupta 4068
                    if (hygieneList != null) {
4069
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31206 tejbeer 4070
 
31697 amit.gupta 4071
                    } else {
4072
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4073
 
31697 amit.gupta 4074
                    }
4075
                }
4076
            }
31206 tejbeer 4077
 
31697 amit.gupta 4078
            for (LocalDate localDate : dateRange) {
31206 tejbeer 4079
 
31697 amit.gupta 4080
                if (dateWiseData == null) {
4081
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4082
 
31697 amit.gupta 4083
                } else {
4084
                    List<HygieneData> hygieneList = dateWiseData.get(localDate);
31206 tejbeer 4085
 
31697 amit.gupta 4086
                    if (hygieneList != null) {
4087
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31218 tejbeer 4088
 
31697 amit.gupta 4089
                    } else {
4090
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31218 tejbeer 4091
 
31697 amit.gupta 4092
                    }
4093
                }
4094
            }
4095
            sb.append("</tr>");
31218 tejbeer 4096
 
31697 amit.gupta 4097
        }
31218 tejbeer 4098
 
31697 amit.gupta 4099
        sb.append("</tbody></table></body></html>");
31218 tejbeer 4100
 
31697 amit.gupta 4101
        return sb.toString();
4102
    }
31218 tejbeer 4103
 
31697 amit.gupta 4104
    @Autowired
4105
    private MonthlyTargetRepository monthlyTargetRepository;
31218 tejbeer 4106
 
31697 amit.gupta 4107
    public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4108
 
31697 amit.gupta 4109
        LocalDateTime curDate = LocalDateTime.now();
4110
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4111
 
31886 tejbeer 4112
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4113
 
31886 tejbeer 4114
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4115
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4116
 
31697 amit.gupta 4117
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4118
 
31697 amit.gupta 4119
        for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
31249 tejbeer 4120
 
31697 amit.gupta 4121
            int fofoId = partnerMonthlyTargetEntry.getKey();
31249 tejbeer 4122
 
31697 amit.gupta 4123
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
31249 tejbeer 4124
 
31697 amit.gupta 4125
            Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
31218 tejbeer 4126
 
31697 amit.gupta 4127
            Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
31218 tejbeer 4128
 
31697 amit.gupta 4129
            if (purchaseTarget > 0) {
4130
                Double purchase = secondaryMtd.get(fofoId);
31249 tejbeer 4131
 
31697 amit.gupta 4132
                if (purchase == null) {
4133
                    purchase = 0.0;
4134
                }
31218 tejbeer 4135
 
31697 amit.gupta 4136
                Double balanceTarget = purchaseTarget - purchase;
31218 tejbeer 4137
 
31697 amit.gupta 4138
                if (balanceTarget <= 0) {
4139
                    balanceTarget = 0.0;
4140
                }
31651 tejbeer 4141
 
31697 amit.gupta 4142
                StringBuilder sb = new StringBuilder();
4143
                sb.append("<html><body><p>Dear Partner,\n");
31886 tejbeer 4144
                sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget + " and your achievement till date is Rs." + purchase + "</p>");
31697 amit.gupta 4145
                sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4146
                sb.append(
31886 tejbeer 4147
                        "<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 4148
 
31697 amit.gupta 4149
                this.sendMailOfHtmlFormat(customRetailer.getEmail(), sb.toString(), null, subject);
31218 tejbeer 4150
 
31697 amit.gupta 4151
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4152
                // null, subject);
31640 tejbeer 4153
 
31697 amit.gupta 4154
            }
31218 tejbeer 4155
 
31697 amit.gupta 4156
        }
31218 tejbeer 4157
 
31697 amit.gupta 4158
    }
31218 tejbeer 4159
 
31697 amit.gupta 4160
    public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4161
 
31697 amit.gupta 4162
        LocalDateTime curDate = LocalDateTime.now();
31218 tejbeer 4163
 
31886 tejbeer 4164
        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 4165
 
31697 amit.gupta 4166
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
31218 tejbeer 4167
 
31697 amit.gupta 4168
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4169
 
31697 amit.gupta 4170
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31218 tejbeer 4171
 
31886 tejbeer 4172
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4173
 
31886 tejbeer 4174
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4175
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4176
 
31697 amit.gupta 4177
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4178
 
31697 amit.gupta 4179
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31218 tejbeer 4180
 
31697 amit.gupta 4181
            String email = storeGuyEntry.getKey();
31218 tejbeer 4182
 
31697 amit.gupta 4183
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4184
            Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4185
            for (Integer fofoId : fofoIds) {
31218 tejbeer 4186
 
31697 amit.gupta 4187
                MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
4188
                if (monthlyTarget != null) {
4189
                    Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4190
 
31697 amit.gupta 4191
                    Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4192
 
31697 amit.gupta 4193
                    if (purchaseTarget != null && purchaseTarget > 0) {
4194
                        Double purchase = secondaryMtd.get(fofoId);
4195
                        if (purchase == null) {
4196
                            purchase = 0.0;
4197
                        }
4198
                        monthlyTarget.setPurchaseAchievement(purchase);
4199
                        monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4200
 
31697 amit.gupta 4201
                    }
4202
                }
4203
            }
31218 tejbeer 4204
 
31697 amit.gupta 4205
            if (!monthlyTargetAchievement.isEmpty()) {
31218 tejbeer 4206
 
31697 amit.gupta 4207
                StringBuilder sb = new StringBuilder();
31218 tejbeer 4208
 
31697 amit.gupta 4209
                sb.append("<html><body><p>Hi,\n");
31886 tejbeer 4210
                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 4211
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4212
                sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31218 tejbeer 4213
 
31697 amit.gupta 4214
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
31218 tejbeer 4215
 
31697 amit.gupta 4216
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4217
                sb.append("</tr>\n");
31218 tejbeer 4218
 
31886 tejbeer 4219
                for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement.entrySet()) {
31697 amit.gupta 4220
                    sb.append("<tr>");
4221
                    int fofoId = monthlyTargetAchievementEntry.getKey();
31218 tejbeer 4222
 
31697 amit.gupta 4223
                    MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
31886 tejbeer 4224
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31218 tejbeer 4225
 
31886 tejbeer 4226
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget() + "</td>\n");
31218 tejbeer 4227
 
31886 tejbeer 4228
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseAchievement() + "</td>\n");
31218 tejbeer 4229
 
31697 amit.gupta 4230
                    sb.append("</tr>\n");
31218 tejbeer 4231
 
31697 amit.gupta 4232
                }
31218 tejbeer 4233
 
31697 amit.gupta 4234
                this.sendMailOfHtmlFormat(email, sb.toString(), null, subject);
4235
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4236
                // null, subject);
31218 tejbeer 4237
 
31697 amit.gupta 4238
            }
31604 tejbeer 4239
 
31697 amit.gupta 4240
        }
31604 tejbeer 4241
 
31697 amit.gupta 4242
    }
31604 tejbeer 4243
 
26418 tejbeer 4244
}
31206 tejbeer 4245
// 2284'