Subversion Repositories SmartDukaan

Rev

Rev 33385 | Rev 33423 | 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;
32421 amit.gupta 6
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationNewService;
29488 manish 7
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationService;
8
import com.smartdukaan.cron.itelImeiActivation.TecnoImeiActivation;
32482 amit.gupta 9
import com.smartdukaan.cron.scheduled.runnables.PurchaseMigration;
32511 amit.gupta 10
import com.spice.profitmandi.common.enumuration.*;
24121 govind 11
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
32421 amit.gupta 12
import com.spice.profitmandi.common.model.*;
24681 amit.gupta 13
import com.spice.profitmandi.common.services.ReporticoService;
29814 tejbeer 14
import com.spice.profitmandi.common.services.mandii.AccountStatusResponseOut;
15
import com.spice.profitmandi.common.services.mandii.EligibilityStatusEnum;
16
import com.spice.profitmandi.common.services.mandii.MandiiService;
24002 amit.gupta 17
import com.spice.profitmandi.common.util.FileUtil;
23929 amit.gupta 18
import com.spice.profitmandi.common.util.FormattingUtils;
27678 amit.gupta 19
import com.spice.profitmandi.common.util.PdfUtils;
23929 amit.gupta 20
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 21
import com.spice.profitmandi.common.util.Utils.Attachment;
29308 tejbeer 22
import com.spice.profitmandi.common.web.client.RestClient;
25300 tejbeer 23
import com.spice.profitmandi.dao.Interface.Campaign;
32511 amit.gupta 24
import com.spice.profitmandi.dao.cart.CartService;
25590 amit.gupta 25
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30421 tejbeer 26
import com.spice.profitmandi.dao.entity.auth.PartnerCollectionRemark;
33078 ranu 27
import com.spice.profitmandi.dao.entity.catalog.*;
28
import com.spice.profitmandi.dao.entity.cs.NonSdBuying;
25590 amit.gupta 29
import com.spice.profitmandi.dao.entity.cs.Position;
26283 tejbeer 30
import com.spice.profitmandi.dao.entity.cs.Ticket;
28769 amit.gupta 31
import com.spice.profitmandi.dao.entity.dtr.User;
32421 amit.gupta 32
import com.spice.profitmandi.dao.entity.dtr.*;
33
import com.spice.profitmandi.dao.entity.fofo.*;
34
import com.spice.profitmandi.dao.entity.inventory.*;
35
import com.spice.profitmandi.dao.entity.transaction.*;
36
import com.spice.profitmandi.dao.entity.user.*;
32511 amit.gupta 37
import com.spice.profitmandi.dao.entity.warehouse.WarehouseInventoryItem;
38
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
30421 tejbeer 39
import com.spice.profitmandi.dao.enumuration.auth.CollectionRemark;
24250 amit.gupta 40
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
25598 amit.gupta 41
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 42
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
29814 tejbeer 43
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
31332 amit.gupta 44
import com.spice.profitmandi.dao.enumuration.fofo.PaymentStatus;
32511 amit.gupta 45
import com.spice.profitmandi.dao.enumuration.fofo.ReturnType;
24242 amit.gupta 46
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
32081 tejbeer 47
import com.spice.profitmandi.dao.enumuration.inventory.VendorCatalogPricingStatus;
30913 tejbeer 48
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
30859 tejbeer 49
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
25609 amit.gupta 50
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
32421 amit.gupta 51
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
52
import com.spice.profitmandi.dao.model.*;
25590 amit.gupta 53
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
33078 ranu 54
import com.spice.profitmandi.dao.repository.auth.NonSdBuyingRepository;
30421 tejbeer 55
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
32421 amit.gupta 56
import com.spice.profitmandi.dao.repository.catalog.*;
32980 amit.gupta 57
import com.spice.profitmandi.dao.repository.cs.CsService;
58
import com.spice.profitmandi.dao.repository.cs.PartnerRegionRepository;
59
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
60
import com.spice.profitmandi.dao.repository.cs.TicketRepository;
32421 amit.gupta 61
import com.spice.profitmandi.dao.repository.dtr.*;
62
import com.spice.profitmandi.dao.repository.fofo.*;
63
import com.spice.profitmandi.dao.repository.inventory.*;
64
import com.spice.profitmandi.dao.repository.transaction.*;
24542 amit.gupta 65
import com.spice.profitmandi.dao.repository.user.AddressRepository;
25721 tejbeer 66
import com.spice.profitmandi.dao.repository.user.UserRepository;
32421 amit.gupta 67
import com.spice.profitmandi.dao.repository.warehouse.*;
33355 amit.gupta 68
import com.spice.profitmandi.dao.service.SidbiService;
32817 amit.gupta 69
import com.spice.profitmandi.dao.service.biuedart.BluedartAuthService;
70
import com.spice.profitmandi.dao.service.biuedart.BluedartService;
31604 tejbeer 71
import com.spice.profitmandi.dao.service.solr.FofoSolr;
32421 amit.gupta 72
import com.spice.profitmandi.service.*;
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;
32872 amit.gupta 76
import com.spice.profitmandi.service.integrations.psismart.PsiSmartService;
32948 amit.gupta 77
import com.spice.profitmandi.service.integrations.smartping.SmartPingService;
25694 amit.gupta 78
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
32421 amit.gupta 79
import com.spice.profitmandi.service.inventory.*;
31746 amit.gupta 80
import com.spice.profitmandi.service.offers.OfferService;
25335 amit.gupta 81
import com.spice.profitmandi.service.order.OrderService;
24431 amit.gupta 82
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 83
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
84
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
85
import com.spice.profitmandi.service.scheme.SchemeService;
29668 tejbeer 86
import com.spice.profitmandi.service.serviceConfig.ServiceConfigService;
31008 amit.gupta 87
import com.spice.profitmandi.service.transaction.CreditNoteService;
30859 tejbeer 88
import com.spice.profitmandi.service.transaction.SDCreditService;
23929 amit.gupta 89
import com.spice.profitmandi.service.transaction.TransactionService;
32990 amit.gupta 90
import com.spice.profitmandi.service.transaction.invoicing.InvoiceService;
23929 amit.gupta 91
import com.spice.profitmandi.service.user.RetailerService;
32511 amit.gupta 92
import com.spice.profitmandi.service.wallet.CommonPaymentService;
23739 amit.gupta 93
import com.spice.profitmandi.service.wallet.WalletService;
32421 amit.gupta 94
import com.spice.profitmandi.service.warehouse.PurchaseOrderService;
32511 amit.gupta 95
import com.spice.profitmandi.service.warehouse.WarehouseInventoryService;
33384 amit.gupta 96
import com.spice.profitmandi.service.warehouse.WarehouseService;
25721 tejbeer 97
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 98
import in.shop2020.model.v1.order.WalletReferenceType;
32421 amit.gupta 99
import org.apache.commons.io.output.ByteArrayOutputStream;
100
import org.apache.commons.lang.StringUtils;
101
import org.apache.http.client.methods.CloseableHttpResponse;
102
import org.apache.http.client.methods.HttpPost;
103
import org.apache.http.conn.HttpHostConnectException;
104
import org.apache.http.entity.StringEntity;
105
import org.apache.http.impl.client.CloseableHttpClient;
106
import org.apache.http.impl.client.HttpClients;
107
import org.apache.logging.log4j.LogManager;
108
import org.apache.logging.log4j.Logger;
109
import org.hibernate.Session;
110
import org.hibernate.SessionFactory;
111
import org.hibernate.query.NativeQuery;
112
import org.json.JSONObject;
113
import org.springframework.beans.factory.annotation.Autowired;
114
import org.springframework.beans.factory.annotation.Qualifier;
115
import org.springframework.beans.factory.annotation.Value;
116
import org.springframework.core.io.ByteArrayResource;
117
import org.springframework.core.io.InputStreamSource;
118
import org.springframework.mail.javamail.JavaMailSender;
119
import org.springframework.mail.javamail.MimeMessageHelper;
120
import org.springframework.stereotype.Component;
121
import org.springframework.transaction.annotation.Transactional;
31640 tejbeer 122
 
32421 amit.gupta 123
import javax.mail.MessagingException;
124
import javax.mail.internet.InternetAddress;
125
import javax.mail.internet.MimeMessage;
126
import java.io.*;
127
import java.math.BigDecimal;
128
import java.math.RoundingMode;
129
import java.nio.file.Files;
130
import java.nio.file.Paths;
131
import java.sql.Timestamp;
132
import java.text.DecimalFormat;
133
import java.time.*;
134
import java.time.format.DateTimeFormatter;
135
import java.time.temporal.ChronoField;
136
import java.time.temporal.ChronoUnit;
137
import java.util.*;
138
import java.util.Map.Entry;
139
import java.util.stream.Collectors;
140
import java.util.stream.Stream;
32060 amit.gupta 141
 
32421 amit.gupta 142
import static java.util.stream.Collectors.groupingBy;
143
import static java.util.stream.Collectors.mapping;
144
 
145
 
23723 amit.gupta 146
@Component
33384 amit.gupta 147
@Transactional(rollbackFor = {Throwable.class, ProfitMandiBusinessException.class})
23723 amit.gupta 148
public class ScheduledTasks {
149
 
31697 amit.gupta 150
    @Value("${oxigen.recharge.enquiry.url}")
151
    private String oxigenRechargeEnquiryUrl;
24533 govind 152
 
31697 amit.gupta 153
    @Autowired
32482 amit.gupta 154
    PurchaseMigration purchaseMigration;
155
 
156
    @Autowired
32795 amit.gupta 157
    SmartPingService smartPingService;
158
 
29668 tejbeer 159
 
31697 amit.gupta 160
    @Autowired
161
    private ServiceConfigService serviceConfigService;
29801 manish 162
 
31697 amit.gupta 163
    @Autowired
164
    private TecnoImeiActivation tecnoImeiActivation;
28205 tejbeer 165
 
31697 amit.gupta 166
    private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 167
 
31697 amit.gupta 168
    @Autowired
169
    private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 170
 
31697 amit.gupta 171
    @Autowired
172
    private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 173
 
31697 amit.gupta 174
    @Autowired
175
    VivoImeiActivationService vivoImeiActivationService;
29488 manish 176
 
31697 amit.gupta 177
    @Autowired
178
    ItelImeiActivationService itelImeiActivationService;
29488 manish 179
 
31697 amit.gupta 180
    @Autowired
181
    private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 182
 
26408 amit.gupta 183
 
31697 amit.gupta 184
    @Autowired
185
    private LeadRepository leadRepository;
25927 amit.gupta 186
 
31697 amit.gupta 187
    @Autowired
188
    private AuthRepository authRepository;
25503 amit.gupta 189
 
31697 amit.gupta 190
    @Autowired
191
    private PriceDropService priceDropService;
26283 tejbeer 192
 
31697 amit.gupta 193
    @Autowired
194
    private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 195
 
31697 amit.gupta 196
    @Autowired
197
    private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 198
 
31697 amit.gupta 199
    @Autowired
200
    private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 201
 
31697 amit.gupta 202
    @Autowired
203
    private CsService csService;
25846 amit.gupta 204
 
31697 amit.gupta 205
    @Autowired
206
    private SaholicInventoryService saholicInventoryService;
27208 tejbeer 207
 
31697 amit.gupta 208
    @Autowired
209
    private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 210
 
31697 amit.gupta 211
    @Autowired
212
    private ToffeeService toffeeService;
25694 amit.gupta 213
 
31697 amit.gupta 214
    @Value("${oxigen.recharge.auth.key}")
215
    private String oxigenRechargeAuthKey;
23724 amit.gupta 216
 
31697 amit.gupta 217
    @Value("${oxigen.recharge.validation.url}")
218
    private String oxigenRechargeValidationUrl;
23724 amit.gupta 219
 
31697 amit.gupta 220
    @Value("${oxigen.recharge.validation.auth.key}")
221
    private String oxigenRechargeValidationAuthKey;
23724 amit.gupta 222
 
31697 amit.gupta 223
    @Value("${think.walnut.digital.recharge.transaction.mobile.url}")
224
    private String thinkWalnutDigitalRechargeTransactionMobileUrl;
23724 amit.gupta 225
 
31697 amit.gupta 226
    @Value("${think.walnut.digital.recharge.transaction.dth.url}")
227
    private String thinkWalnutDigitalRechargeTransactionDthUrl;
23724 amit.gupta 228
 
31697 amit.gupta 229
    @Value("${think.walnut.digital.recharge.enquiry.url}")
230
    private String thinkWalnutDigitalRechargeEnquiryUrl;
23724 amit.gupta 231
 
31697 amit.gupta 232
    @Value("${think.walnut.digital.recharge.balance.url}")
233
    private String thinkWalnutDigitalRechargeBalanceUrl;
23724 amit.gupta 234
 
31697 amit.gupta 235
    @Value("${think.walnut.digital.recharge.username}")
236
    private String thinkWalnutDigitalRechargeUserName;
23724 amit.gupta 237
 
31697 amit.gupta 238
    @Value("${think.walnut.digital.recharge.password}")
239
    private String thinkWalnutDigitalRechargePassword;
23724 amit.gupta 240
 
31697 amit.gupta 241
    @Value("${think.walnut.digital.recharge.auth.key}")
242
    private String thinkWalnutDigitalRechargeAuthKey;
23724 amit.gupta 243
 
31697 amit.gupta 244
    @Autowired
245
    private PurchaseRepository purchaseRepository;
23724 amit.gupta 246
 
31697 amit.gupta 247
    @Autowired
248
    private PriceDropIMEIRepository priceDropIMEIRepository;
25609 amit.gupta 249
 
31697 amit.gupta 250
    @Autowired
251
    PriceDropRepository priceDropRepository;
25609 amit.gupta 252
 
31697 amit.gupta 253
    @Autowired
254
    private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 255
 
31697 amit.gupta 256
    @Autowired
257
    private SchemeService schemeService;
24683 amit.gupta 258
 
31697 amit.gupta 259
    @Autowired
260
    private ServiceConfigRepository serviceConfigRepository;
29668 tejbeer 261
 
32061 amit.gupta 262
    @Autowired
263
    private RetailerBlockBrandsRepository retailerBlockBrandsRepository;
264
 
31886 tejbeer 265
    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 266
 
31886 tejbeer 267
    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 268
 
32580 amit.gupta 269
    private static final String[] INDENT_TERTIARY_MAIL_LIST = new String[]{"uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com"};
28709 amit.gupta 270
 
31886 tejbeer 271
    private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[]{"sm@smartdukaan.com", "sm@smartdukaan.com"};
28790 amit.gupta 272
 
31697 amit.gupta 273
    private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
25721 tejbeer 274
 
31697 amit.gupta 275
    @Autowired
276
    private ReporticoService reporticoService;
23724 amit.gupta 277
 
31697 amit.gupta 278
    @Autowired
279
    private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 280
 
31697 amit.gupta 281
    @Autowired
282
    private PositionRepository positionRepository;
24337 amit.gupta 283
 
31697 amit.gupta 284
    @Autowired
285
    private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 286
 
31697 amit.gupta 287
    @Autowired
288
    private NotificationService notificationService;
24542 amit.gupta 289
 
31697 amit.gupta 290
    @Autowired
291
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
24277 amit.gupta 292
 
31697 amit.gupta 293
    @Autowired
294
    private SchemeInOutRepository schemeInOutRepository;
24241 amit.gupta 295
 
31697 amit.gupta 296
    @Autowired
297
    private RechargeTransactionRepository rechargeTransactionRepository;
23724 amit.gupta 298
 
31697 amit.gupta 299
    @Autowired
300
    private CustomerAddressRepository customerAddressRepository;
24542 amit.gupta 301
 
31697 amit.gupta 302
    @Autowired
303
    private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
23724 amit.gupta 304
 
31697 amit.gupta 305
    @Autowired
306
    private FofoLineItemRepository fofoLineItemRepository;
24590 amit.gupta 307
 
31697 amit.gupta 308
    @Autowired
309
    private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 310
 
31697 amit.gupta 311
    @Autowired
312
    private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 313
 
31697 amit.gupta 314
    @Autowired
315
    private UserWalletRepository userWalletRepository;
24587 amit.gupta 316
 
31697 amit.gupta 317
    @Autowired
318
    private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 319
 
31697 amit.gupta 320
    @Autowired
321
    private WalletService walletService;
23724 amit.gupta 322
 
31697 amit.gupta 323
    @Autowired
324
    private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
23724 amit.gupta 325
 
31697 amit.gupta 326
    @Autowired
327
    private OxigenRechargeProviderService oxigenRechargeProviderService;
23724 amit.gupta 328
 
31697 amit.gupta 329
    @Autowired
330
    private RechargeProviderRepository rechargeProviderRepository;
23724 amit.gupta 331
 
31697 amit.gupta 332
    @Autowired
333
    private ScanRecordRepository scanRecordRepository;
24242 amit.gupta 334
 
31697 amit.gupta 335
    @Autowired
336
    private DailyRechargeRepository dailyRechargeRepository;
23724 amit.gupta 337
 
31697 amit.gupta 338
    @Autowired
339
    private FofoStoreRepository fofoStoreRepository;
24177 govind 340
 
31697 amit.gupta 341
    @Value("${prod}")
342
    private boolean prod;
26945 amit.gupta 343
 
31697 amit.gupta 344
    @Autowired
345
    private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 346
 
31697 amit.gupta 347
    @Autowired
348
    private RetailerService retailerService;
23929 amit.gupta 349
 
31697 amit.gupta 350
    @Autowired
33078 ranu 351
    private BrandsRepository brandsRepository;
352
 
353
    @Autowired
31697 amit.gupta 354
    private TransactionService transactionService;
24250 amit.gupta 355
 
31697 amit.gupta 356
    @Autowired
357
    private ItemRepository itemRepository;
23929 amit.gupta 358
 
31697 amit.gupta 359
    @Autowired
360
    private OrderRepository orderRepository;
25351 tejbeer 361
 
31697 amit.gupta 362
    @Autowired
363
    private OrderService orderService;
23929 amit.gupta 364
 
31697 amit.gupta 365
    @Autowired
366
    private SchemeRepository schemeRepository;
24241 amit.gupta 367
 
31697 amit.gupta 368
    @Autowired
369
    private SchemeItemRepository schemeItemRepository;
31612 tejbeer 370
 
31697 amit.gupta 371
    @Autowired
372
    private JavaMailSender mailSender;
24177 govind 373
 
31697 amit.gupta 374
    @Autowired
375
    private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 376
 
31697 amit.gupta 377
    @Autowired
378
    @Qualifier(value = "googleMailSender")
379
    private JavaMailSender googleMailSender;
23929 amit.gupta 380
 
31697 amit.gupta 381
    @Autowired
382
    private InventoryService inventoryService;
23929 amit.gupta 383
 
31697 amit.gupta 384
    @Autowired
385
    private AddressRepository addressRepository;
24542 amit.gupta 386
 
31697 amit.gupta 387
    @Autowired
388
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
24542 amit.gupta 389
 
31697 amit.gupta 390
    @Autowired
391
    private Mongo mongoClient;
24683 amit.gupta 392
 
31697 amit.gupta 393
    @Autowired
394
    private DeviceRepository deviceRepository;
25300 tejbeer 395
 
31697 amit.gupta 396
    @Autowired
397
    private PushNotificationRepository pushNotificationRepository;
25300 tejbeer 398
 
31697 amit.gupta 399
    @Autowired
400
    private NotificationCampaignRepository notificationCampaignRepository;
25300 tejbeer 401
 
31697 amit.gupta 402
    @Autowired
403
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
25721 tejbeer 404
 
31697 amit.gupta 405
    @Autowired
406
    private FocusedModelRepository focusedModelRepository;
25721 tejbeer 407
 
31697 amit.gupta 408
    @Autowired
409
    private UserAccountRepository userAccountRepository;
24653 govind 410
 
31697 amit.gupta 411
    @Autowired
412
    private UserRepository userUserRepository;
25721 tejbeer 413
 
31697 amit.gupta 414
    @Autowired
415
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
25927 amit.gupta 416
 
31697 amit.gupta 417
    @Autowired
418
    private UserCampaignRepository userCampaignRepository;
25721 tejbeer 419
 
31697 amit.gupta 420
    @Autowired
421
    private Gson gson;
25721 tejbeer 422
 
31697 amit.gupta 423
    @Autowired
424
    private TicketRepository ticketRepository;
26283 tejbeer 425
 
31697 amit.gupta 426
    @Autowired
427
    private RefferalRepository refferalRepository;
26790 tejbeer 428
 
31697 amit.gupta 429
    @Autowired
430
    private PartnerProblemRepository partnerProblemRepository;
28205 tejbeer 431
 
31697 amit.gupta 432
    @Autowired
433
    private PendingOrderRepository pendingOrderRepository;
28368 tejbeer 434
 
31697 amit.gupta 435
    @Autowired
436
    private PendingOrderItemRepository pendingOrderItemRepository;
28368 tejbeer 437
 
31697 amit.gupta 438
    @Value("${razorpay.account.keyId}")
439
    private String keyId;
28368 tejbeer 440
 
31697 amit.gupta 441
    @Value("${razorpay.account.keySecret}")
442
    private String keySecret;
28368 tejbeer 443
 
31697 amit.gupta 444
    @Autowired
445
    private RazorpayPaymentService razorPaymentService;
28369 tejbeer 446
 
31697 amit.gupta 447
    @Autowired
448
    private RazorPayRepository razorPayRepository;
28369 tejbeer 449
 
31697 amit.gupta 450
    @Autowired
451
    private PendingOrderService pendingOrderService;
28377 tejbeer 452
 
31697 amit.gupta 453
    @Autowired
454
    private CustomerRepository customerRepository;
28377 tejbeer 455
 
31697 amit.gupta 456
    @Autowired
457
    private RestClient restClient;
29308 tejbeer 458
 
31697 amit.gupta 459
    @Autowired
460
    private MandiiService mandiiService;
29814 tejbeer 461
 
31697 amit.gupta 462
    @Autowired
463
    CreditAccountRepository creditAccountRepository;
31604 tejbeer 464
 
31697 amit.gupta 465
    @Autowired
466
    CustomerOfferRepository customerOfferRepository;
31612 tejbeer 467
 
31697 amit.gupta 468
    @Autowired
469
    CustomerOfferItemRepository customerOfferItemRepository;
470
    @Autowired
471
    private FofoSolr fofoSolr;
23724 amit.gupta 472
 
25300 tejbeer 473
 
31697 amit.gupta 474
    private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
31388 amit.gupta 475
 
31697 amit.gupta 476
    private String FCM_URL = "https://fcm.googleapis.com/fcm/send";
477
    private String FCM_API_KEY = "AAAASAjNcn4:APA91bG6fWRIgYJI0L9gCjP5ynaXz2hJHYKtD9dfH7Depdv31Nd9APJwhx-OPkAJ1WSz4BGNYG8lHThLFSjDGFxIwUZv241YcAJEGDLgt86mxq9FXJe-yBRu-S0_ZwHqmX-QaVKl5F_A";
23724 amit.gupta 478
 
31697 amit.gupta 479
    @Autowired
480
    private TagListingRepository tagListingRepository;
23724 amit.gupta 481
 
31697 amit.gupta 482
    public void generateDailyRecharge() {
31886 tejbeer 483
        List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository.selectAll(0, 2000);
31697 amit.gupta 484
        List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
485
        rechargeProviders.stream().forEach(x -> x.setAmount(0));
23724 amit.gupta 486
 
31697 amit.gupta 487
        rechargeProviders.stream().forEach(x -> {
31886 tejbeer 488
            Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory.stream().filter(z -> z.getProviderId() == x.getId()).collect(groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
23724 amit.gupta 489
 
31697 amit.gupta 490
            LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
491
            LocalDate endDate = LocalDate.now().plusDays(1);
492
            float previousDayClosing = 0;
493
            LocalDate date = LocalDate.of(2018, 4, 6);
494
            while (date.isBefore(endDate)) {
31886 tejbeer 495
                List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(), date.plusDays(1).atStartOfDay());
23724 amit.gupta 496
 
31886 tejbeer 497
                List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream().filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
23724 amit.gupta 498
 
31697 amit.gupta 499
                float dailyAmount = 0;
500
                float totalCommission = 0;
501
                for (RechargeTransaction rechargeTransaction : successfulTransactions) {
502
                    if (rechargeTransaction.getProviderId() == x.getId()) {
503
                        dailyAmount += rechargeTransaction.getAmount();
504
                        totalCommission += rechargeTransaction.getCommission();
505
                    }
506
                }
28205 tejbeer 507
 
31697 amit.gupta 508
                List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
509
                float dailyWalletRecharge = 0;
510
                if (rechargeHistoryList != null) {
511
                    for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
512
                        if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
513
                            dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
514
                        }
515
                    }
516
                }
517
                if (dailyAmount > 0 || dailyWalletRecharge > 0) {
518
                    DailyRecharge dailyRecharge = null;
519
                    try {
520
                        dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
521
                    } catch (Exception e) {
522
                        LOGGER.info("Could not find Recharge entry");
523
                    }
524
                    if (dailyRecharge == null) {
525
                        dailyRecharge = new DailyRecharge();
526
                        dailyRecharge.setCreateDate(date);
527
                    }
528
                    dailyRecharge.setOpeningBalance(previousDayClosing);
529
                    dailyRecharge.setProviderId(x.getId());
530
                    dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
531
                    dailyRecharge.setTotalAmount(dailyAmount);
532
                    dailyRecharge.setTotalCommission(totalCommission);
533
                    float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
534
                    dailyRecharge.setClosingBalance(closingBalance);
535
                    dailyRechargeRepository.persist(dailyRecharge);
536
                    x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
537
                    previousDayClosing = dailyRecharge.getClosingBalance();
538
                }
539
                date = date.plusDays(1);
540
            }
541
            rechargeProviderRepository.persist(x);
542
        });
543
        LOGGER.info("finished generating daily recharge");
544
    }
24240 amit.gupta 545
 
31697 amit.gupta 546
    public void reconcileRecharge() throws Exception {
547
        LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
548
        LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
549
        List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
550
        LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
551
        nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
552
        nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
553
        RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
554
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
555
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
556
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
557
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
558
        Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
31886 tejbeer 559
        List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
31697 amit.gupta 560
        for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
561
            try {
562
                int providerId = rechargeTransaction.getProviderId();
563
                if (providerId == 1) {
31886 tejbeer 564
                    oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey, rechargeTransaction);
31697 amit.gupta 565
                } else if (providerId == 2) {
31886 tejbeer 566
                    thinkWalnutDigitalRechargeProviderService.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
31697 amit.gupta 567
                }
31886 tejbeer 568
                if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS) || rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
569
                    requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(), rechargeTransaction.getStatus());
31697 amit.gupta 570
                }
571
            } catch (Exception e) {
572
                LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
573
            }
574
        }
575
        LOGGER.info("Reconcile recharge ran successfully");
576
    }
24241 amit.gupta 577
 
31697 amit.gupta 578
    public void processActivation() throws Exception {
579
        schemeService.processActivation();
580
    }
24241 amit.gupta 581
 
31697 amit.gupta 582
    // TemporaryMethod
583
    public void migrateInvoice() {
584
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
585
        Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
31886 tejbeer 586
        partnerOrdersMap = fofoOrders.stream().collect(groupingBy(FofoOrder::getFofoId, Collectors.toList()));
31697 amit.gupta 587
        for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
588
            int sequence = 0;
589
            String prefix = "";
31886 tejbeer 590
            List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId()).collect(Collectors.toList());
31697 amit.gupta 591
            for (FofoOrder order : sortedList) {
23724 amit.gupta 592
 
31697 amit.gupta 593
                LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
594
                if (!order.getInvoiceNumber().contains("SEC")) {
595
                    sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
596
                    prefix = order.getInvoiceNumber().split("/")[0];
597
                } else {
598
                    sequence += 1;
599
                    String invoiceNumber = prefix + "/" + sequence;
600
                    order.setInvoiceNumber(invoiceNumber);
601
                    fofoOrderRepository.persist(order);
602
                }
603
            }
24252 amit.gupta 604
 
31697 amit.gupta 605
        }
606
    }
28205 tejbeer 607
 
31697 amit.gupta 608
    @Autowired
609
    private ReporticoCacheTableRepository reporticoCacheTableRepository;
28205 tejbeer 610
 
31697 amit.gupta 611
    public void processScheme(int offset, boolean dryRun) throws Exception {
612
        LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
613
        LocalDateTime endDate = startDate.plusDays(30);
614
        processScheme(startDate, endDate, dryRun);
615
    }
24533 govind 616
 
31697 amit.gupta 617
    public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
618
        for (String invoiceNumber : invoiceNumbers) {
619
            System.out.println("Invoice Number - " + invoiceNumber);
620
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
32147 amit.gupta 621
            //orderService.reverseScheme(fofoOrder);
31697 amit.gupta 622
            schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
623
        }
624
    }
24271 amit.gupta 625
 
31697 amit.gupta 626
    public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
627
        for (String invoiceNumber : invoiceNumbers) {
628
            System.out.println("Invoice Number - " + invoiceNumber);
629
            Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
630
            schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
631
        }
632
    }
24271 amit.gupta 633
 
31697 amit.gupta 634
    public void processScheme(int offset, int durationDays, boolean dryRun) throws Exception {
635
        LocalDateTime startDate = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(offset);
636
        LocalDateTime endDate = startDate.plusDays(durationDays);
637
        processScheme(startDate, endDate, dryRun);
638
    }
24271 amit.gupta 639
 
31697 amit.gupta 640
    public void processScheme(boolean dryRun) throws Exception {
641
        LocalDateTime fromDate = LocalDateTime.now().minusDays(30);
642
        processScheme(fromDate, LocalDateTime.now(), dryRun);
643
    }
23929 amit.gupta 644
 
31697 amit.gupta 645
    public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
646
        LOGGER.info("Started execution at {}", LocalDateTime.now());
647
        System.out.println(
648
                "InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
649
        try {
650
            List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
651
            for (Purchase purchase : purchases) {
652
                schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
653
            }
29160 amit.gupta 654
 
31697 amit.gupta 655
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
656
            for (FofoOrder fofoOrder : fofoOrders) {
657
                schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
658
            }
659
        } catch (Exception e) {
660
            e.printStackTrace();
661
            throw e;
662
        }
31886 tejbeer 663
        List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(), endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 664
        System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
665
        for (UserWalletHistory uwh : uwhs) {
31886 tejbeer 666
            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 667
        }
668
        LOGGER.info("Schemes processed successfully.");
669
        if (dryRun) {
670
            throw new Exception();
671
        }
672
    }
29160 amit.gupta 673
 
31697 amit.gupta 674
    public void processRechargeCashback() throws Throwable {
675
        LocalDateTime cashbackTime = LocalDateTime.now();
676
        int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
31886 tejbeer 677
        List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository.getPendingCashBackRehargeTransactions();
31697 amit.gupta 678
        Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
31724 amit.gupta 679
                groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
31697 amit.gupta 680
        for (Map.Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
681
            int retailerId = (Integer) totalRetailerCashback.getKey();
682
            float amount = totalRetailerCashback.getValue().floatValue();
683
            if (Math.round(amount) > 0) {
31886 tejbeer 684
                walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK, "Recharge Cashback", Math.round(amount), LocalDateTime.now());
31697 amit.gupta 685
            }
686
        }
687
        for (RechargeTransaction rt : pendingTransactions) {
688
            rt.setCashbackTimestamp(cashbackTime);
689
            rt.setCashbackReference(referenceId);
690
            rechargeTransactionRepository.persist(rt);
691
        }
692
        LOGGER.info("Cashbacks for Recharge processed Successfully");
693
    }
29160 amit.gupta 694
 
31697 amit.gupta 695
    public void rollOutUpgardedMarginsNextMonth() throws Exception {
696
        LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
29160 amit.gupta 697
 
31697 amit.gupta 698
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
699
        for (FofoStore store : stores) {
32003 amit.gupta 700
            this.rolloutMarginForStoreOnMonth(store, startOfPreviousMonth);
701
        }
702
    }
29252 amit.gupta 703
 
32003 amit.gupta 704
    public void rolloutMarginForStoreOnMonth(FofoStore store, LocalDate startOfMonth) throws ProfitMandiBusinessException {
705
        int fofoId = store.getId();
29252 amit.gupta 706
 
32003 amit.gupta 707
        PartnerType startOfPreviousMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, startOfMonth);
708
        PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId, YearMonth.from(startOfMonth.atStartOfDay()));
709
        if (!startOfPreviousMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
710
            return;
711
        }
712
        if (!startOfPreviousMonthPartnerType.equals(todayPartnerType)) {
713
            LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), startOfPreviousMonthPartnerType, todayPartnerType);
714
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startOfMonth.atStartOfDay(), startOfMonth.plusMonths(1).atStartOfDay(), 0, 0);
715
            for (FofoOrder fofoOrder : fofoOrders) {
716
                schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
31697 amit.gupta 717
            }
718
        }
719
    }
29252 amit.gupta 720
 
32003 amit.gupta 721
 
31697 amit.gupta 722
    public void rollOutUpgardedMargins() throws Exception {
723
        LocalDate today = LocalDate.now();
724
        LocalDate yesterday = today.minusDays(1);
725
        int upgradedCount = 0;
726
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
727
        StringBuilder sb = new StringBuilder();
728
        for (FofoStore store : stores) {
729
            int fofoId = store.getId();
23724 amit.gupta 730
 
31697 amit.gupta 731
            PartnerType yesterdayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, yesterday);
732
            PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, today);
733
            if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
734
                continue;
735
            }
736
            if (!yesterdayPartnerType.equals(todayPartnerType)) {
737
                upgradedCount++;
31886 tejbeer 738
                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 739
                sb.append("<br>");
31886 tejbeer 740
                LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), yesterdayPartnerType, todayPartnerType);
741
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
31697 amit.gupta 742
                for (FofoOrder fofoOrder : fofoOrders) {
743
                    schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
744
                }
30390 amit.gupta 745
 
31697 amit.gupta 746
            }
747
        }
748
        if (upgradedCount > 0) {
32439 tejbeer 749
            sendMailOfHtmlFormat(googleMailSender, new String[]{"amit.gupta@smartdukaan.com", "tarun.verma@smartdukaan.com", "neeraj.gupta@smartdukaan.com"}, sb.toString(), null, "Few Partners Category have been Upgraded");
31697 amit.gupta 750
        } else {
32439 tejbeer 751
            sendMailOfHtmlFormat(googleMailSender, 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 752
        }
753
    }
30393 amit.gupta 754
 
31697 amit.gupta 755
    @Autowired
756
    private PartnerStatsService partnerStatsService;
30393 amit.gupta 757
 
31697 amit.gupta 758
    // Temporary Method
759
    public void evaluateExcessSchemeOut() throws Exception {
760
        Map<Integer, String> userNameMap = retailerService.getAllFofoRetailerIdNameMap();
761
        Map<Integer, Float> userAmountMap = new HashMap<>();
30393 amit.gupta 762
 
31697 amit.gupta 763
        List<List<?>> rows = new ArrayList<>();
31886 tejbeer 764
        List<String> headers = Arrays.asList("Scheme", "Item", "Partner", "Amount", "Credited On", "Invoice Number", "Sale On", "Scheme Start", "Scheme End", "Active On", "Expired On");
33256 amit.gupta 765
        for (Scheme scheme : schemeRepository.selectAll()) {
766
            if (scheme.getType().equals(SchemeType.OUT)) {
767
                List<SchemeInOut> sioList = schemeInOutRepository.selectBySchemeIds(new HashSet<>(Arrays.asList(scheme.getId())));
768
                if (scheme.getActiveTimestamp() != null) {
769
                    LocalDateTime endDateTime = scheme.getEndDateTime();
770
                    if (scheme.getExpireTimestamp() != null && scheme.getExpireTimestamp().isBefore(scheme.getEndDateTime())) {
771
                        endDateTime = scheme.getExpireTimestamp();
31697 amit.gupta 772
                    }
773
                    for (SchemeInOut sio : sioList) {
774
                        InventoryItem inventoryItem = null;
775
                        inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
776
                        FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndSerialNumber(
777
                                inventoryItem.getFofoId(), inventoryItem.getSerialNumber(), null, null, 0, 1).get(0);
31886 tejbeer 778
                        Optional<ScanRecord> record = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId()).stream().filter(y -> y.getType().equals(ScanType.SALE)).findFirst();
31697 amit.gupta 779
                        if (record.isPresent()) {
780
                            int fofoId = record.get().getFofoId();
33256 amit.gupta 781
                            if (record.get().getCreateTimestamp().isAfter(endDateTime) || record.get().getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 782
                                if (!userAmountMap.containsKey(fofoId)) {
783
                                    userAmountMap.put(fofoId, 0f);
784
                                }
785
                                userAmountMap.put(fofoId, sio.getAmount() + userAmountMap.get(fofoId));
786
                                try {
33256 amit.gupta 787
                                    rows.add(Arrays.asList(scheme.getDescription(), itemRepository.selectById(inventoryItem.getItemId()).getItemDescription(), userNameMap.get(fofoId), sio.getAmount(), FormattingUtils.formatDate(sio.getCreateTimestamp()), fofoOrder.getInvoiceNumber(), FormattingUtils.formatDate(record.get().getCreateTimestamp()), FormattingUtils.formatDate(scheme.getStartDateTime()), FormattingUtils.formatDate(scheme.getEndDateTime()), FormattingUtils.formatDate(scheme.getActiveTimestamp()), FormattingUtils.formatDate(scheme.getExpireTimestamp())));
31697 amit.gupta 788
                                } catch (Exception e) {
789
                                    e.printStackTrace();
790
                                }
791
                            }
792
                        }
793
                    }
794
                }
795
            }
33256 amit.gupta 796
        }
31886 tejbeer 797
        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 798
 
31697 amit.gupta 799
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
31886 tejbeer 800
        Utils.sendMailWithAttachment(googleMailSender, new String[]{"amit.gupta@shop2020.in"}, null, "Partner Excess Amount", "PFA", "ListofSchemes.csv", new ByteArrayResource(baos.toByteArray()));
30390 amit.gupta 801
 
31697 amit.gupta 802
    }
30390 amit.gupta 803
 
31697 amit.gupta 804
    public void fetchParnterStats() throws Exception {
805
        Map<Integer, PartnerDetailModel> partnerStats = partnerStatsService.getAllPartnerStats();
806
        ObjectOutputStream oos = null;
807
        FileOutputStream fout = null;
808
        try {
809
            fout = new FileOutputStream("/tmp/partnerStat.tmp", false);
810
            oos = new ObjectOutputStream(fout);
811
            oos.writeObject(partnerStats);
30637 amit.gupta 812
 
31697 amit.gupta 813
        } catch (Exception ex) {
814
            ex.printStackTrace();
815
        } finally {
816
            if (oos != null) {
817
                oos.close();
818
            }
819
        }
32421 amit.gupta 820
        ReporticoCacheTable reporticoCacheTable = reporticoCacheTableRepository.selectByTableName("partnerStat");
821
        if (reporticoCacheTable == null) {
822
            reporticoCacheTable = new ReporticoCacheTable();
823
            reporticoCacheTable.setTableName("partnerStat");
824
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
825
            reporticoCacheTableRepository.persist(reporticoCacheTable);
31697 amit.gupta 826
        } else {
32421 amit.gupta 827
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
31697 amit.gupta 828
        }
829
    }
31008 amit.gupta 830
 
31697 amit.gupta 831
    public void processPriceDrop() throws Exception {
31886 tejbeer 832
        List<PriceDrop> priceDrops = priceDropRepository.selectAllByDatesBetween(LocalDateTime.now(), LocalDateTime.now().minusYears(1));
31697 amit.gupta 833
        for (PriceDrop priceDrop : priceDrops) {
834
            if (priceDrop.getDropAmount() > 0) {
835
                priceDropService.processPriceDrop(priceDrop.getId(), true);
836
            }
837
        }
838
    }
31008 amit.gupta 839
 
31697 amit.gupta 840
    @Autowired
841
    CreditNoteService creditNoteService;
25598 amit.gupta 842
 
31697 amit.gupta 843
    public void sendCreditNote(YearMonth yearMonth) throws Exception {
844
        creditNoteService.issueMonthlyMarginsCN(yearMonth);
845
    }
25598 amit.gupta 846
 
31918 amit.gupta 847
    @Autowired
848
    BrandAgeingLimitRepository brandAgeingLimitRepository;
849
 
850
    @Autowired
851
    AgeingService ageingService;
852
 
853
    public void sendMailForAgeingAlert() throws Exception {
854
        //brandAgeingLimitRepository.selectAll();
855
        Map<String, AgeingModel> ageingModelMap = ageingService.getAllAgeingForSecondary();
856
 
857
        System.out.println(ageingModelMap.size());
858
        List<PartnerAgeingModel> partnerAgeingModels = ageingService.getAllAgeingForTertiary();
859
 
860
 
32084 tejbeer 861
        org.apache.commons.io.output.ByteArrayOutputStream byteArrayOutputStream = FileUtil.getCSVByteStream(Arrays.asList("InventoryItemId", "Serial Number", "Item Id", "Brand", "Model Name", "ModelNumber", "Color", "Exceed Days", "Last ScanType", "Supplier Name", "Current Warehouse", "First Warehouse", "Invoice Number", "Invoice Date"), ageingModelMap.values().stream().map(x -> Arrays.asList(x.getInventoryItemId(), x.getSerialNumber(), x.getItemId(), x.getBrand(), x.getModelName(), x.getModelNumber(), x.getColor(), x.getExceedDays(), x.getLastScanType(), x.getSupplierName(), x.getCurrentWarehouse(), x.getFirstWarehouse(), x.getInvoiceNumber(), FormattingUtils.formatDate(x.getInvoiceDate()))).collect(Collectors.toList()));
31918 amit.gupta 862
 
32084 tejbeer 863
        org.apache.commons.io.output.ByteArrayOutputStream byteArrayOutputStream2 = FileUtil.getCSVByteStream(Arrays.asList("InventoryItemId", "Serial Number", "Item Id", "Brand", "Model Name", "ModelNumber", "Color", "Partner Id", "Partner Code", "Partner Name", "Activation Type", "City", "State", "Billing Date", "Exceed Days", "Max Ageing", "Activation Date"), partnerAgeingModels.stream().map(x -> Arrays.asList(x.getInventoryItemId(), x.getSerialNumber(), x.getItemId(), x.getBrand(), x.getModelName(), x.getModelNumber(), x.getColor(), x.getFofoId(), x.getFofoCode(), x.getFofoName(), x.getActivationType(), x.getFofoCity(), x.getFofoState(), FormattingUtils.formatDate(x.getBillingDate()), x.getExceedDays(), x.getMaxAgeingDays(), x.getActivationDate())).collect(Collectors.toList()));
31918 amit.gupta 864
        Utils.Attachment attachment1 = new Utils.Attachment("secondary-alert.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
865
        Utils.Attachment attachment2 = new Utils.Attachment("tertiary-alert.csv", new ByteArrayResource(byteArrayOutputStream2.toByteArray()));
866
 
867
        String mailSubject = "Stock ageing Alert";
868
        Utils.sendMailWithAttachments(mailSender, new String[]{"deena.nath@smartdukaan.com"}, null, mailSubject, "PFA", attachment1, attachment2);
869
    }
870
 
32724 amit.gupta 871
    public void rejectPriceDropsOfApprovedImeis() throws ProfitMandiBusinessException {
32690 amit.gupta 872
        priceDropService.rejectPriceDropsOfApprovedImeis();
873
    }
874
 
33357 amit.gupta 875
    public void processDeductions() {
876
        sidbiService.processDeductions();
877
    }
878
 
31697 amit.gupta 879
    private class SaleRoles {
25598 amit.gupta 880
 
31697 amit.gupta 881
        private List<String> l1;
882
        private List<String> l2;
25598 amit.gupta 883
 
31697 amit.gupta 884
        public SaleRoles() {
885
            l1 = new ArrayList<>();
886
            l2 = new ArrayList<>();
887
        }
25598 amit.gupta 888
 
31697 amit.gupta 889
        public List<String> getL1() {
890
            return l1;
891
        }
25598 amit.gupta 892
 
31697 amit.gupta 893
        public List<String> getL2() {
894
            return l2;
895
        }
26945 amit.gupta 896
 
31697 amit.gupta 897
    }
26945 amit.gupta 898
 
31697 amit.gupta 899
    private class FofoReportingModel {
900
        private String code;
901
        private int fofoId;
902
        private String businessName;
903
        private String territoryManager;
904
        private String regionalManager;
905
        private String businessManager;
26945 amit.gupta 906
 
31697 amit.gupta 907
        public String getCode() {
908
            return code;
909
        }
26945 amit.gupta 910
 
31697 amit.gupta 911
        public void setCode(String code) {
912
            this.code = code;
913
        }
26945 amit.gupta 914
 
31697 amit.gupta 915
        public String getBusinessName() {
916
            return businessName;
917
        }
26945 amit.gupta 918
 
31697 amit.gupta 919
        public void setBusinessName(String businessName) {
920
            this.businessName = businessName;
921
        }
26945 amit.gupta 922
 
31697 amit.gupta 923
        public String getTerritoryManager() {
924
            return territoryManager;
925
        }
26945 amit.gupta 926
 
31697 amit.gupta 927
        public void setTerritoryManager(String territoryManager) {
928
            this.territoryManager = territoryManager;
929
        }
26945 amit.gupta 930
 
31697 amit.gupta 931
        public String getRegionalManager() {
932
            return regionalManager;
933
        }
26945 amit.gupta 934
 
31697 amit.gupta 935
        public void setRegionalManager(String regionalManager) {
936
            this.regionalManager = regionalManager;
937
        }
26945 amit.gupta 938
 
31697 amit.gupta 939
        private ScheduledTasks getOuterType() {
940
            return ScheduledTasks.this;
941
        }
26945 amit.gupta 942
 
31697 amit.gupta 943
        @Override
944
        public String toString() {
31886 tejbeer 945
            return "FofoReportingModel{" + "code='" + code + '\'' + ", fofoId=" + fofoId + ", businessName='" + businessName + '\'' + ", territoryManager='" + territoryManager + '\'' + ", regionalManager='" + regionalManager + '\'' + ", businessManager='" + businessManager + '\'' + '}';
31697 amit.gupta 946
        }
26945 amit.gupta 947
 
31697 amit.gupta 948
        @Override
949
        public boolean equals(Object o) {
950
            if (this == o) return true;
951
            if (o == null || getClass() != o.getClass()) return false;
952
            FofoReportingModel that = (FofoReportingModel) o;
953
            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);
954
        }
26945 amit.gupta 955
 
31697 amit.gupta 956
        @Override
957
        public int hashCode() {
958
            return Objects.hash(code, fofoId, businessName, territoryManager, regionalManager, businessManager);
959
        }
26945 amit.gupta 960
 
31697 amit.gupta 961
        public String getBusinessManager() {
962
            return businessManager;
963
        }
26945 amit.gupta 964
 
31697 amit.gupta 965
        public void setBusinessManager(String businessManager) {
966
            this.businessManager = businessManager;
967
        }
25351 tejbeer 968
 
31697 amit.gupta 969
        public int getFofoId() {
970
            return fofoId;
971
        }
25598 amit.gupta 972
 
31697 amit.gupta 973
        public void setFofoId(int fofoId) {
974
            this.fofoId = fofoId;
975
        }
25598 amit.gupta 976
 
31697 amit.gupta 977
    }
26945 amit.gupta 978
 
31697 amit.gupta 979
    @Autowired
980
    WarehouseInventoryItemRepository warehouseInventoryItemRepository;
26945 amit.gupta 981
 
31746 amit.gupta 982
    @Autowired
983
    OfferService offerService;
984
 
985
    @Autowired
986
    PurchaseReturnItemRepository purchaseReturnItemRepository;
987
 
31918 amit.gupta 988
    @Autowired
989
    BrandRegionMappingRepository brandRegionMappingRepository;
990
 
32161 tejbeer 991
    @Autowired
992
    StandAlone standAlone;
32214 jai.hind 993
    @Autowired
994
    ItelImeiActivationNewService itelImeiActivationNewService;
32350 amit.gupta 995
 
996
    public void checkItelImeiActivationNew(LocalDate date, Integer day) throws Exception {
32063 amit.gupta 997
        try {
32223 amit.gupta 998
            itelImeiActivationNewService.checkItelImeiActivationNew(date, day);
32063 amit.gupta 999
        } catch (Throwable e) {
1000
            throw new Exception(e);
1001
        }
32223 amit.gupta 1002
    }
32062 amit.gupta 1003
 
32511 amit.gupta 1004
    @Autowired
1005
    PurchaseReturnService purchaseReturnService;
1006
 
32682 amit.gupta 1007
    @Autowired
1008
    JavaMailSender javaMailSender;
1009
 
32795 amit.gupta 1010
    @Autowired
1011
    OfferPayoutRepository offerPayoutRepository;
1012
 
1013
    @Autowired
1014
    OfferRepository offerRepository;
1015
 
32817 amit.gupta 1016
    @Autowired
1017
    BluedartAuthService bluedartAuthService;
1018
    @Autowired
1019
    BluedartService bluedartService;
1020
 
1021
    @Autowired
1022
    TransactionRelatedTasks transactionRelatedTasks;
1023
 
32872 amit.gupta 1024
    @Autowired
1025
    PsiSmartService psiSmartService;
32948 amit.gupta 1026
 
32961 amit.gupta 1027
    private void migrateValentine() throws ProfitMandiBusinessException {
1028
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1029
        for (FofoOrder fofoOrder : fofoOrders) {
1030
            orderService.processScratchOffer(fofoOrder);
1031
        }
1032
    }
33051 amit.gupta 1033
 
32990 amit.gupta 1034
    @Autowired
1035
    InvoiceService invoiceService;
1036
 
33384 amit.gupta 1037
    @Autowired
1038
    WarehouseService warehouseService;
1039
 
33316 amit.gupta 1040
    public void test() throws Exception {
33384 amit.gupta 1041
        /*System.out.println(warehouseService.moveToBad(Arrays.asList("860374066889716",
1042
                "863587077946699",
1043
                "865883067303639",
1044
                "868116066180113",
1045
                "868116066179719")));*/
33391 amit.gupta 1046
        System.out.println(warehouseService.moveToGood(Arrays.asList("354814720314877",
1047
                "43356/c21100001116",
1048
                "34850/c21100054629")));
33355 amit.gupta 1049
        //this.test1();
33385 amit.gupta 1050
        //this.processSidbiDeductions();
33316 amit.gupta 1051
        /*List<Order> orders = orderRepository.selectByInvoiceNumber("NSDL43328");
1052
        invoiceService.saveInvoice(orders);*/
33355 amit.gupta 1053
        /*for ( int fofoId : Arrays.asList(4149607,175138674,175138854,175138934,175138958,175139138,175139150,175139245,175139259,175139306,175139324,175139344,175139346,175139362,175139386,175139395,175139412,175139452,175139455,175139460,175139462,175139463,175139488,175139489,175139499,175139504,175139508,175139511,175139513,175139521,175139524,175139531,175139532,175139557,175139559,175139576,175139603,175139605,175139608,175139612,175139621,175139630,175139638,175139657,175139661,175139690,175139697,175139716,175139731)) {
33317 amit.gupta 1054
            try {
1055
                sdCreditService.fundWallet(fofoId);
1056
            } catch (ProfitMandiBusinessException pbse) {
1057
                LOGGER.info("Failed to fund wallet for - {}", fofoId);
1058
            }
33355 amit.gupta 1059
        }*/
33295 amit.gupta 1060
 
1061
        //transactionService.moveOrdersFulfimentWarehouseByBillingWarehouseId(7573);
32817 amit.gupta 1062
    }
1063
 
1064
    public void test3() throws Exception {
1065
        List<Long> payoutIds = Arrays.asList();
32795 amit.gupta 1066
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByIds(payoutIds);
1067
        Map<Integer, List<OfferPayout>> offerPayoutMap = offerPayouts.stream().collect(Collectors.groupingBy(x -> (int) x.getOfferId()));
1068
        for (Map.Entry<Integer, List<OfferPayout>> offerPayoutEntry : offerPayoutMap.entrySet()) {
1069
            int offerId = offerPayoutEntry.getKey();
1070
            List<OfferPayout> offerPayoutList = offerPayoutEntry.getValue();
1071
            Map<Integer, List<OfferPayout>> partnerOfferPayoutMap = offerPayoutList.stream().collect(Collectors.groupingBy(x -> (int) x.getFofoId()));
1072
            for (Entry<Integer, List<OfferPayout>> partnerOfferPayoutEntry : partnerOfferPayoutMap.entrySet()) {
1073
                int fofoId = partnerOfferPayoutEntry.getKey();
1074
                List<OfferPayout> partnerPayouts = partnerOfferPayoutEntry.getValue();
1075
                float amount = 0;
1076
                for (OfferPayout offerPayout : partnerPayouts) {
1077
                    amount += offerPayout.getAmount();
1078
                    offerPayout.setStatus(SchemePayoutStatus.REJECTED);
1079
                    offerPayout.setRejectTimestamp(LocalDateTime.now());
1080
                }
1081
                walletService.rollbackAmountFromWallet(fofoId, amount, offerId,
1082
                        WalletReferenceType.ADDITIONAL_SCHEME, "Imeis returned - " + partnerPayouts.size() + "pc(s)", LocalDateTime.now());
1083
            }
1084
        }
1085
    }
1086
 
33316 amit.gupta 1087
    public void test1() throws Exception {
32690 amit.gupta 1088
        System.out.println("Hello from test");
32724 amit.gupta 1089
        //this.calculateInterestAccured();
32690 amit.gupta 1090
        //sendMailOfHtmlFormat(javaMailSender, new String[]{"amit.gupta@smartdukaan.com"}, "hello", null, "Hello");
32698 amit.gupta 1091
        //priceDropService.rejectPriceDropsOfApprovedImeis();
32511 amit.gupta 1092
        //Create return
32600 amit.gupta 1093
        //this.updatePartnerLimit();
32607 ranu 1094
        //creditNoteService.sendCnMails(YearMonth.now().minusMonths(2));
32690 amit.gupta 1095
        //orderService.createMissingScratchOffers();
33315 amit.gupta 1096
        LocalDateTime debitNoteDate = LocalDate.of(2024, Month.APRIL, 30).atStartOfDay();
32698 amit.gupta 1097
        Map<Integer, Set<String>> fofoIdImeiReturnMap = new LinkedHashMap<>();
33355 amit.gupta 1098
        /*fofoIdImeiReturnMap.put(175139690,	new HashSet<>(Arrays.asList("862054078463472","863862077158219","866202075810858","866202077654494","866335072023651","866518078002718")));
33315 amit.gupta 1099
        fofoIdImeiReturnMap.put(175139414,	new HashSet<>(Arrays.asList("356494471684303","356494471857164","356494472062590","861753065078075","863511068904178","863511069732933","864179068109203","864179068112504","864259078789978","866202076254130","866202076254775","866657078259165","866657078272846","867492065809718","867907071107955","868565073021423","868565073022223","868565073386347")));
1100
        fofoIdImeiReturnMap.put(175139603,	new HashSet<>(Arrays.asList("350886063151961","356412387787135","357594162824701","357594162874771","860600078193972","863862077025350","863862077875796","863967075815072","866335073794995","866335074287874","869116067546048")));
1101
        fofoIdImeiReturnMap.put(175139657,	new HashSet<>(Arrays.asList("350933415734746","354324787135850","354324788766356","354990352512960","354990352580181","358142881241184","866611064207332","869116067600464")));
1102
        fofoIdImeiReturnMap.put(175139223,	new HashSet<>(Arrays.asList("350210770983048","350210771169027","350210771179844","350210771180784","863975067090596","866611060326797","868565075758196","869452074016992","869452074609515","869452074609556","869452074976674","869452074978654")));
1103
        fofoIdImeiReturnMap.put(175139557,	new HashSet<>(Arrays.asList("861977073551795","861977073552678","861977074486819","862046062571245","862046067278226","862046067734921","862046067756866","864468070394741","864468071225506","864468071668341","864468073604740","864468074854625","866993074734475")));
1104
        fofoIdImeiReturnMap.put(175139079,	new HashSet<>(Arrays.asList("862046068861921","862282079169299","865388071283496","866335072007753","866335073946256","866518073601712","866518077425993","866518078760471","868938062675394","868938062690799","868938064895552")));
1105
        fofoIdImeiReturnMap.put(175139711,	new HashSet<>(Arrays.asList("861753065266498","861888066009099","864468073703369","866993071640154","869116062800465")));
1106
        fofoIdImeiReturnMap.put(175139488,	new HashSet<>(Arrays.asList("862054076866114","862054076866650","866335071879079","866335077875998","866335077876095","866518078758939","868938062692878")));
1107
        fofoIdImeiReturnMap.put(175138934,	new HashSet<>(Arrays.asList("862054072810231","862054072823150","862054076867674","862054078659590","863862075768456","863862077158193","863975064472490","863975064473233","865388071160033","865610079408035","866335072117370","866335073899471","866335074306153","866335075664477","868938062669876","868938062677895","868938062685997")));
1108
        fofoIdImeiReturnMap.put(4149607	 ,   new HashSet<>(Arrays.asList("864468073415741","864468075548523","864468075549927","864468079499426","866657074106022","868938062686656","868938062696978","868938062699352","868938064895198","868938066363799")));
1109
        fofoIdImeiReturnMap.put(175139138,	new HashSet<>(Arrays.asList("862286066217631","864259076533691","864468073358842","864487061610014","864487061675918","866083066080028","866518078760950","866518078768979","866657075343848","868544061108518","868544061138432","869116065510848","869116065519781","869452074116891","869452074972939")));
1110
        fofoIdImeiReturnMap.put(175139608,	new HashSet<>(Arrays.asList("350201087552063","350201087559944","350201087635660","350201087649760","350201087843140","350201088470224","350201088696687","350201088697180","354324783756923","354324786101366","355472822024008","355472822025625","860388068055779","860388068262219","866518078762337","866518078767534","868544061141493","868544061141774","868544061141816","868938064895719","868938066360910")));
1111
        fofoIdImeiReturnMap.put(175139731,	new HashSet<>(Arrays.asList("860600079214413","861753063502217","861753065084172","861753065084636","863975064472094","863975064473076","863975064477218","864468074456462","865883068726994","866657074641481","866657078016946","868938062699832","868938062700754")));
1112
        fofoIdImeiReturnMap.put(175138958,	new HashSet<>(Arrays.asList("863862075766393","864179064784108","866202075811732","866202076252654","866202078005571","868544060277439")));
1113
        fofoIdImeiReturnMap.put(175139612,	new HashSet<>(Arrays.asList("864468073474946","864468073477808","864468075031082","864468075280689","864468075745723","864468079481747","864468079483123","866657074538125","866657074538141","866657074573106","867467071856465","867467071875465","867467071891223","867467071913845","867467072729125","867467072760088")));
1114
        fofoIdImeiReturnMap.put(175139479,	new HashSet<>(Arrays.asList("863975062106595","863975064472672","863975064472870","863975064472953","863975064482333","863975064483570","863975064484719","863975064662694","863975064666455","863975064668931","863975067090257","863975067090810","863975067230218","863975067232230","866186062852892","866186062853973","866186062855051","866186062855077","866186063250773","866186063251094","866186063251219","866186063251318")));
1115
        fofoIdImeiReturnMap.put(175139245,	new HashSet<>(Arrays.asList("354324787133962","354324787569397","354324787602750","863816078139719","863816078448318","866335070534139")));
1116
        fofoIdImeiReturnMap.put(175139324,	new HashSet<>(Arrays.asList("863718060410316","863862075060755","865610074109257","866518078844457","866518079735159")));
1117
        fofoIdImeiReturnMap.put(175139576,	new HashSet<>(Arrays.asList("354324789013261","861128071288044","862736064686138","863718062236859","863816074642674","863816074646691","864259078939631","867467071870367","867467072760625","868565073047048")));
1118
        fofoIdImeiReturnMap.put(175139150,	new HashSet<>(Arrays.asList("860492060436217","861977073052257","862054073026738","862054073052056","863862077158938","866993074147710","867907071407074","868938060257450","868956064835055")));
1119
        fofoIdImeiReturnMap.put(175139463,	new HashSet<>(Arrays.asList("862181066909552","863816077757719","863816078448516","864214068977273","866335070447936","866335071699212","866335071699592","866335071700291")));
1120
        fofoIdImeiReturnMap.put(175139722,	new HashSet<>(Arrays.asList("358250293364682","358250294683627","358250295102007","861858064421273","861888066009537","864214068983198","864259078491112","864259078787733","865883068445694","866335072878930","866518078371014","868492068014968","868565072254660","868565073401468","868565073465661")));
1121
        fofoIdImeiReturnMap.put(168311083,	new HashSet<>(Arrays.asList("863718064506176","864468070873488","865883068175572","866335071204435","866335072093738","866518077064313","866657077386209","866657077862282","868938061427359")));
1122
        fofoIdImeiReturnMap.put(175139691,	new HashSet<>(Arrays.asList("863718061338714","863718061339258")));
1123
        fofoIdImeiReturnMap.put(175139395,	new HashSet<>(Arrays.asList("860492060436910","861220079009850","862054077288730","863511068660374","863718060300574","863718060617936","866335072874111","869452070894897")));
1124
        fofoIdImeiReturnMap.put(175139621,	new HashSet<>(Arrays.asList("351240553452191","351240553483527","351240553502920","354990353485570","860492062979750","860492062980998","864214068585274","864214068784398","864214068795378","864214068946534","864214068946757","864214068982075","868938061418754","868938061427391","868938062623139")));
1125
        fofoIdImeiReturnMap.put(175139638,	new HashSet<>(Arrays.asList("863862077159191","866518078780438","866518079750471","868428060238049","868938061532836","868938062619517")));
1126
        fofoIdImeiReturnMap.put(175139313,	new HashSet<>(Arrays.asList("350837023070346","350837023075022","350837023075568","350837023075782","352256988699643","862054076944275","863862075060359","863862075520055","864468075575948","865388072943635","868938060248574","868938061422830","868938062630894","869116061122184","869452070893717","869452073157912","869452074054373","869452075220890")));
1127
        fofoIdImeiReturnMap.put(175139513,	new HashSet<>(Arrays.asList("861977073670355","863718060618439","864468075204986","868024064295935","868024065473754","868024065567811","868024065763972","868956063947893")));
1128
        fofoIdImeiReturnMap.put(175139524,	new HashSet<>(Arrays.asList("350933416006946","350933416007944","351115165469199","351115165471237","351115167775437","351115167778431","351115167784413","351688420101625","355300592141142","358250295005267","358250295284607","359197386833520","359197386864947","862054073974671","862054073979597","862054074261730","862054074425954","862054074426036","864468073609384","866518078777392","868544060023239","868938060253772","868938060258516","868938061419018")));
1129
        fofoIdImeiReturnMap.put(175139359,	new HashSet<>(Arrays.asList("358250293060942","358250293061387","863718063044252","863862077160991","866335072536793","866335072536975","866335072537130","866335072726691","866335072726733","866335073628532","866335073925250","866335073925292","866335073926233","866335075267156")));
1130
        fofoIdImeiReturnMap.put(175139397,	new HashSet<>(Arrays.asList("861977073659010","863511069721050","864468071611101","864468074432844","864468074435284")));
1131
        fofoIdImeiReturnMap.put(175139677,	new HashSet<>(Arrays.asList("351115165472839","351115165476095","351115165476251","351115165477739","351115165483430","351115165485377","351115165486516","351115165487191","351115166897992","351115166898438","351115166900416","351115166900879","351115166902438","351115166903816","351115166903857","351115166903915","351115166904475","351115166905753","351115166906454","351115166906595","351115166907015","351115166907759","351115166907957","351115166908872","351115166909813","864259078771372","864468075692644","864468079730101","864468079736744","866657076858687","868565073398649","869116061118042","869116061261081")));
1132
        fofoIdImeiReturnMap.put(175139460,	new HashSet<>(Arrays.asList("860492061918494","862054079983072","862054079983171","866335070533032","866518078995119","866518079014993","868938060095017")));
1133
        fofoIdImeiReturnMap.put(175139585,	new HashSet<>(Arrays.asList("358250293614706","358250293614904","358250294602908","358250294603120","358250295002181","861977074487718","863718061173699","863816078050254","865883068445777","866335070453439","866335070526812","866335071204351","866518078640293","869116067596803")));
1134
        fofoIdImeiReturnMap.put(175139726,	new HashSet<>(Arrays.asList("861858064489411","863718063927654","864468073702221","864468073928784","864468074193149","865883068445819","866657078378742","866657078498904","867949078179850","867949078180494","868544060023197")));
1135
        fofoIdImeiReturnMap.put(175139532,	new HashSet<>(Arrays.asList("863718060615096","863718060615617","863718060727537","863816077797897","866335073405139","868565072217287","868565072264560","868956065132510")));
1136
        fofoIdImeiReturnMap.put(175139462,	new HashSet<>(Arrays.asList("865610074119819","865610074120536","866335072878658","866335072882098","866335073617030")));
1137
        fofoIdImeiReturnMap.put(175139259,	new HashSet<>(Arrays.asList("350210771180644","355300593052348","860492061918213","861858064422651","864259078402572","864259078924310","866335070769719","866335071700556","866335071742558","866657073553208","867949078178530","867949078692472","868024065518616","868024065619091","869116067492540")));
1138
        fofoIdImeiReturnMap.put(175139344,	new HashSet<>(Arrays.asList("350115571135781","354990352587723","358250293362843","358250293363148","862736064732510","865610070849617","865610070851290","866518078899998","868938062623378","868956065234613")));
1139
        fofoIdImeiReturnMap.put(175139602,	new HashSet<>(Arrays.asList("861128070090482","868565072242160","868565072243044","868565072261004","868565073051644")));
1140
        fofoIdImeiReturnMap.put(175139605,	new HashSet<>(Arrays.asList("861515075217922","861515076369466","863816074206397","863816075080072","864259078661755","864468075627368","867467071860541","868565072177903","868565073075726","868565073401625","868938060248012","868938066709652","869452074088611","869452074609234")));
1141
        fofoIdImeiReturnMap.put(175139640,	new HashSet<>(Arrays.asList("358250293363429","358250293363684","861753065277792","863511069733998","864214068943713","864259078496574","864259078518773","864487060042870","864487060050352","865883069366170","866518079782391","867949078692639","867949078692852","868273068551617","868938066464571","869452073150115")));
1142
        fofoIdImeiReturnMap.put(175139346,	new HashSet<>(Arrays.asList("356494471614953","860600076022215","861765072074616","861977070097412","864468074885181","864468076046105","865610073263139","865883065558994","866335075002538","866657079093605","867907070983216")));
1143
        fofoIdImeiReturnMap.put(175139489,	new HashSet<>(Arrays.asList("354324789015209","354324789081797","861515075189824","861515075575501","861977070268997","864468072790144","864468072983921","864468075233225","866657077951960","869452071082492","869452071982378","869452074617070")));
1144
        fofoIdImeiReturnMap.put(175139508,	new HashSet<>(Arrays.asList("861515075367024","864468072781283","864468074453386","864468075200448","864468076050669","866083062293849")));
1145
        fofoIdImeiReturnMap.put(175139716,	new HashSet<>(Arrays.asList("350832440575209","358250295571425","860600076019492","861753063494373","861753063501151","864468073696100","864468074855689","865883065542311","865883067956030","866202075825450","866202077663297","866335073632591","866657078023769")));
1146
        fofoIdImeiReturnMap.put(175139727,	new HashSet<>(Arrays.asList("355300592353325","355300593005387","861765072344258","862046060196128","864468073908604","864468073910121","864468073911269","867437074118411","868024064300099","868024065464977","868024065468218","869116065414389")));
1147
        fofoIdImeiReturnMap.put(175139521,	new HashSet<>(Arrays.asList("860600071402594","860600071416719","861888064397496","861977073658616","864468070509587","864468073866406","866335074999056","866657077949642","866657078406964","866993072229072","867437070891698")));
1148
        fofoIdImeiReturnMap.put(175139523,	new HashSet<>(Arrays.asList("354324785409950","354324788632830","354990352587939","358250295736085","358250295805187","358311601935629","863967076359575","866657074163502","867907070986318","869452071963378","869452074611750")));
1149
        fofoIdImeiReturnMap.put(175139697,	new HashSet<>(Arrays.asList("862282078030112","862282078867117","863975067709930","863975068443810","864468072828860","864468073705786","864468075276489","864468075277685","865610073830739","866335073264577","866518079802116","866657074518903","866657077949980","868565073058664","868938060985639","869116065613949")));
1150
        fofoIdImeiReturnMap.put(175139622,	new HashSet<>(Arrays.asList("358250293381926","358250293382304","358250293382601","358250294076046","358250294078109","358250294078463","358250294602064","358250294602429","358250294603062","358250294603203")));
1151
        fofoIdImeiReturnMap.put(175139699,	new HashSet<>(Arrays.asList("863718064441317","865610074942897","866202077653173","866202077653553","866335072262671","866335073632211","866335074805519")));
1152
        fofoIdImeiReturnMap.put(175139741,	new HashSet<>(Arrays.asList("861515071386101","861515074123402","861515074124186","861977073047752","861977073658574","864468075082804","864468076049869","865883065542139","865883067957111","866518070599679","866518079800672","866657078018587","866657078270162","866657079236220")));
1153
        fofoIdImeiReturnMap.put(175139114,	new HashSet<>(Arrays.asList("861888066708856","861977074487692","866335070051217","866335070517274","866993074145631")));
1154
        fofoIdImeiReturnMap.put(175139531,	new HashSet<>(Arrays.asList("863816077976194","863816079685710","866335070997336","866335074729354","866335075514698")));
1155
        fofoIdImeiReturnMap.put(175139386,	new HashSet<>(Arrays.asList("350210771192805","358250295053846","860388068563434","863862077333374","864468075193221","864562077193757","864718076084310","866202077464092","866202077742190","866518077001513","868565079682020","868956065252516")));
1156
        fofoIdImeiReturnMap.put(175139452,	new HashSet<>(Arrays.asList("350835033581484","350835034344999","350835035973283","350886063052599","351115165490559","351115165492290","351115165492811","354324788947428","354996630411503","354996631256261","355480685142494","355480686969416","359197386860549","861977073020494","862046067791525","862054077982977","866335072889499","867467072712048","868938062127511")));
1157
        fofoIdImeiReturnMap.put(175139306,	new HashSet<>(Arrays.asList("863718064547394","864718076075516","864718076083478","866202077463631","866202077470057")));
1158
        fofoIdImeiReturnMap.put(175139733,	new HashSet<>(Arrays.asList("350210771180008","861515071845668","861888067164877","866335070489094","866518076378276","868565072242269")));
1159
        fofoIdImeiReturnMap.put(175138824,	new HashSet<>(Arrays.asList("862054078573478","863862074697490","863862075442375","864468074485545","866335070216315","866657078016169","866657078449402","869116065542247")));
1160
        fofoIdImeiReturnMap.put(175139511,	new HashSet<>(Arrays.asList("862054075642557","862054075643530","862054076379357","862054077978934","863816078158016","868938062108974")));
1161
        fofoIdImeiReturnMap.put(175139701,	new HashSet<>(Arrays.asList("863862078258331","866611061131790")));
1162
        fofoIdImeiReturnMap.put(175139552,	new HashSet<>(Arrays.asList("861753065084958","866202075814439","866202075825633","866202075864194","866202076138754","866202076252811","866202077646870","866202077651094","866202077653876","866202077659956","866202077660293","866202077663339","866202078006397","866202078006611","866202078008914","866657078023280")));
1163
        fofoIdImeiReturnMap.put(175139499,	new HashSet<>(Arrays.asList("351115165467359","351115166905951","355358277809813","355358277814052","356049795822532","358250290682060","863862075504950","864468073944906","864468076048721","866657079234365")));
1164
        fofoIdImeiReturnMap.put(175139630,	new HashSet<>(Arrays.asList("357349229650288","358250290499184","358250294552947","358250294590301","860946078570556","860946078571059","861977073552215","861977073657790","861977073657832","861977073658731","861977074660850","862054075627517","862054075632756","862054075642979","862054076374879","863967071220830")));
1165
        fofoIdImeiReturnMap.put(175139720,	new HashSet<>(Arrays.asList("865388072300075","866335073071691","866335073073697","866335073390398")));
1166
        fofoIdImeiReturnMap.put(175138854,	new HashSet<>(Arrays.asList("50115570082950","351688420279827","351688420575703","354324788647382","357594162666201","359333606194530","863862075760198")));
1167
        fofoIdImeiReturnMap.put(175139569,	new HashSet<>(Arrays.asList("350201087565545","350201087948386","350201087949087","350210771180081","351088890316094","351088890318454","351088896121530","351088896127776","351088896127958","351088896133410","351088896133832","352476512881224","352476512979242","354448512964985","357888147926932","357888147928292","357888147928557","357888147929050","357888147929795","357888147933094","861128070182420","861753065277115","863511069713933","866657077333680","868273068567092","868565072301768","869116062743905","869452071985157","869452073161393")));
1168
        fofoIdImeiReturnMap.put(175139610,	new HashSet<>(Arrays.asList("862736063981738","863718063044617","866335072870176","866335072870598")));
1169
        fofoIdImeiReturnMap.put(175139366,	new HashSet<>(Arrays.asList("354324783144864","354324788632608","354889661849990","354990353239423","863967070558271","864718076129396","866657077789543","866657078285368","866657078508066","869116060977828","869116061054429","869116061208546")));
1170
        fofoIdImeiReturnMap.put(175139412,	new HashSet<>(Arrays.asList("351115165488595","351115165491318","351115165491359","351115165491458","351115165492332","355358278026573","355358278081610","861888063460717","861977073052018","863816078633919","865883069477035","866335074538870","866993071639594")));
1171
        fofoIdImeiReturnMap.put(175139504,	new HashSet<>(Arrays.asList("862054072660792","862054075971873","862054076312374","862054077948630","863816075363171","863862075442334","864718075894230","868938062122017","868938065268932","869452071940632","869452073034897","869452073158233","869452073158498","869452074159735")));
1172
        fofoIdImeiReturnMap.put(175139201,	new HashSet<>(Arrays.asList("863718061956671","863862075497734","863862075596915","864718076078510","864718076134834","866335070211639","866611060437032","866611061133812")));
1173
        fofoIdImeiReturnMap.put(175139362,	new HashSet<>(Arrays.asList("350201087545646","350201087547048","350201087547709","350201087548764","350201087597043","350201087597167","350201087597464","350201087597787","350201087598165","350201087600789","863718062929271","865883069477191","865883069477530","866335071174133","866518078023870","866518078243072","868938061053494")));
33355 amit.gupta 1174
        fofoIdImeiReturnMap.put(175139661,	new HashSet<>(Arrays.asList("860946077691031","861977074661155","862054073218855","866335070523694","867940069973476","868938062656477")));*/
33315 amit.gupta 1175
        fofoIdImeiReturnMap.put(175139556,	new HashSet<>(Arrays.asList("863718063534013","866335072895173","866335073390810")));
1176
        fofoIdImeiReturnMap.put(175139721,	new HashSet<>(Arrays.asList("358250294549067","865883067508138","866993072210619")));
33355 amit.gupta 1177
        /*fofoIdImeiReturnMap.put(175139455,	new HashSet<>(Arrays.asList("358293804087913","866518078020694","866518078021650","866518078243676","866518078571936")));
33315 amit.gupta 1178
        fofoIdImeiReturnMap.put(175138674,	new HashSet<>(Arrays.asList("351115165482275","359197386868583","862054074428875","862054077945693","862054078556879","863967070559535","863975068705671","863975068705770","864468076196124","866186064235971","866186066185117","866186066186917","866518073607370","866518079641514","868938060476456","868938060501535","868938060717990","868938062656931")));
1179
        fofoIdImeiReturnMap.put(175139559,	new HashSet<>(Arrays.asList("863718069016890","863816078879256","864468075283881","866335073245436","866335073403571","866657074268327","868024065473853","868956065899993","869452070362895","869452074030274")));
1180
        fofoIdImeiReturnMap.put(175139575,	new HashSet<>(Arrays.asList("354324786659199","860388067452035","861220078009919","863816078878134","863862075841154","865388070857498","867907071407116")));
33355 amit.gupta 1181
        fofoIdImeiReturnMap.put(175139686,	new HashSet<>(Arrays.asList("866657078019106","866657078032869")));*/
33315 amit.gupta 1182
 
33355 amit.gupta 1183
        //this.processOrdersToRebill(fofoIdImeiReturnMap, debitNoteDate);
1184
        purchaseReturnService.fixReturns(fofoIdImeiReturnMap, debitNoteDate);
32513 amit.gupta 1185
 
32698 amit.gupta 1186
    }
1187
 
1188
 
33315 amit.gupta 1189
    private void processOrdersToRebill(Map<Integer, Set<String>> fofoIdImeiReturnMap, LocalDateTime debitNoteDate) throws Exception {
32698 amit.gupta 1190
 
1191
 
1192
        for (Entry<Integer, Set<String>> fofoIdImeiReturnEntry : fofoIdImeiReturnMap.entrySet()) {
32511 amit.gupta 1193
            int fofoId = fofoIdImeiReturnEntry.getKey();
1194
            Set<String> imeis = fofoIdImeiReturnEntry.getValue();
1195
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, imeis, true);
1196
            for (InventoryItem inventoryItem : inventoryItems) {
1197
                //inventoryItem.getId();
1198
                purchaseReturnService.returnInventoryItem(fofoId, true, inventoryItem.getId(), ReturnType.GOOD);
1199
                //Approve return
1200
                PurchaseReturnItem purchaseReturnItem = purchaseReturnItemRepository.selectByInventoryItemId(inventoryItem.getId());
1201
                purchaseReturnItem.setStatus(PurchaseReturnStatus.APPROVED);
1202
                purchaseReturnItem.setApproveTimestamp(LocalDateTime.now());
1203
            }
1204
            Map<Purchase, List<InventoryItem>> purchaseInventoryItemsMap = purchaseReturnService.getPurchaseMapForApprovedReturns(fofoId);
1205
            int walletAmount = walletService.getWalletAmount(fofoId);
1206
            List<DebitNote> debitNotes = purchaseReturnService.generateDebitNotes(purchaseInventoryItemsMap);
1207
            int walletDiff = walletAmount - walletService.getWalletAmount(fofoId);
1208
            if (walletDiff > 0) {
1209
                int reference = walletService.getManualReference(WalletReferenceType.OTHERS);
32514 amit.gupta 1210
                walletService.addAmountToWallet(fofoId, reference, WalletReferenceType.ADVANCE_AMOUNT, "Sytematically added for internal PO", (float) walletDiff + 5000, LocalDateTime.now());
32511 amit.gupta 1211
            }
32698 amit.gupta 1212
            List<CartItem> cartItems = new ArrayList<>();
32511 amit.gupta 1213
            for (DebitNote debitNote : debitNotes) {
33315 amit.gupta 1214
                debitNote.setCreateTimestamp(debitNoteDate);
32511 amit.gupta 1215
                //Try to refund amount per debit note
32698 amit.gupta 1216
                cartItems.addAll(this.refundDnAmount(debitNote));
32511 amit.gupta 1217
            }
32698 amit.gupta 1218
            //If order created
32724 amit.gupta 1219
            Map<Integer, List<CartItem>> warehouseCartItemsMap = cartItems.stream().collect(Collectors.groupingBy(x -> x.getWarehouseId()));
1220
            for (Map.Entry<Integer, List<CartItem>> warehouseCartItemsEntry : warehouseCartItemsMap.entrySet()) {
32223 amit.gupta 1221
 
32698 amit.gupta 1222
                List<CartItem> warehouseCartItems = warehouseCartItemsEntry.getValue();
1223
 
1224
                List<CartItem> mergedCartItems = warehouseCartItems.stream()
1225
                        .collect(Collectors.collectingAndThen(
32724 amit.gupta 1226
                                Collectors.groupingBy(x -> x.getItemId(), Collectors.collectingAndThen(
1227
                                        Collectors.reducing((a, b) -> {
32698 amit.gupta 1228
                                            a.setQuantity(a.getQuantity() + b.getQuantity());
1229
                                            return a;
1230
                                        }), Optional::get)),
1231
                                m -> new ArrayList<>(m.values())));
1232
 
32724 amit.gupta 1233
                double walletTotalAmount = mergedCartItems.stream().mapToDouble(x -> x.getQuantity() * x.getSellingPrice()).sum();
32698 amit.gupta 1234
 
1235
                com.spice.profitmandi.dao.entity.user.User user = userRepository.selectById(fofoId);
1236
                cartService.clearCart(user.getActiveCartId());
1237
                cartService.addItemsToCart(user.getActiveCartId(), mergedCartItems);
1238
 
1239
                UserCart userCart = new UserCart();
1240
                userCart.setCartId(user.getActiveCartId());
1241
                userCart.setUserId(user.getId());
1242
 
1243
                int transactionId = transactionService.createTransactionInternally(userCart, walletTotalAmount, warehouseCartItemsEntry.getKey());
1244
                commonPaymentService.payThroughWallet(transactionId);
1245
                transactionService.processTransaction(transactionId);
1246
            }
1247
        }
31697 amit.gupta 1248
    }
32048 tejbeer 1249
 
32384 amit.gupta 1250
    @Autowired
32511 amit.gupta 1251
    CartService cartService;
1252
    @Autowired
1253
    UserRepository userRepository;
1254
 
1255
    @Autowired
1256
    WarehouseScanRepository warehouseScanRepository;
1257
 
1258
    @Autowired
1259
    WarehouseInventoryService warehouseInventoryService;
1260
 
1261
    @Autowired
1262
    CommonPaymentService commonPaymentService;
1263
 
32533 amit.gupta 1264
    @Autowired
1265
    LineItemImeisRepository lineItemImeisRepository;
1266
 
32698 amit.gupta 1267
 
32511 amit.gupta 1268
    //Also create order
32698 amit.gupta 1269
    private List<CartItem> refundDnAmount(DebitNote debitNote) throws ProfitMandiBusinessException {
32511 amit.gupta 1270
        List<Integer> inventoryItemIds = purchaseReturnItemRepository.selectAllByDebitNoteId(debitNote.getId()).stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList());
1271
        Map<Integer, Long> inventoryItemCountMap = inventoryItemIds.stream().collect(Collectors.groupingBy(x -> x, Collectors.counting()));
1272
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(new ArrayList<>(inventoryItemCountMap.keySet()));
1273
        Purchase purchase = purchaseRepository.selectById(inventoryItems.get(0).getPurchaseId());
1274
        String invoice = purchase.getPurchaseReference();
1275
        List<Order> orders = orderRepository.selectByInvoiceNumber(invoice);
1276
        Set<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toSet());
1277
        Order order = orders.get(0);
1278
        float totalAmount = 0;
1279
        int totalQty = 0;
1280
        Map<Integer, CartItem> itemIdCartItemMap = new HashMap<>();
1281
 
1282
        List<CartItem> cartItems = new ArrayList<>();
1283
        for (InventoryItem inventoryItem : inventoryItems) {
1284
            TagListing tagListing = tagListingRepository.selectByItemId(inventoryItem.getItemId());
1285
            long quantity = inventoryItemCountMap.get(inventoryItem.getId());
1286
            totalAmount += inventoryItem.getUnitPrice() * quantity;
1287
            totalQty += quantity;
1288
            if (!itemIdCartItemMap.containsKey(inventoryItem.getItemId())) {
1289
                CartItem cartItem = new CartItem();
1290
                cartItem.setItemId(inventoryItem.getItemId());
1291
                cartItem.setSellingPrice(tagListing.getSellingPrice());
32698 amit.gupta 1292
                cartItem.setWarehouseId(order.getWarehouseId());
32511 amit.gupta 1293
                cartItems.add(cartItem);
1294
                itemIdCartItemMap.put(inventoryItem.getItemId(), cartItem);
1295
            }
1296
            CartItem cartItem = itemIdCartItemMap.get(inventoryItem.getItemId());
1297
            cartItem.setQuantity((int) quantity + cartItem.getQuantity());
1298
        }
1299
        String rollbackDescription = String.format("Refunded against DN %s, %d pc(s)", debitNote.getDebitNoteNumber(), totalQty);
1300
        walletService.addAmountToWallet(debitNote.getFofoId(), order.getTransactionId(), WalletReferenceType.PURCHASE, rollbackDescription, totalAmount, LocalDateTime.now());
1301
        //Before creating order lets try to in the stock
1302
 
1303
        //All scans pertaining to specific Invoices
1304
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderIds));
32698 amit.gupta 1305
        Map<Integer, Integer> inventoryItemIdOrderIdMap = new HashMap<>();
1306
        try {
1307
            inventoryItemIdOrderIdMap = warehouseScans.stream().collect(Collectors.toMap(x -> x.getInventoryItemId(), x -> x.getQuantity()));
32724 amit.gupta 1308
        } catch (Exception e) {
32698 amit.gupta 1309
            LOGGER.info("Could not process for fofoId - {}, {}", debitNote.getFofoId(), warehouseScans);
1310
        }
32511 amit.gupta 1311
        List<Integer> warehouseInventoryItemIds = warehouseScans.stream().filter(x -> !(x.getType().equals(in.shop2020.warehouse.ScanType.SALE_RET) || x.getType().equals(in.shop2020.warehouse.ScanType.SALE_RET_UNUSABLE)))
1312
                .map(x -> x.getInventoryItemId()).collect(Collectors.toList());
1313
        List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(warehouseInventoryItemIds);
1314
 
1315
        Map<String, WarehouseInventoryItem> serialNumberWarehouseInventoryItemMap = warehouseInventoryItems.stream().filter(x -> StringUtils.isNotBlank(x.getSerialNumber())).collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
1316
 
1317
        for (InventoryItem inventoryItem : inventoryItems) {
1318
            if (StringUtils.isBlank(inventoryItem.getSerialNumber())) {
1319
                //As of now this should be happening as  dn are specifically for serialized devices
1320
                /*int returnQty = inventoryItemCountMap.get(inventoryItem.getId()).intValue();
1321
                List<WarehouseInventoryItem> warehouseInventoryItemList = itemIdWarehouseInventoryItemsMap.get(inventoryItem.getItemId());
1322
                warehouseInventoryService.returnNonSerializedQty(warehouseInventoryItem)*/
1323
            } else if (StringUtils.isNotBlank(inventoryItem.getSerialNumber())) {
1324
                String serialNumber = inventoryItem.getSerialNumber();
1325
                WarehouseInventoryItem warehouseInventoryItem = serialNumberWarehouseInventoryItemMap.get(serialNumber);
1326
                warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.SALE_RET);
1327
                warehouseInventoryService.addQuantity(warehouseInventoryItem.getId(), 1);
1328
                WarehouseScan warehouseScan = new WarehouseScan();
1329
                warehouseScan.setInventoryItemId(warehouseInventoryItem.getId());
1330
                warehouseScan.setQuantity(1);
1331
                warehouseScan.setOrderId(inventoryItemIdOrderIdMap.get(warehouseInventoryItem.getItemId()));
1332
                warehouseScan.setScannedAt(LocalDateTime.now());
1333
                warehouseScan.setType(in.shop2020.warehouse.ScanType.SALE_RET);
1334
                warehouseScanRepository.persist(warehouseScan);
1335
 
1336
            }
1337
        }
1338
 
1339
        //Create Order as well
32724 amit.gupta 1340
        return cartItems;
32698 amit.gupta 1341
    }
32511 amit.gupta 1342
 
32698 amit.gupta 1343
    void addToCartAndCreateOrder() {
32511 amit.gupta 1344
 
1345
    }
1346
 
1347
    @Autowired
32384 amit.gupta 1348
    WarehouseDebitNoteRepository warehouseDebitNoteRepository;
1349
    @Autowired
1350
    WarehouseDebitNoteLineRepository warehouseDebitNoteLineRepository;
1351
 
1352
    @Autowired
1353
    WarehouseInvoiceItemRepository warehouseInvoiceItemRepository;
1354
    @Autowired
1355
    WarehouseSupplierInvoiceRepository warehouseSupplierInvoiceRepository;
1356
 
1357
    @Autowired
1358
    PurchaseOrderService purchaseOrderService;
1359
 
32482 amit.gupta 1360
    @Autowired
1361
    VendorCatalogPricingLogRepository vendorCatalogPricingLogRepository;
32384 amit.gupta 1362
 
32214 jai.hind 1363
//    private void checkItelImeiActivationNew(LocalDate now, int i) {
1364
//    }
1365
 
32169 amit.gupta 1366
    @Autowired
1367
    SessionFactory sessionFactory;
1368
 
1369
    private void checkAllPayoutsDuplicate() throws Exception {
1370
        final Session session = sessionFactory.getCurrentSession();
32439 tejbeer 1371
        final NativeQuery<Object[]> nativeQuery = session.createNativeQuery("select sio.inventory_item_id, sio.scheme_id, sio.status, count(*) c\n" + "from fofo.scheme_in_out sio\n" + "         join catalog.scheme s on s.id = sio.scheme_id\n" + "where (sio.status = 'CREDITED'\n" + "    or sio.status = 'PENDING')\n" + "  and s.type != 'INVESTMENT'\n" + " and sio.create_timestamp >= '2023-01-01' " + "group by sio.inventory_item_id, sio.scheme_id, sio.status\n" + "having c > 1");
32169 amit.gupta 1372
        List<Object[]> resultList = nativeQuery.getResultList();
1373
        for (Object[] tuple : resultList) {
1374
            LOGGER.info("RESULT -- {}, {}, {}", tuple[0], tuple[1], tuple[2]);
1375
            int inventoryItemId = (Integer) tuple[0];
1376
            int schemeId = (Integer) tuple[1];
1377
            SchemePayoutStatus schemePayoutStatus = SchemePayoutStatus.valueOf((String) tuple[2]);
1378
            List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(schemeId, inventoryItemId);
1379
            List<SchemeInOut> statusSpecificSchemeInOuts = schemeInOuts.stream().filter(x -> x.getStatus().equals(schemePayoutStatus)).collect(Collectors.toList());
1380
            if (statusSpecificSchemeInOuts.size() > 0) {
1381
                InventoryItem inventoryItem = inventoryItemRepository.selectById(inventoryItemId);
1382
                Scheme scheme = schemeRepository.selectById(schemeId);
1383
                List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(inventoryItemId);
1384
                if (scheme.getType().equals(SchemeType.IN)) {
1385
                    LOGGER.info("Skipping -- {}", inventoryItem.getSerialNumber());
1386
                } else {
1387
                    int fofoOrderId = scanRecords.stream().filter(x -> x.getOrderId() != 0).max(Comparator.comparing(x -> x.getOrderId())).get().getOrderId();
1388
                    WalletReferenceType walletReferenceType = SchemeType.ACTIVATION.equals(scheme.getType()) ? WalletReferenceType.ACTIVATION_SCHEME : SchemeType.SPECIAL_SUPPORT.equals(scheme.getType()) ? WalletReferenceType.SPECIAL_SUPPORT : WalletReferenceType.SCHEME_OUT;
1389
                    List<UserWalletHistory> userWalletHistoryList = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrderId, walletReferenceType).stream().filter(x -> x.getAmount() == Math.round(statusSpecificSchemeInOuts.get(0).getAmount())).collect(Collectors.toList());
1390
                    LOGGER.info("UserwalletHistory Entry --> {}, Sios --> {}", userWalletHistoryList.size(), statusSpecificSchemeInOuts.size());
1391
                    if (userWalletHistoryList.size() != statusSpecificSchemeInOuts.size()) {
1392
                        //Skipping them in first run as it is the special casw of upgrade where mismatch has happend.
1393
                        LOGGER.info("problem with {}, sio status - {}, inventoryItem id {}, schemeID {} ", fofoOrderId, statusSpecificSchemeInOuts.stream().map(x -> x.getStatus()).collect(Collectors.toList()), inventoryItemId, schemeId);
1394
                        //Primarily multiple pending cases
1395
                        statusSpecificSchemeInOuts.stream().skip(1).forEach(schemeInOut -> {
1396
                            schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
1397
                            schemeInOut.setStatusDescription("Rejected as entry is duplicate");
1398
                        });
1399
                    } else {
1400
                        userWalletHistoryList.stream().skip(1).forEach(userWalletHistory -> {
1401
                            try {
1402
                                walletService.rollbackAmountFromWallet(inventoryItem.getFofoId(), userWalletHistory.getAmount(), userWalletHistory.getReference(), userWalletHistory.getReferenceType(), "Reversal as multiple entries created", userWalletHistory.getBusinessTimestamp());
1403
                            } catch (ProfitMandiBusinessException e) {
1404
                                throw new RuntimeException(e);
1405
                            }
1406
                        });
1407
 
1408
                        statusSpecificSchemeInOuts.stream().skip(1).forEach(schemeInOut -> {
1409
                            schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
1410
                            if (schemePayoutStatus.equals(SchemePayoutStatus.CREDITED)) {
1411
                                schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
1412
                                schemeInOut.setStatusDescription("Rolled back as entry is duplicate");
1413
                            } else {
1414
                                LOGGER.info("This seems higly unreachable should not come here");
1415
                                schemeInOut.setStatusDescription("Rejected as entry is duplicate");
1416
                            }
1417
                        });
1418
                    }
1419
                }
1420
            }
1421
        }
1422
    }
1423
 
32795 amit.gupta 1424
    public void test2() throws Exception {
32009 amit.gupta 1425
        System.out.println("Starting test");
32048 tejbeer 1426
        processScheme(LocalDate.of(2023, 05, 06).atStartOfDay(), LocalDate.of(2023, 05, 9).atStartOfDay(), false);
32009 amit.gupta 1427
        /*partnerTypeChangeService.getTypeOnDate(175139287, LocalDate.of(2023,02, 01));
1428
        partnerTypeChangeService.getTypeOnDate(175139287, LocalDate.of(2023,03, 01));
1429
        partnerTypeChangeService.getTypeOnDate(175139287, LocalDate.of(2023,04, 01));
1430
        FofoStore fs = fofoStoreRepository.selectByRetailerId(175139287);
1431
        this.rolloutMarginForStoreOnMonth(fs, LocalDate.of(2023, 2, 1));
1432
        this.rolloutMarginForStoreOnMonth(fs, LocalDate.of(2023, 3, 1));*/
1433
        //this.sendMailForSamsungRebilling();
1434
        /*List<PurchaseReturnItem> purchaseReturnItems = purchaseReturnItemRepository.selectPurchaseReturnByStatuses(Arrays.asList(PurchaseReturnStatus.DEBIT_NOTE_CREATED));
1435
        Map<Integer, List<PurchaseReturnItem>> inventoryItemsMap = purchaseReturnItems.stream().collect(Collectors.groupingBy(x -> x.getDebitNoteId()));
1436
        for (Map.Entry<Integer, List<PurchaseReturnItem>> debitNotePurcahseReturnMap : inventoryItemsMap.entrySet()) {
1437
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(debitNotePurcahseReturnMap.getValue().stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList()));
1438
            offerService.reverseAdditionalSelloutSchemes(debitNotePurcahseReturnMap.getValue().get(0).getFofoId(), inventoryItems);
1439
        }*/
1440
        //this.sendMailForAgeingAlert();
1441
        //this.sendMailForAgeingAlert();
1442
        //System.out.println(brandRegionMappingRepository.getAvailabilityToVendorWarehouse(Arrays.asList(33353), 7720));
1443
 
1444
    }
1445
 
31697 amit.gupta 1446
    public void sendMailForSamsungRebilling() throws Exception {
1447
        List<BilledImeiModel> samsungModels = warehouseInventoryItemRepository.findByBillingDateBrand(LocalDate.now(), "Samsung");
1448
        LOGGER.info("SamsungModels {}", samsungModels);
1449
        samsungModels = samsungModels.stream().sorted(Comparator.comparing(x -> x.getPcmDate() == null ? -1 : 1)).collect(Collectors.toList());
1450
        if (samsungModels.size() > 0) {
1451
            List<String> headers = Arrays.asList("Partner Id", "Code", "Name", "City", "Brand", "Model Name", "Model Number", "Color", "Serial Number", "Remarks");
1452
            List<List<?>> rows = new ArrayList<>();
1453
            for (BilledImeiModel billedImeiModel : samsungModels) {
31886 tejbeer 1454
                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 1455
                rows.add(row);
1456
            }
1457
            ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1458
            String[] sendToArray = new String[]{"kamini.sharma@smartdukaan.com", "praveen.sharma@smartdukaan.com"};
1459
            String fileName = "Imeis need Rebilling -" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
31886 tejbeer 1460
            Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{"tarun.verma@smartdukaan.com"}, "Samsung Rebilling IMEI Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1461
        }
1462
    }
24002 amit.gupta 1463
 
31697 amit.gupta 1464
    public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
1465
        LocalDate yesterDay = LocalDate.now().minusDays(1);
1466
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
31886 tejbeer 1467
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25312 amit.gupta 1468
 
32169 amit.gupta 1469
        List<String> headers = Arrays.asList("Code", "Outlet name", "State Manager", "Territory/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 1470
        List<List<?>> rows = new ArrayList<>();
1471
        Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1472
 
31697 amit.gupta 1473
        Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25312 amit.gupta 1474
 
31886 tejbeer 1475
        Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(groupingBy(
1476
                x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
24271 amit.gupta 1477
 
31697 amit.gupta 1478
        for (FofoStore fofoStore : fofoStores) {
1479
            LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
1480
            int fofoId = fofoStore.getId();
1481
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
1482
            partnerDailyInvestment.setDate(yesterDay);
24177 govind 1483
 
31697 amit.gupta 1484
            try {
1485
                partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
31886 tejbeer 1486
                shortDaysMap.put(fofoId, shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
31697 amit.gupta 1487
            } catch (Exception e) {
1488
                // ignore the exceptions during persist
1489
            }
25598 amit.gupta 1490
 
31697 amit.gupta 1491
            CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
1492
            if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
1493
                LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1494
                continue;
1495
            }
1496
            FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1497
            List<Serializable> row = new ArrayList<>();
31886 tejbeer 1498
            row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(), reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
31697 amit.gupta 1499
            row.addAll(
31886 tejbeer 1500
                    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 1501
            partnerRowsMap.put(fofoStore.getId(), row);
1502
            rows.add(row);
25837 amit.gupta 1503
 
31697 amit.gupta 1504
        }
25837 amit.gupta 1505
 
31697 amit.gupta 1506
        String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25837 amit.gupta 1507
 
31697 amit.gupta 1508
        if (sendTo == null) {
1509
            for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
31886 tejbeer 1510
                List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 1511
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1512
                String[] sendToArray = new String[]{storeGuyEntry.getKey()};
31886 tejbeer 1513
                Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1514
            }
31886 tejbeer 1515
            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 1516
        }
25837 amit.gupta 1517
 
31697 amit.gupta 1518
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1519
        String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
31886 tejbeer 1520
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
25837 amit.gupta 1521
 
31697 amit.gupta 1522
    }
25598 amit.gupta 1523
 
33256 amit.gupta 1524
    private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() throws ProfitMandiBusinessException {
31697 amit.gupta 1525
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1526
        Map<String, SaleRoles> partnerEmailRBMMap = new HashMap<>();
24271 amit.gupta 1527
 
31886 tejbeer 1528
        List<Position> positions = positionRepository.selectPositionByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM));
1529
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 1530
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1531
        for (Position position : positions) {
1532
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
1533
            if (crList == null)
1534
                continue;
1535
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES) {
1536
                for (CustomRetailer cr : crList) {
1537
                    if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1538
                        partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1539
                    }
1540
                    SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1541
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1542
                    if (authUser == null) {
1543
                        continue;
1544
                    }
1545
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1546
                    if (position.getEscalationType().equals(EscalationType.L1)) {
1547
                        saleRoles.getL1().add(name);
1548
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
1549
                        saleRoles.getL2().add(name);
1550
                    }
1551
                }
1552
            }
1553
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM) {
1554
                for (CustomRetailer cr : crList) {
1555
                    if (!partnerEmailRBMMap.containsKey(cr.getEmail())) {
1556
                        partnerEmailRBMMap.put(cr.getEmail(), new SaleRoles());
1557
                    }
1558
                    SaleRoles saleRoles = partnerEmailRBMMap.get(cr.getEmail());
1559
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1560
                    if (authUser == null) {
1561
                        continue;
1562
                    }
1563
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1564
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1565
                        saleRoles.getL1().add(name);
1566
                    }
1567
                    /*else if (position.getEscalationType().equals(EscalationType.L2)) {
1568
                        saleRoles.getL2().add(name);
1569
                    }*/
1570
                }
1571
            }
24692 amit.gupta 1572
 
31697 amit.gupta 1573
        }
25418 amit.gupta 1574
 
31697 amit.gupta 1575
        Set<CustomRetailer> allCrList = new HashSet<>();
1576
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1577
            allCrList.addAll(cr);
1578
        }
25609 amit.gupta 1579
 
31886 tejbeer 1580
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25503 amit.gupta 1581
 
31697 amit.gupta 1582
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25503 amit.gupta 1583
 
31697 amit.gupta 1584
        for (CustomRetailer cr : allCrList) {
1585
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
1586
            if (fofoStore == null) {
1587
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1588
                continue;
1589
            }
1590
            String code = fofoStore.getCode();
1591
            // String storeName = "SmartDukaan-" +
1592
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
1593
            String businessName = cr.getBusinessName();
1594
            try {
1595
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1596
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
1597
                String bdm = StringUtils.join(partnerEmailRBMMap.get(cr.getEmail()).getL1(), ", ");
1598
                FofoReportingModel reportingModel = new FofoReportingModel();
1599
                reportingModel.setBusinessName(businessName);
1600
                reportingModel.setCode(code);
1601
                reportingModel.setFofoId(fofoStore.getId());
1602
                reportingModel.setRegionalManager(stateManager);
1603
                reportingModel.setTerritoryManager(territoryManager);
1604
                reportingModel.setBusinessManager(bdm);
1605
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
1606
            } catch (Exception e) {
1607
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1608
            }
1609
        }
1610
        return partnerIdSalesHeadersMap;
24533 govind 1611
 
31697 amit.gupta 1612
    }
28709 amit.gupta 1613
 
31697 amit.gupta 1614
    public void sendPartnerInvestmentDetails() throws Exception {
1615
        this.sendPartnerInvestmentDetails(null);
1616
    }
28709 amit.gupta 1617
 
31697 amit.gupta 1618
    public void sendAgeingReport(String... sendTo) throws Exception {
28790 amit.gupta 1619
 
31886 tejbeer 1620
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW, "itemstockageing.xml");
1621
        InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "ItemwiseOverallPendingIndent.xml");
31697 amit.gupta 1622
        Attachment attachment = new Attachment(
1623
                "ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
1624
        Attachment attachment1 = new Attachment(
1625
                "pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
28790 amit.gupta 1626
 
31886 tejbeer 1627
        Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA", attachment);
1628
        Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null, "Itemwise Pending indent", "PFA", attachment1);
28790 amit.gupta 1629
 
31697 amit.gupta 1630
        // Reports to be sent to mapped partners
1631
        Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
28790 amit.gupta 1632
 
31697 amit.gupta 1633
        for (Map.Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
1634
            Map<String, String> params = new HashMap<>();
1635
            if (storeGuyEntry.getValue().size() == 0)
1636
                continue;
1637
            params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
31886 tejbeer 1638
            InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "focostockreport.xml", params);
31697 amit.gupta 1639
            Attachment attache = new Attachment(
1640
                    "Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
1641
            System.out.println(storeGuyEntry.getValue());
31886 tejbeer 1642
            Utils.sendMailWithAttachments(googleMailSender, new String[]{storeGuyEntry.getKey()}, null, "Franchise Stock Report", "PFA", attache);
31697 amit.gupta 1643
        }
28839 tejbeer 1644
 
31697 amit.gupta 1645
    }
28839 tejbeer 1646
 
31697 amit.gupta 1647
    public void sendIndentTertiary() throws Exception {
28790 amit.gupta 1648
 
31886 tejbeer 1649
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "indentandtertiary.xml");
31697 amit.gupta 1650
        Attachment attachment = new Attachment(
1651
                "indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
31886 tejbeer 1652
        Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report", "PFA", attachment);
28790 amit.gupta 1653
 
31697 amit.gupta 1654
    }
28790 amit.gupta 1655
 
31697 amit.gupta 1656
    public void sendAttendanceMorningAlert() throws Exception {
1657
        LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
1658
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1659
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1660
 
31697 amit.gupta 1661
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1662
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28790 amit.gupta 1663
 
31886 tejbeer 1664
        List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
28784 amit.gupta 1665
 
31886 tejbeer 1666
        Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream().collect(groupingBy(EmployeeAttendance::getUserId, Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
31697 amit.gupta 1667
        for (AuthUser authUser : authUsers) {
1668
            User user = userMap.get(authUser.getEmailId());
1669
            Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
1670
            LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
1671
            if (employeeAttendanceOptional != null) {
1672
                LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
1673
                if (employeeAttendanceOptional.orElse(null) != null) {
31886 tejbeer 1674
                    LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}", employeeAttendanceOptional.get().getCreateTimestamp());
31697 amit.gupta 1675
                }
1676
            }
31886 tejbeer 1677
            if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null || employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
31697 amit.gupta 1678
                LOGGER.info("Will Send Email to {}", authUser.getFullName());
1679
                String body = String.format(
31886 tejbeer 1680
                        "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 1681
 
31886 tejbeer 1682
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
28790 amit.gupta 1683
 
31697 amit.gupta 1684
            }
1685
        }
28790 amit.gupta 1686
 
31697 amit.gupta 1687
    }
28790 amit.gupta 1688
 
31697 amit.gupta 1689
    public void sendAttendanceEveningAlert() throws Exception {
1690
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1691
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1692
 
31697 amit.gupta 1693
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1694
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1695
 
31886 tejbeer 1696
        Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream().collect(groupingBy(x -> x.getUserId()));
28709 amit.gupta 1697
 
31697 amit.gupta 1698
        for (AuthUser authUser : authUsers) {
1699
            User user = userMap.get(authUser.getEmailId());
1700
            String body = null;
1701
            List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1702
            if (employeeAttendances == null) {
1703
                body = String.format(
31886 tejbeer 1704
                        "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 1705
            } else {
31886 tejbeer 1706
                List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
31697 amit.gupta 1707
                if (punchTimes.size() == 1) {
1708
                    // body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1709
                    // You have been marked absent for half the day. You may contact your manager
1710
                    // and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
1711
                } else {
1712
                    LocalDateTime firstPunch = punchTimes.get(0);
1713
                    LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
1714
                    Duration duration = Duration.between(firstPunch, lastPunch);
1715
                    boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1716
                    if (!hoursCompleted) {
1717
                        body = String.format(
31886 tejbeer 1718
                                "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 1719
                    }
1720
                }
28709 amit.gupta 1721
 
31697 amit.gupta 1722
            }
1723
            if (body != null) {
31886 tejbeer 1724
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
31697 amit.gupta 1725
            }
1726
        }
28709 amit.gupta 1727
 
31697 amit.gupta 1728
        this.sendMailToHR();
28709 amit.gupta 1729
 
31697 amit.gupta 1730
    }
28709 amit.gupta 1731
 
31697 amit.gupta 1732
    private void sendMailToHR() throws Exception {
1733
        Map<String, String> map = new HashMap<>();
1734
        String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1735
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1736
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
31886 tejbeer 1737
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "employeeattendance.xml");
1738
        Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
1739
        Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null, "Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
31697 amit.gupta 1740
    }
28709 amit.gupta 1741
 
31697 amit.gupta 1742
    public void checkPartnerActiveStore() throws Exception {
24697 amit.gupta 1743
 
31697 amit.gupta 1744
        List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
23929 amit.gupta 1745
 
31697 amit.gupta 1746
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1747
        if (!fofoStores.isEmpty()) {
1748
            for (FofoStore fofoStore : fofoStores) {
24551 amit.gupta 1749
 
31697 amit.gupta 1750
                if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
24542 amit.gupta 1751
 
31697 amit.gupta 1752
                    fofoStore.setActive(true);
1753
                    fofoStoreRepository.persist(fofoStore);
1754
                    LOGGER.info("inserted into InActiveFofoStore successfully");
29160 amit.gupta 1755
 
31697 amit.gupta 1756
                } else {
1757
                    fofoStore.setActive(false);
1758
                    fofoStore.setActiveTimeStamp(null);
1759
                    fofoStoreRepository.persist(fofoStore);
1760
                    LOGGER.info("inserted into InActiveFofoStore successfully");
1761
                }
24542 amit.gupta 1762
 
31697 amit.gupta 1763
            }
1764
        }
24542 amit.gupta 1765
 
31697 amit.gupta 1766
    }
24548 amit.gupta 1767
 
31697 amit.gupta 1768
    public void sendAgeingReport() throws Exception {
31886 tejbeer 1769
        sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "manish.gupta@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
31697 amit.gupta 1770
    }
24542 amit.gupta 1771
 
31697 amit.gupta 1772
    public void moveImeisToPriceDropImeis() throws Exception {
1773
        List<PriceDrop> priceDrops = priceDropRepository.selectAll();
1774
        for (PriceDrop priceDrop : priceDrops) {
1775
            priceDropService.priceDropStatus(priceDrop.getId());
1776
        }
1777
    }
29160 amit.gupta 1778
 
31697 amit.gupta 1779
    public void walletmismatch() throws Exception {
1780
        LocalDate curDate = LocalDate.now();
1781
        List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
1782
        System.out.println(pdis.size());
1783
        for (PartnerDailyInvestment pdi : pdis) {
1784
            int fofoId = pdi.getFofoId();
31886 tejbeer 1785
            for (PartnerDailyInvestment investment : Lists.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
1786
                float statementAmount = walletService.getOpeningTill(fofoId, investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
31697 amit.gupta 1787
                CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
31886 tejbeer 1788
                LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(), investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
29160 amit.gupta 1789
 
31697 amit.gupta 1790
            }
1791
        }
29160 amit.gupta 1792
 
31697 amit.gupta 1793
    }
29160 amit.gupta 1794
 
31697 amit.gupta 1795
    @Autowired
1796
    StateRepository stateRepository;
29160 amit.gupta 1797
 
31697 amit.gupta 1798
    public void gst() throws Exception {
31886 tejbeer 1799
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(), LocalDateTime.now());
31697 amit.gupta 1800
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 1801
            int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24548 amit.gupta 1802
 
31697 amit.gupta 1803
            Address retailerAddress = addressRepository.selectById(retailerAddressId);
1804
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
1805
            Integer stateId = null;
1806
            if (customerAddress.getState().equals(retailerAddress.getState())) {
1807
                try {
1808
                    stateId = stateRepository.selectByName(customerAddress.getState()).getId();
1809
                } catch (Exception e) {
1810
                    LOGGER.error("Cannot found state named {}", customerAddress.getState());
1811
                    continue;
1812
                }
1813
            }
1814
            Map<Integer, GstRate> itemIdStateTaxRateMap = null;
24542 amit.gupta 1815
 
31697 amit.gupta 1816
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1817
            List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
1818
            if (stateId != null) {
1819
                itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
1820
            } else {
32145 tejbeer 1821
                itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
31697 amit.gupta 1822
            }
24580 amit.gupta 1823
 
31697 amit.gupta 1824
            for (FofoOrderItem foi : fofoOrderItems) {
1825
                float sgstRate = foi.getSgstRate();
1826
                float cgstRate = foi.getCgstRate();
1827
                float igstRate = foi.getIgstRate();
32145 tejbeer 1828
                foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
1829
                foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
1830
                foi.setIgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
24587 amit.gupta 1831
 
32145 tejbeer 1832
                LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
1833
                LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
1834
                LOGGER.info("Rates getIgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
1835
                LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(), itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24587 amit.gupta 1836
 
1837
 
31697 amit.gupta 1838
            }
1839
        }
26092 amit.gupta 1840
 
31697 amit.gupta 1841
    }
24590 amit.gupta 1842
 
33256 amit.gupta 1843
    public void schemewalletmismatch() throws ProfitMandiBusinessException {
31697 amit.gupta 1844
        LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
1845
        while (dateToReconcile.isBefore(LocalDate.now())) {
1846
            reconcileSchemes(dateToReconcile);
1847
            // reconcileOrders(dateTime);
1848
            // reconcileRecharges(dateTime);
1849
            dateToReconcile = dateToReconcile.plusDays(1);
1850
        }
1851
    }
24587 amit.gupta 1852
 
33256 amit.gupta 1853
    private void reconcileSchemes(LocalDate date) throws ProfitMandiBusinessException {
31697 amit.gupta 1854
        LocalDateTime startDate = date.atStartOfDay();
1855
        LocalDateTime endDate = startDate.plusDays(1);
1856
        List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
1857
        List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
1858
        double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
1859
        double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
1860
        double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
31886 tejbeer 1861
        List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT);
1862
        List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate, walletReferenceTypes);
31697 amit.gupta 1863
        double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
1864
        if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
1865
            LOGGER.info("Scheme Amount mismatched for Date {}", date);
24590 amit.gupta 1866
 
31724 amit.gupta 1867
            Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1868
 
31886 tejbeer 1869
            Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
24635 amit.gupta 1870
 
31724 amit.gupta 1871
            Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 1872
 
31886 tejbeer 1873
            Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
24635 amit.gupta 1874
 
31697 amit.gupta 1875
            Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
24635 amit.gupta 1876
 
31697 amit.gupta 1877
            for (Map.Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
1878
                if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
1879
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
1880
                } else {
31886 tejbeer 1881
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
31697 amit.gupta 1882
                }
1883
            }
31886 tejbeer 1884
            Map<Integer, Integer> userWalletMap = userWalletRepository.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1885
 
31724 amit.gupta 1886
            Map<Integer, Double> walletAmountMap = history.stream().collect(groupingBy(
31697 amit.gupta 1887
                    UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
1888
            for (Map.Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
1889
                double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
1890
                if (diff > 5) {
1891
                    LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
1892
                }
1893
            }
1894
        }
24635 amit.gupta 1895
 
31697 amit.gupta 1896
    }
24635 amit.gupta 1897
 
31697 amit.gupta 1898
    public void dryRunSchemeReco() throws Exception {
31886 tejbeer 1899
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 1900
 
31697 amit.gupta 1901
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1902
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1903
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1904
        Set<String> serialNumbersConsidered = new HashSet<>();
24631 amit.gupta 1905
 
31697 amit.gupta 1906
        LocalDateTime startDate = LocalDate.of(2018, 3, 1).atStartOfDay();
1907
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1908
        List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
24598 amit.gupta 1909
 
31697 amit.gupta 1910
        Map<Integer, String> storeNameMap = fofoStoreRepository.getStoresMap();
33256 amit.gupta 1911
        for (Purchase purchase : purchases) {
31697 amit.gupta 1912
            float amountToRollback = 0;
31886 tejbeer 1913
            String description = "Adjustment of Duplicate Scheme for Purchase Invoice " + purchase.getPurchaseReference();
1914
            Map<Integer, String> inventorySerialNumberMap = inventoryItemRepository.selectByPurchaseId(purchase.getId()).stream().filter(ii -> ii.getSerialNumber() != null).collect(Collectors.toMap(InventoryItem::getId, InventoryItem::getSerialNumber));
31697 amit.gupta 1915
            if (inventorySerialNumberMap.size() > 0) {
33256 amit.gupta 1916
                for (Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
31697 amit.gupta 1917
                    String serialNumber = inventorySerialNumberEntry.getValue();
1918
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
1919
                    if (serialNumbersConsidered.contains(serialNumber)) {
1920
                        // This will rollback scheme for differenct orders for same serial
31886 tejbeer 1921
                        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 1922
                        Collections.reverse(sios);
1923
                        for (SchemeInOut sio : sios) {
1924
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1925
                            amountToRollback += sio.getAmount();
1926
                            // sio.setSchemeType(SchemeType.OUT);
1927
                            sio.setSerialNumber(serialNumber);
1928
                            rolledbackSios.add(sio);
1929
                        }
1930
                        description = description.concat(" " + serialNumber + " ");
1931
                    } else {
1932
                        serialNumbersConsidered.add(serialNumber);
1933
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 1934
                        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 1935
                        Collections.reverse(sios);
1936
                        for (SchemeInOut sio : sios) {
1937
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
1938
                                schemesConsidered.add(sio.getSchemeId());
1939
                                continue;
1940
                            }
1941
                            sio.setRolledBackTimestamp(LocalDateTime.now());
1942
                            amountToRollback += sio.getAmount();
1943
                            // sio.setSchemeType(SchemeType.OUT);
1944
                            sio.setSerialNumber(serialNumber);
1945
                            sio.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1946
                            sio.setReference(purchase.getId());
1947
                            rolledbackSios.add(sio);
1948
                        }
1949
                    }
24592 amit.gupta 1950
 
31697 amit.gupta 1951
                }
1952
            }
1953
            if (amountToRollback > 0) {
1954
                // Address address =
1955
                // addressRepository.selectAllByRetailerId(purchase.getFofoId(), 0, 10).get(0);
1956
                UserWalletHistory uwh = new UserWalletHistory();
1957
                uwh.setAmount(Math.round(amountToRollback));
1958
                uwh.setDescription(description);
1959
                uwh.setTimestamp(LocalDateTime.now());
1960
                uwh.setReferenceType(WalletReferenceType.SCHEME_IN);
1961
                uwh.setReference(purchase.getId());
1962
                uwh.setWalletId(userWalletMap.get(purchase.getFofoId()));
1963
                uwh.setFofoId(purchase.getFofoId());
1964
                uwh.setStoreCode(storeNameMap.get(purchase.getFofoId()));
1965
                userWalletHistory.add(uwh);
1966
            }
33256 amit.gupta 1967
        }
31697 amit.gupta 1968
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 1969
                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 1970
 
31697 amit.gupta 1971
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 1972
                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 1973
 
31886 tejbeer 1974
        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 1975
 
31697 amit.gupta 1976
        throw new Exception();
24615 amit.gupta 1977
 
31697 amit.gupta 1978
    }
24615 amit.gupta 1979
 
31697 amit.gupta 1980
    public void dryRunOutSchemeReco() throws Exception {
1981
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
1982
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 1983
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
1984
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
31697 amit.gupta 1985
        LocalDateTime startDate = LocalDate.of(2019, 5, 1).atStartOfDay();
1986
        LocalDateTime endDate = LocalDate.now().atStartOfDay();
1987
        List<FofoOrder> allOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
1988
        // Collections.reverse(allOrders);
1989
        // List<FofoOrder> allOrders =
1990
        // List<FofoOrder> allOrders =
1991
        // Arrays.asList(fofoOrderRepository.selectByInvoiceNumber("UPGZ019/25"));
1992
        Set<String> serialNumbersConsidered = new HashSet<>();
33256 amit.gupta 1993
        for (FofoOrder fofoOrder : allOrders) {
31697 amit.gupta 1994
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
1995
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
1996
            float amountToRollback = 0;
1997
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
1998
            orderItems.forEach(x -> {
31886 tejbeer 1999
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 2000
            });
2001
            if (inventorySerialNumberMap.size() > 0) {
33256 amit.gupta 2002
                for (Entry<Integer, String> inventorySerialNumberEntry : inventorySerialNumberMap.entrySet()) {
31697 amit.gupta 2003
                    String serialNumber = inventorySerialNumberEntry.getValue();
2004
                    int inventoryItemId = inventorySerialNumberEntry.getKey();
2005
                    if (serialNumbersConsidered.contains(serialNumber)) {
2006
                        // This will rollback scheme for differenct orders for same serial
33256 amit.gupta 2007
                        List<SchemeInOut> sios = new ArrayList<>();
2008
                        for (SchemeInOut schemeInOut : schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItemId)))) {
2009
                            if (schemeInOut.getRolledBackTimestamp() == null && schemeTypeMap.get(schemeInOut.getSchemeId()).equals(SchemeType.OUT)) {
2010
                                sios.add(schemeInOut);
2011
                            }
2012
                        }
31697 amit.gupta 2013
                        Collections.reverse(sios);
2014
                        for (SchemeInOut sio : sios) {
2015
                            sio.setRolledBackTimestamp(LocalDateTime.now());
2016
                            amountToRollback += sio.getAmount();
2017
                            // sio.setSchemeType(SchemeType.OUT);
2018
                            sio.setSerialNumber(serialNumber);
2019
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2020
                            sio.setReference(fofoOrder.getId());
2021
                            rolledbackSios.add(sio);
2022
                        }
2023
                        description = description.concat(" " + serialNumber + " ");
2024
                    } else {
2025
                        serialNumbersConsidered.add(serialNumber);
2026
                        List<Integer> schemesConsidered = new ArrayList<>();
31886 tejbeer 2027
                        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 2028
                        Collections.reverse(sios);
2029
                        for (SchemeInOut sio : sios) {
2030
                            if (!schemesConsidered.contains(sio.getSchemeId())) {
2031
                                schemesConsidered.add(sio.getSchemeId());
2032
                                continue;
2033
                            }
2034
                            sio.setRolledBackTimestamp(LocalDateTime.now());
2035
                            amountToRollback += sio.getAmount();
2036
                            // sio.setSchemeType(SchemeType.OUT);
2037
                            sio.setReference(fofoOrder.getId());
2038
                            sio.setSerialNumber(serialNumber);
2039
                            sio.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2040
                            rolledbackSios.add(sio);
2041
                        }
2042
                    }
24615 amit.gupta 2043
 
31697 amit.gupta 2044
                }
2045
            }
2046
            if (amountToRollback > 0) {
2047
                UserWalletHistory uwh = new UserWalletHistory();
2048
                uwh.setAmount(Math.round(amountToRollback));
2049
                uwh.setDescription(description);
2050
                uwh.setTimestamp(LocalDateTime.now());
2051
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
2052
                uwh.setReference(fofoOrder.getId());
2053
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
2054
                uwh.setFofoId(fofoOrder.getFofoId());
2055
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2056
                userWalletHistory.add(uwh);
2057
            }
33256 amit.gupta 2058
        }
24615 amit.gupta 2059
 
31697 amit.gupta 2060
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2061
                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 2062
 
31697 amit.gupta 2063
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2064
                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 2065
 
31886 tejbeer 2066
        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 2067
 
31697 amit.gupta 2068
        throw new Exception();
2069
    }
24615 amit.gupta 2070
 
31697 amit.gupta 2071
    public void dryRunSchemeOutReco1() throws Exception {
2072
        List<Integer> references = Arrays.asList(6744, 7347, 8320, 8891, 9124, 9217, 9263, 9379);
2073
        List<UserWalletHistory> userWalletHistory = new ArrayList<>();
2074
        List<SchemeInOut> rolledbackSios = new ArrayList<>();
31886 tejbeer 2075
        Map<Integer, Integer> userWalletMap = userWalletRepository.selectAll().stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
2076
        Map<Integer, SchemeType> schemeTypeMap = schemeRepository.selectAll().stream().collect(Collectors.toMap(Scheme::getId, Scheme::getType));
33256 amit.gupta 2077
        for (Integer reference : references) {
31697 amit.gupta 2078
            FofoOrder fofoOrder = null;
2079
            try {
2080
                fofoOrder = fofoOrderRepository.selectByOrderId(reference);
2081
            } catch (Exception e) {
25927 amit.gupta 2082
 
31697 amit.gupta 2083
            }
2084
            String description = "Adjustment of Duplicate Scheme for Sale Invoice " + fofoOrder.getInvoiceNumber();
2085
            Map<Integer, String> inventorySerialNumberMap = new HashMap<>();
2086
            float amountToRollback = 0;
2087
            List<FofoOrderItem> orderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2088
            orderItems.forEach(x -> {
31886 tejbeer 2089
                inventorySerialNumberMap.putAll(x.getFofoLineItems().stream().filter(li -> li.getSerialNumber() != null).collect(Collectors.toMap(FofoLineItem::getInventoryItemId, FofoLineItem::getSerialNumber)));
31697 amit.gupta 2090
            });
2091
            if (inventorySerialNumberMap.size() > 0) {
31886 tejbeer 2092
                List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(inventorySerialNumberMap.keySet()).stream().filter(x -> schemeTypeMap.get(x.getSchemeId()).equals(SchemeType.OUT)).collect(Collectors.toList());
31697 amit.gupta 2093
                LOGGER.info("Found {} duplicate schemeouts for Orderid {}", sios.size(), fofoOrder.getId());
2094
                UserWalletHistory uwh = new UserWalletHistory();
31886 tejbeer 2095
                Map<Integer, List<SchemeInOut>> inventoryIdSouts = sios.stream().collect(groupingBy(SchemeInOut::getInventoryItemId, Collectors.toList()));
33256 amit.gupta 2096
                for (Entry<Integer, List<SchemeInOut>> inventorySioEntry : inventoryIdSouts.entrySet()) {
31697 amit.gupta 2097
                    List<SchemeInOut> outList = inventorySioEntry.getValue();
2098
                    if (outList.size() > 1) {
24683 amit.gupta 2099
 
31697 amit.gupta 2100
                    }
2101
                }
2102
                uwh.setAmount(Math.round(amountToRollback));
2103
                uwh.setDescription(description);
2104
                uwh.setTimestamp(LocalDateTime.now());
2105
                uwh.setReferenceType(WalletReferenceType.SCHEME_OUT);
2106
                uwh.setReference(fofoOrder.getId());
2107
                uwh.setWalletId(userWalletMap.get(fofoOrder.getFofoId()));
2108
                uwh.setFofoId(fofoOrder.getFofoId());
2109
                uwh.setStoreCode(fofoOrder.getInvoiceNumber().split("/")[0]);
2110
                userWalletHistory.add(uwh);
2111
            }
33256 amit.gupta 2112
        }
26945 amit.gupta 2113
 
31697 amit.gupta 2114
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
31886 tejbeer 2115
                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 2116
 
31697 amit.gupta 2117
        ByteArrayOutputStream baosOuts = FileUtil.getCSVByteStream(
31886 tejbeer 2118
                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 2119
 
31886 tejbeer 2120
        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 2121
 
31697 amit.gupta 2122
        throw new Exception();
25880 amit.gupta 2123
 
31697 amit.gupta 2124
    }
30982 tejbeer 2125
 
31697 amit.gupta 2126
    public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
30982 tejbeer 2127
 
31697 amit.gupta 2128
        LocalDateTime now = LocalDateTime.now();
2129
        LocalDateTime from = now.with(LocalTime.MIN);
2130
        String timeString = "Today %s";
2131
        // Send yesterday's report
2132
        /*
2133
         * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
2134
         * now.minusDays(1).; now = from.with(LocalTime.MAX);
2135
         *
2136
         * }
2137
         */
30982 tejbeer 2138
 
31697 amit.gupta 2139
        List<Integer> fofoIds = null;
31886 tejbeer 2140
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getId(), x -> x));
30982 tejbeer 2141
 
24653 govind 2142
 
31697 amit.gupta 2143
        if (fofoIdInt == null) {
2144
            fofoIds = new ArrayList<>(fofoStoreMap.keySet());
2145
        } else {
2146
            fofoIds = Arrays.asList(fofoIdInt);
2147
        }
2148
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
28368 tejbeer 2149
 
31886 tejbeer 2150
        Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now, null);
31697 amit.gupta 2151
        Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
28368 tejbeer 2152
 
31886 tejbeer 2153
        Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, true);
28377 tejbeer 2154
 
31886 tejbeer 2155
        Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
31697 amit.gupta 2156
        Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
28368 tejbeer 2157
 
31886 tejbeer 2158
        Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, false);
31697 amit.gupta 2159
        Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
28377 tejbeer 2160
 
31697 amit.gupta 2161
        //4 days + current day running
2162
        Map<Integer, Double> partnerBilledValueMap = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(from.minusDays(4), now);
28377 tejbeer 2163
 
31697 amit.gupta 2164
        Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
2165
        for (int fofoId : fofoIds) {
2166
            SaleTargetReportModel model = new SaleTargetReportModel();
2167
            model.setInsuranceSale(
2168
                    partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
2169
            model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
2170
            model.setSecondary(partnerBilledValueMap.containsKey(fofoId) ? partnerBilledValueMap.get(fofoId) : 0);
2171
            model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
2172
            model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
2173
            model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
2174
            model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
2175
            model.setPast3daysSale(
2176
                    spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
2177
            model.setFofoId(fofoId);
2178
            model.setCode(fofoStoreMap.get(fofoId).getCode());
31724 amit.gupta 2179
            model.setActivationType(fofoStoreMap.get(fofoId).getActivationType());
31697 amit.gupta 2180
            saleTargetReportModelMap.put(fofoId, model);
2181
        }
28377 tejbeer 2182
 
31697 amit.gupta 2183
        Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
2184
        for (Integer fofoId : fofoIds) {
2185
            SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
28368 tejbeer 2186
 
31697 amit.gupta 2187
            // com.spice.profitmandi.dao.entity.user.User user =
2188
            // userUserRepository.selectById(fofoId);
28377 tejbeer 2189
 
31697 amit.gupta 2190
            // Address address = addressRepository.selectById(user.getAddressId());
28377 tejbeer 2191
 
31697 amit.gupta 2192
            String title = "Sale Update";
31886 tejbeer 2193
            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 2194
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2195
            sendNotificationModel.setCampaignName("Sales update alert");
2196
            sendNotificationModel.setTitle(title);
2197
            sendNotificationModel.setMessage(messageTemplate);
2198
            sendNotificationModel.setType("url");
2199
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2200
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
2201
            sendNotificationModel.setMessageType(MessageType.notification);
2202
            int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2203
            sendNotificationModel.setUserIds(Arrays.asList(userId));
2204
            notificationService.sendNotification(sendNotificationModel);
2205
            String whatsappMessageTemplate = String.format(
31886 tejbeer 2206
                    "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 2207
            // notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
2208
            // address.getPhoneNumber());
28377 tejbeer 2209
 
31697 amit.gupta 2210
        }
2211
        // String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
2212
        // saleTargetReportModelMap);
2213
        this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
2214
    }
28377 tejbeer 2215
 
31697 amit.gupta 2216
    public void checkRazorPayPaymentStatus() throws Exception {
31886 tejbeer 2217
        List<PendingOrder> pendingOrder = pendingOrderRepository.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
28377 tejbeer 2218
 
31697 amit.gupta 2219
        for (PendingOrder po : pendingOrder) {
2220
            RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
2221
            List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28369 tejbeer 2222
 
31697 amit.gupta 2223
            LOGGER.info("razorPay" + razorPay);
2224
            if (razorPay != null) {
2225
                List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28368 tejbeer 2226
 
31697 amit.gupta 2227
                if (!payments.isEmpty()) {
2228
                    List<String> statusList = new ArrayList<>();
2229
                    for (Payment payment : payments) {
25880 amit.gupta 2230
 
31697 amit.gupta 2231
                        JSONObject jsonObj = new JSONObject(payment.toString());
25880 amit.gupta 2232
 
31697 amit.gupta 2233
                        String status = jsonObj.getString("status");
25880 amit.gupta 2234
 
31697 amit.gupta 2235
                        statusList.add(status);
25865 amit.gupta 2236
 
31697 amit.gupta 2237
                    }
2238
                    LOGGER.info("statusList" + statusList);
26941 amit.gupta 2239
 
31697 amit.gupta 2240
                    if (statusList.contains("authorized") || statusList.contains("captured")) {
2241
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2242
                        po.setPaidAmount(po.getTotalAmount());
2243
                        for (PendingOrderItem poi : poItems) {
2244
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2245
                        }
2246
                        Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
26941 amit.gupta 2247
 
31697 amit.gupta 2248
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
2249
                        Customer customer = customerRepository.selectById(po.getCustomerId());
2250
                        String[] customerEmail = null;
2251
                        if (customer.getEmailId() != null) {
2252
                            customerEmail = new String[]{customer.getEmailId()};
2253
                        }
31886 tejbeer 2254
                        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 2255
                        List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
2256
                        if (authUserEmails != null) {
2257
                            authUserEmails = new ArrayList<>();
2258
                        }
2259
                        authUserEmails.addAll(bccTo);
26945 amit.gupta 2260
 
31697 amit.gupta 2261
                        // emailService.sendMailWithAttachments("Order Created with SmartDukaan",
2262
                        // "order-confirm.vm",
2263
                        // emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
26945 amit.gupta 2264
 
31697 amit.gupta 2265
                    } else if (statusList.contains("refunded") || statusList.contains("failed")) {
2266
                        for (PendingOrderItem poi : poItems) {
2267
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2268
                        }
25865 amit.gupta 2269
 
31697 amit.gupta 2270
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2271
                    }
25865 amit.gupta 2272
 
31697 amit.gupta 2273
                }
2274
                // LOGGER.info("payment" + payments);
25865 amit.gupta 2275
 
31697 amit.gupta 2276
            }
2277
        }
2278
    }
25865 amit.gupta 2279
 
31697 amit.gupta 2280
    public static class SaleTargetReportModel {
2281
        private double totalSale;
2282
        private long totalQty;
2283
        private double past3daysSale;
2284
        private int fofoId;
2285
        private String code;
31724 amit.gupta 2286
        private ActivationType activationType;
25865 amit.gupta 2287
 
31724 amit.gupta 2288
 
2289
        @Override
2290
        public boolean equals(Object o) {
2291
            if (this == o) return true;
2292
            if (o == null || getClass() != o.getClass()) return false;
2293
            SaleTargetReportModel that = (SaleTargetReportModel) o;
2294
            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;
2295
        }
2296
 
2297
        @Override
2298
        public int hashCode() {
2299
            return Objects.hash(totalSale, totalQty, past3daysSale, fofoId, code, activationType, secondary, smartphoneSale, smartphoneQty, insuranceSale, insruanceQty);
2300
        }
2301
 
2302
        public ActivationType getActivationType() {
2303
            return activationType;
2304
        }
2305
 
2306
        public void setActivationType(ActivationType activationType) {
2307
            this.activationType = activationType;
2308
        }
2309
 
31697 amit.gupta 2310
        public double getSecondary() {
2311
            return secondary;
2312
        }
25865 amit.gupta 2313
 
31697 amit.gupta 2314
        public void setSecondary(double secondary) {
2315
            this.secondary = secondary;
2316
        }
25865 amit.gupta 2317
 
31697 amit.gupta 2318
        private double secondary;
25865 amit.gupta 2319
 
31697 amit.gupta 2320
        public int getFofoId() {
2321
            return fofoId;
2322
        }
25865 amit.gupta 2323
 
31697 amit.gupta 2324
        @Override
2325
        public String toString() {
31886 tejbeer 2326
            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 2327
        }
25865 amit.gupta 2328
 
31697 amit.gupta 2329
        public String getCode() {
2330
            return code;
2331
        }
25865 amit.gupta 2332
 
31697 amit.gupta 2333
        public void setCode(String code) {
2334
            this.code = code;
2335
        }
25865 amit.gupta 2336
 
31697 amit.gupta 2337
        public void setFofoId(int fofoId) {
2338
            this.fofoId = fofoId;
2339
        }
25872 tejbeer 2340
 
31697 amit.gupta 2341
        private double smartphoneSale;
2342
        private long smartphoneQty;
2343
        private double insuranceSale;
2344
        private long insruanceQty;
26945 amit.gupta 2345
 
31697 amit.gupta 2346
        public long getTotalQty() {
2347
            return totalQty;
2348
        }
30765 tejbeer 2349
 
31697 amit.gupta 2350
        public void setTotalQty(long totalQty) {
2351
            this.totalQty = totalQty;
2352
        }
2353
 
2354
        public double getPast3daysSale() {
2355
            return past3daysSale;
2356
        }
2357
 
2358
        public void setPast3daysSale(double past3daysSale) {
2359
            this.past3daysSale = past3daysSale;
2360
        }
2361
 
2362
        public double getTotalSale() {
2363
            return totalSale;
2364
        }
2365
 
2366
        public void setTotalSale(double totalSale) {
2367
            this.totalSale = totalSale;
2368
        }
2369
 
2370
        public double getSmartphoneSale() {
2371
            return smartphoneSale;
2372
        }
2373
 
2374
        public void setSmartphoneSale(double smartphoneSale) {
2375
            this.smartphoneSale = smartphoneSale;
2376
        }
2377
 
2378
        public long getSmartphoneQty() {
2379
            return smartphoneQty;
2380
        }
2381
 
2382
        public void setSmartphoneQty(long smartphoneQty) {
2383
            this.smartphoneQty = smartphoneQty;
2384
        }
2385
 
2386
        public double getInsuranceSale() {
2387
            return insuranceSale;
2388
        }
2389
 
2390
        public void setInsuranceSale(double insuranceSale) {
2391
            this.insuranceSale = insuranceSale;
2392
        }
2393
 
2394
        public long getInsruanceQty() {
2395
            return insruanceQty;
2396
        }
2397
 
2398
        public void setInsruanceQty(long insruanceQty) {
2399
            this.insruanceQty = insruanceQty;
2400
        }
2401
 
2402
    }
2403
 
32482 amit.gupta 2404
    private void getStateWiseSales
2405
            (Map<Integer, SaleTargetReportModel> saleTargetReportModelMap, Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws
2406
            Exception {
31697 amit.gupta 2407
        String timeString = "Today %s";
2408
        LocalDateTime now = LocalDateTime.now();
2409
 
2410
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
31886 tejbeer 2411
        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 2412
 
2413
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
2414
 
31746 amit.gupta 2415
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2416
            String email = storeGuyEntry.getKey();
2417
            Set<Integer> fofoIds = storeGuyEntry.getValue();
2418
            LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2419
 
31746 amit.gupta 2420
            if (!fofoIds.isEmpty()) {
31886 tejbeer 2421
                List<FofoStore> stores = fofoStoreRepository.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2422
 
31724 amit.gupta 2423
                Map<String, List<Integer>> stateMap = stores.stream().collect(groupingBy(
2424
                        x -> x.getCode().substring(0, 2), mapping(x -> x.getId(), Collectors.toList())));
31697 amit.gupta 2425
                List<List<Serializable>> stateWiseSales = new ArrayList<>();
2426
                for (Map.Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
31886 tejbeer 2427
                    long totalQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2428
                    double totalSale = stateMapEntry.getValue().stream().collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2429
                    long smartPhoneQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
31697 amit.gupta 2430
                    double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2431
                            Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2432
                    stateWiseSales.add(
2433
                            Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2434
                }
2435
                StringBuilder sb = new StringBuilder();
2436
                sb.append("<html><body>");
2437
                sb.append("<p>Statewise Sale Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2438
                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 2439
                for (List<Serializable> stateSale : stateWiseSales) {
2440
                    sb.append("<tr>");
2441
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2442
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2443
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2444
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2445
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2446
                    sb.append("</tr>");
2447
                }
2448
                sb.append("</tbody></table><br><br>");
26945 amit.gupta 2449
 
31697 amit.gupta 2450
                sb.append("<p>Partnerwise Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2451
                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 2452
 
2453
 
31886 tejbeer 2454
                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 2455
 
31697 amit.gupta 2456
                String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 2457
 
31886 tejbeer 2458
                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 2459
                List<List<?>> rows = new ArrayList<>();
2460
                for (Integer fofoId : sortedSaleTargetReport) {
2461
                    FofoReportingModel fofoReportingModel = partnerSalesHeadersMap.get(fofoId);
31886 tejbeer 2462
                    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 2463
                    ));
31169 tejbeer 2464
 
31724 amit.gupta 2465
                    //Now try to populate html rows
2466
                    if (!saleTargetReportModelMap.get(fofoId).getActivationType().equals(ActivationType.ACTIVE)) {
31697 amit.gupta 2467
                        continue;
2468
                    }
2469
                    if (saleTargetReportModelMap.get(fofoId).getSecondary() == 0) {
2470
                        sb.append("<tr style='background-color:#D21F3C;color:white'>");
2471
                    } else {
2472
                        sb.append("<tr>");
2473
                    }
31886 tejbeer 2474
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2475
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2476
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessManager() + "</td>");
2477
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2478
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2479
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSecondary() + "</td>");
2480
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2481
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2482
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
31697 amit.gupta 2483
                    sb.append("</tr>");
24841 govind 2484
 
25300 tejbeer 2485
 
31697 amit.gupta 2486
                }
2487
                sb.append("</tr>");
2488
                sb.append("</body></html>");
2489
                String statewiseSaleReport = sb.toString();
25300 tejbeer 2490
 
2491
 
31697 amit.gupta 2492
                ByteArrayOutputStream baos = null;
2493
                try {
2494
                    baos = FileUtil.getCSVByteStream(headers, rows);
2495
                } catch (Exception e2) {
2496
                    e2.printStackTrace();
2497
                }
2498
                Attachment attachment = new Attachment("PartnerSalePerformance.csv", new ByteArrayResource(baos.toByteArray()));
2499
                Utils.sendHtmlMailWithAttachments(googleMailSender, new String[]{email}, null, "Statewise " + subject, statewiseSaleReport, attachment);
2500
            }
2501
        }
2502
    }
29668 tejbeer 2503
 
32350 amit.gupta 2504
 
32482 amit.gupta 2505
    private void sendMailOfHtmlFormat(JavaMailSender sender, String[] email, String body, String cc[], String subject) throws
2506
            MessagingException, ProfitMandiBusinessException, IOException {
32350 amit.gupta 2507
        MimeMessage message = sender.createMimeMessage();
31697 amit.gupta 2508
        MimeMessageHelper helper = new MimeMessageHelper(message);
2509
        helper.setSubject(subject);
2510
        helper.setText(body, true);
2511
        helper.setTo(email);
2512
        if (cc != null) {
2513
            helper.setCc(cc);
2514
        }
2515
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2516
        helper.setFrom(senderAddress);
2517
        mailSender.send(message);
2518
    }
25694 amit.gupta 2519
 
31697 amit.gupta 2520
    public void sendNotification() throws Exception {
32610 amit.gupta 2521
        List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllPendingNotifications();
31697 amit.gupta 2522
        if (!pushNotifications.isEmpty()) {
2523
            for (PushNotifications pushNotification : pushNotifications) {
2524
                Device device = deviceRepository.selectById(pushNotification.getDeviceId());
31886 tejbeer 2525
                NotificationCampaign notificationCampaign = notificationCampaignRepository.selectById(pushNotification.getNotificationCampaignid());
2526
                SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(), SimpleCampaignParams.class);
31697 amit.gupta 2527
                Campaign campaign = new SimpleCampaign(scp);
2528
                String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
2529
                JSONObject json = new JSONObject();
2530
                json.put("to", device.getFcmId());
2531
                JSONObject jsonObj = new JSONObject();
2532
                jsonObj.put("message", campaign.getMessage());
2533
                jsonObj.put("title", campaign.getTitle());
2534
                jsonObj.put("type", campaign.getType());
2535
                jsonObj.put("url", result_url);
2536
                jsonObj.put("time_to_live", campaign.getExpireTimestamp());
2537
                jsonObj.put("image", campaign.getImageUrl());
2538
                jsonObj.put("largeIcon", "large_icon");
2539
                jsonObj.put("smallIcon", "small_icon");
2540
                jsonObj.put("vibrate", 1);
2541
                jsonObj.put("pid", pushNotification.getId());
2542
                jsonObj.put("sound", 1);
2543
                jsonObj.put("priority", "high");
2544
                json.put("data", jsonObj);
2545
                try {
2546
                    CloseableHttpClient client = HttpClients.createDefault();
2547
                    HttpPost httpPost = new HttpPost(FCM_URL);
25694 amit.gupta 2548
 
31697 amit.gupta 2549
                    httpPost.setHeader("Content-Type", "application/json; utf-8");
2550
                    httpPost.setHeader("authorization", "key=" + FCM_API_KEY);
2551
                    StringEntity entity = new StringEntity(json.toString());
2552
                    httpPost.setEntity(entity);
2553
                    CloseableHttpResponse response = client.execute(httpPost);
30858 amit.gupta 2554
 
31697 amit.gupta 2555
                    if (response.getStatusLine().getStatusCode() == 200) {
2556
                        pushNotification.setSentTimestamp(LocalDateTime.now());
2557
                    } else {
2558
                        pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2559
                        LOGGER.info("message" + "not sent");
2560
                        response.toString();
2561
                    }
25694 amit.gupta 2562
 
31697 amit.gupta 2563
                } catch (Exception e) {
2564
                    e.printStackTrace();
2565
                    pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2566
                    LOGGER.info("message " + "not sent " + e.getMessage());
2567
                }
2568
            }
2569
        }
2570
    }
25721 tejbeer 2571
 
31697 amit.gupta 2572
    public void grouping() throws Exception {
2573
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2574
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
31886 tejbeer 2575
        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 2576
        Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
2577
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
2578
            if (priceDropIMEI.getPartnerId() == 0)
2579
                continue;
2580
            HashSet<String> imeis = new HashSet<>();
2581
            PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2582
            imeis.add(priceDropIMEI.getImei());
31886 tejbeer 2583
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
31697 amit.gupta 2584
            if (inventoryItems.size() == 0) {
2585
                LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
2586
                continue;
2587
            }
2588
            InventoryItem inventoryItem = inventoryItems.get(0);
2589
            CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
31886 tejbeer 2590
            if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) || inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
31697 amit.gupta 2591
                // check if pricedrop has been rolled out
31886 tejbeer 2592
                List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(), priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
31697 amit.gupta 2593
                if (uwh.size() > 0) {
2594
                    Item item = itemRepository.selectById(inventoryItem.getItemId());
31886 tejbeer 2595
                    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 2596
                }
2597
            }
2598
        }
2599
    }
25721 tejbeer 2600
 
31697 amit.gupta 2601
    public void toffeeRollback() throws Exception {
2602
        toffeeService.cancelPolicyCopy("110143521986");
2603
        toffeeService.getOrderId("110143521986");
2604
    }
27212 tejbeer 2605
 
31697 amit.gupta 2606
    public void attachToffeeInvoices() throws Exception {
31886 tejbeer 2607
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
31697 amit.gupta 2608
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2609
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2610
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2611
            InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2612
            java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2613
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
31886 tejbeer 2614
            String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2615
            boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
31697 amit.gupta 2616
            if (attached) {
2617
                insurancePolicy.setPosted(true);
2618
            }
2619
        }
2620
    }
25721 tejbeer 2621
 
31697 amit.gupta 2622
    public void sendBAGPendingPolicies() throws Exception {
31886 tejbeer 2623
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4, Optional.of(false));
31697 amit.gupta 2624
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2625
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2626
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2627
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2628
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2629
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2630
            BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
2631
            // bagInsuranceModel.setModelId();
2632
            bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2633
            bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2634
            bagInsuranceModel.setCity(customerAddress.getCity());
2635
            bagInsuranceModel.setBrandWarranty("1 Year");
2636
            Item item = itemRepository.selectById(fofoOrderItem.getId());
2637
            bagInsuranceModel.setModelName(item.getItemDescription());
2638
            bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2639
            bagInsuranceModel.setEmail(customer.getEmailId());
2640
            bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2641
            bagInsuranceModel.setFirstName(customer.getFirstName());
2642
            bagInsuranceModel.setLastName(customer.getLastName());
2643
            bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2644
            bagInsuranceModel.setPlanId("");
2645
            insurancePolicy.setPosted(true);
2646
        }
2647
    }
25721 tejbeer 2648
 
31697 amit.gupta 2649
    public void schemeRollback(List<String> schemeIds) throws Exception {
2650
        List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
31886 tejbeer 2651
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 2652
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2653
        for (SchemeInOut sio : schemeInOuts) {
2654
            Scheme scheme = schemesMap.get(sio.getSchemeId());
2655
            if (scheme.getType().equals(SchemeType.IN)) {
25721 tejbeer 2656
 
31697 amit.gupta 2657
            } else if (scheme.getType().equals(SchemeType.OUT)) {
2658
                InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2659
                List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
31886 tejbeer 2660
                ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE)).max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2661
                if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime()) || scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 2662
                    sio.setRolledBackTimestamp(LocalDateTime.now());
2663
                    FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
31886 tejbeer 2664
                    String rollbackReason = "Scheme reversed for " + itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - " + fofoOrder.getInvoiceNumber();
2665
                    walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(), scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason, LocalDateTime.now());
2666
                    System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(), rollbackReason);
31697 amit.gupta 2667
                }
2668
            }
2669
        }
2670
        // throw new Exception();
2671
    }
25721 tejbeer 2672
 
31697 amit.gupta 2673
    public void checkfocusedModelInPartnerStock() throws Exception {
25721 tejbeer 2674
 
31886 tejbeer 2675
        List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).map(x -> x.getId()).collect(Collectors.toList());
2676
        Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
31697 amit.gupta 2677
        Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2678
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
25721 tejbeer 2679
 
31886 tejbeer 2680
        Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
31697 amit.gupta 2681
        Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2682
        for (Integer fofoId : fofoIds) {
2683
            List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2684
            focusedModelShortageReportMap.put(fofoId, focusedModelShortageList);
2685
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
2686
            Map<Integer, Integer> processingOrderMap = null;
2687
            Map<Integer, Integer> catalogIdAndQtyMap = null;
2688
            Map<Integer, Integer> grnPendingOrdersMap = null;
25721 tejbeer 2689
 
31886 tejbeer 2690
            Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoId).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
25721 tejbeer 2691
 
31697 amit.gupta 2692
            if (!currentInventorySnapshot.isEmpty()) {
31886 tejbeer 2693
                catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
25800 tejbeer 2694
 
31697 amit.gupta 2695
            }
25800 tejbeer 2696
 
31886 tejbeer 2697
            Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2698
            if (!grnPendingOrders.isEmpty()) {
31886 tejbeer 2699
                grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
25721 tejbeer 2700
 
31697 amit.gupta 2701
            }
25721 tejbeer 2702
 
31886 tejbeer 2703
            Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoId, orderStatusList).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
31697 amit.gupta 2704
            if (!processingOrder.isEmpty()) {
31886 tejbeer 2705
                processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> processingOrder.get(x.getId()))));
25721 tejbeer 2706
 
31697 amit.gupta 2707
            }
25721 tejbeer 2708
 
31886 tejbeer 2709
            List<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name")).collect(Collectors.toList());
28526 tejbeer 2710
 
31886 tejbeer 2711
            List<Integer> regionIds = partnerRegionRepository.selectByfofoId(fofoId).stream().map(x -> x.getRegionId()).collect(Collectors.toList());
31697 amit.gupta 2712
            LOGGER.info("regionIds" + regionIds);
2713
            if (regionIds.size() == 0) {
2714
                LOGGER.info("No region found for partner {}", fofoId);
2715
                continue;
2716
            }
31886 tejbeer 2717
            Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = focusedModelRepository.selectAllByRegionIds(regionIds).stream().collect(groupingBy(FocusedModel::getCatalogId, mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
25721 tejbeer 2718
 
31697 amit.gupta 2719
            LOGGER.info("focusedCatalogIdAndQtyMap" + focusedCatalogIdAndQtyMap);
32060 amit.gupta 2720
 
32048 tejbeer 2721
            Map<String, RetailerBlockBrands> retailerBlockBrands = retailerBlockBrandsRepository.selectAllByRetailer(fofoId).stream().collect(Collectors.toMap(x -> x.getBlockBrands(), x -> x));
31388 amit.gupta 2722
 
32048 tejbeer 2723
 
31697 amit.gupta 2724
            for (Map.Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
2725
                int minQty = entry.getValue().get();
2726
                int inStockQty = 0;
2727
                int processingQty = 0;
2728
                int grnPendingQty = 0;
2729
                int allColorNetAvailability = 0;
2730
                int allColorPoAvailability = 0;
2731
                if (processingOrderMap != null) {
31886 tejbeer 2732
                    processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0 : processingOrderMap.get(entry.getKey());
31388 amit.gupta 2733
 
31697 amit.gupta 2734
                }
2735
                if (grnPendingOrdersMap != null) {
31886 tejbeer 2736
                    grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0 : grnPendingOrdersMap.get(entry.getKey());
25721 tejbeer 2737
 
31697 amit.gupta 2738
                }
2739
                if (catalogIdAndQtyMap != null) {
31886 tejbeer 2740
                    inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0 : catalogIdAndQtyMap.get(entry.getKey());
27213 tejbeer 2741
 
31697 amit.gupta 2742
                }
25721 tejbeer 2743
 
31697 amit.gupta 2744
                int grnStockQty = grnPendingQty + inStockQty;
2745
                int totalQty = processingQty + grnPendingQty + inStockQty;
27208 tejbeer 2746
 
31697 amit.gupta 2747
                int shortageQty = minQty - totalQty;
2748
                List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
28528 tejbeer 2749
 
31697 amit.gupta 2750
                TagListing tagListing = tagListingRepository.selectByCatalogId(entry.getKey());
27208 tejbeer 2751
 
31697 amit.gupta 2752
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
25721 tejbeer 2753
 
31886 tejbeer 2754
                Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
27233 tejbeer 2755
 
31886 tejbeer 2756
                Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
29801 manish 2757
 
31697 amit.gupta 2758
                for (Item item : items) {
2759
                    List<SaholicCIS> currentAvailability = null;
2760
                    List<SaholicPOItem> poItemAvailability = null;
2761
                    if (itemAvailabilityMap != null) {
2762
                        currentAvailability = itemAvailabilityMap.get(item.getId());
2763
                    }
25721 tejbeer 2764
 
31697 amit.gupta 2765
                    if (poItemAvailabilityMap != null) {
2766
                        poItemAvailability = poItemAvailabilityMap.get(item.getId());
2767
                    }
2768
                    if (currentAvailability != null) {
31886 tejbeer 2769
                        allColorNetAvailability += currentAvailability.stream().collect(Collectors.summingInt(SaholicCIS::getNetavailability));
31697 amit.gupta 2770
                    }
25800 tejbeer 2771
 
31697 amit.gupta 2772
                    if (poItemAvailability != null) {
31886 tejbeer 2773
                        allColorPoAvailability += poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
31697 amit.gupta 2774
                    }
25800 tejbeer 2775
 
31697 amit.gupta 2776
                }
25721 tejbeer 2777
 
31697 amit.gupta 2778
                FocusedModelShortageModel fm = new FocusedModelShortageModel();
2779
                fm.setFofoId(fofoId);
2780
                fm.setStoreCode(fofoStore.getCode());
2781
                fm.setStoreName(customRetailer.getBusinessName());
2782
                fm.setBrandName(items.get(0).getBrand());
2783
                fm.setModelName(items.get(0).getModelName());
2784
                fm.setModelNumber(items.get(0).getModelNumber());
2785
                fm.setGrnStockQty(grnStockQty);
2786
                fm.setPendingIndentQty(processingQty);
2787
                fm.setShortageQty(shortageQty);
2788
                fm.setPoAvailability(allColorPoAvailability);
2789
                fm.setDp(tagListing.getSellingPrice());
2790
                fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
2791
                fm.setStateManager(partnerIdSalesHeadersMap.get(fofoId).getRegionalManager());
2792
                fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoId).getTerritoryManager());
2793
                fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
2794
                fm.setAvailability(allColorNetAvailability);
25721 tejbeer 2795
 
31697 amit.gupta 2796
                focusedModelShortageList.add(fm);
2797
            }
25721 tejbeer 2798
 
31697 amit.gupta 2799
        }
2800
        if (!focusedModelShortageReportMap.isEmpty()) {
2801
            String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2802
            Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
2803
            Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
25721 tejbeer 2804
 
31697 amit.gupta 2805
            focusedModelShortageReportMap.entrySet().forEach(x -> {
2806
                storeGuyMap.entrySet().forEach(y -> {
28526 tejbeer 2807
 
31697 amit.gupta 2808
                    if (y.getValue().contains(x.getKey())) {
2809
                        if (!emailRowsMap.containsKey(y.getKey())) {
2810
                            emailRowsMap.put(y.getKey(), new ArrayList<>());
2811
                        }
31886 tejbeer 2812
                        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 2813
                        emailRowsMap.get(y.getKey()).addAll(fms);
29995 tejbeer 2814
 
31697 amit.gupta 2815
                    }
29995 tejbeer 2816
 
31697 amit.gupta 2817
                });
25721 tejbeer 2818
 
31697 amit.gupta 2819
            });
25721 tejbeer 2820
 
31886 tejbeer 2821
            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 2822
            emailRowsMap.entrySet().forEach(entry -> {
25721 tejbeer 2823
 
31697 amit.gupta 2824
                ByteArrayOutputStream baos = null;
2825
                try {
2826
                    baos = FileUtil.getCSVByteStream(headers, entry.getValue());
2827
                } catch (Exception e2) {
2828
                    e2.printStackTrace();
2829
                }
2830
                String[] sendToArray = new String[]{
25721 tejbeer 2831
 
31886 tejbeer 2832
                        entry.getKey(), "apurve.shrivastava@smartdukaan.com", "puneet.bisht@smartdukaan.com"
25721 tejbeer 2833
 
31697 amit.gupta 2834
                };
25721 tejbeer 2835
 
31886 tejbeer 2836
 
31697 amit.gupta 2837
                try {
31886 tejbeer 2838
                    Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 2839
                } catch (Exception e1) { // TODO Auto-generated catch block
2840
                    e1.printStackTrace();
2841
                }
25721 tejbeer 2842
 
31697 amit.gupta 2843
            });
2844
        }
2845
    }
25721 tejbeer 2846
 
31697 amit.gupta 2847
    private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2848
        StringBuilder sb = new StringBuilder();
2849
        sb.append("Focused Model Shortage in Your Stock : \n");
2850
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2851
 
31697 amit.gupta 2852
            sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2853
            sb.append(String.format("%n", ""));
2854
        }
2855
        return sb.toString();
2856
    }
25721 tejbeer 2857
 
31697 amit.gupta 2858
    private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2859
        MimeMessage message = mailSender.createMimeMessage();
2860
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
25721 tejbeer 2861
 
31697 amit.gupta 2862
        helper.setSubject(subject);
2863
        helper.setText(messageText, true);
2864
        helper.setTo(email);
2865
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2866
        helper.setFrom(senderAddress);
2867
        mailSender.send(message);
25721 tejbeer 2868
 
31697 amit.gupta 2869
    }
25721 tejbeer 2870
 
31697 amit.gupta 2871
    private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2872
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2873
        sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2874
        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 2875
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2876
 
31697 amit.gupta 2877
            sb.append("<tr>");
2878
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
25936 amit.gupta 2879
 
31697 amit.gupta 2880
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
26790 tejbeer 2881
 
31697 amit.gupta 2882
            sb.append("</tr>");
25927 amit.gupta 2883
 
31697 amit.gupta 2884
        }
26790 tejbeer 2885
 
31697 amit.gupta 2886
        sb.append("</tbody></table></body></html>");
26945 amit.gupta 2887
 
31697 amit.gupta 2888
        return sb.toString();
2889
    }
26945 amit.gupta 2890
 
31697 amit.gupta 2891
    public void notifyLead() throws Exception {
31886 tejbeer 2892
        List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2893
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
31697 amit.gupta 2894
        LOGGER.info("authUserEmailMap {}", authUserEmailMap);
31886 tejbeer 2895
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25982 amit.gupta 2896
 
31697 amit.gupta 2897
        LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26283 tejbeer 2898
 
31697 amit.gupta 2899
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26283 tejbeer 2900
 
31697 amit.gupta 2901
        for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2902
            int authId = authUserEmail.getKey();
2903
            String email = authUserEmail.getValue();
2904
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2905
        }
2906
        LOGGER.info("authUserKeyMap", authUserKeyMap);
2907
        LOGGER.info("leadsToNotify {}", leadsToNotify);
26283 tejbeer 2908
 
31697 amit.gupta 2909
        String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
2910
        for (Lead lead : leadsToNotify) {
2911
            if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2912
                LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
2913
                continue;
2914
            }
2915
            String title = "Leads followup Reminder";
31886 tejbeer 2916
            String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(), lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
31697 amit.gupta 2917
            String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
2918
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2919
            sendNotificationModel.setCampaignName("Lead Reminder");
2920
            sendNotificationModel.setTitle(title);
2921
            sendNotificationModel.setMessage(notificationMessage);
2922
            sendNotificationModel.setType("url");
2923
            sendNotificationModel.setUrl(url);
2924
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
2925
            sendNotificationModel.setMessageType(MessageType.reminder);
2926
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
2927
            System.out.println(sendNotificationModel);
2928
            notificationService.sendNotification(sendNotificationModel);
2929
        }
2930
    }
26790 tejbeer 2931
 
32350 amit.gupta 2932
    @Autowired
2933
    AuthService authService;
2934
 
2935
    public void sendUnscheduledFollowUpMail() throws Exception {
2936
        List<Lead> missedScheduleLeads = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay().minusDays(30), LocalDateTime.now().toLocalDate().atStartOfDay());
2937
        List<Lead> leadsScheduledForToday = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay(), LocalDate.now().atTime(LocalTime.MAX));
2938
        List<Integer> authIds = missedScheduleLeads.stream().map(x -> x.getAssignTo()).distinct().collect(Collectors.toList());
2939
        LOGGER.info(authIds.size());
2940
        Map<Integer, AuthUser> authUserMap = authRepository.selectAllAuthUserByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
2941
        LOGGER.info(authUserMap.size());
2942
        //if(true) return;
2943
 
2944
        missedScheduleLeads = missedScheduleLeads.stream().sorted(Comparator.comparing(Lead::getState, String.CASE_INSENSITIVE_ORDER).thenComparing(Lead::getAssignTo).thenComparing(Lead::getScheduledTimestamp)).collect(Collectors.toList());
2945
        //leadsScheduledForToday
2946
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
2947
        LOGGER.info("Auth Users Size - {}", authUsers.size());
2948
        for (AuthUser authUser : authUsers) {
2949
            LOGGER.info("Auth Name - {}", authUser.getFullName());
2950
            List<Integer> reporteeAuthIds = authService.getAllReportees(authUser.getId());
2951
            reporteeAuthIds.add(authUser.getId());
2952
            StringBuilder sb = new StringBuilder();
2953
            sb.append("<html><body>");
2954
            List<Lead> authMissedScheduledLeads = missedScheduleLeads.stream().filter(x -> reporteeAuthIds.contains(x.getAssignTo())).collect(Collectors.toList());
2955
            LOGGER.info("authMissedScheduledLeads {}", authMissedScheduledLeads.size());
2956
            if (authMissedScheduledLeads.size() > 0) {
2957
                addMissedScheduledLeadsTable(sb, authMissedScheduledLeads, authUserMap);
2958
                sb.append("</body></html>");
2959
 
2960
                String subject = "Lead Updates Summary";
32421 amit.gupta 2961
                String[] email = Arrays.asList(authUser.getEmailId()).toArray(new String[1]);
2962
                //String[] email = Arrays.asList("amit.gupta@smartdukaan.com").toArray(new String[1]);
32350 amit.gupta 2963
                this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
32421 amit.gupta 2964
                //break;
32350 amit.gupta 2965
            }
2966
        }
2967
 
2968
    }
2969
 
32482 amit.gupta 2970
    private void addMissedScheduledLeadsTable(StringBuilder
2971
                                                      sb, List<Lead> missedScheduleLeads, Map<Integer, AuthUser> authUserMap) {
32350 amit.gupta 2972
        sb.append("<h3>Leads That Missed the schedule</h3>");
32439 tejbeer 2973
        sb.append("<table style='border:1px solid black' cellspacing='0'>").append("<tr>").append("<th style='border:1px solid black;padding: 5px'>").append("Lead Id").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Lead Name").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Mobile No").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("City").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("State").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Created On").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Assigned To").append("</th>").append("<th style='border:1px solid black;padding: 5px'>").append("Scheduled On").append("</th>").append("</tr>");
32350 amit.gupta 2974
        for (Lead lead : missedScheduleLeads) {
32439 tejbeer 2975
            sb.append("<tr style='background-color:").append(lead.getColor()).append("'>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getId()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getFullName()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getLeadMobile()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getCity()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(lead.getState()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(FormattingUtils.formatDate(lead.getCreatedTimestamp())).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(
2976
                    authUserMap.containsKey(lead.getAssignTo()) ? authUserMap.get(lead.getAssignTo()).getFullName() : lead.getAssignTo()).append("</td>").append("<td style='border:1px solid black;padding: 5px'>").append(FormattingUtils.formatDate(lead.getScheduledTimestamp())).append("</td>").append("</tr>");
32350 amit.gupta 2977
        }
2978
        sb.append("</table>");
2979
    }
2980
 
31697 amit.gupta 2981
    public void notifyVisits() throws Exception {
31886 tejbeer 2982
        List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2983
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
2984
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
31697 amit.gupta 2985
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26790 tejbeer 2986
 
31697 amit.gupta 2987
        for (Map.Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
2988
            int authId = authUserEmail.getKey();
2989
            String email = authUserEmail.getValue();
2990
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2991
        }
2992
        String visitTemplate = "Planned visit to franchisee %s is due by %s";
2993
        String followupTemplate = "Lead followup for franchisee %s is due by %s";
2994
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
2995
        for (FranchiseeVisit visit : franchiseeVisits) {
2996
            if (authUserKeyMap.containsKey(visit.getAuthId())) {
2997
                continue;
2998
            }
2999
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
3000
            String message = null;
3001
            if (visit.getFranchiseActivityId() == 0) {
31886 tejbeer 3002
                message = String.format(visitTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3003
                sendNotificationModel.setCampaignName("Franchisee visit Reminder");
3004
            } else {
31886 tejbeer 3005
                message = String.format(followupTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3006
                sendNotificationModel.setCampaignName("Franchisee followup Reminder");
3007
            }
3008
            sendNotificationModel.setMessage(message);
3009
            sendNotificationModel.setType("url");
3010
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3011
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
3012
            sendNotificationModel.setMessageType(MessageType.reminder);
3013
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
3014
            // notificationService.sendNotification(sendNotificationModel);
3015
        }
3016
    }
26792 tejbeer 3017
 
31697 amit.gupta 3018
    public void ticketClosed() throws Exception {
26790 tejbeer 3019
 
31697 amit.gupta 3020
        List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
3021
        for (Ticket ticket : tickets) {
3022
            if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
3023
                ticket.setCloseTimestamp(LocalDateTime.now());
3024
                ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
3025
                ticket.setUpdateTimestamp(LocalDateTime.now());
3026
                ticketRepository.persist(ticket);
3027
            }
3028
        }
26790 tejbeer 3029
 
31697 amit.gupta 3030
    }
26790 tejbeer 3031
 
31697 amit.gupta 3032
    public void checkValidateReferral() throws Exception {
26790 tejbeer 3033
 
31697 amit.gupta 3034
        List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
3035
        LOGGER.info("referrals" + referrals);
3036
        if (!referrals.isEmpty()) {
3037
            String subject = "Referral Request";
3038
            String messageText = this.getMessageForReferral(referrals);
26790 tejbeer 3039
 
31697 amit.gupta 3040
            MimeMessage message = mailSender.createMimeMessage();
3041
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
3042
            String[] email = {"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com"};
3043
            helper.setSubject(subject);
3044
            helper.setText(messageText, true);
3045
            helper.setTo(email);
3046
            InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3047
            helper.setFrom(senderAddress);
3048
            mailSender.send(message);
26790 tejbeer 3049
 
31697 amit.gupta 3050
        }
3051
    }
26790 tejbeer 3052
 
31697 amit.gupta 3053
    private String getMessageForReferral(List<Refferal> referrals) {
3054
        StringBuilder sb = new StringBuilder();
31886 tejbeer 3055
        sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3056
        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 3057
        for (Refferal entry : referrals) {
26790 tejbeer 3058
 
31697 amit.gupta 3059
            sb.append("<tr>");
3060
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
30421 tejbeer 3061
 
31697 amit.gupta 3062
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
3063
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
3064
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
3065
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
3066
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
30421 tejbeer 3067
 
31697 amit.gupta 3068
            sb.append("</tr>");
30421 tejbeer 3069
 
31697 amit.gupta 3070
        }
30421 tejbeer 3071
 
31697 amit.gupta 3072
        sb.append("</tbody></table></body></html>");
30421 tejbeer 3073
 
31697 amit.gupta 3074
        return sb.toString();
3075
    }
30421 tejbeer 3076
 
32832 amit.gupta 3077
    private String getMessageForRBMEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
32482 amit.gupta 3078
            ProfitMandiBusinessException {
31697 amit.gupta 3079
        StringBuilder sb = new StringBuilder();
32832 amit.gupta 3080
        sb.append("<html><body><p>Alert</p><p>Escalated by RBM-L1:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3081
        sb.append("<tbody>" +
3082
                "<tr>" +
3083
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3084
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3085
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3086
                "</tr>");
30421 tejbeer 3087
 
31697 amit.gupta 3088
        for (PartnerCollectionRemark entry : pcrs) {
30421 tejbeer 3089
 
31697 amit.gupta 3090
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30421 tejbeer 3091
 
31697 amit.gupta 3092
            sb.append("<tr>");
31886 tejbeer 3093
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3094
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
32832 amit.gupta 3095
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
28205 tejbeer 3096
 
31697 amit.gupta 3097
            sb.append("</tr>");
28205 tejbeer 3098
 
31697 amit.gupta 3099
        }
28205 tejbeer 3100
 
31697 amit.gupta 3101
        sb.append("</tbody></table></body></html>");
28205 tejbeer 3102
 
31697 amit.gupta 3103
        return sb.toString();
3104
    }
28208 tejbeer 3105
 
32795 amit.gupta 3106
    private String getMessageForSalesEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
3107
            ProfitMandiBusinessException {
3108
        StringBuilder sb = new StringBuilder();
3109
        sb.append("<html><body><p>Alert</p><p>Escalated to Sales Team:-</p>" + "<br/>" +
3110
                "<table style='border:1px solid black ;padding: 5px';>");
3111
        sb.append("<tbody>" +
3112
                "<tr>" +
3113
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3114
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3115
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3116
                "</tr>");
3117
        for (PartnerCollectionRemark entry : pcrs) {
3118
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3119
            sb.append("<tr>");
3120
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3121
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3122
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
3123
            sb.append("</tr>");
3124
        }
3125
 
3126
        sb.append("</tbody></table></body></html>");
3127
 
3128
        return sb.toString();
3129
    }
3130
 
33078 ranu 3131
    private String getMessageForUnauthorizedBuying(List<NonSdBuying> nsb) throws
3132
            ProfitMandiBusinessException {
3133
        StringBuilder sb = new StringBuilder();
3134
        sb.append("<html><body><p>Alert</p><p>Unauthorized Buying-</p>" + "<br/>" +
3135
                "<table style='border:1px solid black ;padding: 5px';>");
3136
        sb.append("<tbody>" +
3137
                "<tr>" +
3138
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3139
                "<th style='border:1px solid black;padding: 5px'>Brand Name</th>" +
3140
                "<th style='border:1px solid black;padding: 5px'>Brand Value</th>" +
3141
                "<th style='border:1px solid black;padding: 5px'>Created At</th>" +
3142
                "<th style='border:1px solid black;padding: 5px'>Reason</th>" +
3143
                "</tr>");
3144
        for (NonSdBuying entry : nsb) {
3145
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3146
            List<Integer> brandIds = Collections.singletonList(entry.getBrandId());
3147
            BrandCatalog brandsDisplay = brandsRepository.selectByIds(brandIds).get(0);
3148
            sb.append("<tr>");
3149
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3150
            sb.append("<td style='border:1px solid black;padding: 5px'>" + brandsDisplay.getName() + "</td>");
3151
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getBrandValue() + "</td>");
3152
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3153
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getReason() + "</td>");
3154
            sb.append("</tr>");
3155
        }
3156
 
3157
        sb.append("</tbody></table></body></html>");
3158
 
3159
        return sb.toString();
3160
    }
3161
 
31697 amit.gupta 3162
    public void reverseWallet() throws Exception {
3163
        LocalDate localDate = LocalDate.of(2020, 10, 28);
31886 tejbeer 3164
        List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 3165
        for (UserWalletHistory uwh : uwhList) {
3166
            if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
3167
                UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
3168
                // LOGGER.info("UWH - {}", uwh);
3169
                // amount += uwh.getAmount();
3170
                // System.out.println("Amount is - " + amount);
3171
                // walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
3172
                // uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
3173
                // run", uwh.getBusinessTimestamp());
3174
                int orderId = uwh.getReference();
3175
                FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
3176
                int inventoryItemId = 0;
3177
                // fofoOrderRepository.delete(fofoOrder);
3178
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3179
                /*
3180
                 * List<PaymentOptionTransaction> paymentOptionTransactions =
3181
                 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
3182
                 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
3183
                 * paymentOptionTransaction : paymentOptionTransactions) {
3184
                 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
3185
                 */
3186
                for (FofoOrderItem foi : fofoOrderItems) {
3187
                    // fofoOrderItemRepository.delete(foi);
3188
                    List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
3189
                    for (FofoLineItem fli : flis) {
3190
                        // fofoLineItemRepository.delete(fli);
3191
                        inventoryItemId = fli.getInventoryItemId();
3192
                    }
3193
                }
3194
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
3195
                        java.util.stream.Stream.of(inventoryItemId).collect(Collectors.toSet()));
3196
                for (SchemeInOut sio : schemeInOuts) {
3197
                    if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
3198
                        LOGGER.info("SIO - {}", sio);
3199
                        sio.setRolledBackTimestamp(LocalDateTime.now());
3200
                    }
3201
                }
28208 tejbeer 3202
 
31697 amit.gupta 3203
            }
3204
        }
28208 tejbeer 3205
 
31697 amit.gupta 3206
    }
28208 tejbeer 3207
 
31697 amit.gupta 3208
    public void partnerProblemAlert() throws Exception {
3209
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
3210
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
3211
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
31886 tejbeer 3212
        Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
3213
        Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3214
 
31697 amit.gupta 3215
        for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
28208 tejbeer 3216
 
31697 amit.gupta 3217
            double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 3218
 
31697 amit.gupta 3219
            LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
28208 tejbeer 3220
 
31697 amit.gupta 3221
            double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28205 tejbeer 3222
 
31697 amit.gupta 3223
            LOGGER.info("mtdSale" + mtdSale);
28205 tejbeer 3224
 
31886 tejbeer 3225
            double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 3226
 
31697 amit.gupta 3227
            LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
28205 tejbeer 3228
 
31697 amit.gupta 3229
            double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28205 tejbeer 3230
 
31697 amit.gupta 3231
            LOGGER.info("stockInvestment" + stockInvestment);
28205 tejbeer 3232
 
31697 amit.gupta 3233
            boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
28205 tejbeer 3234
 
31697 amit.gupta 3235
            PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
28205 tejbeer 3236
 
31697 amit.gupta 3237
            if (partnerProblem == null) {
3238
                partnerProblem = new PartnerProblem();
3239
                partnerProblem.setFofoId(ls.getKey());
3240
                if (mtdSale < lmtdTwentyPercentSale) {
3241
                    partnerProblem.setMtd(1);
3242
                }
3243
                if (Investmentvalue) {
3244
                    partnerProblem.setInvestment(1);
3245
                }
28205 tejbeer 3246
 
31697 amit.gupta 3247
                if (stockInvestment < totalSixtyPercentInvestment) {
3248
                    partnerProblem.setInvestment(1);
3249
                }
28205 tejbeer 3250
 
31697 amit.gupta 3251
                partnerProblemRepository.persist(partnerProblem);
3252
            } else {
3253
                if (mtdSale < lmtdTwentyPercentSale) {
3254
                    partnerProblem.setMtd(partnerProblem.getMtd() + 1);
28213 tejbeer 3255
 
31697 amit.gupta 3256
                } else {
3257
                    partnerProblem.setMtd(0);
28227 tejbeer 3258
 
31697 amit.gupta 3259
                }
3260
                if (Investmentvalue) {
3261
                    partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
3262
                } else {
3263
                    partnerProblem.setInvestment(0);
28227 tejbeer 3264
 
31697 amit.gupta 3265
                }
3266
                if (stockInvestment < totalSixtyPercentInvestment) {
3267
                    partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
3268
                } else {
3269
                    partnerProblem.setStockInvestment(0);
3270
                }
28213 tejbeer 3271
 
31697 amit.gupta 3272
            }
28213 tejbeer 3273
 
31697 amit.gupta 3274
        }
28213 tejbeer 3275
 
31886 tejbeer 3276
        List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream().filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
28205 tejbeer 3277
 
31697 amit.gupta 3278
        partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3279
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3280
        }).collect(Collectors.toList());
28205 tejbeer 3281
 
31697 amit.gupta 3282
        Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3283
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3284
        }).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3285
 
31697 amit.gupta 3286
        Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28205 tejbeer 3287
 
31697 amit.gupta 3288
        List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28205 tejbeer 3289
 
31886 tejbeer 3290
        Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectAllAuthUserByIds(assignTo).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
28222 tejbeer 3291
 
31886 tejbeer 3292
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "sm@smartdukaan.com");
31697 amit.gupta 3293
        LOGGER.info("partnerProblem" + partnerProblems);
3294
        StringBuilder sb = new StringBuilder();
3295
        sb.append("<htl><body>");
3296
        sb.append(
3297
                "<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 3298
        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 3299
 
31697 amit.gupta 3300
                + "	    				</tr>");
28218 tejbeer 3301
 
31697 amit.gupta 3302
        for (PartnerProblem pp : partnerProblems) {
3303
            int value = pp.getFofoId() % 4;
28218 tejbeer 3304
 
31697 amit.gupta 3305
            Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
3306
            LOGGER.info("authUserMap" + authUserMap);
3307
            sb.append("<tr>");
31886 tejbeer 3308
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3309
            sb.append("<td style='border:1px solid black;padding: 5px'>" + assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
31697 amit.gupta 3310
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3311
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3312
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
31886 tejbeer 3313
            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 3314
 
31697 amit.gupta 3315
            sb.append("</tr>");
3316
        }
3317
        sb.append("</tbody></table><br><br>");
3318
        String subject = "Partner Problem Alert!";
3319
        String[] email = sendTo.toArray(new String[sendTo.size()]);
28227 tejbeer 3320
 
32350 amit.gupta 3321
        this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
28227 tejbeer 3322
 
31697 amit.gupta 3323
        Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
28224 tejbeer 3324
 
31697 amit.gupta 3325
        for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
3326
            AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
3327
            for (Integer patnerId : authUserPartner.getValue()) {
3328
                if (partnerProblemMap.get(patnerId) != null) {
28230 tejbeer 3329
 
31697 amit.gupta 3330
                    StringBuilder sbbuilder = new StringBuilder();
3331
                    sbbuilder.append("<hml><body>");
3332
                    sb.append(
3333
                            "<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 3334
                    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 3335
 
31697 amit.gupta 3336
                            + "	    				</tr>");
28205 tejbeer 3337
 
31697 amit.gupta 3338
                    for (Integer partnerId : authUserPartner.getValue()) {
3339
                        if (partnerProblemMap.get(partnerId) != null) {
3340
                            PartnerProblem pp = partnerProblemMap.get(partnerId);
3341
                            sbbuilder.append("<tr>");
31886 tejbeer 3342
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3343
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
31697 amit.gupta 3344
                            sbbuilder.append(
3345
                                    "<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
31886 tejbeer 3346
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28790 amit.gupta 3347
 
31697 amit.gupta 3348
                            sbbuilder.append("</tr>");
3349
                        }
28790 amit.gupta 3350
 
31697 amit.gupta 3351
                    }
3352
                    sbbuilder.append("</tbody></table><br><br>");
29488 manish 3353
 
32350 amit.gupta 3354
                    this.sendMailOfHtmlFormat(googleMailSender, new String[]{authUser.getEmailId()}, sbbuilder.toString(), null, subject);
31697 amit.gupta 3355
                }
29488 manish 3356
 
31697 amit.gupta 3357
            }
3358
        }
3359
    }
28775 amit.gupta 3360
 
31697 amit.gupta 3361
    @Autowired
3362
    WarehouseRepository warehouseRepository;
29488 manish 3363
 
33256 amit.gupta 3364
    public void getVendorWarehouses(int warehouseId) throws ProfitMandiBusinessException {
31697 amit.gupta 3365
        LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
29488 manish 3366
 
31697 amit.gupta 3367
    }
29488 manish 3368
 
31697 amit.gupta 3369
    public void checkImeiActivation() {
29801 manish 3370
 
31697 amit.gupta 3371
        try {
3372
            vivoImeiActivationService.checkImeiActivation();
3373
        } catch (ProfitMandiBusinessException e) {
3374
            // TODO Auto-generated catch block
3375
            e.printStackTrace();
3376
        } catch (IOException e) {
3377
            // TODO Auto-generated catch block
3378
            e.printStackTrace();
3379
        } catch (Exception e) {
3380
            // TODO Auto-generated catch block
3381
            e.printStackTrace();
3382
        }
29807 manish 3383
 
31697 amit.gupta 3384
    }
29801 manish 3385
 
31697 amit.gupta 3386
    public void checkItelImeiActivation(LocalDate date, Integer day) {
3387
        LOGGER.info("Hello - {}", "hhh");
29488 manish 3388
 
31697 amit.gupta 3389
        try {
3390
            itelImeiActivationService.checkItelImeiActivation(date, day);
3391
        } catch (ProfitMandiBusinessException e) {
3392
            // TODO Auto-generated catch block
3393
            e.printStackTrace();
3394
        } catch (IOException e) {
3395
            // TODO Auto-generated catch block
3396
            e.printStackTrace();
3397
        } catch (Exception e) {
3398
            // TODO Auto-generated catch block
3399
            e.printStackTrace();
3400
        }
29488 manish 3401
 
31697 amit.gupta 3402
    }
29488 manish 3403
 
32482 amit.gupta 3404
    public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate) throws
3405
            MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 3406
        LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
29308 tejbeer 3407
 
31697 amit.gupta 3408
        serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
29252 amit.gupta 3409
 
31697 amit.gupta 3410
    }
29451 manish 3411
 
31697 amit.gupta 3412
    public void checkTecnoImeiActivation(LocalDate date, Integer day) {
3413
        LOGGER.info("Hello - {}", "hhh");
29308 tejbeer 3414
 
31697 amit.gupta 3415
        try {
3416
            tecnoImeiActivation.checkTecnoImeiActivation(date, day);
3417
        } catch (ProfitMandiBusinessException e) {
3418
            // TODO Auto-generated catch block
3419
            e.printStackTrace();
3420
        } catch (IOException e) {
3421
            // TODO Auto-generated catch block
3422
            e.printStackTrace();
3423
        } catch (Exception e) {
3424
            // TODO Auto-generated catch block
3425
            e.printStackTrace();
3426
        }
29308 tejbeer 3427
 
31697 amit.gupta 3428
    }
29441 tejbeer 3429
 
31697 amit.gupta 3430
    public void checkCancellationMargin() throws Exception {
3431
        LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3432
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3433
        LOGGER.info("Total Orders =  {}", fofoOrders.size());
3434
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 3435
            List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3436
            history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.ACTIVATION_SCHEME));
31697 amit.gupta 3437
            int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3438
            if (Math.abs(walletSum) > 1) {
3439
                // LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3440
                // = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
3441
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3442
                List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3443
                FofoLineItem fli = flis.get(0);
3444
                if (StringUtils.isEmpty(fli.getSerialNumber()))
3445
                    continue;
31886 tejbeer 3446
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
31697 amit.gupta 3447
                InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
31886 tejbeer 3448
                double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).mapToDouble(x -> x.getAmount()).sum();
31697 amit.gupta 3449
                /*
3450
                 * if(inventoryItem.getGoodQuantity()==1) {
3451
                 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3452
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3453
                 * inventoryItem.getUpdateTimestamp()); } else
3454
                 * if(inventoryItem.getBadQuantity()==1){
3455
                 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3456
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3457
                 * inventoryItem.getUpdateTimestamp()); } else if
3458
                 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3459
                 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3460
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3461
                 * inventoryItem.getUpdateTimestamp()); }
3462
                 */
31886 tejbeer 3463
                if (inventoryItem.getLastScanType().equals(ScanType.SALE) || inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3464
                    Map<String, Double> map = schemeInOuts.stream().collect(
3465
                            groupingBy(
3466
                                    x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x.getCreateTimestamp()) + "- " + x.getSchemeId(), Collectors.summingDouble(x -> x.getAmount())));
31697 amit.gupta 3467
                    for (Map.Entry<String, Double> entry : map.entrySet()) {
3468
                        LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
3469
                    }
31886 tejbeer 3470
                    LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(), inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
31697 amit.gupta 3471
                }
3472
            }
3473
        }
29441 tejbeer 3474
 
31697 amit.gupta 3475
    }
29308 tejbeer 3476
 
31697 amit.gupta 3477
    public static String readFileAsString(String file) throws Exception {
3478
        String data = "";
3479
        data = new String(Files.readAllBytes(Paths.get(file)));
3480
        return data;
3481
    }
29308 tejbeer 3482
 
3483
 
31697 amit.gupta 3484
    public void partnerWiseCreditAccount() throws Exception {
29814 tejbeer 3485
 
31697 amit.gupta 3486
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
29814 tejbeer 3487
 
31697 amit.gupta 3488
        for (FofoStore fs : fofoStores) {
29835 tejbeer 3489
 
31697 amit.gupta 3490
            if (fs.getPan() != null) {
3491
                AccountStatusResponseOut accountStatusResponseOut = mandiiService.getStatus(fs.getPan());
29835 tejbeer 3492
 
31697 amit.gupta 3493
                LOGGER.info("accountStatusResponseOut" + accountStatusResponseOut);
31886 tejbeer 3494
                CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fs.getId(), Gateway.MANDII);
29817 tejbeer 3495
 
31697 amit.gupta 3496
                if (creditAccount == null) {
29835 tejbeer 3497
 
31697 amit.gupta 3498
                    creditAccount = new CreditAccount();
29835 tejbeer 3499
 
31697 amit.gupta 3500
                    creditAccount.setFofoId(fs.getId());
3501
                    creditAccount.setGateway(Gateway.MANDII);
29817 tejbeer 3502
 
31697 amit.gupta 3503
                }
29814 tejbeer 3504
 
31697 amit.gupta 3505
                if (accountStatusResponseOut == null) {
3506
                    creditAccount.setCreditStatus(CreditStatus.UNKNOWN);
3507
                    creditAccount.setDescription("User company not found");
30421 tejbeer 3508
 
31697 amit.gupta 3509
                } else {
3510
                    if (accountStatusResponseOut.getSanctionLimit() != null) {
3511
                        creditAccount.setSanctionedAmount(accountStatusResponseOut.getSanctionLimit().floatValue());
3512
                    } else {
3513
                        creditAccount.setSanctionedAmount(0);
3514
                    }
30421 tejbeer 3515
 
31697 amit.gupta 3516
                    creditAccount.setInterestRate(accountStatusResponseOut.getRateOfInterest());
3517
                    if (accountStatusResponseOut.getBalanceAmount() != null) {
3518
                        creditAccount.setAvailableAmount(accountStatusResponseOut.getBalanceAmount().floatValue());
3519
                    } else {
3520
                        creditAccount.setAvailableAmount(0);
3521
                    }
30421 tejbeer 3522
 
31697 amit.gupta 3523
                    if (accountStatusResponseOut.getCurrentStage() != null) {
3524
                        creditAccount.setDescription(accountStatusResponseOut.getCurrentStage().toString());
3525
                    }
3526
                    if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.SANCTION_AVAILABLE)) {
3527
                        creditAccount.setCreditStatus(CreditStatus.SANCTIONED);
3528
                    } else if (accountStatusResponseOut.getStatus().equals(EligibilityStatusEnum.IN_ELIGIBLE)) {
3529
                        creditAccount.setCreditStatus(CreditStatus.INELIGIBLE);
3530
                    } else {
30421 tejbeer 3531
 
31697 amit.gupta 3532
                        creditAccount.setCreditStatus(CreditStatus.TO_BE_EVALUATED);
3533
                    }
3534
                }
30421 tejbeer 3535
 
31697 amit.gupta 3536
                creditAccount.setUpdatedOn(LocalDateTime.now());
3537
                creditAccountRepository.persist(creditAccount);
3538
            }
3539
        }
3540
    }
30421 tejbeer 3541
 
31697 amit.gupta 3542
    @Autowired
3543
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30421 tejbeer 3544
 
32832 amit.gupta 3545
    //RBM L2 Escalations
32482 amit.gupta 3546
    public void reviewUncontactablePartner() throws
3547
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
30421 tejbeer 3548
 
31697 amit.gupta 3549
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30421 tejbeer 3550
 
32832 amit.gupta 3551
        List<Integer> partnerLastCollectionRemarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
30859 tejbeer 3552
 
32832 amit.gupta 3553
        if (!partnerLastCollectionRemarkIds.isEmpty()) {
3554
            List<PartnerCollectionRemark> partnerCollectionRemarks = partnerCollectionRemarkRepository.selectByIds(partnerLastCollectionRemarkIds);
30421 tejbeer 3555
 
33064 ranu 3556
            Map<Integer, PartnerCollectionRemark> rbmEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.RBM_L2_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
32832 amit.gupta 3557
            Map<Integer, PartnerCollectionRemark> salesEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.SALES_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 3558
 
32832 amit.gupta 3559
 
3560
            if (!rbmEscalatedRemarksMap.isEmpty()) {
3561
                //
3562
                for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
3563
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3564
                            .map(x -> rbmEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3565
                    String subject = "Partners escalated to RBM-L2";
3566
                    String messageText = this.getMessageForRBMEscalatedPartners(filteredRows);
3567
 
31697 amit.gupta 3568
                    MimeMessage message = mailSender.createMimeMessage();
3569
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3570
                    String[] email = new String[]{storeGuyEntry.getKey()};
30859 tejbeer 3571
 
31697 amit.gupta 3572
                    helper.setSubject(subject);
3573
                    helper.setText(messageText, true);
3574
                    helper.setTo(email);
31886 tejbeer 3575
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
31697 amit.gupta 3576
                    helper.setFrom(senderAddress);
3577
                    mailSender.send(message);
30859 tejbeer 3578
 
31697 amit.gupta 3579
                    LOGGER.info("filteredRows {}", filteredRows);
30859 tejbeer 3580
 
31697 amit.gupta 3581
                }
3582
            }
32832 amit.gupta 3583
            if (!salesEscalatedRemarksMap.isEmpty()) {
3584
                //
3585
                for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
3586
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3587
                            .map(x -> salesEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3588
                    String subject = "Partners escalated to Sales";
3589
                    String messageText = this.getMessageForSalesEscalatedPartners(filteredRows);
30936 tejbeer 3590
 
32832 amit.gupta 3591
                    MimeMessage message = mailSender.createMimeMessage();
3592
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3593
                    String[] email = new String[]{storeGuyEntry.getKey()};
3594
 
3595
                    helper.setSubject(subject);
3596
                    helper.setText(messageText, true);
3597
                    helper.setTo(email);
3598
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3599
                    helper.setFrom(senderAddress);
3600
                    mailSender.send(message);
3601
 
3602
                    LOGGER.info("filteredRows {}", filteredRows);
3603
 
3604
                }
3605
            }
3606
 
31697 amit.gupta 3607
        }
3608
    }
30936 tejbeer 3609
 
33078 ranu 3610
 
31697 amit.gupta 3611
    @Autowired
33078 ranu 3612
    private NonSdBuyingRepository nonSdBuyingRepository;
3613
 
3614
    //Non Sd Buying
3615
    public void reviewNonSdBuyingBrand() throws
3616
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3617
        List<NonSdBuying> nonSdByuingActiveList = nonSdBuyingRepository.selectAllActiveNonSDBuyingList(true);
3618
        Map<Integer, NonSdBuying> unAuthorizedBuyingMap = nonSdByuingActiveList.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3619
 
3620
        if (!unAuthorizedBuyingMap.isEmpty()) {
3621
            for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES), true).entrySet()) {
3622
                List<NonSdBuying> unAuthorizedfilteredRows = storeGuyEntry.getValue().stream()
3623
                        .map(x -> unAuthorizedBuyingMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
33112 amit.gupta 3624
                if (!unAuthorizedfilteredRows.isEmpty()) {
33078 ranu 3625
                    String subject = "Unauthorized Buying";
3626
                    String messageText = this.getMessageForUnauthorizedBuying(unAuthorizedfilteredRows);
3627
 
3628
                    MimeMessage message = mailSender.createMimeMessage();
3629
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3630
                    String[] email = new String[]{storeGuyEntry.getKey()};
33112 amit.gupta 3631
                    // String[] email = {"ranu.rajput@smartdukaan.com"};
33078 ranu 3632
 
3633
                    helper.setSubject(subject);
3634
                    helper.setText(messageText, true);
3635
                    helper.setTo(email);
3636
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3637
                    helper.setFrom(senderAddress);
3638
                    mailSender.send(message);
3639
                    LOGGER.info("unAuthorizedfilteredRows {}", unAuthorizedfilteredRows);
3640
                }
3641
 
3642
 
3643
            }
3644
 
3645
        }
3646
    }
3647
 
3648
    @Autowired
31697 amit.gupta 3649
    private LoanRepository loanRepository;
31020 tejbeer 3650
 
31697 amit.gupta 3651
    @Autowired
3652
    private LoanStatementRepository loanStatementRepository;
30859 tejbeer 3653
 
31697 amit.gupta 3654
    @Autowired
3655
    private SDCreditService sdCreditService;
30859 tejbeer 3656
 
31697 amit.gupta 3657
    @Autowired
3658
    private SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 3659
 
31697 amit.gupta 3660
    @Autowired
3661
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30859 tejbeer 3662
 
31697 amit.gupta 3663
    @Autowired
3664
    private TransactionRepository transactionRepository;
30859 tejbeer 3665
 
31697 amit.gupta 3666
    @Autowired
3667
    private SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 3668
 
31697 amit.gupta 3669
    public void calculateInterestAccured() throws ProfitMandiBusinessException {
3670
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3671
 
32724 amit.gupta 3672
        for (Loan loan : loans) {
3673
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3674
            Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(
3675
                    x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
30936 tejbeer 3676
 
32724 amit.gupta 3677
            int freeDays = loan.getFreeDays();
30936 tejbeer 3678
 
32724 amit.gupta 3679
            LocalDateTime freeDaysLimitDate = loan.getCreatedOn().plusDays(freeDays);
30936 tejbeer 3680
 
32724 amit.gupta 3681
            LOGGER.info("freeDaysLimitDate {}", freeDaysLimitDate);
3682
            if (LocalDateTime.now().isAfter(freeDaysLimitDate)) {
3683
                int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
3684
                LOGGER.info("loanStatementId {}", loanStatementId);
3685
                if (loanStatementId != 0) {
3686
                    this.calculateInterest(loan, loanStatusAmount, loanStatementId);
31697 amit.gupta 3687
                } else {
32724 amit.gupta 3688
                    sdCreditService.addInterest(freeDaysLimitDate.toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3689
                }
32724 amit.gupta 3690
            }
31518 amit.gupta 3691
 
31697 amit.gupta 3692
        }
30936 tejbeer 3693
 
32724 amit.gupta 3694
 
31697 amit.gupta 3695
    }
30936 tejbeer 3696
 
31697 amit.gupta 3697
    @Autowired
3698
    FofoPaymentRepository fofoPaymentRepository;
30936 tejbeer 3699
 
31697 amit.gupta 3700
    @Autowired
3701
    CCAvenuePaymentService ccAvenuePaymentService;
30936 tejbeer 3702
 
31697 amit.gupta 3703
    public void settleCCAvePayments() throws Exception {
31886 tejbeer 3704
        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 3705
        for (FofoPayment fofoPayment : fofoPayments) {
3706
            ccAvenuePaymentService.updatePayment(fofoPayment);
3707
        }
3708
    }
30859 tejbeer 3709
 
31697 amit.gupta 3710
    /*
3711
     * public void getCCAvenuePendingOrderStatus(int pendingOrderId) { PendingOrder
3712
     * pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
3713
     * ccAvenuePaymentService.getPaymentStatusMap(pendingOrder); }
3714
     */
30859 tejbeer 3715
 
32482 amit.gupta 3716
    private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount,
3717
                                   int loanStatementId) throws ProfitMandiBusinessException {
31697 amit.gupta 3718
        LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
30859 tejbeer 3719
 
31697 amit.gupta 3720
        if (loanStatement.getLoanId() == loan.getId()) {
30859 tejbeer 3721
 
31886 tejbeer 3722
            sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate(), LocalDate.now(), loan, loanStatusAmount);
30859 tejbeer 3723
 
31697 amit.gupta 3724
        } else {
3725
            throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3726
        }
3727
    }
31175 tejbeer 3728
 
31697 amit.gupta 3729
    public void loanSettlement() throws Exception {
3730
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3731
 
31697 amit.gupta 3732
        if (!loans.isEmpty()) {
30859 tejbeer 3733
 
31697 amit.gupta 3734
            for (Loan loan : loans) {
31020 tejbeer 3735
 
31697 amit.gupta 3736
                UserWallet userWallet = userWalletRepository.selectByRetailerId(loan.getFofoId());
31886 tejbeer 3737
                SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(loan.getFofoId());
30859 tejbeer 3738
 
33159 amit.gupta 3739
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31175 tejbeer 3740
 
33159 amit.gupta 3741
                LOGGER.info("loanStatements {}", loanStatements);
30859 tejbeer 3742
 
33159 amit.gupta 3743
                Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> FormattingUtils.serialize(x.getAmount()))));
30859 tejbeer 3744
 
33159 amit.gupta 3745
                LOGGER.info("loanStatusAmount {}", loanStatusAmount);
3746
                Double interestAmount = loanStatusAmount.get(LoanReferenceType.INTEREST);
30859 tejbeer 3747
 
33159 amit.gupta 3748
                if (interestAmount == null) {
3749
                    interestAmount = (double) 0;
3750
                }
3751
                double principalAmount = loanStatusAmount.get(LoanReferenceType.PRINCIPAL);
3752
                //if it can be settled
33163 amit.gupta 3753
                if (userWallet.getAmount() >= 100 || userWallet.getAmount() > Math.abs(interestAmount + principalAmount)) {
31697 amit.gupta 3754
                    double paidAmount = 0;
3755
                    if (userWallet.getAmount() > Math.abs(interestAmount)) {
30859 tejbeer 3756
 
31697 amit.gupta 3757
                        LOGGER.info("interestAmount b {}", interestAmount);
30859 tejbeer 3758
 
31697 amit.gupta 3759
                        if (interestAmount < 0) {
3760
                            LOGGER.info("interestAmount a {}", interestAmount);
30859 tejbeer 3761
 
31886 tejbeer 3762
                            settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(interestAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31697 amit.gupta 3763
                            loan.setInterestPaid(loan.getInterestPaid().add(BigDecimal.valueOf(interestAmount).abs()));
30859 tejbeer 3764
 
31697 amit.gupta 3765
                            paidAmount += Math.abs(interestAmount);
3766
                        }
31020 tejbeer 3767
 
31697 amit.gupta 3768
                        double userWalletAmount = userWallet.getAmount() - Math.abs(interestAmount);
31110 tejbeer 3769
 
31697 amit.gupta 3770
                        if (userWalletAmount > Math.abs(principalAmount) && principalAmount < 0) {
31886 tejbeer 3771
                            settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(principalAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
31697 amit.gupta 3772
                            paidAmount += Math.abs(principalAmount);
31886 tejbeer 3773
                            BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount().subtract(BigDecimal.valueOf(principalAmount).abs());
31697 amit.gupta 3774
                            sdCreditRequirement.setUtilizedAmount(utilizationAmount);
31886 tejbeer 3775
                            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
31020 tejbeer 3776
 
31697 amit.gupta 3777
                            creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3778
                            creditAccount.setUpdatedOn(LocalDateTime.now());
31020 tejbeer 3779
 
31697 amit.gupta 3780
                            loan.setPendingAmount(BigDecimal.ZERO);
32682 amit.gupta 3781
                            loan.setSettledOn(LocalDateTime.now());
31020 tejbeer 3782
 
31697 amit.gupta 3783
                        } else if (principalAmount < 0) {
31110 tejbeer 3784
 
31886 tejbeer 3785
                            settledLoanStatement(LoanReferenceType.PRINCIPAL, BigDecimal.valueOf(userWalletAmount), loan.getFofoId(), loan.getId(), "Amount adjusted against loan", LocalDateTime.now());
30859 tejbeer 3786
 
31697 amit.gupta 3787
                            paidAmount += Math.abs(userWalletAmount);
30859 tejbeer 3788
 
31886 tejbeer 3789
                            BigDecimal utilizationAmount = sdCreditRequirement.getUtilizedAmount().subtract(BigDecimal.valueOf(userWalletAmount)).abs();
30859 tejbeer 3790
 
31697 amit.gupta 3791
                            sdCreditRequirement.setUtilizedAmount(utilizationAmount);
30859 tejbeer 3792
 
31886 tejbeer 3793
                            CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(loan.getFofoId(), Gateway.SDDIRECT);
30859 tejbeer 3794
 
31697 amit.gupta 3795
                            creditAccount.setAvailableAmount(sdCreditRequirement.getAvailableLimit().floatValue());
3796
                            creditAccount.setUpdatedOn(LocalDateTime.now());
30859 tejbeer 3797
 
31697 amit.gupta 3798
                            loan.setPendingAmount(
3799
                                    loan.getPendingAmount().subtract(BigDecimal.valueOf(userWalletAmount)));
3800
                        }
32117 tejbeer 3801
                        walletService.consumeAmountFromWallet(userWallet.getUserId(), loan.getId(), WalletReferenceType.LOAN_REPAYMENT, "Amount adjusted against loan", (float) Math.abs(paidAmount), LocalDateTime.now());
31697 amit.gupta 3802
                    } else {
33256 amit.gupta 3803
                        settledLoanStatement(LoanReferenceType.INTEREST, BigDecimal.valueOf(userWallet.getAmount()), loan.getFofoId(), loan.getId(),
3804
                                "Amount adjusted against loan", LocalDateTime.now());
30999 tejbeer 3805
 
31697 amit.gupta 3806
                        paidAmount += Math.abs(userWallet.getAmount());
31020 tejbeer 3807
 
33256 amit.gupta 3808
                        loan.setInterestPaid(loan.getInterestPaid().add(BigDecimal.valueOf(userWallet.getAmount()).abs()));
3809
                        walletService.consumeAmountFromWallet(userWallet.getUserId(), loan.getId(), WalletReferenceType.LOAN_REPAYMENT,
3810
                                "Amount adjusted against loan", (float) Math.abs(paidAmount), LocalDateTime.now());
31020 tejbeer 3811
 
31697 amit.gupta 3812
                    }
31020 tejbeer 3813
 
3814
 
32439 tejbeer 3815
                    List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanctionByFofoId(loan.getFofoId());
31020 tejbeer 3816
 
32439 tejbeer 3817
                    double settledAmount = paidAmount;
3818
                    for (SanctionRequest sanctionRequest : sanctionRequests) {
31020 tejbeer 3819
 
32439 tejbeer 3820
                        List<Order> orders = orderRepository.selectAllByTransactionId(sanctionRequest.getTransactionId());
32948 amit.gupta 3821
                        if (orders.size() == 0) {
32922 amit.gupta 3822
                            LOGGER.info("Could not find orders - for Sanction Request {}", sanctionRequest);
3823
                            continue;
3824
                        }
31020 tejbeer 3825
 
32439 tejbeer 3826
                        if (settledAmount >= sanctionRequest.getPendingAmount().doubleValue()) {
33256 amit.gupta 3827
                            settledAmount -= sanctionRequest.getPendingAmount().doubleValue();
32439 tejbeer 3828
                            sanctionRequest.setPendingAmount(BigDecimal.valueOf(0));
3829
                            this.sendUnholdEmail(orders);
3830
                        } else {
33256 amit.gupta 3831
                            settledAmount -= sanctionRequest.getPendingAmount().doubleValue();
32439 tejbeer 3832
                            sanctionRequest.setPendingAmount(BigDecimal.valueOf(settledAmount));
3833
                            break;
31020 tejbeer 3834
 
32439 tejbeer 3835
                        }
31020 tejbeer 3836
 
32439 tejbeer 3837
                    }
3838
                }
31020 tejbeer 3839
 
32439 tejbeer 3840
            }
31020 tejbeer 3841
 
3842
 
32439 tejbeer 3843
        }
31020 tejbeer 3844
 
32439 tejbeer 3845
    }
31020 tejbeer 3846
 
3847
 
32439 tejbeer 3848
    private void sendUnholdEmail(List<Order> orders) throws Exception {
30859 tejbeer 3849
 
3850
 
32439 tejbeer 3851
        orders.forEach(x -> x.setShipmentHold(false));
3852
        double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
30859 tejbeer 3853
 
32439 tejbeer 3854
        List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3855
        authUserEmail.add("vinay.p@smartdukaan.com");
3856
        authUserEmail.add("shivam.gupta@smartdukaan.com");
30859 tejbeer 3857
 
32439 tejbeer 3858
        String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
30859 tejbeer 3859
 
32439 tejbeer 3860
        String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
30859 tejbeer 3861
 
32439 tejbeer 3862
        String subject = "Dispatched " + (orders.get(0).getRetailerName());
3863
        String message = String.format("Dear Team, \n" + "kindly note the material for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is dispatched.");
3864
        Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
30859 tejbeer 3865
 
32439 tejbeer 3866
 
31697 amit.gupta 3867
    }
30859 tejbeer 3868
 
32482 amit.gupta 3869
    private void settledLoanStatement(LoanReferenceType loanReferneceType, BigDecimal amount, int fofoId,
3870
                                      int loanId, String description, LocalDateTime now) {
30859 tejbeer 3871
 
31886 tejbeer 3872
        sdCreditService.createLoanStatement(loanReferneceType, amount.abs(), fofoId, loanId, description, LocalDateTime.now());
30859 tejbeer 3873
 
31697 amit.gupta 3874
    }
30859 tejbeer 3875
 
32482 amit.gupta 3876
    private void createUserWalletHistory(int walletId, int userId, WalletReferenceType referenceType, int loanId,
3877
                                         double interestAmount) {
31697 amit.gupta 3878
        UserWalletHistory uwh = new UserWalletHistory();
3879
        uwh.setWalletId(walletId);
3880
        uwh.setFofoId(userId);
3881
        uwh.setBusinessTimestamp(LocalDateTime.now());
3882
        uwh.setReferenceType(referenceType);
3883
        uwh.setReference(loanId);
3884
        uwh.setTimestamp(LocalDateTime.now());
3885
        uwh.setAmount((int) -(interestAmount));
3886
        uwh.setDescription("Amount adjusted against loan");
3887
        userWalletHistoryRepository.persist(uwh);
30859 tejbeer 3888
 
31697 amit.gupta 3889
    }
30859 tejbeer 3890
 
32307 amit.gupta 3891
    public void dailyLoanAlert() throws Exception {
31697 amit.gupta 3892
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3893
 
31697 amit.gupta 3894
        Map<Integer, Double> partnerLoanAmount = new HashMap<>();
30859 tejbeer 3895
 
31697 amit.gupta 3896
        if (!loans.isEmpty()) {
30859 tejbeer 3897
 
31697 amit.gupta 3898
            for (Loan loan : loans) {
30859 tejbeer 3899
 
31697 amit.gupta 3900
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30859 tejbeer 3901
 
31886 tejbeer 3902
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31697 amit.gupta 3903
                if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3904
                    amount += partnerLoanAmount.get(loan.getFofoId());
3905
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3906
                } else {
3907
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3908
                }
30965 tejbeer 3909
 
31697 amit.gupta 3910
            }
30965 tejbeer 3911
 
31697 amit.gupta 3912
        }
30859 tejbeer 3913
 
31697 amit.gupta 3914
        if (!partnerLoanAmount.isEmpty()) {
30965 tejbeer 3915
 
31697 amit.gupta 3916
            for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
30859 tejbeer 3917
 
31697 amit.gupta 3918
                int fofoId = partnerLoanAmountEnrty.getKey();
30859 tejbeer 3919
 
31697 amit.gupta 3920
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
30859 tejbeer 3921
 
31697 amit.gupta 3922
                Address address = addressRepository.selectById(user.getAddressId());
30896 amit.gupta 3923
 
31697 amit.gupta 3924
                String title = "Alert Credit Outstanding!";
3925
                String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 3926
                String message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
31697 amit.gupta 3927
                notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
30913 tejbeer 3928
 
32841 amit.gupta 3929
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30913 tejbeer 3930
 
31697 amit.gupta 3931
            }
30917 tejbeer 3932
 
31697 amit.gupta 3933
        }
30917 tejbeer 3934
 
31697 amit.gupta 3935
    }
30920 tejbeer 3936
 
31697 amit.gupta 3937
    public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3938
        schemeService.processActivatedImeisForSchemes();
3939
    }
30920 tejbeer 3940
 
33112 amit.gupta 3941
    @Autowired
33355 amit.gupta 3942
    SidbiService sidbiService;
33112 amit.gupta 3943
 
33364 amit.gupta 3944
    public void processSidbiDeductions() throws ProfitMandiBusinessException {
33355 amit.gupta 3945
        sidbiService.migrateSanctions();
3946
        sidbiService.processDeductions();
3947
    }
3948
 
31697 amit.gupta 3949
    public void updatePartnerLimit() throws ProfitMandiBusinessException {
3950
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
33355 amit.gupta 3951
        Map<Integer, BigDecimal> fofoSidbiLimitMap = sidbiService.getSuggestedLimitMap();
31886 tejbeer 3952
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
33159 amit.gupta 3953
        Map<Integer, CreditAccount> creditAccountMap = creditAccountRepository.selectAllByGateways(Arrays.asList(Gateway.SIDBI, Gateway.SDDIRECT))
33112 amit.gupta 3954
                .stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31886 tejbeer 3955
        Map<Integer, CurrentPartnerDailyInvestment> currentPartnerDailyInvestmentMap = currentPartnerDailyInvestmentRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31697 amit.gupta 3956
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3957
            int fofoId = customRetailerEntry.getKey();
3958
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
33287 amit.gupta 3959
 
33112 amit.gupta 3960
            CreditAccount creditAccount = creditAccountMap.get(fofoId);
3961
 
31697 amit.gupta 3962
            CurrentPartnerDailyInvestment currentPartnerDailyInvestment = currentPartnerDailyInvestmentMap.get(fofoId);
33355 amit.gupta 3963
            BigDecimal suggestedAmount = this.getSuggestedAmount(creditAccount, currentPartnerDailyInvestment, fofoSidbiLimitMap.get(fofoId));
33112 amit.gupta 3964
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(fofoId);
30929 tejbeer 3965
 
31697 amit.gupta 3966
            LOGGER.info("suggestedAmount {} ", suggestedAmount);
30913 tejbeer 3967
 
31697 amit.gupta 3968
            if (sdCreditRequirement == null) {
3969
                sdCreditRequirement = new SDCreditRequirement();
3970
                sdCreditRequirement.setFofoId(fofoId);
3971
                sdCreditRequirement.setCreditDays(15);
3972
                sdCreditRequirement.setInterestRate(BigDecimal.valueOf(0.05));
3973
                sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3974
                sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3975
                sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3976
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3977
                sdCreditRequirementRepository.persist(sdCreditRequirement);
3978
            }
30913 tejbeer 3979
 
31697 amit.gupta 3980
            CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30913 tejbeer 3981
 
31697 amit.gupta 3982
            sdCreditRequirement.setRisk(creditRisk);
30913 tejbeer 3983
 
31697 amit.gupta 3984
            sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3985
            sdCreditRequirement.setLimit(suggestedAmount);
3986
            BigDecimal utilizedLimit = new BigDecimal(sdCreditService.getUtilizationAmount(fofoId));
30934 tejbeer 3987
 
31697 amit.gupta 3988
            BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30934 tejbeer 3989
 
31697 amit.gupta 3990
            LOGGER.info("utilizedLimit {} ", utilizedLimit);
30913 tejbeer 3991
 
31697 amit.gupta 3992
            LOGGER.info("availableLimit {} ", availableLimit);
30913 tejbeer 3993
 
31697 amit.gupta 3994
            sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30929 tejbeer 3995
 
31697 amit.gupta 3996
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30929 tejbeer 3997
 
31697 amit.gupta 3998
            if (creditAccount != null) {
30929 tejbeer 3999
 
31697 amit.gupta 4000
                creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
4001
                creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
4002
                creditAccount.setAvailableAmount(availableLimit.floatValue());
4003
                creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
4004
                creditAccount.setUpdatedOn(LocalDateTime.now());
4005
            }
30929 tejbeer 4006
 
31697 amit.gupta 4007
        }
31177 tejbeer 4008
 
31697 amit.gupta 4009
    }
30929 tejbeer 4010
 
33355 amit.gupta 4011
    private BigDecimal getSuggestedAmount(CreditAccount creditAccount, CurrentPartnerDailyInvestment currentPartnerDailyInvestment, BigDecimal sidbiLimit) {
33112 amit.gupta 4012
        BigDecimal suggestedAmount = BigDecimal.ZERO;
4013
        //1 LAC
4014
        double limitValue = 100000;
33295 amit.gupta 4015
        if (creditAccount == null || creditAccount.getGateway().equals(Gateway.SDDIRECT)) {
33112 amit.gupta 4016
 
4017
            if (currentPartnerDailyInvestment != null) {
4018
                suggestedAmount = BigDecimal.valueOf(Math.min(currentPartnerDailyInvestment.getTotalInvestment() * 0.1, limitValue));
4019
            }
4020
            if (suggestedAmount.doubleValue() < 0) {
4021
                suggestedAmount = BigDecimal.ZERO;
4022
            }
33355 amit.gupta 4023
        } else if (creditAccount.getGateway().equals(Gateway.SIDBI) && sidbiLimit != null) {
33112 amit.gupta 4024
            //Left
33355 amit.gupta 4025
            suggestedAmount = sidbiLimit;
33112 amit.gupta 4026
        }
4027
        return suggestedAmount;
4028
    }
4029
 
31697 amit.gupta 4030
    public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 4031
 
31697 amit.gupta 4032
        sdCreditService.updateRisk();
4033
        List<Loan> defaultLoans = sdCreditService.getDefaultLoan();
4034
        if (!defaultLoans.isEmpty()) {
4035
            this.sendDefaultLoanAlert(defaultLoans);
4036
        }
30929 tejbeer 4037
 
31697 amit.gupta 4038
    }
30929 tejbeer 4039
 
32482 amit.gupta 4040
    public void sendDefaultLoanAlert(List<Loan> defaultLoans) throws
4041
            ProfitMandiBusinessException, MessagingException, IOException {
31697 amit.gupta 4042
        String subject = "Default Partners";
30931 tejbeer 4043
 
31886 tejbeer 4044
        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 4045
 
31886 tejbeer 4046
        for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 4047
            List<Loan> filteredRows = new ArrayList<>();
4048
            for (Loan loan : defaultLoans) {
30929 tejbeer 4049
 
31697 amit.gupta 4050
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 4051
 
31697 amit.gupta 4052
                    filteredRows.add(loan);
4053
                }
4054
            }
4055
            if (!filteredRows.isEmpty()) {
4056
                String messageText = this.getMessageForDueDateExtend(filteredRows);
4057
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 4058
 
32350 amit.gupta 4059
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, subject);
30982 tejbeer 4060
 
31697 amit.gupta 4061
            }
30936 tejbeer 4062
 
31697 amit.gupta 4063
        }
30982 tejbeer 4064
 
31697 amit.gupta 4065
        for (Loan defaultLoan : defaultLoans) {
4066
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 4067
 
31886 tejbeer 4068
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4069
 
31697 amit.gupta 4070
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
30936 tejbeer 4071
 
31697 amit.gupta 4072
            Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4073
 
31697 amit.gupta 4074
            String title = "Loan Amount Overdue!";
4075
            String url = "http://app.smartdukaan.com/pages/home/credit";
31886 tejbeer 4076
            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!!";
4077
            notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4078
 
31697 amit.gupta 4079
            // notificationService.sendWhatsappMessage(message, title,
4080
            // address.getPhoneNumber());
30929 tejbeer 4081
 
31697 amit.gupta 4082
        }
4083
    }
30929 tejbeer 4084
 
31697 amit.gupta 4085
    private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
4086
        StringBuilder sb = new StringBuilder();
4087
        sb.append(
31886 tejbeer 4088
                "<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';>");
4089
        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 4090
 
31697 amit.gupta 4091
                + "	    				</tr>");
4092
        for (Loan entry : loans) {
30929 tejbeer 4093
 
31697 amit.gupta 4094
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
30929 tejbeer 4095
 
31886 tejbeer 4096
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4097
 
31697 amit.gupta 4098
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
30929 tejbeer 4099
 
31697 amit.gupta 4100
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30929 tejbeer 4101
 
31697 amit.gupta 4102
            sb.append("<tr>");
31886 tejbeer 4103
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
31397 tejbeer 4104
 
31886 tejbeer 4105
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4106
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4107
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
31397 tejbeer 4108
 
31697 amit.gupta 4109
            sb.append("</tr>");
31397 tejbeer 4110
 
31697 amit.gupta 4111
        }
31397 tejbeer 4112
 
31697 amit.gupta 4113
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4114
 
31697 amit.gupta 4115
        return sb.toString();
4116
    }
31397 tejbeer 4117
 
31697 amit.gupta 4118
    private String getMessageForDueDateCross(List<Loan> loans) throws ProfitMandiBusinessException {
33161 ranu 4119
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
4120
        Map<Integer, com.spice.profitmandi.dao.model.FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
31697 amit.gupta 4121
        StringBuilder sb = new StringBuilder();
33161 ranu 4122
        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/>" +
4123
                "<table style='border:1px solid black ;padding: 5px';>");
4124
        sb.append("<tbody>\n" + "<tr>\n" +
33256 amit.gupta 4125
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
4126
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
4127
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
4128
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
4129
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
4130
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
4131
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
4132
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
4133
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
33161 ranu 4134
                "</tr>");
31397 tejbeer 4135
 
31697 amit.gupta 4136
        for (Loan entry : loans) {
31397 tejbeer 4137
 
31697 amit.gupta 4138
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
31397 tejbeer 4139
 
31886 tejbeer 4140
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31397 tejbeer 4141
 
31697 amit.gupta 4142
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
31397 tejbeer 4143
 
31697 amit.gupta 4144
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
31397 tejbeer 4145
 
31697 amit.gupta 4146
            sb.append("<tr>");
31886 tejbeer 4147
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33162 ranu 4148
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
30936 tejbeer 4149
 
31886 tejbeer 4150
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4151
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4152
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33161 ranu 4153
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4154
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4155
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4156
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
31697 amit.gupta 4157
            sb.append("</tr>");
4158
        }
31397 tejbeer 4159
 
31697 amit.gupta 4160
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4161
 
31697 amit.gupta 4162
        return sb.toString();
4163
    }
31397 tejbeer 4164
 
32307 amit.gupta 4165
    public void notifyLoanDueDateCross() throws Exception {
31397 tejbeer 4166
 
31697 amit.gupta 4167
        List<Loan> dueDateCrossLoans = sdCreditService.getDueDateCrossLoan();
4168
        if (!dueDateCrossLoans.isEmpty()) {
4169
            this.sendDueDateCrossLoanAlert(dueDateCrossLoans);
4170
        }
31397 tejbeer 4171
 
31697 amit.gupta 4172
    }
31397 tejbeer 4173
 
32307 amit.gupta 4174
    private void sendDueDateCrossLoanAlert(List<Loan> dueDateCrossLoans) throws Exception {
31886 tejbeer 4175
        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 4176
 
31886 tejbeer 4177
        for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 4178
            List<Loan> filteredRows = new ArrayList<>();
4179
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4180
 
31697 amit.gupta 4181
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30982 tejbeer 4182
 
31697 amit.gupta 4183
                    filteredRows.add(loan);
4184
                }
4185
            }
4186
            if (!filteredRows.isEmpty()) {
4187
                String messageText = this.getMessageForDueDateCross(filteredRows);
4188
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 4189
 
32350 amit.gupta 4190
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, "Due Date Cross");
30936 tejbeer 4191
 
31697 amit.gupta 4192
            }
30936 tejbeer 4193
 
31697 amit.gupta 4194
        }
4195
        if (!dueDateCrossLoans.isEmpty()) {
4196
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4197
 
31697 amit.gupta 4198
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
30989 tejbeer 4199
 
31697 amit.gupta 4200
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30989 tejbeer 4201
 
31697 amit.gupta 4202
                Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 4203
 
31697 amit.gupta 4204
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4205
 
31697 amit.gupta 4206
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 4207
 
31886 tejbeer 4208
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4209
 
31697 amit.gupta 4210
                String url = "http://app.smartdukaan.com/pages/home/credit";
30936 tejbeer 4211
 
31697 amit.gupta 4212
                String title = "Alert!";
31886 tejbeer 4213
                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 4214
 
31886 tejbeer 4215
                notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4216
 
32841 amit.gupta 4217
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4218
 
31697 amit.gupta 4219
            }
4220
        }
30982 tejbeer 4221
 
31697 amit.gupta 4222
    }
30936 tejbeer 4223
 
32307 amit.gupta 4224
    public void alertForDueDate() throws Exception {
30936 tejbeer 4225
 
31697 amit.gupta 4226
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30936 tejbeer 4227
 
31697 amit.gupta 4228
        if (!loans.isEmpty()) {
4229
            for (Loan loan : loans) {
30936 tejbeer 4230
 
31697 amit.gupta 4231
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30936 tejbeer 4232
 
31697 amit.gupta 4233
                Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4234
 
31697 amit.gupta 4235
                long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
30936 tejbeer 4236
 
31697 amit.gupta 4237
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4238
 
31697 amit.gupta 4239
                if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
4240
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31886 tejbeer 4241
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4242
 
31697 amit.gupta 4243
                    String title = "Alert!";
4244
                    String url = "http://app.smartdukaan.com/pages/home/credit";
4245
                    String message = null;
4246
                    if (noOfdaysBetween == 0) {
30936 tejbeer 4247
 
31886 tejbeer 4248
                        message = "Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
30982 tejbeer 4249
 
31697 amit.gupta 4250
                    } else {
30982 tejbeer 4251
 
31886 tejbeer 4252
                        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 4253
 
31697 amit.gupta 4254
                    }
31886 tejbeer 4255
                    notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
32841 amit.gupta 4256
                    //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4257
 
31697 amit.gupta 4258
                }
4259
            }
4260
        }
30984 tejbeer 4261
 
31697 amit.gupta 4262
    }
30982 tejbeer 4263
 
32307 amit.gupta 4264
    public void userMobileNumberOptIn() throws Exception {
30982 tejbeer 4265
 
31697 amit.gupta 4266
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
30982 tejbeer 4267
 
31886 tejbeer 4268
        List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
30982 tejbeer 4269
 
31886 tejbeer 4270
        List<Address> addresses = addressRepository.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
30982 tejbeer 4271
 
31697 amit.gupta 4272
        LOGGER.info("addresses" + addresses);
30984 tejbeer 4273
 
31697 amit.gupta 4274
        for (Address address : addresses) {
32307 amit.gupta 4275
            notificationService.optIn(address.getPhoneNumber());
30982 tejbeer 4276
 
31697 amit.gupta 4277
        }
30982 tejbeer 4278
 
31697 amit.gupta 4279
    }
30982 tejbeer 4280
 
31697 amit.gupta 4281
    public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
31206 tejbeer 4282
 
31697 amit.gupta 4283
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
4284
        LOGGER.info("authUsers" + authUsers);
31206 tejbeer 4285
 
31697 amit.gupta 4286
        for (AuthUser authUser : authUsers) {
4287
            Map<String, String> requestheaders = new HashMap<>();
4288
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4289
            Map<String, String> requestParams = new HashMap<>();
4290
            requestParams.put("userid", String.valueOf(2000215976));
4291
            requestParams.put("password", "MFRd!BBL");
4292
            requestParams.put("phone_number", authUser.getMobileNumber());
4293
            requestParams.put("auth_scheme", "plain");
4294
            requestParams.put("v", "1.1");
4295
            requestParams.put("format", "json");
31206 tejbeer 4296
 
31697 amit.gupta 4297
            requestParams.put("method", "OPT_IN");
31206 tejbeer 4298
 
31697 amit.gupta 4299
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 4300
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 4301
            LOGGER.info("response" + response);
4302
        }
31206 tejbeer 4303
 
31697 amit.gupta 4304
    }
31206 tejbeer 4305
 
31697 amit.gupta 4306
    @Autowired
4307
    private HygieneDataRepository hygieneDataRepository;
31209 tejbeer 4308
 
31697 amit.gupta 4309
    public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4310
 
31697 amit.gupta 4311
        List<String> remarks = new ArrayList<>();
4312
        remarks.add("Out of Service");
4313
        remarks.add("Duplicate number");
4314
        remarks.add("Partner number");
31886 tejbeer 4315
        List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(), remarks);
31206 tejbeer 4316
 
31697 amit.gupta 4317
        if (!hygieneData.isEmpty()) {
31206 tejbeer 4318
 
31886 tejbeer 4319
            Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4320
 
31697 amit.gupta 4321
            for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
31206 tejbeer 4322
 
31697 amit.gupta 4323
                CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
31206 tejbeer 4324
 
31697 amit.gupta 4325
                StringBuilder sb = new StringBuilder();
31886 tejbeer 4326
                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 4327
 
31886 tejbeer 4328
                        + " </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 4329
 
31697 amit.gupta 4330
                        + "<br/><table style='border:1px solid black ;padding: 5px';>");
4331
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4332
                sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4333
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4334
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4335
                sb.append("</tr>\n");
31206 tejbeer 4336
 
31697 amit.gupta 4337
                List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
31206 tejbeer 4338
 
31697 amit.gupta 4339
                List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
31206 tejbeer 4340
 
31697 amit.gupta 4341
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
31206 tejbeer 4342
 
31697 amit.gupta 4343
                for (FofoOrder fofoOrder : fofoOrders) {
4344
                    Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4345
                    sb.append("<tr>");
31886 tejbeer 4346
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber() + "</td>\n");
4347
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + "" + customer.getLastName() + "</td>\n");
4348
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber() + "</td>\n");
31206 tejbeer 4349
 
31697 amit.gupta 4350
                    sb.append("</tr>\n");
4351
                }
31206 tejbeer 4352
 
31697 amit.gupta 4353
                sb.append("</tbody></table></body></html>");
4354
                String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4355
 
32350 amit.gupta 4356
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31206 tejbeer 4357
 
31697 amit.gupta 4358
            }
31206 tejbeer 4359
 
31697 amit.gupta 4360
        }
31206 tejbeer 4361
 
31697 amit.gupta 4362
    }
31206 tejbeer 4363
 
33046 amit.gupta 4364
    //
4365
    public void setInventoryItemIdToPriceDropImei() {
4366
        List<PriceDropIMEI> priceDropIMEIList = priceDropIMEIRepository.selectAllMissingInventoryItemIds();
4367
        LOGGER.info("Problems with - {} entries", priceDropIMEIList.size());
4368
        //priceDropIMEIList.stream().collect(C)
4369
        for (PriceDropIMEI priceDropIMEI : priceDropIMEIList) {
4370
            System.out.println(priceDropIMEI.getImei());
4371
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllBySerialNumberFofoId(priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
33051 amit.gupta 4372
            if (inventoryItems.size() == 0) {
33046 amit.gupta 4373
                LOGGER.info("Could not find Grn - FofoID {} , Imei {} ", priceDropIMEI);
33051 amit.gupta 4374
            } else if (inventoryItems.size() > 1) {
33046 amit.gupta 4375
                LOGGER.info("Found 2 such instance for - FofoID {} , Imei {} ", priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
4376
            } else {
4377
                priceDropIMEI.setInventoryItemId(inventoryItems.get(0).getId());
4378
            }
4379
 
4380
        }
4381
    }
4382
 
33051 amit.gupta 4383
    @Autowired
4384
    SaholicReservationSnapshotRepository saholicReservationSnapshotRepository;
4385
 
33256 amit.gupta 4386
    public void removePartialBillingForTransaction(int transactionId) throws ProfitMandiBusinessException {
33051 amit.gupta 4387
        List<Order> orderList = orderRepository.selectAllByTransactionId(transactionId);
4388
        Map<Integer, Order> orderMap = orderList.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
4389
        //Delete scanRecords
4390
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderMap.keySet()));
4391
        for (WarehouseScan warehouseScan : warehouseScans) {
4392
            warehouseScanRepository.delete(warehouseScan);
4393
            WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItemRepository.selectById(warehouseScan.getInventoryItemId());
4394
            warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.PURCHASE);
4395
            warehouseInventoryItem.setCurrentQuantity(warehouseInventoryItem.getCurrentQuantity() + warehouseScan.getQuantity());
4396
        }
4397
 
4398
        for (Order order : orderList) {
33078 ranu 4399
            if (order.getBillingTimestamp() != null) {
33056 amit.gupta 4400
                order.setStatus(OrderStatus.ACCEPTED);
4401
                order.setStatusDescription("Submitted for Processing");
4402
                order.setBillingTimestamp(null);
4403
                order.setBilledBy(null);
33057 amit.gupta 4404
                order.setSerialNumber(null);
33056 amit.gupta 4405
                order.setJacketNumber(null);
33060 amit.gupta 4406
                order.getLineItem().setSerialNumber(null);
33056 amit.gupta 4407
                List<LineItemImei> lineItemImeis = lineItemImeisRepository.selectByLineItemId(order.getLineItem().getId());
4408
                for (LineItemImei lineItemImei : lineItemImeis) {
4409
                    lineItemImeisRepository.delete(lineItemImei);
4410
                }
4411
                SaholicReservationSnapshot saholicReservationSnapshot = saholicReservationSnapshotRepository
4412
                        .selectByOrderId(order.getId());
4413
                if (saholicReservationSnapshot == null) {
4414
                    saholicInventoryService.addReservationCount(order.getLineItem().getItemId(),
4415
                            order.getFulfilmentWarehouseId(), order.getLineItem().getQuantity(), order.getId());
4416
                }
33055 amit.gupta 4417
            }
33051 amit.gupta 4418
        }
4419
    }
4420
 
31697 amit.gupta 4421
    public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4422
 
31697 amit.gupta 4423
        List<String> remarks = new ArrayList<>();
4424
        remarks.add("Out of Service");
4425
        remarks.add("Duplicate number");
4426
        remarks.add("Partner number");
31886 tejbeer 4427
        List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository.selectDisposedDateAndRemarks(
4428
                LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX), remarks);
31206 tejbeer 4429
 
31886 tejbeer 4430
        List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
31697 amit.gupta 4431
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4432
        Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
31206 tejbeer 4433
 
31697 amit.gupta 4434
        Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
31206 tejbeer 4435
 
31697 amit.gupta 4436
        if (!hygieneDataLastThreeMonth.isEmpty()) {
31886 tejbeer 4437
            partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4438
 
31697 amit.gupta 4439
        }
31206 tejbeer 4440
 
31697 amit.gupta 4441
        if (!hygieneDataRecentMonth.isEmpty()) {
31886 tejbeer 4442
            partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31697 amit.gupta 4443
        }
31206 tejbeer 4444
 
31697 amit.gupta 4445
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31206 tejbeer 4446
 
31697 amit.gupta 4447
            String email = storeGuyEntry.getKey();
31206 tejbeer 4448
 
31697 amit.gupta 4449
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
31206 tejbeer 4450
 
31697 amit.gupta 4451
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4452
            Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4453
            for (Integer fofoId : fofoIds) {
31206 tejbeer 4454
 
31697 amit.gupta 4455
                partnerYearMonthData.put(fofoId, null);
4456
                partnerDateWiseData.put(fofoId, null);
4457
                if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4458
                    List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
31206 tejbeer 4459
 
31697 amit.gupta 4460
                    if (hygienes != null) {
31886 tejbeer 4461
                        Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream().collect(groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
31206 tejbeer 4462
 
31697 amit.gupta 4463
                        partnerYearMonthData.put(fofoId, yearMonthData);
31206 tejbeer 4464
 
31697 amit.gupta 4465
                    }
4466
                    List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
31206 tejbeer 4467
 
31697 amit.gupta 4468
                    if (dateWiseHygienes != null) {
31206 tejbeer 4469
 
31886 tejbeer 4470
                        Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream().collect(groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
31206 tejbeer 4471
 
31697 amit.gupta 4472
                        partnerDateWiseData.put(fofoId, dateWiseData);
31206 tejbeer 4473
 
31697 amit.gupta 4474
                    }
31206 tejbeer 4475
 
31697 amit.gupta 4476
                }
31206 tejbeer 4477
 
31697 amit.gupta 4478
            }
31206 tejbeer 4479
 
31697 amit.gupta 4480
            String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4481
 
31697 amit.gupta 4482
            LOGGER.info("hygieneData {}", partnerDateWiseData.values());
31206 tejbeer 4483
 
31697 amit.gupta 4484
            boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4485
 
31697 amit.gupta 4486
            boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4487
 
31697 amit.gupta 4488
            if (!partnerDateWise && !partnerYearMonth) {
4489
                String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
32350 amit.gupta 4490
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb, null, subject);
31697 amit.gupta 4491
            }
31206 tejbeer 4492
 
31697 amit.gupta 4493
        }
31206 tejbeer 4494
 
31697 amit.gupta 4495
    }
31206 tejbeer 4496
 
31697 amit.gupta 4497
    private String getMessageHygieneAlertForPartner(
33256 amit.gupta 4498
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData, Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData)
4499
            throws ProfitMandiBusinessException {
31206 tejbeer 4500
 
31697 amit.gupta 4501
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31206 tejbeer 4502
 
31697 amit.gupta 4503
        LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4504
        LocalDateTime endDate = LocalDateTime.now();
31206 tejbeer 4505
 
31697 amit.gupta 4506
        LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
31886 tejbeer 4507
        LocalDateTime endYearMonth = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
31206 tejbeer 4508
 
31697 amit.gupta 4509
        DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
31206 tejbeer 4510
 
31697 amit.gupta 4511
        List<YearMonth> yearMonthRange = new ArrayList<>();
4512
        yearMonthRange.add(YearMonth.from(startYearMonth));
31206 tejbeer 4513
 
31697 amit.gupta 4514
        yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
31206 tejbeer 4515
 
31697 amit.gupta 4516
        yearMonthRange.add(YearMonth.from(endYearMonth));
31206 tejbeer 4517
 
31697 amit.gupta 4518
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
31206 tejbeer 4519
 
31886 tejbeer 4520
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
31206 tejbeer 4521
 
31697 amit.gupta 4522
        StringBuilder sb = new StringBuilder();
31886 tejbeer 4523
        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 4524
 
31697 amit.gupta 4525
                + "<table style='border:1px solid black ;padding: 5px';>");
4526
        sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4527
        sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31206 tejbeer 4528
 
31697 amit.gupta 4529
        for (YearMonth yearMonth : yearMonthRange) {
31886 tejbeer 4530
            sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter) + "</th>\n");
31697 amit.gupta 4531
        }
31206 tejbeer 4532
 
31697 amit.gupta 4533
        for (LocalDate localDate : dateRange) {
4534
            sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4535
        }
31206 tejbeer 4536
 
31697 amit.gupta 4537
        sb.append("</tr>\n");
31206 tejbeer 4538
 
31886 tejbeer 4539
        for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData.entrySet()) {
31206 tejbeer 4540
 
31697 amit.gupta 4541
            int fofoId = partnerYearMonthEntry.getKey();
31206 tejbeer 4542
 
31697 amit.gupta 4543
            Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
31206 tejbeer 4544
 
31697 amit.gupta 4545
            Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
31206 tejbeer 4546
 
31697 amit.gupta 4547
            if (yearMonthData == null && dateWiseData == null) {
4548
                continue;
4549
            }
31206 tejbeer 4550
 
31697 amit.gupta 4551
            sb.append("<tr>");
31886 tejbeer 4552
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31697 amit.gupta 4553
            for (YearMonth yearMonth : yearMonthRange) {
31206 tejbeer 4554
 
31697 amit.gupta 4555
                if (yearMonthData == null) {
4556
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4557
 
31697 amit.gupta 4558
                } else {
4559
                    List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
31206 tejbeer 4560
 
31697 amit.gupta 4561
                    if (hygieneList != null) {
4562
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31206 tejbeer 4563
 
31697 amit.gupta 4564
                    } else {
4565
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4566
 
31697 amit.gupta 4567
                    }
4568
                }
4569
            }
31206 tejbeer 4570
 
31697 amit.gupta 4571
            for (LocalDate localDate : dateRange) {
31206 tejbeer 4572
 
31697 amit.gupta 4573
                if (dateWiseData == null) {
4574
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4575
 
31697 amit.gupta 4576
                } else {
4577
                    List<HygieneData> hygieneList = dateWiseData.get(localDate);
31206 tejbeer 4578
 
31697 amit.gupta 4579
                    if (hygieneList != null) {
4580
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31218 tejbeer 4581
 
31697 amit.gupta 4582
                    } else {
4583
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31218 tejbeer 4584
 
31697 amit.gupta 4585
                    }
4586
                }
4587
            }
4588
            sb.append("</tr>");
31218 tejbeer 4589
 
31697 amit.gupta 4590
        }
31218 tejbeer 4591
 
31697 amit.gupta 4592
        sb.append("</tbody></table></body></html>");
31218 tejbeer 4593
 
31697 amit.gupta 4594
        return sb.toString();
4595
    }
31218 tejbeer 4596
 
31697 amit.gupta 4597
    @Autowired
4598
    private MonthlyTargetRepository monthlyTargetRepository;
31218 tejbeer 4599
 
31697 amit.gupta 4600
    public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4601
 
31697 amit.gupta 4602
        LocalDateTime curDate = LocalDateTime.now();
4603
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4604
 
31886 tejbeer 4605
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4606
 
31886 tejbeer 4607
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4608
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4609
 
31697 amit.gupta 4610
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4611
 
31697 amit.gupta 4612
        for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
31249 tejbeer 4613
 
31697 amit.gupta 4614
            int fofoId = partnerMonthlyTargetEntry.getKey();
31249 tejbeer 4615
 
31697 amit.gupta 4616
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
31249 tejbeer 4617
 
31697 amit.gupta 4618
            Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
31218 tejbeer 4619
 
31697 amit.gupta 4620
            Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
31218 tejbeer 4621
 
31697 amit.gupta 4622
            if (purchaseTarget > 0) {
4623
                Double purchase = secondaryMtd.get(fofoId);
31249 tejbeer 4624
 
31697 amit.gupta 4625
                if (purchase == null) {
4626
                    purchase = 0.0;
4627
                }
31218 tejbeer 4628
 
31697 amit.gupta 4629
                Double balanceTarget = purchaseTarget - purchase;
31218 tejbeer 4630
 
31697 amit.gupta 4631
                if (balanceTarget <= 0) {
4632
                    balanceTarget = 0.0;
4633
                }
31651 tejbeer 4634
 
31697 amit.gupta 4635
                StringBuilder sb = new StringBuilder();
4636
                sb.append("<html><body><p>Dear Partner,\n");
31886 tejbeer 4637
                sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget + " and your achievement till date is Rs." + purchase + "</p>");
31697 amit.gupta 4638
                sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4639
                sb.append(
32350 amit.gupta 4640
                        "<p>We wish you all the best and we are confident that this focused approach towards our outlet sales will help us take our outlet to the best SmartDukaan in your city.\n" + "</p>\n");
31651 tejbeer 4641
 
32350 amit.gupta 4642
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31697 amit.gupta 4643
            }
31218 tejbeer 4644
 
31697 amit.gupta 4645
        }
31218 tejbeer 4646
 
31697 amit.gupta 4647
    }
31218 tejbeer 4648
 
31697 amit.gupta 4649
    public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4650
 
31697 amit.gupta 4651
        LocalDateTime curDate = LocalDateTime.now();
31218 tejbeer 4652
 
31886 tejbeer 4653
        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 4654
 
31697 amit.gupta 4655
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
31218 tejbeer 4656
 
31697 amit.gupta 4657
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4658
 
31697 amit.gupta 4659
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31218 tejbeer 4660
 
31886 tejbeer 4661
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4662
 
31886 tejbeer 4663
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4664
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4665
 
31697 amit.gupta 4666
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4667
 
31697 amit.gupta 4668
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31218 tejbeer 4669
 
31697 amit.gupta 4670
            String email = storeGuyEntry.getKey();
31218 tejbeer 4671
 
31697 amit.gupta 4672
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4673
            Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4674
            for (Integer fofoId : fofoIds) {
31218 tejbeer 4675
 
31697 amit.gupta 4676
                MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
4677
                if (monthlyTarget != null) {
4678
                    Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4679
 
31697 amit.gupta 4680
                    Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4681
 
31697 amit.gupta 4682
                    if (purchaseTarget != null && purchaseTarget > 0) {
4683
                        Double purchase = secondaryMtd.get(fofoId);
4684
                        if (purchase == null) {
4685
                            purchase = 0.0;
4686
                        }
4687
                        monthlyTarget.setPurchaseAchievement(purchase);
4688
                        monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4689
 
31697 amit.gupta 4690
                    }
4691
                }
4692
            }
31218 tejbeer 4693
 
31697 amit.gupta 4694
            if (!monthlyTargetAchievement.isEmpty()) {
31218 tejbeer 4695
 
31697 amit.gupta 4696
                StringBuilder sb = new StringBuilder();
31218 tejbeer 4697
 
31697 amit.gupta 4698
                sb.append("<html><body><p>Hi,\n");
31886 tejbeer 4699
                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 4700
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4701
                sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31218 tejbeer 4702
 
31697 amit.gupta 4703
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
31218 tejbeer 4704
 
31697 amit.gupta 4705
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4706
                sb.append("</tr>\n");
31218 tejbeer 4707
 
31886 tejbeer 4708
                for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement.entrySet()) {
31697 amit.gupta 4709
                    sb.append("<tr>");
4710
                    int fofoId = monthlyTargetAchievementEntry.getKey();
31218 tejbeer 4711
 
31697 amit.gupta 4712
                    MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
31886 tejbeer 4713
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31218 tejbeer 4714
 
31886 tejbeer 4715
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget() + "</td>\n");
31218 tejbeer 4716
 
31886 tejbeer 4717
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseAchievement() + "</td>\n");
31218 tejbeer 4718
 
31697 amit.gupta 4719
                    sb.append("</tr>\n");
31218 tejbeer 4720
 
31697 amit.gupta 4721
                }
31218 tejbeer 4722
 
32350 amit.gupta 4723
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb.toString(), null, subject);
31697 amit.gupta 4724
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4725
                // null, subject);
31218 tejbeer 4726
 
31697 amit.gupta 4727
            }
31604 tejbeer 4728
 
31697 amit.gupta 4729
        }
31604 tejbeer 4730
 
31697 amit.gupta 4731
    }
31604 tejbeer 4732
 
32061 amit.gupta 4733
    @Autowired
4734
    private PerformanceService performanceService;
4735
 
4736
 
4737
    public void sendFilteredRetailerPerformance() throws Exception {
4738
        RetailerFilterModel retailerFilterModel = performanceService.getRetailerFilterModel();
4739
 
4740
        Map<Integer, CustomRetailer> customRetailers = retailerService.getFofoRetailers(true);
4741
 
4742
 
4743
        List<RetailerPeformanceFilterModel> partnersPerformance = performanceService.getPerformance(retailerFilterModel, customRetailers);
4744
 
4745
        Map<Integer, RetailerPeformanceFilterModel> partnersPerformanceMap = new HashMap<>();
4746
 
4747
        if (!partnersPerformance.isEmpty()) {
4748
            partnersPerformanceMap = partnersPerformance.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
4749
            performanceService.sendPartnerPerformanceEmail(partnersPerformanceMap, retailerFilterModel, customRetailers);
4750
 
4751
        }
4752
 
4753
 
4754
    }
4755
 
32081 tejbeer 4756
    @Autowired
4757
    private VendorItemPricingRepository vendorItemPricingRepository;
32061 amit.gupta 4758
 
32081 tejbeer 4759
 
4760
    @Autowired
4761
    private VendorCatalogPricingService vendorCatalogPricingService;
4762
 
4763
 
33256 amit.gupta 4764
    public void migrateVendorItemPricing() throws ProfitMandiBusinessException {
32081 tejbeer 4765
 
4766
        List<VendorItemPricing> vendorItemPricings = vendorItemPricingRepository.selectAll();
32350 amit.gupta 4767
        LOGGER.info("At migrate VendorItemPricing");
32092 tejbeer 4768
        Map<Integer, Item> items = itemRepository.selectByIds(vendorItemPricings.stream().map(x -> x.getItemId()).collect(Collectors.toSet())).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32081 tejbeer 4769
        for (VendorItemPricing vendorItemPricing : vendorItemPricings) {
4770
            Item item = null;
32092 tejbeer 4771
            if (items.get(vendorItemPricing.getItemId()) != null) {
4772
                item = items.get(vendorItemPricing.getItemId());
4773
            } else {
32084 tejbeer 4774
                continue;
32081 tejbeer 4775
            }
32092 tejbeer 4776
 
32081 tejbeer 4777
            VendorCatalogPricingModel vendorCatalogPricingModel = new VendorCatalogPricingModel();
4778
            vendorCatalogPricingModel.setCatalogId(item.getCatalogItemId());
4779
            vendorCatalogPricingModel.setAuthId(13);
32088 tejbeer 4780
            vendorCatalogPricingModel.setDp(vendorItemPricing.getDp());
32081 tejbeer 4781
 
4782
            vendorCatalogPricingModel.setTp(vendorItemPricing.getTp());
4783
            vendorCatalogPricingModel.setMop(vendorItemPricing.getMop());
32384 amit.gupta 4784
            vendorCatalogPricingModel.setEffectedOn(LocalDate.of(2023, 8, 22));
32081 tejbeer 4785
            vendorCatalogPricingModel.setVendorId(vendorItemPricing.getVendorId());
4786
 
4787
 
4788
            try {
4789
                vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);
4790
            } catch (ProfitMandiBusinessException e) {
4791
                continue;
4792
            }
4793
 
4794
        }
4795
 
4796
    }
4797
 
4798
    public void approveVendorCatalogPricing() {
4799
        List<VendorCatalogPricingLog> vendorCatalogPricingLogs = vendorCatalogPricingLogRepository.selectByStatus(VendorCatalogPricingStatus.PENDING);
4800
 
32084 tejbeer 4801
 
32081 tejbeer 4802
        for (VendorCatalogPricingLog vendorCatalogPricingLog : vendorCatalogPricingLogs) {
32107 tejbeer 4803
            vendorCatalogPricingLog.setStatus(VendorCatalogPricingStatus.APPROVED);
4804
            vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());
4805
            vendorCatalogPricingLog.setApprovedBy(13);
4806
            vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());
32114 tejbeer 4807
            vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);
4808
        }
32081 tejbeer 4809
 
32114 tejbeer 4810
    }
32108 tejbeer 4811
 
32822 ranu 4812
    public void sendMailWhatsAppAfterLoanDueDate() throws Exception {
4813
        sdCreditService.updateRisk();
4814
        List<Loan> defaultLoans = sdCreditService.getLoanALert();
4815
        if (!defaultLoans.isEmpty()) {
4816
            this.sendLoanAlert(defaultLoans);
4817
        }
32108 tejbeer 4818
 
32822 ranu 4819
 
4820
    }
4821
 
4822
    public void sendLoanAlert(List<Loan> defaultLoans) throws
4823
            Exception {
4824
 
4825
        List<Integer> categoryIds = Arrays.asList(
4826
                ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
4827
                ProfitMandiConstants.TICKET_CATEGORY_RBM,
4828
                ProfitMandiConstants.TICKET_CATEGORY_SALES,
4829
                ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
4830
                ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
4831
 
4832
        /*for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
4833
            List<Loan> filteredRows = defaultLoans.stream()
4834
                    .filter(loan -> storeGuyEntry.getValue().contains(loan.getFofoId()))
4835
                    .collect(Collectors.toList());
4836
 
4837
            if (!filteredRows.isEmpty()) {
4838
                for (Loan defaultLoan : filteredRows) {
4839
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
4840
                    double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
4841
                    String messageText = getMessageForDueDateExtend(defaultLoan,amount);
4842
                   // String[] email = new String[]{storeGuyEntry.getKey()};
4843
                    String[] email = {"ranu.rajput@smartdukaan.com"};
4844
                    sendMailOfHtmlFormat(mailSender, email, messageText, null, subject);
4845
 
4846
                }
4847
            }
4848
        }*/
32842 amit.gupta 4849
        //Send single whatsapp to tv
4850
        String title = "SD Credit Alert!";
32850 amit.gupta 4851
        boolean notYetSent = true;
32822 ranu 4852
        for (Loan defaultLoan : defaultLoans) {
4853
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
4854
 
4855
            double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
4856
 
4857
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
4858
 
4859
            Address address = addressRepository.selectById(user.getAddressId());
4860
 
32842 amit.gupta 4861
            //String url = "http://app.smartdukaan.com/pages/home/credit";
32822 ranu 4862
 
32842 amit.gupta 4863
            String message = getMessageForDueDateExtend(defaultLoan, amount);
4864
            String whatsAppMessage = getWhatsAppMessageForDueDateExtend(defaultLoan, amount);
32948 amit.gupta 4865
            if (whatsAppMessage != null) {
32850 amit.gupta 4866
                notificationService.sendWhatsappMessage(whatsAppMessage, title, address.getPhoneNumber());
32948 amit.gupta 4867
                if (notYetSent) {
32850 amit.gupta 4868
                    notificationService.sendWhatsappMessage(whatsAppMessage, title, "9911565032");
4869
                    notYetSent = false;
4870
                }
4871
            }
4872
 
32822 ranu 4873
            String[] email = {user.getEmailId()};
4874
            sendMailOfHtmlFormat(mailSender, email, message, null, "Loan Alert - SmartDukaan");
4875
        }
4876
    }
4877
 
4878
    private String getMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
4879
 
4880
        double absoluteAmount = Math.abs(amount);
4881
        long roundedAmount = Math.round(absoluteAmount);
4882
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
4883
 
4884
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
4885
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
4886
 
4887
        // Retrieve the name of the user associated with the loan
4888
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
4889
 
4890
        // Initialize a StringBuilder to construct the HTML message
4891
        StringBuilder sb = new StringBuilder();
4892
 
32842 amit.gupta 4893
        if (LocalDate.now().isBefore(dueDate)) {
4894
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
32822 ranu 4895
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
4896
            // 5 Days Before Due Date - daily
4897
            if (noOfdaysBetween <= 5) {
4898
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4899
                sb.append("<p>This is a friendly reminder that your loan payment is due in " + noOfdaysBetween + "days, on " +
4900
                        payDate +
4901
                        ". Please ensure that the payment is made on time to avoid any late fees or penalties.</p>");
4902
                sb.append("<p>As per the terms of your loan agreement, the total amount due is Rs. " + formattedAmount + ". " +
4903
                        "You can make the payment by adding money to your wallet. If you have any questions or need assistance, " +
4904
                        "our customer service team is available to help you.</p>");
4905
                sb.append("<p>Thank you for your cooperation and prompt attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4906
            }
32842 amit.gupta 4907
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 4908
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
4909
 
4910
            // After Due Date – Alternate days
4911
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
4912
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4913
                sb.append("<p>We would like to remind you that your payment for the outstanding balance on your account is now overdue. " +
4914
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs. " + formattedAmount + ".</p>");
4915
                sb.append("<p>To avoid further charges and any negative impact on your CIBIL score, we kindly request that you settle the " +
4916
                        "outstanding balance as soon as possible.</p>");
4917
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4918
            }
4919
            // 5 Days before default - daily
32842 amit.gupta 4920
            if (noOfdaysBetween <= 5) {
32822 ranu 4921
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br>");
4922
                sb.append("<p>Attention: High Alert</p>");
4923
                sb.append("<p>Dear " + name + "</p>");
4924
                sb.append("<p>This is to inform you that the due date for your payment of Rs. " + formattedAmount + " has been crossed, " +
4925
                        "and you are approaching the default date on " + defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + ". " +
4926
                        "Please be aware that this will have a significant impact on your CIBIL score and may result in substantial penalties as well.</p>");
4927
                sb.append("<p>To rectify this situation, it is imperative that you take immediate action. " +
4928
                        "Please make the necessary payment immediately to avoid further consequences.</p>");
4929
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
4930
            }
32842 amit.gupta 4931
        } else {
32822 ranu 4932
            // Post Default - Daily
32842 amit.gupta 4933
            sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
4934
            sb.append("<p>We regret to inform you that you are currently in loan default. As a result, " +
4935
                    "higher penalties are being charged, which is also negatively impacting your CIBIL score. " +
4936
                    "It is imperative that you make an immediate payment to rectify this situation.</p>");
4937
            sb.append("<p>Please note that failing to make the payment promptly will result in further consequences, " +
4938
                    "including potential legal action and additional financial penalties. " +
4939
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible.</p>");
4940
            sb.append("<p>To make the payment, please add Rs. " + formattedAmount + " to your wallet. We are here to help you resolve this issue and get back on track.</p>");
4941
            sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
32822 ranu 4942
 
4943
        }
4944
 
4945
        // Return the constructed HTML message
4946
        sb.append("</body></html>");
4947
        return sb.toString();
4948
    }
4949
 
4950
    private String getWhatsAppMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
4951
 
4952
        double absoluteAmount = Math.abs(amount);
4953
        long roundedAmount = Math.round(absoluteAmount);
4954
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
4955
 
4956
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
4957
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
4958
 
4959
        // Retrieve the name of the user associated with the loan
4960
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
4961
 
4962
        // Initialize a StringBuilder to construct the HTML message
4963
        String message = null;
4964
 
32842 amit.gupta 4965
        if (LocalDate.now().isBefore(dueDate)) {
32822 ranu 4966
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
4967
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
4968
            // 5 Days Before Due Date - daily
4969
            if (noOfdaysBetween <= 5) {
4970
 
4971
                message = "Dear %s, This is a friendly reminder that your loan payment is due in %d days, on %s.\n" +
4972
                        "\n" +
4973
                        "Please ensure that the payment is made on time to avoid any late fees or penalties.As per the terms of your loan agreement, the total amount due is Rs. %s. You can make the payment by adding money to wallet.\n" +
4974
                        "\n" +
4975
                        "If you have any questions or need assistance, our customer service team is available to help you.\n" +
4976
                        "Thank you for your cooperation and prompt attention to this matter.\n" +
4977
                        "\n" +
4978
                        "Team SmartDukaan";
32842 amit.gupta 4979
                message = String.format(message, name, noOfdaysBetween, payDate, formattedAmount);
4980
            }
4981
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 4982
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
4983
            // After Due Date – Alternate days
4984
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
4985
                message = "Dear %s, We would like to remind you that your payment for the outstanding balance on your account is now overdue. \n" +
4986
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs.%s.\n" +
4987
                        "To avoid further charges and any negative impact on your CIBIL score, we kindly request that you settle the outstanding balance as soon as possible.\n" +
4988
                        "Thank you for your attention to this matter. \n" +
4989
                        "\n" +
4990
                        "Team SmartDukaan";
4991
                message = String.format(message, name, formattedAmount);
4992
            }
4993
            // 5 Days before default - daily
32842 amit.gupta 4994
            if (noOfdaysBetween <= 5) {
32822 ranu 4995
                String defaultPayDate = defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
4996
                message = "Attention: High Alert!! Dear %s, \n" +
4997
                        "\n" +
4998
                        "This is to inform you that the due date for your payment of Rs. %s has been crossed, and as a result, you are now about to reach default date %s.\n" +
4999
                        "Please be aware that this will have a significant impact on your CIBIL score and may result in substantial penalties as well. To rectify this situation, it is imperative that you take immediate action.\n" +
5000
                        "\n" +
5001
                        "Please make the necessary payment immediately to avoid further consequences. Thank you for your attention to this matter.\n" +
5002
                        "\n" +
5003
                        "Team SmartDukaan";
5004
                message = String.format(message, name, formattedAmount, defaultPayDate);
5005
            }
32842 amit.gupta 5006
        } else {
32822 ranu 5007
            // Post Default - Daily
5008
            message = "Dear %s, We regret to inform you that you are currently in loan default. As a result, higher penalties are being charged, which is also negatively impacting your CIBIL score. \n" +
5009
                    "\n" +
5010
                    "It is imperative that you make an immediate payment to rectify this situation. \n" +
5011
                    "\n" +
5012
                    "Please note that failing to make the payment promptly will result in further consequences, including potential legal action and additional financial penalties. \n" +
5013
                    "\n" +
5014
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible. \n" +
5015
                    "\n" +
5016
                    "To make the payment, please add Rs. %s  to wallet. We are here to help you resolve this issue and get back on track. Thank you for your attention to this matter. \n" +
5017
                    "\n" +
5018
                    "Team SmartDukaan";
5019
            message = String.format(message, name, formattedAmount);
5020
 
5021
        }
5022
        // Return the constructed HTML message
5023
        return message;
5024
    }
5025
 
32210 jai.hind 5026
}
5027
// 2284'