Subversion Repositories SmartDukaan

Rev

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