Subversion Repositories SmartDukaan

Rev

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