Subversion Repositories SmartDukaan

Rev

Rev 35446 | Rev 35461 | 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
 
34039 vikas.jang 3
import com.google.auth.oauth2.GoogleCredentials;
24542 amit.gupta 4
import com.google.common.collect.Lists;
25300 tejbeer 5
import com.google.gson.Gson;
29488 manish 6
import com.razorpay.Payment;
32421 amit.gupta 7
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationNewService;
29488 manish 8
import com.smartdukaan.cron.itelImeiActivation.ItelImeiActivationService;
9
import com.smartdukaan.cron.itelImeiActivation.TecnoImeiActivation;
33994 amit.gupta 10
import com.smartdukaan.cron.migrations.RunOnceTasks;
35021 amit 11
import com.smartdukaan.cron.scheduled.ambreports.AbmReportSender;
32482 amit.gupta 12
import com.smartdukaan.cron.scheduled.runnables.PurchaseMigration;
32511 amit.gupta 13
import com.spice.profitmandi.common.enumuration.*;
24121 govind 14
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
32421 amit.gupta 15
import com.spice.profitmandi.common.model.*;
24681 amit.gupta 16
import com.spice.profitmandi.common.services.ReporticoService;
29814 tejbeer 17
import com.spice.profitmandi.common.services.mandii.MandiiService;
35295 amit 18
import com.spice.profitmandi.common.util.FileUtil;
19
import com.spice.profitmandi.common.util.FormattingUtils;
20
import com.spice.profitmandi.common.util.PdfUtils;
21
import com.spice.profitmandi.common.util.Utils;
24592 amit.gupta 22
import com.spice.profitmandi.common.util.Utils.Attachment;
29308 tejbeer 23
import com.spice.profitmandi.common.web.client.RestClient;
25300 tejbeer 24
import com.spice.profitmandi.dao.Interface.Campaign;
32511 amit.gupta 25
import com.spice.profitmandi.dao.cart.CartService;
34450 ranu 26
import com.spice.profitmandi.dao.cart.SmartCartService;
25590 amit.gupta 27
import com.spice.profitmandi.dao.entity.auth.AuthUser;
30421 tejbeer 28
import com.spice.profitmandi.dao.entity.auth.PartnerCollectionRemark;
33078 ranu 29
import com.spice.profitmandi.dao.entity.catalog.*;
35393 amit 30
import com.spice.profitmandi.dao.entity.catalog.Offer;
33078 ranu 31
import com.spice.profitmandi.dao.entity.cs.NonSdBuying;
25590 amit.gupta 32
import com.spice.profitmandi.dao.entity.cs.Position;
26283 tejbeer 33
import com.spice.profitmandi.dao.entity.cs.Ticket;
35295 amit 34
import com.spice.profitmandi.dao.entity.dtr.*;
28769 amit.gupta 35
import com.spice.profitmandi.dao.entity.dtr.User;
32421 amit.gupta 36
import com.spice.profitmandi.dao.entity.fofo.*;
37
import com.spice.profitmandi.dao.entity.inventory.*;
33553 ranu 38
import com.spice.profitmandi.dao.entity.logistics.AST;
39
import com.spice.profitmandi.dao.entity.logistics.ASTRepository;
32421 amit.gupta 40
import com.spice.profitmandi.dao.entity.transaction.*;
41
import com.spice.profitmandi.dao.entity.user.*;
32511 amit.gupta 42
import com.spice.profitmandi.dao.entity.warehouse.WarehouseInventoryItem;
43
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
30421 tejbeer 44
import com.spice.profitmandi.dao.enumuration.auth.CollectionRemark;
34324 amit.gupta 45
import com.spice.profitmandi.dao.enumuration.catalog.StockTransactionType;
25598 amit.gupta 46
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
26790 tejbeer 47
import com.spice.profitmandi.dao.enumuration.dtr.RefferalStatus;
29814 tejbeer 48
import com.spice.profitmandi.dao.enumuration.fofo.Gateway;
31332 amit.gupta 49
import com.spice.profitmandi.dao.enumuration.fofo.PaymentStatus;
32511 amit.gupta 50
import com.spice.profitmandi.dao.enumuration.fofo.ReturnType;
24242 amit.gupta 51
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
34162 ranu 52
import com.spice.profitmandi.dao.enumuration.inventory.CatalogMovingEnum;
32081 tejbeer 53
import com.spice.profitmandi.dao.enumuration.inventory.VendorCatalogPricingStatus;
34324 amit.gupta 54
import com.spice.profitmandi.dao.enumuration.transaction.CreditRisk;
55
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
56
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
57
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
32421 amit.gupta 58
import com.spice.profitmandi.dao.model.*;
33452 amit.gupta 59
import com.spice.profitmandi.dao.repository.GenericRepository;
25590 amit.gupta 60
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
33078 ranu 61
import com.spice.profitmandi.dao.repository.auth.NonSdBuyingRepository;
30421 tejbeer 62
import com.spice.profitmandi.dao.repository.auth.PartnerCollectionRemarkRepository;
32421 amit.gupta 63
import com.spice.profitmandi.dao.repository.catalog.*;
33874 ranu 64
import com.spice.profitmandi.dao.repository.cs.CsService;
65
import com.spice.profitmandi.dao.repository.cs.PartnerRegionRepository;
66
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
67
import com.spice.profitmandi.dao.repository.cs.TicketRepository;
32421 amit.gupta 68
import com.spice.profitmandi.dao.repository.dtr.*;
69
import com.spice.profitmandi.dao.repository.fofo.*;
70
import com.spice.profitmandi.dao.repository.inventory.*;
33817 amit.gupta 71
import com.spice.profitmandi.dao.repository.logistics.WarehouseProviderRepository;
32421 amit.gupta 72
import com.spice.profitmandi.dao.repository.transaction.*;
35295 amit 73
import com.spice.profitmandi.dao.repository.trialOnboarding.TrialFormRepository;
24542 amit.gupta 74
import com.spice.profitmandi.dao.repository.user.AddressRepository;
34160 tejus.loha 75
import com.spice.profitmandi.dao.repository.user.LoiFormRepository;
25721 tejbeer 76
import com.spice.profitmandi.dao.repository.user.UserRepository;
32421 amit.gupta 77
import com.spice.profitmandi.dao.repository.warehouse.*;
34547 vikas.jang 78
import com.spice.profitmandi.dao.service.LiquidationService;
34252 tejus.loha 79
import com.spice.profitmandi.dao.service.PurSaleService;
33355 amit.gupta 80
import com.spice.profitmandi.dao.service.SidbiService;
32817 amit.gupta 81
import com.spice.profitmandi.dao.service.biuedart.BluedartAuthService;
82
import com.spice.profitmandi.dao.service.biuedart.BluedartService;
31604 tejbeer 83
import com.spice.profitmandi.dao.service.solr.FofoSolr;
32421 amit.gupta 84
import com.spice.profitmandi.service.*;
31332 amit.gupta 85
import com.spice.profitmandi.service.integrations.CCAvenuePaymentService;
28368 tejbeer 86
import com.spice.profitmandi.service.integrations.RazorpayPaymentService;
30858 amit.gupta 87
import com.spice.profitmandi.service.integrations.bharti.model.BAGInsuranceModel;
33638 amit.gupta 88
import com.spice.profitmandi.service.integrations.gstpro.GstProAuthService;
33817 amit.gupta 89
import com.spice.profitmandi.service.integrations.gstpro.GstProService;
35393 amit 90
import com.spice.profitmandi.service.integrations.pinelabs.dto.*;
32872 amit.gupta 91
import com.spice.profitmandi.service.integrations.psismart.PsiSmartService;
32948 amit.gupta 92
import com.spice.profitmandi.service.integrations.smartping.SmartPingService;
25694 amit.gupta 93
import com.spice.profitmandi.service.integrations.toffee.ToffeeService;
32421 amit.gupta 94
import com.spice.profitmandi.service.inventory.*;
31746 amit.gupta 95
import com.spice.profitmandi.service.offers.OfferService;
25335 amit.gupta 96
import com.spice.profitmandi.service.order.OrderService;
33452 amit.gupta 97
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
24431 amit.gupta 98
import com.spice.profitmandi.service.pricing.PriceDropService;
23724 amit.gupta 99
import com.spice.profitmandi.service.recharge.provider.OxigenRechargeProviderService;
100
import com.spice.profitmandi.service.recharge.provider.ThinkWalnutDigitalRechargeProviderService;
101
import com.spice.profitmandi.service.scheme.SchemeService;
29668 tejbeer 102
import com.spice.profitmandi.service.serviceConfig.ServiceConfigService;
35295 amit 103
import com.spice.profitmandi.service.transaction.CreditBlockedExceptionPartnersRepository;
31008 amit.gupta 104
import com.spice.profitmandi.service.transaction.CreditNoteService;
30859 tejbeer 105
import com.spice.profitmandi.service.transaction.SDCreditService;
23929 amit.gupta 106
import com.spice.profitmandi.service.transaction.TransactionService;
32990 amit.gupta 107
import com.spice.profitmandi.service.transaction.invoicing.InvoiceService;
23929 amit.gupta 108
import com.spice.profitmandi.service.user.RetailerService;
34160 tejus.loha 109
import com.spice.profitmandi.service.user.StoreTimelineTatService;
32511 amit.gupta 110
import com.spice.profitmandi.service.wallet.CommonPaymentService;
23739 amit.gupta 111
import com.spice.profitmandi.service.wallet.WalletService;
32421 amit.gupta 112
import com.spice.profitmandi.service.warehouse.PurchaseOrderService;
32511 amit.gupta 113
import com.spice.profitmandi.service.warehouse.WarehouseInventoryService;
33384 amit.gupta 114
import com.spice.profitmandi.service.warehouse.WarehouseService;
25721 tejbeer 115
import in.shop2020.model.v1.order.OrderStatus;
29308 tejbeer 116
import in.shop2020.model.v1.order.WalletReferenceType;
32421 amit.gupta 117
import org.apache.commons.io.output.ByteArrayOutputStream;
118
import org.apache.commons.lang.StringUtils;
119
import org.apache.http.client.methods.CloseableHttpResponse;
120
import org.apache.http.client.methods.HttpPost;
121
import org.apache.http.conn.HttpHostConnectException;
122
import org.apache.http.entity.StringEntity;
123
import org.apache.http.impl.client.CloseableHttpClient;
124
import org.apache.http.impl.client.HttpClients;
125
import org.apache.logging.log4j.LogManager;
126
import org.apache.logging.log4j.Logger;
127
import org.hibernate.SessionFactory;
128
import org.json.JSONObject;
129
import org.springframework.beans.factory.annotation.Autowired;
130
import org.springframework.beans.factory.annotation.Qualifier;
131
import org.springframework.beans.factory.annotation.Value;
132
import org.springframework.core.io.ByteArrayResource;
133
import org.springframework.core.io.InputStreamSource;
134
import org.springframework.mail.javamail.JavaMailSender;
135
import org.springframework.mail.javamail.MimeMessageHelper;
136
import org.springframework.stereotype.Component;
137
import org.springframework.transaction.annotation.Transactional;
31640 tejbeer 138
 
32421 amit.gupta 139
import javax.mail.MessagingException;
140
import javax.mail.internet.InternetAddress;
141
import javax.mail.internet.MimeMessage;
142
import java.io.*;
143
import java.math.BigDecimal;
144
import java.math.RoundingMode;
145
import java.nio.file.Files;
146
import java.nio.file.Paths;
147
import java.sql.Timestamp;
148
import java.text.DecimalFormat;
149
import java.time.*;
150
import java.time.format.DateTimeFormatter;
151
import java.time.temporal.ChronoField;
152
import java.time.temporal.ChronoUnit;
153
import java.util.*;
154
import java.util.Map.Entry;
155
import java.util.stream.Collectors;
156
import java.util.stream.Stream;
32060 amit.gupta 157
 
33664 amit.gupta 158
import static java.util.stream.Collectors.*;
32421 amit.gupta 159
 
160
 
23723 amit.gupta 161
@Component
33384 amit.gupta 162
@Transactional(rollbackFor = {Throwable.class, ProfitMandiBusinessException.class})
23723 amit.gupta 163
public class ScheduledTasks {
164
 
31697 amit.gupta 165
    @Value("${oxigen.recharge.enquiry.url}")
166
    private String oxigenRechargeEnquiryUrl;
24533 govind 167
 
31697 amit.gupta 168
    @Autowired
32482 amit.gupta 169
    PurchaseMigration purchaseMigration;
170
 
171
    @Autowired
32795 amit.gupta 172
    SmartPingService smartPingService;
173
 
33553 ranu 174
    @Autowired
175
    private ASTRepository astRepository;
29668 tejbeer 176
 
31697 amit.gupta 177
    @Autowired
178
    private ServiceConfigService serviceConfigService;
29801 manish 179
 
31697 amit.gupta 180
    @Autowired
181
    private TecnoImeiActivation tecnoImeiActivation;
28205 tejbeer 182
 
31697 amit.gupta 183
    private static final DateTimeFormatter leadTimeFormatter = DateTimeFormatter.ofPattern("d LLL, hh:mm a");
27088 tejbeer 184
 
31697 amit.gupta 185
    @Autowired
186
    private PartnerRegionRepository partnerRegionRepository;
28790 amit.gupta 187
 
31697 amit.gupta 188
    @Autowired
189
    private EmployeeAttendanceRepository employeeAttendanceRepository;
27088 tejbeer 190
 
31697 amit.gupta 191
    @Autowired
192
    VivoImeiActivationService vivoImeiActivationService;
29488 manish 193
 
31697 amit.gupta 194
    @Autowired
195
    ItelImeiActivationService itelImeiActivationService;
29488 manish 196
 
31697 amit.gupta 197
    @Autowired
198
    private PartnerTypeChangeService partnerTypeChangeService;
25598 amit.gupta 199
 
26408 amit.gupta 200
 
31697 amit.gupta 201
    @Autowired
202
    private LeadRepository leadRepository;
25927 amit.gupta 203
 
31697 amit.gupta 204
    @Autowired
205
    private AuthRepository authRepository;
25503 amit.gupta 206
 
31697 amit.gupta 207
    @Autowired
208
    private PriceDropService priceDropService;
26283 tejbeer 209
 
31697 amit.gupta 210
    @Autowired
211
    private FranchiseeVisitRepository franchiseeVisitRepository;
26790 tejbeer 212
 
31697 amit.gupta 213
    @Autowired
214
    private FranchiseeActivityRepository franchiseeActivityRepository;
26790 tejbeer 215
 
31697 amit.gupta 216
    @Autowired
217
    private HdfcPaymentRepository hdfcPaymentRepository;
26790 tejbeer 218
 
31697 amit.gupta 219
    @Autowired
220
    private CsService csService;
25846 amit.gupta 221
 
31697 amit.gupta 222
    @Autowired
223
    private SaholicInventoryService saholicInventoryService;
27208 tejbeer 224
 
31697 amit.gupta 225
    @Autowired
226
    private InsurancePolicyRepository insurancePolicyRepository;
23723 amit.gupta 227
 
31697 amit.gupta 228
    @Autowired
229
    private ToffeeService toffeeService;
25694 amit.gupta 230
 
31697 amit.gupta 231
    @Value("${oxigen.recharge.auth.key}")
232
    private String oxigenRechargeAuthKey;
23724 amit.gupta 233
 
31697 amit.gupta 234
    @Value("${oxigen.recharge.validation.url}")
235
    private String oxigenRechargeValidationUrl;
23724 amit.gupta 236
 
31697 amit.gupta 237
    @Value("${oxigen.recharge.validation.auth.key}")
238
    private String oxigenRechargeValidationAuthKey;
23724 amit.gupta 239
 
31697 amit.gupta 240
    @Value("${think.walnut.digital.recharge.transaction.mobile.url}")
241
    private String thinkWalnutDigitalRechargeTransactionMobileUrl;
23724 amit.gupta 242
 
31697 amit.gupta 243
    @Value("${think.walnut.digital.recharge.transaction.dth.url}")
244
    private String thinkWalnutDigitalRechargeTransactionDthUrl;
23724 amit.gupta 245
 
31697 amit.gupta 246
    @Value("${think.walnut.digital.recharge.enquiry.url}")
247
    private String thinkWalnutDigitalRechargeEnquiryUrl;
23724 amit.gupta 248
 
31697 amit.gupta 249
    @Value("${think.walnut.digital.recharge.balance.url}")
250
    private String thinkWalnutDigitalRechargeBalanceUrl;
23724 amit.gupta 251
 
31697 amit.gupta 252
    @Value("${think.walnut.digital.recharge.username}")
253
    private String thinkWalnutDigitalRechargeUserName;
23724 amit.gupta 254
 
31697 amit.gupta 255
    @Value("${think.walnut.digital.recharge.password}")
256
    private String thinkWalnutDigitalRechargePassword;
23724 amit.gupta 257
 
31697 amit.gupta 258
    @Value("${think.walnut.digital.recharge.auth.key}")
259
    private String thinkWalnutDigitalRechargeAuthKey;
23724 amit.gupta 260
 
31697 amit.gupta 261
    @Autowired
262
    private PurchaseRepository purchaseRepository;
23724 amit.gupta 263
 
31697 amit.gupta 264
    @Autowired
265
    private PriceDropIMEIRepository priceDropIMEIRepository;
25609 amit.gupta 266
 
31697 amit.gupta 267
    @Autowired
268
    PriceDropRepository priceDropRepository;
25609 amit.gupta 269
 
31697 amit.gupta 270
    @Autowired
271
    private PartnerTypeChangeRepository partnerTypeChangeRepository;
28368 tejbeer 272
 
31697 amit.gupta 273
    @Autowired
274
    private SchemeService schemeService;
24683 amit.gupta 275
 
31697 amit.gupta 276
    @Autowired
277
    private ServiceConfigRepository serviceConfigRepository;
29668 tejbeer 278
 
32061 amit.gupta 279
    @Autowired
280
    private RetailerBlockBrandsRepository retailerBlockBrandsRepository;
281
 
34547 vikas.jang 282
    @Autowired
283
    private LiquidationService liquidationService;
284
 
34578 vikas.jang 285
    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.gupta1@smartdukaan.com"};
25609 amit.gupta 286
 
31886 tejbeer 287
    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 288
 
33664 amit.gupta 289
    private static final String[] INDENT_TERTIARY_MAIL_LIST = new String[]{"uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "vinay.p@smartdukaan.com", "deena.nath@smartdukaan.com", "shobhit.tandon@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com"};
28709 amit.gupta 290
 
31886 tejbeer 291
    private static final String[] EMPLOYEE_ATTENDANCE_MAIL_LIST = new String[]{"sm@smartdukaan.com", "sm@smartdukaan.com"};
28790 amit.gupta 292
 
31697 amit.gupta 293
    private List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING);
25721 tejbeer 294
 
31697 amit.gupta 295
    @Autowired
296
    private ReporticoService reporticoService;
23724 amit.gupta 297
 
31697 amit.gupta 298
    @Autowired
299
    private PartnerInvestmentService partnerInvestmentService;
25598 amit.gupta 300
 
31697 amit.gupta 301
    @Autowired
302
    private PositionRepository positionRepository;
24337 amit.gupta 303
 
31697 amit.gupta 304
    @Autowired
305
    private FofoOrderItemRepository fofoOrderItemRepository;
25865 amit.gupta 306
 
31697 amit.gupta 307
    @Autowired
308
    private NotificationService notificationService;
24542 amit.gupta 309
 
31697 amit.gupta 310
    @Autowired
311
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
24277 amit.gupta 312
 
31697 amit.gupta 313
    @Autowired
314
    private SchemeInOutRepository schemeInOutRepository;
24241 amit.gupta 315
 
31697 amit.gupta 316
    @Autowired
317
    private RechargeTransactionRepository rechargeTransactionRepository;
23724 amit.gupta 318
 
31697 amit.gupta 319
    @Autowired
320
    private CustomerAddressRepository customerAddressRepository;
24542 amit.gupta 321
 
31697 amit.gupta 322
    @Autowired
323
    private RechargeProviderCreditWalletHistoryRepository rechargeProviderCreditWalletHistoryRepository;
23724 amit.gupta 324
 
31697 amit.gupta 325
    @Autowired
326
    private FofoLineItemRepository fofoLineItemRepository;
24590 amit.gupta 327
 
31697 amit.gupta 328
    @Autowired
329
    private FofoOrderRepository fofoOrderRepository;
24587 amit.gupta 330
 
31697 amit.gupta 331
    @Autowired
332
    private UserWalletHistoryRepository userWalletHistoryRepository;
24250 amit.gupta 333
 
31697 amit.gupta 334
    @Autowired
335
    private UserWalletRepository userWalletRepository;
24587 amit.gupta 336
 
31697 amit.gupta 337
    @Autowired
338
    private InventoryItemRepository inventoryItemRepository;
23929 amit.gupta 339
 
31697 amit.gupta 340
    @Autowired
341
    private WalletService walletService;
23724 amit.gupta 342
 
31697 amit.gupta 343
    @Autowired
344
    private ThinkWalnutDigitalRechargeProviderService thinkWalnutDigitalRechargeProviderService;
23724 amit.gupta 345
 
31697 amit.gupta 346
    @Autowired
347
    private OxigenRechargeProviderService oxigenRechargeProviderService;
23724 amit.gupta 348
 
31697 amit.gupta 349
    @Autowired
350
    private RechargeProviderRepository rechargeProviderRepository;
23724 amit.gupta 351
 
31697 amit.gupta 352
    @Autowired
353
    private ScanRecordRepository scanRecordRepository;
24242 amit.gupta 354
 
31697 amit.gupta 355
    @Autowired
356
    private DailyRechargeRepository dailyRechargeRepository;
23724 amit.gupta 357
 
31697 amit.gupta 358
    @Autowired
359
    private FofoStoreRepository fofoStoreRepository;
24177 govind 360
 
31697 amit.gupta 361
    @Value("${prod}")
362
    private boolean prod;
26945 amit.gupta 363
 
31697 amit.gupta 364
    @Autowired
365
    private StateGstRateRepository stateGstRateRepository;
23724 amit.gupta 366
 
31697 amit.gupta 367
    @Autowired
368
    private RetailerService retailerService;
23929 amit.gupta 369
 
31697 amit.gupta 370
    @Autowired
33078 ranu 371
    private BrandsRepository brandsRepository;
372
 
373
    @Autowired
31697 amit.gupta 374
    private TransactionService transactionService;
24250 amit.gupta 375
 
31697 amit.gupta 376
    @Autowired
377
    private ItemRepository itemRepository;
23929 amit.gupta 378
 
31697 amit.gupta 379
    @Autowired
380
    private OrderRepository orderRepository;
25351 tejbeer 381
 
31697 amit.gupta 382
    @Autowired
383
    private OrderService orderService;
23929 amit.gupta 384
 
31697 amit.gupta 385
    @Autowired
386
    private SchemeRepository schemeRepository;
24241 amit.gupta 387
 
31697 amit.gupta 388
    @Autowired
389
    private SchemeItemRepository schemeItemRepository;
31612 tejbeer 390
 
31697 amit.gupta 391
    @Autowired
392
    private JavaMailSender mailSender;
24177 govind 393
 
31697 amit.gupta 394
    @Autowired
395
    private PartnerTargetRepository partnerTargetRepository;
24002 amit.gupta 396
 
31697 amit.gupta 397
    @Autowired
398
    @Qualifier(value = "googleMailSender")
399
    private JavaMailSender googleMailSender;
23929 amit.gupta 400
 
31697 amit.gupta 401
    @Autowired
402
    private InventoryService inventoryService;
23929 amit.gupta 403
 
31697 amit.gupta 404
    @Autowired
405
    private AddressRepository addressRepository;
24542 amit.gupta 406
 
31697 amit.gupta 407
    @Autowired
408
    private RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;
24542 amit.gupta 409
 
31697 amit.gupta 410
    @Autowired
411
    private Mongo mongoClient;
24683 amit.gupta 412
 
31697 amit.gupta 413
    @Autowired
414
    private DeviceRepository deviceRepository;
25300 tejbeer 415
 
31697 amit.gupta 416
    @Autowired
417
    private PushNotificationRepository pushNotificationRepository;
25300 tejbeer 418
 
31697 amit.gupta 419
    @Autowired
420
    private NotificationCampaignRepository notificationCampaignRepository;
25300 tejbeer 421
 
31697 amit.gupta 422
    @Autowired
423
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
25721 tejbeer 424
 
31697 amit.gupta 425
    @Autowired
426
    private FocusedModelRepository focusedModelRepository;
25721 tejbeer 427
 
31697 amit.gupta 428
    @Autowired
429
    private UserAccountRepository userAccountRepository;
24653 govind 430
 
31697 amit.gupta 431
    @Autowired
432
    private UserRepository userUserRepository;
25721 tejbeer 433
 
31697 amit.gupta 434
    @Autowired
435
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
25927 amit.gupta 436
 
31697 amit.gupta 437
    @Autowired
438
    private UserCampaignRepository userCampaignRepository;
25721 tejbeer 439
 
31697 amit.gupta 440
    @Autowired
441
    private Gson gson;
25721 tejbeer 442
 
31697 amit.gupta 443
    @Autowired
444
    private TicketRepository ticketRepository;
26283 tejbeer 445
 
31697 amit.gupta 446
    @Autowired
447
    private RefferalRepository refferalRepository;
26790 tejbeer 448
 
31697 amit.gupta 449
    @Autowired
450
    private PartnerProblemRepository partnerProblemRepository;
28205 tejbeer 451
 
31697 amit.gupta 452
    @Autowired
453
    private PendingOrderRepository pendingOrderRepository;
28368 tejbeer 454
 
31697 amit.gupta 455
    @Autowired
456
    private PendingOrderItemRepository pendingOrderItemRepository;
28368 tejbeer 457
 
31697 amit.gupta 458
    @Value("${razorpay.account.keyId}")
459
    private String keyId;
28368 tejbeer 460
 
31697 amit.gupta 461
    @Value("${razorpay.account.keySecret}")
462
    private String keySecret;
28368 tejbeer 463
 
31697 amit.gupta 464
    @Autowired
465
    private RazorpayPaymentService razorPaymentService;
28369 tejbeer 466
 
31697 amit.gupta 467
    @Autowired
468
    private RazorPayRepository razorPayRepository;
28369 tejbeer 469
 
31697 amit.gupta 470
    @Autowired
471
    private PendingOrderService pendingOrderService;
28377 tejbeer 472
 
31697 amit.gupta 473
    @Autowired
474
    private CustomerRepository customerRepository;
28377 tejbeer 475
 
31697 amit.gupta 476
    @Autowired
477
    private RestClient restClient;
29308 tejbeer 478
 
31697 amit.gupta 479
    @Autowired
480
    private MandiiService mandiiService;
29814 tejbeer 481
 
31697 amit.gupta 482
    @Autowired
483
    CreditAccountRepository creditAccountRepository;
31604 tejbeer 484
 
31697 amit.gupta 485
    @Autowired
486
    CustomerOfferRepository customerOfferRepository;
31612 tejbeer 487
 
31697 amit.gupta 488
    @Autowired
489
    CustomerOfferItemRepository customerOfferItemRepository;
490
    @Autowired
491
    private FofoSolr fofoSolr;
23724 amit.gupta 492
 
25300 tejbeer 493
 
31697 amit.gupta 494
    private static final Logger LOGGER = LogManager.getLogger(ScheduledTasks.class);
31388 amit.gupta 495
 
34039 vikas.jang 496
    private String FCM_URL = "https://fcm.googleapis.com/v1/projects/api-project-309385327230/messages:send";
497
    private String FCM_SCOPED = "https://www.googleapis.com/auth/cloud-platform";
23724 amit.gupta 498
 
31697 amit.gupta 499
    @Autowired
500
    private TagListingRepository tagListingRepository;
33994 amit.gupta 501
    @Autowired
502
    private RunOnceTasks runOnceTasks;
23724 amit.gupta 503
 
31697 amit.gupta 504
    public void generateDailyRecharge() {
31886 tejbeer 505
        List<RechargeProviderCreditWalletHistory> allCreditHistory = rechargeProviderCreditWalletHistoryRepository.selectAll(0, 2000);
31697 amit.gupta 506
        List<RechargeProvider> rechargeProviders = rechargeProviderRepository.selectAll();
507
        rechargeProviders.stream().forEach(x -> x.setAmount(0));
23724 amit.gupta 508
 
31697 amit.gupta 509
        rechargeProviders.stream().forEach(x -> {
31886 tejbeer 510
            Map<LocalDate, List<RechargeProviderCreditWalletHistory>> dateWiseProviderCreditsMap = allCreditHistory.stream().filter(z -> z.getProviderId() == x.getId()).collect(groupingBy(x1 -> x1.getReceiveTimestamp().toLocalDate()));
23724 amit.gupta 511
 
31697 amit.gupta 512
            LOGGER.info("dateWiseProviderCreditsMap -{}", dateWiseProviderCreditsMap);
513
            LocalDate endDate = LocalDate.now().plusDays(1);
514
            float previousDayClosing = 0;
515
            LocalDate date = LocalDate.of(2018, 4, 6);
516
            while (date.isBefore(endDate)) {
31886 tejbeer 517
                List<RechargeTransaction> dateWiseRechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(Arrays.asList(RechargeStatus.values()), date.atStartOfDay(), date.plusDays(1).atStartOfDay());
23724 amit.gupta 518
 
31886 tejbeer 519
                List<RechargeTransaction> successfulTransactions = dateWiseRechargeTransactions.stream().filter(y -> y.getStatus().equals(RechargeStatus.SUCCESS)).collect(Collectors.toList());
23724 amit.gupta 520
 
31697 amit.gupta 521
                float dailyAmount = 0;
522
                float totalCommission = 0;
523
                for (RechargeTransaction rechargeTransaction : successfulTransactions) {
524
                    if (rechargeTransaction.getProviderId() == x.getId()) {
525
                        dailyAmount += rechargeTransaction.getAmount();
526
                        totalCommission += rechargeTransaction.getCommission();
527
                    }
528
                }
28205 tejbeer 529
 
31697 amit.gupta 530
                List<RechargeProviderCreditWalletHistory> rechargeHistoryList = dateWiseProviderCreditsMap.get(date);
531
                float dailyWalletRecharge = 0;
532
                if (rechargeHistoryList != null) {
533
                    for (RechargeProviderCreditWalletHistory rechargeProviderCreditWalletHistory : rechargeHistoryList) {
534
                        if (rechargeProviderCreditWalletHistory.getProviderId() == x.getId()) {
535
                            dailyWalletRecharge += rechargeProviderCreditWalletHistory.getAmount();
536
                        }
537
                    }
538
                }
539
                if (dailyAmount > 0 || dailyWalletRecharge > 0) {
540
                    DailyRecharge dailyRecharge = null;
541
                    try {
542
                        dailyRecharge = dailyRechargeRepository.selectByProviderIdAndCreateDate(x.getId(), date);
543
                    } catch (Exception e) {
544
                        LOGGER.info("Could not find Recharge entry");
545
                    }
546
                    if (dailyRecharge == null) {
547
                        dailyRecharge = new DailyRecharge();
548
                        dailyRecharge.setCreateDate(date);
549
                    }
550
                    dailyRecharge.setOpeningBalance(previousDayClosing);
551
                    dailyRecharge.setProviderId(x.getId());
552
                    dailyRecharge.setWalletRechargeAmount(dailyWalletRecharge);
553
                    dailyRecharge.setTotalAmount(dailyAmount);
554
                    dailyRecharge.setTotalCommission(totalCommission);
555
                    float closingBalance = dailyRecharge.getOpeningBalance() + dailyWalletRecharge - dailyAmount;
556
                    dailyRecharge.setClosingBalance(closingBalance);
557
                    dailyRechargeRepository.persist(dailyRecharge);
558
                    x.setAmount(x.getAmount() + dailyRecharge.getClosingBalance() - dailyRecharge.getOpeningBalance());
559
                    previousDayClosing = dailyRecharge.getClosingBalance();
560
                }
561
                date = date.plusDays(1);
562
            }
563
            rechargeProviderRepository.persist(x);
564
        });
565
        LOGGER.info("finished generating daily recharge");
566
    }
24240 amit.gupta 567
 
31697 amit.gupta 568
    public void reconcileRecharge() throws Exception {
569
        LocalDateTime fromDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(30);
570
        LocalDateTime toDate = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
571
        List<RechargeStatus> nonSuccessRechargeStatuses = new ArrayList<>(Arrays.asList(RechargeStatus.values()));
572
        LOGGER.info("nonSuccessRechargeStatuses {} ", nonSuccessRechargeStatuses);
573
        nonSuccessRechargeStatuses.remove(RechargeStatus.SUCCESS);
574
        nonSuccessRechargeStatuses.remove(RechargeStatus.FAILED);
575
        RechargeCredential thinkWalnutDigitalRechargeEnquiryCredential = new RechargeCredential();
576
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUrl(thinkWalnutDigitalRechargeEnquiryUrl);
577
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeUserName(thinkWalnutDigitalRechargeUserName);
578
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargePassword(thinkWalnutDigitalRechargePassword);
579
        thinkWalnutDigitalRechargeEnquiryCredential.setRechargeAuthKey(thinkWalnutDigitalRechargeAuthKey);
580
        Map<String, RechargeStatus> requestRechargeStatusChanged = new HashMap<>();
31886 tejbeer 581
        List<RechargeTransaction> rechargeTransactions = rechargeTransactionRepository.selectAllBetweenTimestamp(nonSuccessRechargeStatuses, fromDate, toDate);
31697 amit.gupta 582
        for (RechargeTransaction rechargeTransaction : rechargeTransactions) {
583
            try {
584
                int providerId = rechargeTransaction.getProviderId();
585
                if (providerId == 1) {
31886 tejbeer 586
                    oxigenRechargeProviderService.doCheckStatusRequest(oxigenRechargeEnquiryUrl, oxigenRechargeAuthKey, rechargeTransaction);
31697 amit.gupta 587
                } else if (providerId == 2) {
31886 tejbeer 588
                    thinkWalnutDigitalRechargeProviderService.doCheckStatusRequest(thinkWalnutDigitalRechargeEnquiryCredential, rechargeTransaction);
31697 amit.gupta 589
                }
31886 tejbeer 590
                if (rechargeTransaction.getStatus().equals(RechargeStatus.SUCCESS) || rechargeTransaction.getStatus().equals(RechargeStatus.FAILED)) {
591
                    requestRechargeStatusChanged.put(rechargeTransaction.getRequestId(), rechargeTransaction.getStatus());
31697 amit.gupta 592
                }
593
            } catch (Exception e) {
594
                LOGGER.info("Could not check status for Request {}", rechargeTransaction.getRequestId());
595
            }
596
        }
597
        LOGGER.info("Reconcile recharge ran successfully");
598
    }
24241 amit.gupta 599
 
31697 amit.gupta 600
    public void processActivation() throws Exception {
601
        schemeService.processActivation();
602
    }
24241 amit.gupta 603
 
31697 amit.gupta 604
    // TemporaryMethod
605
    public void migrateInvoice() {
606
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectFromSaleDate(LocalDateTime.now().minusDays(3));
607
        Map<Integer, List<FofoOrder>> partnerOrdersMap = new HashMap<>();
31886 tejbeer 608
        partnerOrdersMap = fofoOrders.stream().collect(groupingBy(FofoOrder::getFofoId, Collectors.toList()));
31697 amit.gupta 609
        for (List<FofoOrder> orderList : partnerOrdersMap.values()) {
610
            int sequence = 0;
611
            String prefix = "";
31886 tejbeer 612
            List<FofoOrder> sortedList = orderList.stream().sorted((x1, x2) -> x1.getId() - x2.getId()).collect(Collectors.toList());
31697 amit.gupta 613
            for (FofoOrder order : sortedList) {
23724 amit.gupta 614
 
31697 amit.gupta 615
                LOGGER.info("Order Id is {}, partner Id is {}", order.getId(), order.getFofoId());
616
                if (!order.getInvoiceNumber().contains("SEC")) {
617
                    sequence = Integer.parseInt(order.getInvoiceNumber().split("/")[1]);
618
                    prefix = order.getInvoiceNumber().split("/")[0];
619
                } else {
620
                    sequence += 1;
621
                    String invoiceNumber = prefix + "/" + sequence;
622
                    order.setInvoiceNumber(invoiceNumber);
623
                    fofoOrderRepository.persist(order);
624
                }
625
            }
24252 amit.gupta 626
 
31697 amit.gupta 627
        }
628
    }
28205 tejbeer 629
 
31697 amit.gupta 630
    @Autowired
631
    private ReporticoCacheTableRepository reporticoCacheTableRepository;
28205 tejbeer 632
 
31697 amit.gupta 633
    public void processSchemeOut(List<String> invoiceNumbers) throws Exception {
634
        for (String invoiceNumber : invoiceNumbers) {
635
            System.out.println("Invoice Number - " + invoiceNumber);
636
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
32147 amit.gupta 637
            //orderService.reverseScheme(fofoOrder);
31697 amit.gupta 638
            schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
639
        }
640
    }
24271 amit.gupta 641
 
31697 amit.gupta 642
    public void processSchemeIn(List<String> invoiceNumbers) throws Exception {
643
        for (String invoiceNumber : invoiceNumbers) {
644
            System.out.println("Invoice Number - " + invoiceNumber);
645
            Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
646
            schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
647
        }
648
    }
24271 amit.gupta 649
 
31697 amit.gupta 650
    public void processScheme(LocalDateTime startDate, LocalDateTime endDate, boolean dryRun) throws Exception {
651
        LOGGER.info("Started execution at {}", LocalDateTime.now());
652
        System.out.println(
653
                "InventoryId\tSerialNumber\tItem Id\tScheme Id\tScheme Name\tScheme Type\tAmount Type\tDP\tTaxable\tScheme Amount\tAmount Paid");
654
        try {
655
            List<Purchase> purchases = purchaseRepository.selectAllBetweenPurchaseDate(startDate, endDate);
656
            for (Purchase purchase : purchases) {
657
                schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
658
            }
29160 amit.gupta 659
 
31697 amit.gupta 660
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(startDate, endDate);
661
            for (FofoOrder fofoOrder : fofoOrders) {
662
                schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
663
            }
664
        } catch (Exception e) {
665
            e.printStackTrace();
666
            throw e;
667
        }
31886 tejbeer 668
        List<UserWalletHistory> uwhs = userWalletHistoryRepository.selectAllByDateType(LocalDate.now().atStartOfDay(), endDate, Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 669
        System.out.println("Amount\tReference\tReferenceType\tTimestamp\tDescription");
670
        for (UserWalletHistory uwh : uwhs) {
31886 tejbeer 671
            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 672
        }
673
        LOGGER.info("Schemes processed successfully.");
674
        if (dryRun) {
675
            throw new Exception();
676
        }
677
    }
29160 amit.gupta 678
 
31697 amit.gupta 679
    public void processRechargeCashback() throws Throwable {
680
        LocalDateTime cashbackTime = LocalDateTime.now();
681
        int referenceId = (int) Timestamp.valueOf(cashbackTime).getTime() / 1000;
31886 tejbeer 682
        List<RechargeTransaction> pendingTransactions = rechargeTransactionRepository.getPendingCashBackRehargeTransactions();
31697 amit.gupta 683
        Map<Object, Double> totalRetailerCashbacks = pendingTransactions.stream().collect(
31724 amit.gupta 684
                groupingBy(x -> x.getRetailerId(), Collectors.summingDouble(x -> x.getCommission())));
33452 amit.gupta 685
        for (Entry<Object, Double> totalRetailerCashback : totalRetailerCashbacks.entrySet()) {
31697 amit.gupta 686
            int retailerId = (Integer) totalRetailerCashback.getKey();
687
            float amount = totalRetailerCashback.getValue().floatValue();
688
            if (Math.round(amount) > 0) {
31886 tejbeer 689
                walletService.addAmountToWallet(retailerId, referenceId, WalletReferenceType.CASHBACK, "Recharge Cashback", Math.round(amount), LocalDateTime.now());
31697 amit.gupta 690
            }
691
        }
692
        for (RechargeTransaction rt : pendingTransactions) {
693
            rt.setCashbackTimestamp(cashbackTime);
694
            rt.setCashbackReference(referenceId);
695
            rechargeTransactionRepository.persist(rt);
696
        }
697
        LOGGER.info("Cashbacks for Recharge processed Successfully");
698
    }
29160 amit.gupta 699
 
31697 amit.gupta 700
    public void rollOutUpgardedMarginsNextMonth() throws Exception {
701
        LocalDate startOfPreviousMonth = LocalDate.now().with(ChronoField.DAY_OF_MONTH, 1).minusMonths(1);
29160 amit.gupta 702
 
31697 amit.gupta 703
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
704
        for (FofoStore store : stores) {
32003 amit.gupta 705
            this.rolloutMarginForStoreOnMonth(store, startOfPreviousMonth);
706
        }
707
    }
29252 amit.gupta 708
 
32003 amit.gupta 709
    public void rolloutMarginForStoreOnMonth(FofoStore store, LocalDate startOfMonth) throws ProfitMandiBusinessException {
710
        int fofoId = store.getId();
29252 amit.gupta 711
 
32003 amit.gupta 712
        PartnerType startOfPreviousMonthPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, startOfMonth);
34777 amit.gupta 713
        PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnMonth(fofoId, YearMonth.from(startOfMonth));
32003 amit.gupta 714
        if (!startOfPreviousMonthPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
715
            return;
716
        }
717
        if (!startOfPreviousMonthPartnerType.equals(todayPartnerType)) {
718
            LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), startOfPreviousMonthPartnerType, todayPartnerType);
719
            List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, startOfMonth.atStartOfDay(), startOfMonth.plusMonths(1).atStartOfDay(), 0, 0);
720
            for (FofoOrder fofoOrder : fofoOrders) {
721
                schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
31697 amit.gupta 722
            }
723
        }
724
    }
29252 amit.gupta 725
 
32003 amit.gupta 726
 
31697 amit.gupta 727
    public void rollOutUpgardedMargins() throws Exception {
728
        LocalDate today = LocalDate.now();
729
        LocalDate yesterday = today.minusDays(1);
730
        int upgradedCount = 0;
731
        List<FofoStore> stores = fofoStoreRepository.selectActiveStores();
732
        StringBuilder sb = new StringBuilder();
733
        for (FofoStore store : stores) {
734
            int fofoId = store.getId();
23724 amit.gupta 735
 
31697 amit.gupta 736
            PartnerType yesterdayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, yesterday);
737
            PartnerType todayPartnerType = partnerTypeChangeService.getTypeOnDate(fofoId, today);
738
            if (!yesterdayPartnerType.nextPartnerTypes().contains(todayPartnerType)) {
739
                continue;
740
            }
741
            if (!yesterdayPartnerType.equals(todayPartnerType)) {
742
                upgradedCount++;
31886 tejbeer 743
                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 744
                sb.append("<br>");
31886 tejbeer 745
                LOGGER.info("Partner Type has been changed for code {} from {} to {}", store.getCode(), yesterdayPartnerType, todayPartnerType);
746
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoId(fofoId, yesterday.withDayOfMonth(1).atStartOfDay(), yesterday.atStartOfDay(), 0, 0);
31697 amit.gupta 747
                for (FofoOrder fofoOrder : fofoOrders) {
748
                    schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
749
                }
30390 amit.gupta 750
 
31697 amit.gupta 751
            }
752
        }
753
        if (upgradedCount > 0) {
32439 tejbeer 754
            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 755
        } else {
32439 tejbeer 756
            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 757
        }
758
    }
30393 amit.gupta 759
 
31697 amit.gupta 760
    @Autowired
761
    private PartnerStatsService partnerStatsService;
30393 amit.gupta 762
 
31697 amit.gupta 763
    // Temporary Method
30393 amit.gupta 764
 
31697 amit.gupta 765
    public void fetchParnterStats() throws Exception {
766
        Map<Integer, PartnerDetailModel> partnerStats = partnerStatsService.getAllPartnerStats();
767
        ObjectOutputStream oos = null;
768
        FileOutputStream fout = null;
769
        try {
34666 ranu 770
//            fout = new FileOutputStream("/tmp/partnerStat.tmp", false);
771
            fout = new FileOutputStream("/var/www/partner_stats/partnerStat.tmp", false);
31697 amit.gupta 772
            oos = new ObjectOutputStream(fout);
773
            oos.writeObject(partnerStats);
30637 amit.gupta 774
 
31697 amit.gupta 775
        } catch (Exception ex) {
776
            ex.printStackTrace();
777
        } finally {
778
            if (oos != null) {
779
                oos.close();
780
            }
781
        }
32421 amit.gupta 782
        ReporticoCacheTable reporticoCacheTable = reporticoCacheTableRepository.selectByTableName("partnerStat");
783
        if (reporticoCacheTable == null) {
784
            reporticoCacheTable = new ReporticoCacheTable();
785
            reporticoCacheTable.setTableName("partnerStat");
786
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
787
            reporticoCacheTableRepository.persist(reporticoCacheTable);
31697 amit.gupta 788
        } else {
32421 amit.gupta 789
            reporticoCacheTable.setLastCreatedTimestamp(LocalDateTime.now());
31697 amit.gupta 790
        }
791
    }
31008 amit.gupta 792
 
31697 amit.gupta 793
    public void processPriceDrop() throws Exception {
31886 tejbeer 794
        List<PriceDrop> priceDrops = priceDropRepository.selectAllByDatesBetween(LocalDateTime.now(), LocalDateTime.now().minusYears(1));
31697 amit.gupta 795
        for (PriceDrop priceDrop : priceDrops) {
796
            if (priceDrop.getDropAmount() > 0) {
797
                priceDropService.processPriceDrop(priceDrop.getId(), true);
798
            }
799
        }
800
    }
31008 amit.gupta 801
 
31697 amit.gupta 802
    @Autowired
803
    CreditNoteService creditNoteService;
25598 amit.gupta 804
 
31697 amit.gupta 805
    public void sendCreditNote(YearMonth yearMonth) throws Exception {
806
        creditNoteService.issueMonthlyMarginsCN(yearMonth);
807
    }
25598 amit.gupta 808
 
31918 amit.gupta 809
    @Autowired
810
    BrandAgeingLimitRepository brandAgeingLimitRepository;
811
 
812
    @Autowired
813
    AgeingService ageingService;
814
 
33928 ranu 815
    @Autowired
816
    RbmTargetService rbmTargetService;
817
 
31918 amit.gupta 818
    public void sendMailForAgeingAlert() throws Exception {
819
        //brandAgeingLimitRepository.selectAll();
820
        Map<String, AgeingModel> ageingModelMap = ageingService.getAllAgeingForSecondary();
821
 
822
        System.out.println(ageingModelMap.size());
823
        List<PartnerAgeingModel> partnerAgeingModels = ageingService.getAllAgeingForTertiary();
824
 
825
 
33452 amit.gupta 826
        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 827
 
33452 amit.gupta 828
        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()));
829
        Attachment attachment1 = new Attachment("secondary-alert.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
830
        Attachment attachment2 = new Attachment("tertiary-alert.csv", new ByteArrayResource(byteArrayOutputStream2.toByteArray()));
31918 amit.gupta 831
 
832
        String mailSubject = "Stock ageing Alert";
833
        Utils.sendMailWithAttachments(mailSender, new String[]{"deena.nath@smartdukaan.com"}, null, mailSubject, "PFA", attachment1, attachment2);
834
    }
835
 
32724 amit.gupta 836
    public void rejectPriceDropsOfApprovedImeis() throws ProfitMandiBusinessException {
32690 amit.gupta 837
        priceDropService.rejectPriceDropsOfApprovedImeis();
838
    }
839
 
33357 amit.gupta 840
    public void processDeductions() {
841
        sidbiService.processDeductions();
842
    }
843
 
35295 amit 844
    public void resetHardLimit() throws  ProfitMandiBusinessException{
33904 amit.gupta 845
        sdCreditService.resetHardLimit();
846
    }
847
 
35021 amit 848
    public void testInvoiceFormat() throws ProfitMandiBusinessException {
849
        InvoicePdfModel invoicePdfModel = orderService.getInvoicePdfModel(560280);
850
        //System.out.println(InvoiceFormatter.buildInvoiceLines(invoicePdfModel, InvoiceFormatter.WIDTH_80MM));
851
    }
852
 
35326 amit 853
    public void sendTrialExpiry() {
854
        List<FofoStore> stores = fofoStoreRepository.selectAllTrial();
855
        List<FofoStore> twoDaysToExpiry = stores.stream().filter(x->x.getTrialEnd().minusDays(2).equals(LocalDate.now())).collect(Collectors.toList());
856
 
857
        List<FofoStore> fiveDaysToExpiry = stores.stream().filter(x->x.getTrialEnd().minusDays(5).equals(LocalDate.now())).collect(Collectors.toList());
858
        List<FofoStore> expiredToday = stores.stream().filter(x->x.getTrialEnd().equals(LocalDate.now())).collect(Collectors.toList());
859
        List<FofoStore> expired = stores.stream().filter(x->x.getTrialEnd().isAfter(LocalDate.now())).collect(Collectors.toList());
860
    }
861
 
34710 amit.gupta 862
    /*public void processCashDiscount() throws ProfitMandiBusinessException {
863
        System.out.println("processing cash discount");
864
        List<Loan> loansSettledYesterday = loanRepository.selectLoansSettledOn(LocalDate.now().minusDays(1));
865
        loansSettledYesterday.addAll(loanRepository.selectLoansSettledOn(LocalDate.now()));
866
        Map<Integer, List<Loan>> partnerSettledLoans = loansSettledYesterday.stream().collect(Collectors.groupingBy(x -> x.getFofoId()));
867
        for (Entry<Integer, List<Loan>> partnerLoans : partnerSettledLoans.entrySet()) {
868
            List<Loan> fullCdLoans = partnerLoans.getValue().stream().filter(x -> x.getInvoiceNumber() != null && x.getDays() <= ProfitMandiConstants.LOAN_PARTIAL_CREDIT_DAYS).collect(toList());
869
            List<Loan> partialCdLoans = partnerLoans.getValue().stream().filter(x -> x.getInvoiceNumber() != null && x.getDays() > ProfitMandiConstants.LOAN_PARTIAL_CREDIT_DAYS &&
870
                    x.getDays() <= ProfitMandiConstants.LOAN_FULL_CREDIT_DAYS).collect(toList());
871
            //List<Loan> noCdLoans = loanRepository.selectLoansDueByDays()
872
            //
873
            for (Loan fullCdLoan : fullCdLoans) {
874
                LOGGER.info("FullCdLoan - {}", fullCdLoan);
875
                schemeService.processFullCD(fullCdLoan.getInvoiceNumber());
876
            }
877
 
878
            for (Loan partialCdLoan : partialCdLoans) {
879
                schemeService.processPartialCD(partialCdLoan.getInvoiceNumber());
880
            }
881
 
882
            *//*for (Loan noCdLoan : noCdLoans) {
883
                schemeService.processNoCD(noCdLoan.getInvoiceNumber());
884
            }*//*
885
        }
886
 
887
    }*/
888
 
31697 amit.gupta 889
    private class SaleRoles {
25598 amit.gupta 890
 
31697 amit.gupta 891
        private List<String> l1;
892
        private List<String> l2;
25598 amit.gupta 893
 
31697 amit.gupta 894
        public SaleRoles() {
895
            l1 = new ArrayList<>();
896
            l2 = new ArrayList<>();
897
        }
25598 amit.gupta 898
 
31697 amit.gupta 899
        public List<String> getL1() {
900
            return l1;
901
        }
25598 amit.gupta 902
 
31697 amit.gupta 903
        public List<String> getL2() {
904
            return l2;
905
        }
26945 amit.gupta 906
 
31697 amit.gupta 907
    }
26945 amit.gupta 908
 
31697 amit.gupta 909
    private class FofoReportingModel {
910
        private String code;
911
        private int fofoId;
912
        private String businessName;
913
        private String territoryManager;
914
        private String regionalManager;
915
        private String businessManager;
26945 amit.gupta 916
 
31697 amit.gupta 917
        public String getCode() {
918
            return code;
919
        }
26945 amit.gupta 920
 
31697 amit.gupta 921
        public void setCode(String code) {
922
            this.code = code;
923
        }
26945 amit.gupta 924
 
31697 amit.gupta 925
        public String getBusinessName() {
926
            return businessName;
927
        }
26945 amit.gupta 928
 
31697 amit.gupta 929
        public void setBusinessName(String businessName) {
930
            this.businessName = businessName;
931
        }
26945 amit.gupta 932
 
31697 amit.gupta 933
        public String getTerritoryManager() {
934
            return territoryManager;
935
        }
26945 amit.gupta 936
 
31697 amit.gupta 937
        public void setTerritoryManager(String territoryManager) {
938
            this.territoryManager = territoryManager;
939
        }
26945 amit.gupta 940
 
31697 amit.gupta 941
        public String getRegionalManager() {
942
            return regionalManager;
943
        }
26945 amit.gupta 944
 
31697 amit.gupta 945
        public void setRegionalManager(String regionalManager) {
946
            this.regionalManager = regionalManager;
947
        }
26945 amit.gupta 948
 
31697 amit.gupta 949
        private ScheduledTasks getOuterType() {
950
            return ScheduledTasks.this;
951
        }
26945 amit.gupta 952
 
31697 amit.gupta 953
        @Override
954
        public String toString() {
31886 tejbeer 955
            return "FofoReportingModel{" + "code='" + code + '\'' + ", fofoId=" + fofoId + ", businessName='" + businessName + '\'' + ", territoryManager='" + territoryManager + '\'' + ", regionalManager='" + regionalManager + '\'' + ", businessManager='" + businessManager + '\'' + '}';
31697 amit.gupta 956
        }
26945 amit.gupta 957
 
31697 amit.gupta 958
        @Override
959
        public boolean equals(Object o) {
960
            if (this == o) return true;
961
            if (o == null || getClass() != o.getClass()) return false;
962
            FofoReportingModel that = (FofoReportingModel) o;
963
            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);
964
        }
26945 amit.gupta 965
 
31697 amit.gupta 966
        @Override
967
        public int hashCode() {
968
            return Objects.hash(code, fofoId, businessName, territoryManager, regionalManager, businessManager);
969
        }
26945 amit.gupta 970
 
31697 amit.gupta 971
        public String getBusinessManager() {
972
            return businessManager;
973
        }
26945 amit.gupta 974
 
31697 amit.gupta 975
        public void setBusinessManager(String businessManager) {
976
            this.businessManager = businessManager;
977
        }
25351 tejbeer 978
 
31697 amit.gupta 979
        public int getFofoId() {
980
            return fofoId;
981
        }
25598 amit.gupta 982
 
31697 amit.gupta 983
        public void setFofoId(int fofoId) {
984
            this.fofoId = fofoId;
985
        }
25598 amit.gupta 986
 
31697 amit.gupta 987
    }
26945 amit.gupta 988
 
31697 amit.gupta 989
    @Autowired
990
    WarehouseInventoryItemRepository warehouseInventoryItemRepository;
26945 amit.gupta 991
 
31746 amit.gupta 992
    @Autowired
993
    OfferService offerService;
994
 
995
    @Autowired
996
    PurchaseReturnItemRepository purchaseReturnItemRepository;
997
 
31918 amit.gupta 998
    @Autowired
999
    BrandRegionMappingRepository brandRegionMappingRepository;
1000
 
32161 tejbeer 1001
    @Autowired
1002
    StandAlone standAlone;
32214 jai.hind 1003
    @Autowired
1004
    ItelImeiActivationNewService itelImeiActivationNewService;
32350 amit.gupta 1005
 
1006
    public void checkItelImeiActivationNew(LocalDate date, Integer day) throws Exception {
32063 amit.gupta 1007
        try {
32223 amit.gupta 1008
            itelImeiActivationNewService.checkItelImeiActivationNew(date, day);
32063 amit.gupta 1009
        } catch (Throwable e) {
1010
            throw new Exception(e);
1011
        }
32223 amit.gupta 1012
    }
32062 amit.gupta 1013
 
32511 amit.gupta 1014
    @Autowired
1015
    PurchaseReturnService purchaseReturnService;
1016
 
32682 amit.gupta 1017
    @Autowired
1018
    JavaMailSender javaMailSender;
1019
 
32795 amit.gupta 1020
    @Autowired
1021
    OfferPayoutRepository offerPayoutRepository;
1022
 
1023
    @Autowired
1024
    OfferRepository offerRepository;
1025
 
32817 amit.gupta 1026
    @Autowired
1027
    BluedartAuthService bluedartAuthService;
1028
    @Autowired
1029
    BluedartService bluedartService;
1030
 
1031
    @Autowired
1032
    TransactionRelatedTasks transactionRelatedTasks;
1033
 
32872 amit.gupta 1034
    @Autowired
1035
    PsiSmartService psiSmartService;
32948 amit.gupta 1036
 
32961 amit.gupta 1037
    private void migrateValentine() throws ProfitMandiBusinessException {
1038
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.now().atStartOfDay(), LocalDateTime.now());
1039
        for (FofoOrder fofoOrder : fofoOrders) {
1040
            orderService.processScratchOffer(fofoOrder);
1041
        }
1042
    }
33051 amit.gupta 1043
 
32990 amit.gupta 1044
    @Autowired
1045
    InvoiceService invoiceService;
1046
 
33384 amit.gupta 1047
    @Autowired
1048
    WarehouseService warehouseService;
1049
 
33452 amit.gupta 1050
    @Autowired
1051
    GenericRepository genericRepository;
1052
 
1053
    @Autowired
1054
    PriceCircularService priceCircularService;
1055
 
34611 ranu 1056
    /*@Autowired
1057
    RedisCacheManager redisFortnightlyCacheManage;*/
33638 amit.gupta 1058
 
1059
    @Autowired
1060
    GstProAuthService gstProAuthService;
33664 amit.gupta 1061
 
33817 amit.gupta 1062
    @Autowired
1063
    GstProService gstProService;
1064
 
1065
    @Autowired
1066
    WarehouseProviderRepository warehouseProviderRepository;
33928 ranu 1067
 
34160 tejus.loha 1068
    @Autowired
1069
    LoiFormRepository loiFormRepository;
1070
    @Autowired
1071
    PartnerOnBoardingPanelRepository partnerOnBoardingPanelRepository;
1072
    @Autowired
1073
    StoreTimelineTatService storeTimelineTatService;
1074
    @Autowired
1075
    PartnerDealerRepository partnerDealerRepository;
33664 amit.gupta 1076
 
34275 tejus.loha 1077
    @Autowired
1078
    PurSaleService purSaleService;
1079
 
34502 amit.gupta 1080
    @Autowired
1081
    CatalogRepository catalogRepository;
1082
 
34510 amit.gupta 1083
    private void rolloutOppoPayout() throws Exception {
34504 amit.gupta 1084
        //List<Integer> schemeIds = Arrays.asList(5540, 5542, 5544,5918, 5919, 5920, 5921, 5922);
1085
        List<Integer> schemeIds = Arrays.asList(5540, 5542, 5544, 5545, 5550, 5555, 5556, 5557, 5564, 5565, 5566, 5567, 5569, 5570, 5582, 5590, 5592, 5593, 5594,
34502 amit.gupta 1086
                5595, 5598, 5602, 5604, 5605, 5606, 5607, 5608, 5611, 5618, 5620, 5621, 5622, 5623, 5624, 5625, 5626, 5629, 5631,
1087
                5633, 5634, 5635, 5637, 5644, 5649, 5655, 5659, 5662, 5668, 5672, 5674, 5679, 5683, 5684, 5685, 5688, 5689, 5690,
1088
                5692, 5694, 5697, 5699, 5700, 5706, 5718, 5729, 5730, 5754, 5756, 5758, 5759, 5761, 5762, 5766, 5769, 5771, 5772,
1089
                5773, 5774, 5775, 5776, 5781, 5782, 5783, 5786, 5788, 5790, 5795, 5800, 5803, 5804, 5807, 5809, 5815, 5816, 5819,
1090
                5820, 5821, 5822, 5823, 5824, 5825, 5826, 5827, 5828, 5829, 5830, 5832, 5833, 5834, 5835, 5836, 5837, 5839, 5840,
1091
                5841, 5842, 5843, 5844, 5845, 5846, 5847, 5848, 5849, 5850, 5851, 5852, 5853, 5854, 5855, 5857, 5859, 5860, 5863,
1092
                5864, 5866, 5869, 5870, 5871, 5872, 5873, 5874, 5875, 5877, 5878, 5879, 5880, 5885, 5888, 5889, 5891, 5892, 5894,
1093
                5899, 5901, 5903, 5905, 5908, 5910, 5913, 5916, 5917, 5918, 5919, 5920, 5921, 5922, 5923, 5924, 5925, 5926, 5927,
1094
                5928, 5929, 5930, 5931, 5932, 5933, 5934, 5935, 5936, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947,
1095
                5948, 5949, 5950, 5951, 5952, 5953, 5954, 5955, 5956, 5957, 5958, 5959, 5960, 5961, 5962, 5963, 5964, 5965, 5966,
1096
                5967, 5968, 5969, 5970, 5971, 5972, 5973, 5974, 5975, 5976, 5977, 5979, 5980, 5981, 5982, 5983, 5984, 5985, 5986,
1097
                5987, 5989, 5990, 5991, 5992, 5996, 5997, 5998, 5999, 6000, 6001, 6002, 6003, 6004, 6005, 6006, 6007, 6008, 6010,
1098
                6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6019, 6020, 6021, 6022, 6023, 6024, 6025, 6026, 6028, 6029, 6030,
1099
                6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 6040, 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049,
1100
                6050, 6051, 6052, 6053, 6054, 6055, 6056, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 6064, 6065, 6066, 6067, 6068,
1101
                6069, 6070, 6071, 6072, 6073, 6078, 6079, 6080, 6081, 6082, 6083, 6084, 6085, 6086, 6087, 6088, 6089, 6091, 6092,
34504 amit.gupta 1102
                6093, 6094, 6095, 6098, 6102);
34502 amit.gupta 1103
        Map<Integer, List<SchemeInOut>> inventoryItemSiosMap = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIds)).stream().collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
1104
        Map<Integer, InventoryItem> inventoryItemMap = inventoryItemRepository.selectByIds(inventoryItemSiosMap.keySet()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
1105
        Set<Integer> itemIds = itemRepository.selectAllByBrand("Oppo", 10006).stream().map(x -> x.getId()).collect(toSet());
1106
        List<InventoryItem> filteredInventoryItems = inventoryItemMap.values().stream().filter(x -> itemIds.contains(x.getItemId())).collect(Collectors.toList());
34510 amit.gupta 1107
 
1108
        Map<Integer, List<InventoryItem>> purchaseInventoryItemsMap = filteredInventoryItems.stream().filter(x -> x.getCreateTimestamp().isAfter(YearMonth.now().atDay(1).atStartOfDay())).collect(Collectors.groupingBy(x -> x.getPurchaseId()));
1109
        List<Purchase> purchases = purchaseRepository.selectAllByIds(new ArrayList<>(purchaseInventoryItemsMap.keySet()));
1110
        for (Purchase purchase : purchases) {
1111
            String invoiceNumber = purchase.getPurchaseReference();
1112
            LocalDateTime billingTime = orderRepository.selectByInvoiceNumber(invoiceNumber).get(0).getBillingTimestamp();
1113
            if (billingTime.isAfter(YearMonth.now().atDay(1).atStartOfDay())) {
1114
                schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
1115
            }
1116
        }
1117
 
34502 amit.gupta 1118
        for (InventoryItem filteredInventoryItem : filteredInventoryItems) {
34504 amit.gupta 1119
            //System.out.println("Serial Number is - " + filteredInventoryItem.getSerialNumber());
34502 amit.gupta 1120
            List<ScanRecord> scanRecords = scanRecordRepository.selectByInventoryItemId(filteredInventoryItem.getId());
1121
            ScanRecord scanRecord = scanRecords.stream().filter(x -> x.getType().equals(ScanType.SALE)).findFirst().orElse(null);
1122
            if (scanRecord == null) {
1123
                continue;
1124
            }
34510 amit.gupta 1125
            schemeService.processSchemeOut(scanRecord.getOrderId(), scanRecord.getFofoId());
34502 amit.gupta 1126
        }
1127
    }
1128
 
35021 amit 1129
    @Autowired
1130
    AbmReportSender abmReportSender;
34510 amit.gupta 1131
 
35021 amit 1132
    public void sendOverDueReport() {
1133
        List<Loan> loans = loanRepository.selectAllActiveLoan();
1134
        Map<Integer, List<Loan>> partnerLoansMap = loans.stream().filter(x->x.isOverdue()).collect(Collectors.groupingBy(x->x.getFofoId()));
1135
        //sdCreditService.getDueDateCrossLoan()
1136
        partnerLoansMap.entrySet().stream().forEach(x->{
34858 amit 1137
 
35021 amit 1138
            x.getKey();
1139
            x.getValue().size();
1140
        });
34858 amit 1141
 
35021 amit 1142
    }
1143
 
35295 amit 1144
    @Autowired
1145
    OnBoardingRelatedSchelduleTask onBoardingRelatedSchelduleTask;
1146
 
1147
    @Autowired
1148
    Migrations migrations;
1149
 
1150
    /*@Autowired
1151
    BenowService benowService;*/
1152
 
1153
    @Autowired
1154
    TrialFormRepository trialFormRepository;
1155
 
1156
    @Autowired
1157
    CreditBlockedExceptionPartnersRepository creditBlockedExceptionPartnersRepository;
1158
 
1159
    @Autowired
1160
    SDCreditService sdCreditService;
1161
 
35393 amit 1162
    @Autowired
1163
    com.spice.profitmandi.service.integrations.pinelabs.PinelabsAffordabilityService pinelabsAffordabilityService;
1164
 
1165
    @Autowired
1166
    com.spice.profitmandi.service.integrations.pinelabs.PinelabsAuthService pinelabsAuthService;
1167
    public void testAffordability() {
1168
        Money orderAmount = new Money("1000000", "INR");
1169
        Money discountAmount = new Money("0", "INR");
1170
        List<ProductDetails> productDetails = Arrays.asList(new ProductDetails(orderAmount, discountAmount, "Alpha_2"));
1171
        OfferDiscoveryRequest offerDiscoveryRequest = new com.spice.profitmandi.service.integrations.pinelabs.dto.OfferDiscoveryRequest(orderAmount, productDetails, new AffordabilityIssuer("12345678"));
1172
        OfferDiscoveryResponse offerDiscoveryResponse = pinelabsAffordabilityService.discoverOffers(offerDiscoveryRequest);
1173
        System.out.println(offerDiscoveryResponse);
1174
    }
35021 amit 1175
    public void test() throws Exception {
35393 amit 1176
 
1177
        System.out.println(pinelabsAuthService.getAccessToken());
1178
        testAffordability();
1179
 
35295 amit 1180
        //System.out.println(trialFormRepository.selectByEmailOrMobile("9990381568"));
1181
        /*CreditBlockedExceptionPartner creditBlockedExceptionPartner = creditBlockedExceptionPartnersRepository.select(175139430);
1182
        System.out.println(creditBlockedExceptionPartner);*/
35330 amit 1183
        //this.updatePartnerLimit(175139595);
35393 amit 1184
        //this.releaseBlockedLimit();
35326 amit 1185
        //sdCreditService.resetHardLimit();
35295 amit 1186
        //migrations.migrateSerialInvoiceMap();
35151 amit 1187
        //runOnceTasks.checkRewardsEligibility();
35295 amit 1188
        //hybridEncryptor.getJwt();
1189
        /*System.out.printf("Date|Transaction Id|Serial Number|Sale Amount|Swipe Payout|Discount Payout%n");
1190
        for(int i=0;i<10;i++){
1191
            benowService.parseBenowTransaction(LocalDate.now().minusDays(i));
1192
        }*/
1193
        //onBoardingRelatedSchelduleTask.onboardingEventDelays();
35177 amit 1194
        //runOnceTasks.migrateLimit();866009067657118
1195
        //TODO -- Sales Return Pending
1196
        //runOnceTasks.moveSaleReturnScanToDoa("866009067657118");
35295 amit 1197
        //runOnceTasks.sendCreditExposureReport();
35177 amit 1198
        //runOnceTasks.moveDoaScanToSaleReturn("868770072438608");
35150 vikas 1199
        //runOnceTasks.purchasePolicy();
35105 vikas 1200
        //purSaleService.moreThen10DaysEgedStockReport();
35102 amit 1201
        //System.out.println(schemeService.testRedis(1, 2L));
1202
        //System.out.println(schemeService.testRedis(1, null));
35177 amit 1203
        // abmReportSender.sendAbmSmartCartReport();
1204
        //this.sendOverDueReport();
35053 amit 1205
        /*List<Integer> orderIds = Arrays.asList(1929879,1932372,1932377,1932386,1932396,1935221,1935563,1935564,1945144,1955256,1955271,1955294,1961255,1961256,1972821,1972823,1972824,1972825,1972826,1974250,1974252,1974253,1974254,1974255,1974256,1974242,1974244,1974245,1974246,1974247,1974248,1976610,1978095,1978136,1978130,1978174,1978156,1978158,1978167,1978169,1978160,1978179,1978175,1978180,1978201,1978200,1978202,1978192,1978198,1978207,1978204,1978457,1979781,1979783,1979784,1979787,1982412,1982413,1986531,1986532,1986533,1991006,1991628,1991629,2016001,2018921,2042948,2047031,2058500,2058522,2058519,2058520,2058546,2058559,2058568,2058575,2058574,2058598,2058594,2058618,2058633,2066491,2067110,2067113,2067118,2067120,2067123,2067132,2067125,2067127,2069974,2069970,2069976,2069985,2069987);
35021 amit 1206
        for (Integer orderId : orderIds) {
1207
            System.out.println("Refund Started - " + orderId);
1208
            orderRepository.refundOrder(orderId, "vinay.p", "Long awaited cancellation", OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY);
1209
            System.out.println("Refund Ended");
35053 amit 1210
        }*/
1211
        //System.out.println(warehouseSupplierInvoiceRepository.selectWarehouseItemAgeing(LocalDateTime.now().minusDays(10), LocalDateTime.now(), null, 0, null));
35102 amit 1212
        /*Offer offer = offerRepository.selectById(6820);
1213
        offerService.sendWhatsapp(offer, Arrays.asList(175140233),"https://images.smartdukaan.com/uploads/campaigns/image2025-09-24/offer-6820.png");*/
1214
        /*List<String> invoices = Arrays.asList("NSDLNOI16527","NSDLNOI16366", "NSDLNOI16394", "NSDLNOI16460");
35056 amit 1215
        List<Loan> loans = new ArrayList<>();
1216
        for (String invoice : invoices) {
1217
            loans.add(loanRepository.selectLoanByInvoice(invoice));
1218
        }
1219
        loans.stream().sorted(Comparator.comparing(x->x.getCreatedOn())).forEach(x-> {
1220
            try {
1221
                sdCreditService.settleLoan(x);
1222
            } catch (ProfitMandiBusinessException e) {
1223
                throw new RuntimeException(e);
1224
            }
35102 amit 1225
        });*/
35021 amit 1226
        //Utils.sendMailWithAttachments(googleMailSender, new String[]{"amit.gupta@smartdukaan.com"}, null, "DTDC AWb", "PFA");*/
33452 amit.gupta 1227
    }
1228
 
35330 amit 1229
    private void releaseBlockedLimit() throws ProfitMandiBusinessException {
1230
        List<Loan> blockedLoans = loanRepository.selectAllBlockedLoans();
1231
        for (Loan blockedLoan : blockedLoans) {
1232
            LoanTransaction loanTransaction = loanTransactionRepository.selectByLoanId(blockedLoan.getId());
1233
            int transactionId = loanTransaction.getTransactionId();
1234
            List<UserWalletHistory> userWalletHistory = walletService.getAllByReference(blockedLoan.getFofoId(), transactionId, WalletReferenceType.PURCHASE);
1235
            int amount = userWalletHistory.get(userWalletHistory.size()-1).getAmount();
1236
            int loanAmount = blockedLoan.getIntialAmount().intValue();
1237
            if(loanAmount > -amount) {
1238
                sdCreditService.settleBlockedLoan(transactionId, loanAmount+amount);
1239
            }
1240
 
1241
 
1242
 
1243
        }
1244
    }
1245
 
34731 amit.gupta 1246
    @Autowired
1247
    LoanTransactionRepository loanTransactionRepository;
1248
 
1249
    private void fixBlockedCredit() throws ProfitMandiBusinessException {
1250
        List<Loan> unsettledBlockedLoans = loanRepository.selectAllActiveLoan().stream().filter(x -> x.getFreeDays() >= 365).collect(toList());
1251
        //unsettledBlockedLoans = unsettledBlockedLoans.stream().filter(x -> x.getId() == 52310).collect(toList());
1252
        for (Loan unsettledBlockedLoan : unsettledBlockedLoans) {
1253
            LoanTransaction loanTransaction = loanTransactionRepository.selectByLoanId(unsettledBlockedLoan.getId());
1254
            if (loanTransaction == null) {
1255
                System.out.println("Cant find Transaction Id for Loan - " + unsettledBlockedLoan.getId() + "-- Created On ->" + unsettledBlockedLoan.getCreatedOn());
1256
                continue;
1257
            }
1258
            List<Order> processedOrders = orderRepository.selectAllByTransactionId(loanTransaction.getTransactionId()).stream()
1259
                    .filter(x -> !x.getStatus().equals(OrderStatus.SUBMITTED_FOR_PROCESSING)).collect(toList());
1260
            List<OrderStatus> processedOrderIds = processedOrders.stream().map(x -> x.getStatus()).collect(Collectors.toList());
1261
            System.out.println("processedOrderIds " + processedOrderIds);
1262
            //if(unsettledBlockedLoan !=null) continue;
1263
            double limitToRelease = processedOrders.stream().collect(Collectors.summingDouble(x -> x.getWalletAmount()));
1264
            sdCreditService.releaseBlockedLimit(unsettledBlockedLoan, limitToRelease);
1265
 
1266
 
1267
        }
1268
    }
1269
 
34710 amit.gupta 1270
    public static byte[] toByteArray(InputStream input) throws IOException {
1271
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
1272
        int nRead;
1273
        byte[] data = new byte[16384];
1274
        while ((nRead = input.read(data, 0, data.length)) != -1) {
1275
            buffer.write(data, 0, nRead);
1276
        }
1277
        return buffer.toByteArray();
1278
    }
1279
 
34547 vikas.jang 1280
    private void whatsappTest() throws Exception {
34603 ranu 1281
        //liquidationService.processBids(ProfitMandiConstants.BID_CRON_ENUM.TODAY);
34612 ranu 1282
        Utils.sendMailWithAttachments(googleMailSender, new String[]{"ranu.rajput@smartdukaan.com"}, null, "Test Mail", "Mail is working");
34532 amit.gupta 1283
    }
1284
 
34510 amit.gupta 1285
    private void debitLoanAmountFromWallet() {
1286
        List l1 = Arrays.asList(1234, 1420, 2694, 8129, 12182, 12880, 16289, 16462, 16551, 16625, 16819, 17606, 18902, 19152, 19663, 22409, 22410, 23924, 24058, 24206, 24215, 24220, 24459, 25977, 30585, 31590);
1287
        l1.addAll(Arrays.asList(11849, 12702, 14554, 14643, 19166, 19638, 32824, 33467, 33954, 34017, 34514, 35128, 35229, 35355, 36007, 36351, 36435, 36586, 36608, 36612, 36665, 37076, 37495, 37678, 38519, 38563, 38638, 38690, 38815, 38840, 39015, 39084, 39142, 39379, 39384, 39586, 39636, 39657, 39755, 39788, 39908, 40054, 40220, 40534, 41731, 41962, 42692));
1288
        l1.addAll(Arrays.asList());
1289
    }
1290
 
33452 amit.gupta 1291
    public void test4() throws Exception {
1292
        List<Integer> offerIds = Arrays.asList(2882, 2881, 2880, 2879, 2878, 2877, 2876, 2875, 2874, 2873, 2872, 2871, 2870, 2869, 2868, 2867, 2866, 2865, 2864, 2863, 2862, 2861, 2860, 2859, 2858, 2857, 2856, 2855, 2854, 2853, 2852, 2851, 2850, 2849, 2847, 2846, 2845, 2844, 2843, 2842, 2841, 2840, 2839, 2838, 2837, 2836, 2835, 2834, 2833, 2832, 2831, 2830, 2829, 2828, 2827, 2826, 2825, 2824, 2823, 2822, 2821, 2820, 2819, 2818, 2817, 2816, 2815, 2814, 2813, 2812, 2811, 2810, 2809, 2808, 2807, 2806, 2805, 2804, 2803, 2802, 2801, 2800, 2799, 2798, 2797, 2796, 2795, 2794, 2793, 2792, 2791, 2790, 2789, 2788, 2787, 2786, 2785, 2784, 2783, 2782, 2781, 2780, 2777, 2776, 2775, 2774, 2773, 2772, 2771, 2770, 2769, 2768, 2767, 2766, 2765, 2764, 2763, 2762, 2761, 2760, 2759, 2758, 2757, 2756, 2755, 2754, 2753, 2752, 2751, 2750, 2749, 2748, 2747, 2746, 2745, 2744, 2723, 2722, 2721, 2720, 2719, 2718, 2717, 2716, 2715, 2714, 2713, 2712, 2711, 2710, 2709, 2708, 2707, 2706, 2705, 2704, 2703, 2702, 2701, 2700, 2699, 2698, 2697, 2696, 2695, 2694, 2693, 2692, 2691, 2690, 2494, 2493, 2492, 2491, 2490, 2489, 2488, 2487, 2486, 2485, 2484, 2483, 2482, 2481, 2480, 2479, 2478, 2477, 2476, 2475, 2474, 2473, 2472, 2471, 2470, 2469, 2466, 2465, 2464, 2463, 2462, 2461, 2460, 2459, 2458, 2457, 2456, 2455, 2454, 2453, 2452, 2451, 2450, 2449, 2448, 2447, 2446, 2445, 2444, 2443, 2442, 2441, 2440, 2439, 2407, 2406, 2405, 2404, 2403, 2402, 2401, 2400, 2399, 2398, 2397, 2396, 2395, 2394, 2393, 2392, 2391, 2390, 2389, 2388, 2387, 2386, 2385, 2384, 2383, 2382, 2381, 2117, 2116, 2115, 2114, 2113, 2112, 2111, 2110, 2109, 2108, 2107, 2106, 2105, 2104, 2103, 2102, 2101, 2100, 2099, 2098, 2077);
1293
        for (Integer offerId : offerIds) {
1294
            Offer fromOffer = offerRepository.selectById(offerId);
1295
            CreateOfferRequest createOfferRequest = offerService.getCreateOfferRequest(fromOffer);
1296
            System.out.println("Processing offer Id " + fromOffer);
1297
            offerService.processActivationtOffer(createOfferRequest);
1298
        }
34160 tejus.loha 1299
 
33433 amit.gupta 1300
        this.processSidbiDeductions();
32817 amit.gupta 1301
    }
1302
 
1303
    public void test3() throws Exception {
1304
        List<Long> payoutIds = Arrays.asList();
32795 amit.gupta 1305
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByIds(payoutIds);
33452 amit.gupta 1306
        Map<Integer, List<OfferPayout>> offerPayoutMap = offerPayouts.stream().collect(groupingBy(x -> (int) x.getOfferId()));
1307
        for (Entry<Integer, List<OfferPayout>> offerPayoutEntry : offerPayoutMap.entrySet()) {
32795 amit.gupta 1308
            int offerId = offerPayoutEntry.getKey();
1309
            List<OfferPayout> offerPayoutList = offerPayoutEntry.getValue();
33452 amit.gupta 1310
            Map<Integer, List<OfferPayout>> partnerOfferPayoutMap = offerPayoutList.stream().collect(groupingBy(x -> (int) x.getFofoId()));
32795 amit.gupta 1311
            for (Entry<Integer, List<OfferPayout>> partnerOfferPayoutEntry : partnerOfferPayoutMap.entrySet()) {
1312
                int fofoId = partnerOfferPayoutEntry.getKey();
1313
                List<OfferPayout> partnerPayouts = partnerOfferPayoutEntry.getValue();
1314
                float amount = 0;
1315
                for (OfferPayout offerPayout : partnerPayouts) {
1316
                    amount += offerPayout.getAmount();
1317
                    offerPayout.setStatus(SchemePayoutStatus.REJECTED);
1318
                    offerPayout.setRejectTimestamp(LocalDateTime.now());
1319
                }
1320
                walletService.rollbackAmountFromWallet(fofoId, amount, offerId,
1321
                        WalletReferenceType.ADDITIONAL_SCHEME, "Imeis returned - " + partnerPayouts.size() + "pc(s)", LocalDateTime.now());
1322
            }
1323
        }
1324
    }
1325
 
33316 amit.gupta 1326
    public void test1() throws Exception {
32690 amit.gupta 1327
        System.out.println("Hello from test");
32724 amit.gupta 1328
        //this.calculateInterestAccured();
32690 amit.gupta 1329
        //sendMailOfHtmlFormat(javaMailSender, new String[]{"amit.gupta@smartdukaan.com"}, "hello", null, "Hello");
32698 amit.gupta 1330
        //priceDropService.rejectPriceDropsOfApprovedImeis();
32511 amit.gupta 1331
        //Create return
32600 amit.gupta 1332
        //this.updatePartnerLimit();
32607 ranu 1333
        //creditNoteService.sendCnMails(YearMonth.now().minusMonths(2));
32690 amit.gupta 1334
        //orderService.createMissingScratchOffers();
33315 amit.gupta 1335
        LocalDateTime debitNoteDate = LocalDate.of(2024, Month.APRIL, 30).atStartOfDay();
32698 amit.gupta 1336
        Map<Integer, Set<String>> fofoIdImeiReturnMap = new LinkedHashMap<>();
33355 amit.gupta 1337
        /*fofoIdImeiReturnMap.put(175139690,	new HashSet<>(Arrays.asList("862054078463472","863862077158219","866202075810858","866202077654494","866335072023651","866518078002718")));
33315 amit.gupta 1338
        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")));
1339
        fofoIdImeiReturnMap.put(175139603,	new HashSet<>(Arrays.asList("350886063151961","356412387787135","357594162824701","357594162874771","860600078193972","863862077025350","863862077875796","863967075815072","866335073794995","866335074287874","869116067546048")));
1340
        fofoIdImeiReturnMap.put(175139657,	new HashSet<>(Arrays.asList("350933415734746","354324787135850","354324788766356","354990352512960","354990352580181","358142881241184","866611064207332","869116067600464")));
1341
        fofoIdImeiReturnMap.put(175139223,	new HashSet<>(Arrays.asList("350210770983048","350210771169027","350210771179844","350210771180784","863975067090596","866611060326797","868565075758196","869452074016992","869452074609515","869452074609556","869452074976674","869452074978654")));
1342
        fofoIdImeiReturnMap.put(175139557,	new HashSet<>(Arrays.asList("861977073551795","861977073552678","861977074486819","862046062571245","862046067278226","862046067734921","862046067756866","864468070394741","864468071225506","864468071668341","864468073604740","864468074854625","866993074734475")));
1343
        fofoIdImeiReturnMap.put(175139079,	new HashSet<>(Arrays.asList("862046068861921","862282079169299","865388071283496","866335072007753","866335073946256","866518073601712","866518077425993","866518078760471","868938062675394","868938062690799","868938064895552")));
1344
        fofoIdImeiReturnMap.put(175139711,	new HashSet<>(Arrays.asList("861753065266498","861888066009099","864468073703369","866993071640154","869116062800465")));
1345
        fofoIdImeiReturnMap.put(175139488,	new HashSet<>(Arrays.asList("862054076866114","862054076866650","866335071879079","866335077875998","866335077876095","866518078758939","868938062692878")));
1346
        fofoIdImeiReturnMap.put(175138934,	new HashSet<>(Arrays.asList("862054072810231","862054072823150","862054076867674","862054078659590","863862075768456","863862077158193","863975064472490","863975064473233","865388071160033","865610079408035","866335072117370","866335073899471","866335074306153","866335075664477","868938062669876","868938062677895","868938062685997")));
1347
        fofoIdImeiReturnMap.put(4149607	 ,   new HashSet<>(Arrays.asList("864468073415741","864468075548523","864468075549927","864468079499426","866657074106022","868938062686656","868938062696978","868938062699352","868938064895198","868938066363799")));
1348
        fofoIdImeiReturnMap.put(175139138,	new HashSet<>(Arrays.asList("862286066217631","864259076533691","864468073358842","864487061610014","864487061675918","866083066080028","866518078760950","866518078768979","866657075343848","868544061108518","868544061138432","869116065510848","869116065519781","869452074116891","869452074972939")));
1349
        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")));
1350
        fofoIdImeiReturnMap.put(175139731,	new HashSet<>(Arrays.asList("860600079214413","861753063502217","861753065084172","861753065084636","863975064472094","863975064473076","863975064477218","864468074456462","865883068726994","866657074641481","866657078016946","868938062699832","868938062700754")));
1351
        fofoIdImeiReturnMap.put(175138958,	new HashSet<>(Arrays.asList("863862075766393","864179064784108","866202075811732","866202076252654","866202078005571","868544060277439")));
1352
        fofoIdImeiReturnMap.put(175139612,	new HashSet<>(Arrays.asList("864468073474946","864468073477808","864468075031082","864468075280689","864468075745723","864468079481747","864468079483123","866657074538125","866657074538141","866657074573106","867467071856465","867467071875465","867467071891223","867467071913845","867467072729125","867467072760088")));
1353
        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")));
1354
        fofoIdImeiReturnMap.put(175139245,	new HashSet<>(Arrays.asList("354324787133962","354324787569397","354324787602750","863816078139719","863816078448318","866335070534139")));
1355
        fofoIdImeiReturnMap.put(175139324,	new HashSet<>(Arrays.asList("863718060410316","863862075060755","865610074109257","866518078844457","866518079735159")));
1356
        fofoIdImeiReturnMap.put(175139576,	new HashSet<>(Arrays.asList("354324789013261","861128071288044","862736064686138","863718062236859","863816074642674","863816074646691","864259078939631","867467071870367","867467072760625","868565073047048")));
1357
        fofoIdImeiReturnMap.put(175139150,	new HashSet<>(Arrays.asList("860492060436217","861977073052257","862054073026738","862054073052056","863862077158938","866993074147710","867907071407074","868938060257450","868956064835055")));
1358
        fofoIdImeiReturnMap.put(175139463,	new HashSet<>(Arrays.asList("862181066909552","863816077757719","863816078448516","864214068977273","866335070447936","866335071699212","866335071699592","866335071700291")));
1359
        fofoIdImeiReturnMap.put(175139722,	new HashSet<>(Arrays.asList("358250293364682","358250294683627","358250295102007","861858064421273","861888066009537","864214068983198","864259078491112","864259078787733","865883068445694","866335072878930","866518078371014","868492068014968","868565072254660","868565073401468","868565073465661")));
1360
        fofoIdImeiReturnMap.put(168311083,	new HashSet<>(Arrays.asList("863718064506176","864468070873488","865883068175572","866335071204435","866335072093738","866518077064313","866657077386209","866657077862282","868938061427359")));
1361
        fofoIdImeiReturnMap.put(175139691,	new HashSet<>(Arrays.asList("863718061338714","863718061339258")));
1362
        fofoIdImeiReturnMap.put(175139395,	new HashSet<>(Arrays.asList("860492060436910","861220079009850","862054077288730","863511068660374","863718060300574","863718060617936","866335072874111","869452070894897")));
1363
        fofoIdImeiReturnMap.put(175139621,	new HashSet<>(Arrays.asList("351240553452191","351240553483527","351240553502920","354990353485570","860492062979750","860492062980998","864214068585274","864214068784398","864214068795378","864214068946534","864214068946757","864214068982075","868938061418754","868938061427391","868938062623139")));
1364
        fofoIdImeiReturnMap.put(175139638,	new HashSet<>(Arrays.asList("863862077159191","866518078780438","866518079750471","868428060238049","868938061532836","868938062619517")));
1365
        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")));
1366
        fofoIdImeiReturnMap.put(175139513,	new HashSet<>(Arrays.asList("861977073670355","863718060618439","864468075204986","868024064295935","868024065473754","868024065567811","868024065763972","868956063947893")));
1367
        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")));
1368
        fofoIdImeiReturnMap.put(175139359,	new HashSet<>(Arrays.asList("358250293060942","358250293061387","863718063044252","863862077160991","866335072536793","866335072536975","866335072537130","866335072726691","866335072726733","866335073628532","866335073925250","866335073925292","866335073926233","866335075267156")));
1369
        fofoIdImeiReturnMap.put(175139397,	new HashSet<>(Arrays.asList("861977073659010","863511069721050","864468071611101","864468074432844","864468074435284")));
1370
        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")));
1371
        fofoIdImeiReturnMap.put(175139460,	new HashSet<>(Arrays.asList("860492061918494","862054079983072","862054079983171","866335070533032","866518078995119","866518079014993","868938060095017")));
1372
        fofoIdImeiReturnMap.put(175139585,	new HashSet<>(Arrays.asList("358250293614706","358250293614904","358250294602908","358250294603120","358250295002181","861977074487718","863718061173699","863816078050254","865883068445777","866335070453439","866335070526812","866335071204351","866518078640293","869116067596803")));
1373
        fofoIdImeiReturnMap.put(175139726,	new HashSet<>(Arrays.asList("861858064489411","863718063927654","864468073702221","864468073928784","864468074193149","865883068445819","866657078378742","866657078498904","867949078179850","867949078180494","868544060023197")));
1374
        fofoIdImeiReturnMap.put(175139532,	new HashSet<>(Arrays.asList("863718060615096","863718060615617","863718060727537","863816077797897","866335073405139","868565072217287","868565072264560","868956065132510")));
1375
        fofoIdImeiReturnMap.put(175139462,	new HashSet<>(Arrays.asList("865610074119819","865610074120536","866335072878658","866335072882098","866335073617030")));
1376
        fofoIdImeiReturnMap.put(175139259,	new HashSet<>(Arrays.asList("350210771180644","355300593052348","860492061918213","861858064422651","864259078402572","864259078924310","866335070769719","866335071700556","866335071742558","866657073553208","867949078178530","867949078692472","868024065518616","868024065619091","869116067492540")));
1377
        fofoIdImeiReturnMap.put(175139344,	new HashSet<>(Arrays.asList("350115571135781","354990352587723","358250293362843","358250293363148","862736064732510","865610070849617","865610070851290","866518078899998","868938062623378","868956065234613")));
1378
        fofoIdImeiReturnMap.put(175139602,	new HashSet<>(Arrays.asList("861128070090482","868565072242160","868565072243044","868565072261004","868565073051644")));
1379
        fofoIdImeiReturnMap.put(175139605,	new HashSet<>(Arrays.asList("861515075217922","861515076369466","863816074206397","863816075080072","864259078661755","864468075627368","867467071860541","868565072177903","868565073075726","868565073401625","868938060248012","868938066709652","869452074088611","869452074609234")));
1380
        fofoIdImeiReturnMap.put(175139640,	new HashSet<>(Arrays.asList("358250293363429","358250293363684","861753065277792","863511069733998","864214068943713","864259078496574","864259078518773","864487060042870","864487060050352","865883069366170","866518079782391","867949078692639","867949078692852","868273068551617","868938066464571","869452073150115")));
1381
        fofoIdImeiReturnMap.put(175139346,	new HashSet<>(Arrays.asList("356494471614953","860600076022215","861765072074616","861977070097412","864468074885181","864468076046105","865610073263139","865883065558994","866335075002538","866657079093605","867907070983216")));
1382
        fofoIdImeiReturnMap.put(175139489,	new HashSet<>(Arrays.asList("354324789015209","354324789081797","861515075189824","861515075575501","861977070268997","864468072790144","864468072983921","864468075233225","866657077951960","869452071082492","869452071982378","869452074617070")));
1383
        fofoIdImeiReturnMap.put(175139508,	new HashSet<>(Arrays.asList("861515075367024","864468072781283","864468074453386","864468075200448","864468076050669","866083062293849")));
1384
        fofoIdImeiReturnMap.put(175139716,	new HashSet<>(Arrays.asList("350832440575209","358250295571425","860600076019492","861753063494373","861753063501151","864468073696100","864468074855689","865883065542311","865883067956030","866202075825450","866202077663297","866335073632591","866657078023769")));
1385
        fofoIdImeiReturnMap.put(175139727,	new HashSet<>(Arrays.asList("355300592353325","355300593005387","861765072344258","862046060196128","864468073908604","864468073910121","864468073911269","867437074118411","868024064300099","868024065464977","868024065468218","869116065414389")));
1386
        fofoIdImeiReturnMap.put(175139521,	new HashSet<>(Arrays.asList("860600071402594","860600071416719","861888064397496","861977073658616","864468070509587","864468073866406","866335074999056","866657077949642","866657078406964","866993072229072","867437070891698")));
1387
        fofoIdImeiReturnMap.put(175139523,	new HashSet<>(Arrays.asList("354324785409950","354324788632830","354990352587939","358250295736085","358250295805187","358311601935629","863967076359575","866657074163502","867907070986318","869452071963378","869452074611750")));
1388
        fofoIdImeiReturnMap.put(175139697,	new HashSet<>(Arrays.asList("862282078030112","862282078867117","863975067709930","863975068443810","864468072828860","864468073705786","864468075276489","864468075277685","865610073830739","866335073264577","866518079802116","866657074518903","866657077949980","868565073058664","868938060985639","869116065613949")));
1389
        fofoIdImeiReturnMap.put(175139622,	new HashSet<>(Arrays.asList("358250293381926","358250293382304","358250293382601","358250294076046","358250294078109","358250294078463","358250294602064","358250294602429","358250294603062","358250294603203")));
1390
        fofoIdImeiReturnMap.put(175139699,	new HashSet<>(Arrays.asList("863718064441317","865610074942897","866202077653173","866202077653553","866335072262671","866335073632211","866335074805519")));
1391
        fofoIdImeiReturnMap.put(175139741,	new HashSet<>(Arrays.asList("861515071386101","861515074123402","861515074124186","861977073047752","861977073658574","864468075082804","864468076049869","865883065542139","865883067957111","866518070599679","866518079800672","866657078018587","866657078270162","866657079236220")));
1392
        fofoIdImeiReturnMap.put(175139114,	new HashSet<>(Arrays.asList("861888066708856","861977074487692","866335070051217","866335070517274","866993074145631")));
1393
        fofoIdImeiReturnMap.put(175139531,	new HashSet<>(Arrays.asList("863816077976194","863816079685710","866335070997336","866335074729354","866335075514698")));
1394
        fofoIdImeiReturnMap.put(175139386,	new HashSet<>(Arrays.asList("350210771192805","358250295053846","860388068563434","863862077333374","864468075193221","864562077193757","864718076084310","866202077464092","866202077742190","866518077001513","868565079682020","868956065252516")));
1395
        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")));
1396
        fofoIdImeiReturnMap.put(175139306,	new HashSet<>(Arrays.asList("863718064547394","864718076075516","864718076083478","866202077463631","866202077470057")));
1397
        fofoIdImeiReturnMap.put(175139733,	new HashSet<>(Arrays.asList("350210771180008","861515071845668","861888067164877","866335070489094","866518076378276","868565072242269")));
1398
        fofoIdImeiReturnMap.put(175138824,	new HashSet<>(Arrays.asList("862054078573478","863862074697490","863862075442375","864468074485545","866335070216315","866657078016169","866657078449402","869116065542247")));
1399
        fofoIdImeiReturnMap.put(175139511,	new HashSet<>(Arrays.asList("862054075642557","862054075643530","862054076379357","862054077978934","863816078158016","868938062108974")));
1400
        fofoIdImeiReturnMap.put(175139701,	new HashSet<>(Arrays.asList("863862078258331","866611061131790")));
1401
        fofoIdImeiReturnMap.put(175139552,	new HashSet<>(Arrays.asList("861753065084958","866202075814439","866202075825633","866202075864194","866202076138754","866202076252811","866202077646870","866202077651094","866202077653876","866202077659956","866202077660293","866202077663339","866202078006397","866202078006611","866202078008914","866657078023280")));
1402
        fofoIdImeiReturnMap.put(175139499,	new HashSet<>(Arrays.asList("351115165467359","351115166905951","355358277809813","355358277814052","356049795822532","358250290682060","863862075504950","864468073944906","864468076048721","866657079234365")));
1403
        fofoIdImeiReturnMap.put(175139630,	new HashSet<>(Arrays.asList("357349229650288","358250290499184","358250294552947","358250294590301","860946078570556","860946078571059","861977073552215","861977073657790","861977073657832","861977073658731","861977074660850","862054075627517","862054075632756","862054075642979","862054076374879","863967071220830")));
1404
        fofoIdImeiReturnMap.put(175139720,	new HashSet<>(Arrays.asList("865388072300075","866335073071691","866335073073697","866335073390398")));
1405
        fofoIdImeiReturnMap.put(175138854,	new HashSet<>(Arrays.asList("50115570082950","351688420279827","351688420575703","354324788647382","357594162666201","359333606194530","863862075760198")));
1406
        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")));
1407
        fofoIdImeiReturnMap.put(175139610,	new HashSet<>(Arrays.asList("862736063981738","863718063044617","866335072870176","866335072870598")));
1408
        fofoIdImeiReturnMap.put(175139366,	new HashSet<>(Arrays.asList("354324783144864","354324788632608","354889661849990","354990353239423","863967070558271","864718076129396","866657077789543","866657078285368","866657078508066","869116060977828","869116061054429","869116061208546")));
1409
        fofoIdImeiReturnMap.put(175139412,	new HashSet<>(Arrays.asList("351115165488595","351115165491318","351115165491359","351115165491458","351115165492332","355358278026573","355358278081610","861888063460717","861977073052018","863816078633919","865883069477035","866335074538870","866993071639594")));
1410
        fofoIdImeiReturnMap.put(175139504,	new HashSet<>(Arrays.asList("862054072660792","862054075971873","862054076312374","862054077948630","863816075363171","863862075442334","864718075894230","868938062122017","868938065268932","869452071940632","869452073034897","869452073158233","869452073158498","869452074159735")));
1411
        fofoIdImeiReturnMap.put(175139201,	new HashSet<>(Arrays.asList("863718061956671","863862075497734","863862075596915","864718076078510","864718076134834","866335070211639","866611060437032","866611061133812")));
1412
        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 1413
        fofoIdImeiReturnMap.put(175139661,	new HashSet<>(Arrays.asList("860946077691031","861977074661155","862054073218855","866335070523694","867940069973476","868938062656477")));*/
33452 amit.gupta 1414
        fofoIdImeiReturnMap.put(175139556, new HashSet<>(Arrays.asList("863718063534013", "866335072895173", "866335073390810")));
1415
        fofoIdImeiReturnMap.put(175139721, new HashSet<>(Arrays.asList("358250294549067", "865883067508138", "866993072210619")));
33355 amit.gupta 1416
        /*fofoIdImeiReturnMap.put(175139455,	new HashSet<>(Arrays.asList("358293804087913","866518078020694","866518078021650","866518078243676","866518078571936")));
33315 amit.gupta 1417
        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")));
1418
        fofoIdImeiReturnMap.put(175139559,	new HashSet<>(Arrays.asList("863718069016890","863816078879256","864468075283881","866335073245436","866335073403571","866657074268327","868024065473853","868956065899993","869452070362895","869452074030274")));
1419
        fofoIdImeiReturnMap.put(175139575,	new HashSet<>(Arrays.asList("354324786659199","860388067452035","861220078009919","863816078878134","863862075841154","865388070857498","867907071407116")));
33355 amit.gupta 1420
        fofoIdImeiReturnMap.put(175139686,	new HashSet<>(Arrays.asList("866657078019106","866657078032869")));*/
33315 amit.gupta 1421
 
33355 amit.gupta 1422
        //this.processOrdersToRebill(fofoIdImeiReturnMap, debitNoteDate);
1423
        purchaseReturnService.fixReturns(fofoIdImeiReturnMap, debitNoteDate);
32513 amit.gupta 1424
 
32698 amit.gupta 1425
    }
1426
 
1427
 
33315 amit.gupta 1428
    private void processOrdersToRebill(Map<Integer, Set<String>> fofoIdImeiReturnMap, LocalDateTime debitNoteDate) throws Exception {
32698 amit.gupta 1429
 
1430
 
1431
        for (Entry<Integer, Set<String>> fofoIdImeiReturnEntry : fofoIdImeiReturnMap.entrySet()) {
32511 amit.gupta 1432
            int fofoId = fofoIdImeiReturnEntry.getKey();
1433
            Set<String> imeis = fofoIdImeiReturnEntry.getValue();
1434
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(fofoId, imeis, true);
1435
            for (InventoryItem inventoryItem : inventoryItems) {
1436
                //inventoryItem.getId();
1437
                purchaseReturnService.returnInventoryItem(fofoId, true, inventoryItem.getId(), ReturnType.GOOD);
1438
                //Approve return
1439
                PurchaseReturnItem purchaseReturnItem = purchaseReturnItemRepository.selectByInventoryItemId(inventoryItem.getId());
1440
                purchaseReturnItem.setStatus(PurchaseReturnStatus.APPROVED);
1441
                purchaseReturnItem.setApproveTimestamp(LocalDateTime.now());
1442
            }
1443
            Map<Purchase, List<InventoryItem>> purchaseInventoryItemsMap = purchaseReturnService.getPurchaseMapForApprovedReturns(fofoId);
1444
            int walletAmount = walletService.getWalletAmount(fofoId);
1445
            List<DebitNote> debitNotes = purchaseReturnService.generateDebitNotes(purchaseInventoryItemsMap);
1446
            int walletDiff = walletAmount - walletService.getWalletAmount(fofoId);
1447
            if (walletDiff > 0) {
1448
                int reference = walletService.getManualReference(WalletReferenceType.OTHERS);
32514 amit.gupta 1449
                walletService.addAmountToWallet(fofoId, reference, WalletReferenceType.ADVANCE_AMOUNT, "Sytematically added for internal PO", (float) walletDiff + 5000, LocalDateTime.now());
32511 amit.gupta 1450
            }
32698 amit.gupta 1451
            List<CartItem> cartItems = new ArrayList<>();
32511 amit.gupta 1452
            for (DebitNote debitNote : debitNotes) {
33315 amit.gupta 1453
                debitNote.setCreateTimestamp(debitNoteDate);
32511 amit.gupta 1454
                //Try to refund amount per debit note
32698 amit.gupta 1455
                cartItems.addAll(this.refundDnAmount(debitNote));
32511 amit.gupta 1456
            }
32698 amit.gupta 1457
            //If order created
33452 amit.gupta 1458
            Map<Integer, List<CartItem>> warehouseCartItemsMap = cartItems.stream().collect(groupingBy(x -> x.getWarehouseId()));
1459
            for (Entry<Integer, List<CartItem>> warehouseCartItemsEntry : warehouseCartItemsMap.entrySet()) {
32223 amit.gupta 1460
 
32698 amit.gupta 1461
                List<CartItem> warehouseCartItems = warehouseCartItemsEntry.getValue();
1462
 
1463
                List<CartItem> mergedCartItems = warehouseCartItems.stream()
1464
                        .collect(Collectors.collectingAndThen(
33452 amit.gupta 1465
                                groupingBy(x -> x.getItemId(), Collectors.collectingAndThen(
32724 amit.gupta 1466
                                        Collectors.reducing((a, b) -> {
32698 amit.gupta 1467
                                            a.setQuantity(a.getQuantity() + b.getQuantity());
1468
                                            return a;
1469
                                        }), Optional::get)),
1470
                                m -> new ArrayList<>(m.values())));
1471
 
32724 amit.gupta 1472
                double walletTotalAmount = mergedCartItems.stream().mapToDouble(x -> x.getQuantity() * x.getSellingPrice()).sum();
32698 amit.gupta 1473
 
1474
                com.spice.profitmandi.dao.entity.user.User user = userRepository.selectById(fofoId);
1475
                cartService.clearCart(user.getActiveCartId());
1476
                cartService.addItemsToCart(user.getActiveCartId(), mergedCartItems);
1477
 
1478
                UserCart userCart = new UserCart();
1479
                userCart.setCartId(user.getActiveCartId());
1480
                userCart.setUserId(user.getId());
1481
 
1482
                int transactionId = transactionService.createTransactionInternally(userCart, walletTotalAmount, warehouseCartItemsEntry.getKey());
1483
                commonPaymentService.payThroughWallet(transactionId);
34352 amit.gupta 1484
                transactionService.processTransaction(transactionId, 0);
32698 amit.gupta 1485
            }
1486
        }
31697 amit.gupta 1487
    }
32048 tejbeer 1488
 
32384 amit.gupta 1489
    @Autowired
32511 amit.gupta 1490
    CartService cartService;
1491
    @Autowired
1492
    UserRepository userRepository;
1493
 
1494
    @Autowired
1495
    WarehouseScanRepository warehouseScanRepository;
1496
 
1497
    @Autowired
1498
    WarehouseInventoryService warehouseInventoryService;
1499
 
1500
    @Autowired
1501
    CommonPaymentService commonPaymentService;
1502
 
32533 amit.gupta 1503
    @Autowired
1504
    LineItemImeisRepository lineItemImeisRepository;
1505
 
32698 amit.gupta 1506
 
32511 amit.gupta 1507
    //Also create order
32698 amit.gupta 1508
    private List<CartItem> refundDnAmount(DebitNote debitNote) throws ProfitMandiBusinessException {
32511 amit.gupta 1509
        List<Integer> inventoryItemIds = purchaseReturnItemRepository.selectAllByDebitNoteId(debitNote.getId()).stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList());
33452 amit.gupta 1510
        Map<Integer, Long> inventoryItemCountMap = inventoryItemIds.stream().collect(groupingBy(x -> x, Collectors.counting()));
32511 amit.gupta 1511
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllByIds(new ArrayList<>(inventoryItemCountMap.keySet()));
1512
        Purchase purchase = purchaseRepository.selectById(inventoryItems.get(0).getPurchaseId());
1513
        String invoice = purchase.getPurchaseReference();
1514
        List<Order> orders = orderRepository.selectByInvoiceNumber(invoice);
1515
        Set<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toSet());
1516
        Order order = orders.get(0);
1517
        float totalAmount = 0;
1518
        int totalQty = 0;
1519
        Map<Integer, CartItem> itemIdCartItemMap = new HashMap<>();
1520
 
35447 amit 1521
        // Batch fetch all TagListings by itemIds to avoid N+1 queries
1522
        Set<Integer> allItemIds = inventoryItems.stream()
1523
                .map(InventoryItem::getItemId)
1524
                .collect(Collectors.toSet());
1525
        List<TagListing> allTagListings = tagListingRepository.selectByItemIdsAndTagIds(allItemIds, null);
1526
        Map<Integer, TagListing> itemIdTagListingMap = allTagListings.stream()
1527
                .collect(Collectors.toMap(TagListing::getItemId, t -> t, (u, v) -> u));
1528
 
32511 amit.gupta 1529
        List<CartItem> cartItems = new ArrayList<>();
1530
        for (InventoryItem inventoryItem : inventoryItems) {
35447 amit 1531
            TagListing tagListing = itemIdTagListingMap.get(inventoryItem.getItemId());
32511 amit.gupta 1532
            long quantity = inventoryItemCountMap.get(inventoryItem.getId());
1533
            totalAmount += inventoryItem.getUnitPrice() * quantity;
1534
            totalQty += quantity;
1535
            if (!itemIdCartItemMap.containsKey(inventoryItem.getItemId())) {
1536
                CartItem cartItem = new CartItem();
1537
                cartItem.setItemId(inventoryItem.getItemId());
1538
                cartItem.setSellingPrice(tagListing.getSellingPrice());
32698 amit.gupta 1539
                cartItem.setWarehouseId(order.getWarehouseId());
32511 amit.gupta 1540
                cartItems.add(cartItem);
1541
                itemIdCartItemMap.put(inventoryItem.getItemId(), cartItem);
1542
            }
1543
            CartItem cartItem = itemIdCartItemMap.get(inventoryItem.getItemId());
1544
            cartItem.setQuantity((int) quantity + cartItem.getQuantity());
1545
        }
1546
        String rollbackDescription = String.format("Refunded against DN %s, %d pc(s)", debitNote.getDebitNoteNumber(), totalQty);
1547
        walletService.addAmountToWallet(debitNote.getFofoId(), order.getTransactionId(), WalletReferenceType.PURCHASE, rollbackDescription, totalAmount, LocalDateTime.now());
1548
        //Before creating order lets try to in the stock
1549
 
1550
        //All scans pertaining to specific Invoices
1551
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderIds));
32698 amit.gupta 1552
        Map<Integer, Integer> inventoryItemIdOrderIdMap = new HashMap<>();
1553
        try {
1554
            inventoryItemIdOrderIdMap = warehouseScans.stream().collect(Collectors.toMap(x -> x.getInventoryItemId(), x -> x.getQuantity()));
32724 amit.gupta 1555
        } catch (Exception e) {
32698 amit.gupta 1556
            LOGGER.info("Could not process for fofoId - {}, {}", debitNote.getFofoId(), warehouseScans);
1557
        }
32511 amit.gupta 1558
        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)))
1559
                .map(x -> x.getInventoryItemId()).collect(Collectors.toList());
1560
        List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(warehouseInventoryItemIds);
1561
 
1562
        Map<String, WarehouseInventoryItem> serialNumberWarehouseInventoryItemMap = warehouseInventoryItems.stream().filter(x -> StringUtils.isNotBlank(x.getSerialNumber())).collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
1563
 
1564
        for (InventoryItem inventoryItem : inventoryItems) {
1565
            if (StringUtils.isBlank(inventoryItem.getSerialNumber())) {
1566
                //As of now this should be happening as  dn are specifically for serialized devices
1567
                /*int returnQty = inventoryItemCountMap.get(inventoryItem.getId()).intValue();
1568
                List<WarehouseInventoryItem> warehouseInventoryItemList = itemIdWarehouseInventoryItemsMap.get(inventoryItem.getItemId());
1569
                warehouseInventoryService.returnNonSerializedQty(warehouseInventoryItem)*/
1570
            } else if (StringUtils.isNotBlank(inventoryItem.getSerialNumber())) {
1571
                String serialNumber = inventoryItem.getSerialNumber();
1572
                WarehouseInventoryItem warehouseInventoryItem = serialNumberWarehouseInventoryItemMap.get(serialNumber);
1573
                warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.SALE_RET);
1574
                warehouseInventoryService.addQuantity(warehouseInventoryItem.getId(), 1);
1575
                WarehouseScan warehouseScan = new WarehouseScan();
1576
                warehouseScan.setInventoryItemId(warehouseInventoryItem.getId());
1577
                warehouseScan.setQuantity(1);
1578
                warehouseScan.setOrderId(inventoryItemIdOrderIdMap.get(warehouseInventoryItem.getItemId()));
1579
                warehouseScan.setScannedAt(LocalDateTime.now());
1580
                warehouseScan.setType(in.shop2020.warehouse.ScanType.SALE_RET);
1581
                warehouseScanRepository.persist(warehouseScan);
1582
 
1583
            }
1584
        }
1585
 
1586
        //Create Order as well
32724 amit.gupta 1587
        return cartItems;
32698 amit.gupta 1588
    }
32511 amit.gupta 1589
 
32698 amit.gupta 1590
    void addToCartAndCreateOrder() {
32511 amit.gupta 1591
 
1592
    }
1593
 
1594
    @Autowired
32384 amit.gupta 1595
    WarehouseDebitNoteRepository warehouseDebitNoteRepository;
1596
    @Autowired
1597
    WarehouseDebitNoteLineRepository warehouseDebitNoteLineRepository;
1598
 
1599
    @Autowired
1600
    WarehouseInvoiceItemRepository warehouseInvoiceItemRepository;
1601
    @Autowired
1602
    WarehouseSupplierInvoiceRepository warehouseSupplierInvoiceRepository;
1603
 
1604
    @Autowired
1605
    PurchaseOrderService purchaseOrderService;
1606
 
32482 amit.gupta 1607
    @Autowired
1608
    VendorCatalogPricingLogRepository vendorCatalogPricingLogRepository;
32384 amit.gupta 1609
 
32214 jai.hind 1610
//    private void checkItelImeiActivationNew(LocalDate now, int i) {
1611
//    }
1612
 
32169 amit.gupta 1613
    @Autowired
1614
    SessionFactory sessionFactory;
1615
 
1616
 
31697 amit.gupta 1617
    public void sendMailForSamsungRebilling() throws Exception {
1618
        List<BilledImeiModel> samsungModels = warehouseInventoryItemRepository.findByBillingDateBrand(LocalDate.now(), "Samsung");
1619
        LOGGER.info("SamsungModels {}", samsungModels);
1620
        samsungModels = samsungModels.stream().sorted(Comparator.comparing(x -> x.getPcmDate() == null ? -1 : 1)).collect(Collectors.toList());
1621
        if (samsungModels.size() > 0) {
1622
            List<String> headers = Arrays.asList("Partner Id", "Code", "Name", "City", "Brand", "Model Name", "Model Number", "Color", "Serial Number", "Remarks");
1623
            List<List<?>> rows = new ArrayList<>();
1624
            for (BilledImeiModel billedImeiModel : samsungModels) {
31886 tejbeer 1625
                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 1626
                rows.add(row);
1627
            }
1628
            ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1629
            String[] sendToArray = new String[]{"kamini.sharma@smartdukaan.com", "praveen.sharma@smartdukaan.com"};
1630
            String fileName = "Imeis need Rebilling -" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
31886 tejbeer 1631
            Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{"tarun.verma@smartdukaan.com"}, "Samsung Rebilling IMEI Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1632
        }
1633
    }
24002 amit.gupta 1634
 
31697 amit.gupta 1635
    public void sendPartnerInvestmentDetails(List<String> sendTo) throws Exception {
1636
        LocalDate yesterDay = LocalDate.now().minusDays(1);
1637
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
31886 tejbeer 1638
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
25312 amit.gupta 1639
 
32169 amit.gupta 1640
        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 1641
        List<List<?>> rows = new ArrayList<>();
1642
        Map<Integer, List<?>> partnerRowsMap = new HashMap<>();
25598 amit.gupta 1643
 
31697 amit.gupta 1644
        Map<Integer, FofoReportingModel> partnerIdSalesHeaderMap = this.getPartnerIdSalesHeaders();
25312 amit.gupta 1645
 
31886 tejbeer 1646
        Map<Integer, Integer> shortDaysMap = partnerDailyInvestmentRepository.selectAll(LocalDate.now().withDayOfMonth(1), LocalDate.now()).stream().collect(groupingBy(
1647
                x -> x.getFofoId(), Collectors.summingInt(x -> x.getShortPercentage() > 10 ? 1 : 0)));
24271 amit.gupta 1648
 
31697 amit.gupta 1649
        for (FofoStore fofoStore : fofoStores) {
1650
            LOGGER.info("Fofo Store {},  {}", fofoStore.getId(), fofoStore.getCode());
1651
            int fofoId = fofoStore.getId();
1652
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 1);
1653
            partnerDailyInvestment.setDate(yesterDay);
24177 govind 1654
 
31697 amit.gupta 1655
            try {
1656
                partnerDailyInvestmentRepository.persist(partnerDailyInvestment);
31886 tejbeer 1657
                shortDaysMap.put(fofoId, shortDaysMap.get(fofoId) + (partnerDailyInvestment.getShortPercentage() > 10 ? 1 : 0));
31697 amit.gupta 1658
            } catch (Exception e) {
1659
                // ignore the exceptions during persist
1660
            }
25598 amit.gupta 1661
 
31697 amit.gupta 1662
            CustomRetailer retailer = customRetailerMap.get(fofoStore.getId());
1663
            if (retailer == null || partnerIdSalesHeaderMap.get(fofoStore.getId()) == null) {
1664
                LOGGER.info("Could not find retailer with retailer Id {}", fofoStore.getId());
1665
                continue;
1666
            }
1667
            FofoReportingModel reportingModel = partnerIdSalesHeaderMap.get(fofoStore.getId());
1668
            List<Serializable> row = new ArrayList<>();
31886 tejbeer 1669
            row.addAll(Arrays.asList(reportingModel.getCode(), reportingModel.getBusinessName(), reportingModel.getRegionalManager(), reportingModel.getTerritoryManager()));
31697 amit.gupta 1670
            row.addAll(
31886 tejbeer 1671
                    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 1672
            partnerRowsMap.put(fofoStore.getId(), row);
1673
            rows.add(row);
25837 amit.gupta 1674
 
31697 amit.gupta 1675
        }
25837 amit.gupta 1676
 
34611 ranu 1677
        String fileName = "InvestmentSummary-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
25837 amit.gupta 1678
 
34337 amit.gupta 1679
        if (sendTo == null) {
33452 amit.gupta 1680
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMapping().entrySet()) {
31886 tejbeer 1681
                List<List<?>> filteredRows = storeGuyEntry.getValue().stream().map(x -> partnerRowsMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
31697 amit.gupta 1682
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, filteredRows);
1683
                String[] sendToArray = new String[]{storeGuyEntry.getKey()};
31886 tejbeer 1684
                Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
31697 amit.gupta 1685
            }
34578 vikas.jang 1686
            sendTo = Arrays.asList("tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com", "neeraj.gupta@smartdukaan.com", "amit.gupta@shop2020.in", "manish.gupta1@smartdukaan.com", "niranjan.kala@smartdukaan.com");
31697 amit.gupta 1687
        }
25837 amit.gupta 1688
 
31697 amit.gupta 1689
        ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
1690
        String[] sendToArray = sendTo.toArray(new String[sendTo.size()]);
34611 ranu 1691
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Franchise Investment Summary", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
25837 amit.gupta 1692
 
31697 amit.gupta 1693
    }
25598 amit.gupta 1694
 
33256 amit.gupta 1695
    private Map<Integer, FofoReportingModel> getPartnerIdSalesHeaders() throws ProfitMandiBusinessException {
31697 amit.gupta 1696
        Map<String, SaleRoles> partnerEmailSalesMap = new HashMap<>();
1697
        Map<String, SaleRoles> partnerEmailRBMMap = new HashMap<>();
34903 ranu 1698
        Map<String, SaleRoles> partnerEmailABMMap = new HashMap<>();
24271 amit.gupta 1699
 
34903 ranu 1700
        List<Position> positions = positionRepository.selectPositionByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_RBM,ProfitMandiConstants.TICKET_CATEGORY_ABM));
31886 tejbeer 1701
        Map<Integer, AuthUser> authUsersMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 1702
        Map<Integer, List<CustomRetailer>> positionIdRetailerMap = csService.getPositionCustomRetailerMap(positions);
1703
        for (Position position : positions) {
1704
            List<CustomRetailer> crList = positionIdRetailerMap.get(position.getId());
1705
            if (crList == null)
1706
                continue;
1707
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_SALES) {
1708
                for (CustomRetailer cr : crList) {
1709
                    if (!partnerEmailSalesMap.containsKey(cr.getEmail())) {
1710
                        partnerEmailSalesMap.put(cr.getEmail(), new SaleRoles());
1711
                    }
1712
                    SaleRoles saleRoles = partnerEmailSalesMap.get(cr.getEmail());
1713
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1714
                    if (authUser == null) {
1715
                        continue;
1716
                    }
1717
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1718
                    if (position.getEscalationType().equals(EscalationType.L1)) {
1719
                        saleRoles.getL1().add(name);
1720
                    } else if (position.getEscalationType().equals(EscalationType.L2)) {
1721
                        saleRoles.getL2().add(name);
1722
                    }
1723
                }
1724
            }
1725
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_RBM) {
1726
                for (CustomRetailer cr : crList) {
1727
                    if (!partnerEmailRBMMap.containsKey(cr.getEmail())) {
1728
                        partnerEmailRBMMap.put(cr.getEmail(), new SaleRoles());
1729
                    }
1730
                    SaleRoles saleRoles = partnerEmailRBMMap.get(cr.getEmail());
1731
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1732
                    if (authUser == null) {
1733
                        continue;
1734
                    }
1735
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1736
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1737
                        saleRoles.getL1().add(name);
1738
                    }
1739
                    /*else if (position.getEscalationType().equals(EscalationType.L2)) {
1740
                        saleRoles.getL2().add(name);
1741
                    }*/
1742
                }
1743
            }
24692 amit.gupta 1744
 
34903 ranu 1745
            if (position.getCategoryId() == ProfitMandiConstants.TICKET_CATEGORY_ABM) {
1746
                for (CustomRetailer cr : crList) {
1747
                    if (!partnerEmailABMMap.containsKey(cr.getEmail())) {
1748
                        partnerEmailABMMap.put(cr.getEmail(), new SaleRoles());
1749
                    }
1750
                    SaleRoles saleRoles = partnerEmailABMMap.get(cr.getEmail());
1751
                    AuthUser authUser = authUsersMap.get(position.getAuthUserId());
1752
                    if (authUser == null) {
1753
                        continue;
1754
                    }
1755
                    String name = authUser.getFirstName() + " " + authUser.getLastName();
1756
                    if (position.getEscalationType().equals(EscalationType.L1) || position.getEscalationType().equals(EscalationType.L1)) {
1757
                        saleRoles.getL1().add(name);
1758
                    }
1759
                    else if (position.getEscalationType().equals(EscalationType.L2)) {
1760
                        saleRoles.getL2().add(name);
1761
                    }
1762
                }
1763
            }
1764
 
31697 amit.gupta 1765
        }
25418 amit.gupta 1766
 
31697 amit.gupta 1767
        Set<CustomRetailer> allCrList = new HashSet<>();
1768
        for (List<CustomRetailer> cr : positionIdRetailerMap.values()) {
1769
            allCrList.addAll(cr);
1770
        }
25609 amit.gupta 1771
 
31886 tejbeer 1772
        Map<Integer, FofoStore> fofoStoresMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
25503 amit.gupta 1773
 
31697 amit.gupta 1774
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = new HashMap<>();
25503 amit.gupta 1775
 
31697 amit.gupta 1776
        for (CustomRetailer cr : allCrList) {
1777
            FofoStore fofoStore = fofoStoresMap.get(cr.getPartnerId());
1778
            if (fofoStore == null) {
1779
                LOGGER.info("Could not find Store {} in active Store", cr.getBusinessName());
1780
                continue;
1781
            }
1782
            String code = fofoStore.getCode();
1783
            // String storeName = "SmartDukaan-" +
1784
            // fofoStore.getCode().replaceAll("[a-zA-Z]", "");
1785
            String businessName = cr.getBusinessName();
1786
            try {
1787
                String stateManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL2(), ", ");
1788
                String territoryManager = StringUtils.join(partnerEmailSalesMap.get(cr.getEmail()).getL1(), ", ");
1789
                String bdm = StringUtils.join(partnerEmailRBMMap.get(cr.getEmail()).getL1(), ", ");
1790
                FofoReportingModel reportingModel = new FofoReportingModel();
1791
                reportingModel.setBusinessName(businessName);
1792
                reportingModel.setCode(code);
1793
                reportingModel.setFofoId(fofoStore.getId());
1794
                reportingModel.setRegionalManager(stateManager);
1795
                reportingModel.setTerritoryManager(territoryManager);
1796
                reportingModel.setBusinessManager(bdm);
1797
                partnerIdSalesHeadersMap.put(fofoStore.getId(), reportingModel);
1798
            } catch (Exception e) {
1799
                LOGGER.warn("Could not find partner with email - {}", cr.getEmail());
1800
            }
1801
        }
1802
        return partnerIdSalesHeadersMap;
24533 govind 1803
 
31697 amit.gupta 1804
    }
28709 amit.gupta 1805
 
34275 tejus.loha 1806
    public void persistRbmTodayTargets() throws Exception {
33928 ranu 1807
        rbmTargetService.setMovementWiseRbmTargets();
1808
    }
1809
 
34275 tejus.loha 1810
    public void persistRbmTodayAchievements() throws Exception {
33986 ranu 1811
        rbmTargetService.setMovementWiseRbmAchievement();
1812
    }
1813
 
31697 amit.gupta 1814
    public void sendPartnerInvestmentDetails() throws Exception {
1815
        this.sendPartnerInvestmentDetails(null);
1816
    }
28709 amit.gupta 1817
 
31697 amit.gupta 1818
    public void sendAgeingReport(String... sendTo) throws Exception {
28790 amit.gupta 1819
 
31886 tejbeer 1820
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.WAREHOUSENEW, "itemstockageing.xml");
1821
        InputStreamSource isr1 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "ItemwiseOverallPendingIndent.xml");
31697 amit.gupta 1822
        Attachment attachment = new Attachment(
1823
                "ageing-report-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr);
1824
        Attachment attachment1 = new Attachment(
1825
                "pending-indent-" + FormattingUtils.formatDate(LocalDateTime.now().minusDays(1)) + ".csv", isr1);
28790 amit.gupta 1826
 
31886 tejbeer 1827
        Utils.sendMailWithAttachments(googleMailSender, STOCK_AGEING_MAIL_LIST, null, "Stock Ageing Report", "PFA", attachment);
1828
        Utils.sendMailWithAttachments(googleMailSender, ITEMWISE_PENDING_INDENT_MAIL_LIST, null, "Itemwise Pending indent", "PFA", attachment1);
28790 amit.gupta 1829
 
31697 amit.gupta 1830
        // Reports to be sent to mapped partners
1831
        Map<String, Set<String>> storeGuysMap = csService.getAuthUserPartnerEmailMapping();
28790 amit.gupta 1832
 
33452 amit.gupta 1833
        for (Entry<String, Set<String>> storeGuyEntry : storeGuysMap.entrySet()) {
31697 amit.gupta 1834
            Map<String, String> params = new HashMap<>();
1835
            if (storeGuyEntry.getValue().size() == 0)
1836
                continue;
1837
            params.put("MANUAL_email", String.join(",", storeGuyEntry.getValue()));
31886 tejbeer 1838
            InputStreamSource isr3 = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "focostockreport.xml", params);
31697 amit.gupta 1839
            Attachment attache = new Attachment(
1840
                    "Franchise-stock-report" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr3);
1841
            System.out.println(storeGuyEntry.getValue());
31886 tejbeer 1842
            Utils.sendMailWithAttachments(googleMailSender, new String[]{storeGuyEntry.getKey()}, null, "Franchise Stock Report", "PFA", attache);
31697 amit.gupta 1843
        }
28839 tejbeer 1844
 
31697 amit.gupta 1845
    }
28839 tejbeer 1846
 
31697 amit.gupta 1847
    public void sendIndentTertiary() throws Exception {
28790 amit.gupta 1848
 
31886 tejbeer 1849
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "indentandtertiary.xml");
31697 amit.gupta 1850
        Attachment attachment = new Attachment(
1851
                "indentandtertiary-report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
31886 tejbeer 1852
        Utils.sendMailWithAttachments(googleMailSender, INDENT_TERTIARY_MAIL_LIST, null, "Indent Tertiary Report", "PFA", attachment);
28790 amit.gupta 1853
 
31697 amit.gupta 1854
    }
28790 amit.gupta 1855
 
31697 amit.gupta 1856
    public void sendAttendanceMorningAlert() throws Exception {
1857
        LocalDateTime moriningTime = LocalDate.now().atTime(10, 31);
1858
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1859
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28775 amit.gupta 1860
 
31697 amit.gupta 1861
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1862
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28790 amit.gupta 1863
 
31886 tejbeer 1864
        List<EmployeeAttendance> employeeAttendances = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now());
28784 amit.gupta 1865
 
31886 tejbeer 1866
        Map<Integer, Optional<EmployeeAttendance>> employeeMorningAttendance = employeeAttendances.stream().collect(groupingBy(EmployeeAttendance::getUserId, Collectors.minBy(Comparator.comparing(EmployeeAttendance::getCreateTimestamp))));
31697 amit.gupta 1867
        for (AuthUser authUser : authUsers) {
1868
            User user = userMap.get(authUser.getEmailId());
1869
            Optional<EmployeeAttendance> employeeAttendanceOptional = employeeMorningAttendance.get(user.getId());
1870
            LOGGER.info("AuthUser - {}, employeeAttendanceOptional {}", authUser.getName(), employeeAttendanceOptional);
1871
            if (employeeAttendanceOptional != null) {
1872
                LOGGER.info("employeeAttendanceOptional.orElse {}", employeeAttendanceOptional.orElse(null));
1873
                if (employeeAttendanceOptional.orElse(null) != null) {
31886 tejbeer 1874
                    LOGGER.info("employeeAttendanceOptional.get().getCreateTimestamp() {}", employeeAttendanceOptional.get().getCreateTimestamp());
31697 amit.gupta 1875
                }
1876
            }
31886 tejbeer 1877
            if (employeeAttendanceOptional == null || employeeAttendanceOptional.orElse(null) == null || employeeAttendanceOptional.get().getCreateTimestamp().isAfter(moriningTime)) {
31697 amit.gupta 1878
                LOGGER.info("Will Send Email to {}", authUser.getFullName());
1879
                String body = String.format(
31886 tejbeer 1880
                        "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 1881
 
31886 tejbeer 1882
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
28790 amit.gupta 1883
 
31697 amit.gupta 1884
            }
1885
        }
28790 amit.gupta 1886
 
31697 amit.gupta 1887
    }
28790 amit.gupta 1888
 
31697 amit.gupta 1889
    public void sendAttendanceEveningAlert() throws Exception {
1890
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
31886 tejbeer 1891
        Map<String, AuthUser> authUserEmailMap = authUsers.stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1892
 
31697 amit.gupta 1893
        List<User> users = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.keySet()));
1894
        Map<String, User> userMap = users.stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x));
28709 amit.gupta 1895
 
31886 tejbeer 1896
        Map<Integer, List<EmployeeAttendance>> employeeAttendancesMap = employeeAttendanceRepository.selectAllByDatesBetween(LocalDate.now().atStartOfDay(), LocalDateTime.now()).stream().collect(groupingBy(x -> x.getUserId()));
28709 amit.gupta 1897
 
31697 amit.gupta 1898
        for (AuthUser authUser : authUsers) {
1899
            User user = userMap.get(authUser.getEmailId());
1900
            String body = null;
1901
            List<EmployeeAttendance> employeeAttendances = employeeAttendancesMap.get(user.getId());
1902
            if (employeeAttendances == null) {
1903
                body = String.format(
31886 tejbeer 1904
                        "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 1905
            } else {
31886 tejbeer 1906
                List<LocalDateTime> punchTimes = employeeAttendances.stream().sorted(Comparator.comparing(EmployeeAttendance::getCreateTimestamp)).map(x -> x.getCreateTimestamp()).collect(Collectors.toList());
31697 amit.gupta 1907
                if (punchTimes.size() == 1) {
1908
                    // body = String.format("Dear %s,\n Pls note that you haven't punched out yet.
1909
                    // You have been marked absent for half the day. You may contact your manager
1910
                    // and get it regularise.\n\nRegards\nHR Team", authUser.getFullName());
1911
                } else {
1912
                    LocalDateTime firstPunch = punchTimes.get(0);
1913
                    LocalDateTime lastPunch = punchTimes.get(punchTimes.size() - 1);
1914
                    Duration duration = Duration.between(firstPunch, lastPunch);
1915
                    boolean hoursCompleted = lastPunch.isAfter(firstPunch.plusHours(8).plusMinutes(30));
1916
                    if (!hoursCompleted) {
1917
                        body = String.format(
31886 tejbeer 1918
                                "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 1919
                    }
1920
                }
28709 amit.gupta 1921
 
31697 amit.gupta 1922
            }
1923
            if (body != null) {
31886 tejbeer 1924
                Utils.sendMailWithAttachments(googleMailSender, new String[]{authUser.getEmailId()}, new String[]{"kangan.monga@smartdukaan.com"}, "Attendance Alert", body);
31697 amit.gupta 1925
            }
1926
        }
28709 amit.gupta 1927
 
31697 amit.gupta 1928
        this.sendMailToHR();
28709 amit.gupta 1929
 
31697 amit.gupta 1930
    }
28709 amit.gupta 1931
 
31697 amit.gupta 1932
    private void sendMailToHR() throws Exception {
1933
        Map<String, String> map = new HashMap<>();
1934
        String reporticoDate = FormattingUtils.formatReporitcoDate(LocalDateTime.now());
1935
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
1936
        map.put("MANUAL_datesBetween_FROMDATE", reporticoDate);
31886 tejbeer 1937
        InputStreamSource isr = reporticoService.getReportInputStreamSource(ReporticoProject.FOCO, "employeeattendance.xml");
1938
        Attachment attachment = new Attachment("attendance-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv", isr);
1939
        Utils.sendMailWithAttachments(googleMailSender, EMPLOYEE_ATTENDANCE_MAIL_LIST, null, "Attendance - " + FormattingUtils.formatDate(LocalDateTime.now()), "PFA Attendance", attachment);
31697 amit.gupta 1940
    }
28709 amit.gupta 1941
 
31697 amit.gupta 1942
    public void checkPartnerActiveStore() throws Exception {
24697 amit.gupta 1943
 
31697 amit.gupta 1944
        List<FofoStore> fofoStores = fofoStoreRepository.selectByStatus(true);
23929 amit.gupta 1945
 
31697 amit.gupta 1946
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1947
        if (!fofoStores.isEmpty()) {
1948
            for (FofoStore fofoStore : fofoStores) {
24551 amit.gupta 1949
 
31697 amit.gupta 1950
                if (currentDate.isBefore(fofoStore.getActiveTimeStamp())) {
24542 amit.gupta 1951
 
31697 amit.gupta 1952
                    fofoStore.setActive(true);
1953
                    fofoStoreRepository.persist(fofoStore);
1954
                    LOGGER.info("inserted into InActiveFofoStore successfully");
29160 amit.gupta 1955
 
31697 amit.gupta 1956
                } else {
1957
                    fofoStore.setActive(false);
1958
                    fofoStore.setActiveTimeStamp(null);
1959
                    fofoStoreRepository.persist(fofoStore);
1960
                    LOGGER.info("inserted into InActiveFofoStore successfully");
1961
                }
24542 amit.gupta 1962
 
31697 amit.gupta 1963
            }
1964
        }
24542 amit.gupta 1965
 
31697 amit.gupta 1966
    }
24548 amit.gupta 1967
 
31697 amit.gupta 1968
    public void sendAgeingReport() throws Exception {
33820 ranu 1969
        sendAgeingReport("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com", "kuldeep.kumar@smartdukaan.com");
31697 amit.gupta 1970
    }
24542 amit.gupta 1971
 
31697 amit.gupta 1972
    public void moveImeisToPriceDropImeis() throws Exception {
1973
        List<PriceDrop> priceDrops = priceDropRepository.selectAll();
1974
        for (PriceDrop priceDrop : priceDrops) {
1975
            priceDropService.priceDropStatus(priceDrop.getId());
1976
        }
1977
    }
29160 amit.gupta 1978
 
31697 amit.gupta 1979
    public void walletmismatch() throws Exception {
1980
        LocalDate curDate = LocalDate.now();
1981
        List<PartnerDailyInvestment> pdis = partnerDailyInvestmentRepository.selectAll(curDate.minusDays(2));
1982
        System.out.println(pdis.size());
1983
        for (PartnerDailyInvestment pdi : pdis) {
1984
            int fofoId = pdi.getFofoId();
31886 tejbeer 1985
            for (PartnerDailyInvestment investment : Lists.reverse(partnerDailyInvestmentRepository.selectAll(fofoId, null, null))) {
1986
                float statementAmount = walletService.getOpeningTill(fofoId, investment.getDate().plusDays(1).atTime(LocalTime.of(4, 0)));
31697 amit.gupta 1987
                CustomRetailer retailer = retailerService.getFofoRetailer(fofoId);
31886 tejbeer 1988
                LOGGER.info("{}\t{}\t{}\t{}\t{}", fofoId, retailer.getBusinessName(), retailer.getMobileNumber(), investment.getDate().toString(), investment.getWalletAmount(), statementAmount);
29160 amit.gupta 1989
 
31697 amit.gupta 1990
            }
1991
        }
29160 amit.gupta 1992
 
31697 amit.gupta 1993
    }
29160 amit.gupta 1994
 
31697 amit.gupta 1995
    @Autowired
1996
    StateRepository stateRepository;
29160 amit.gupta 1997
 
31697 amit.gupta 1998
    public void gst() throws Exception {
31886 tejbeer 1999
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectBetweenSaleDate(LocalDate.of(2021, 8, 16).atStartOfDay(), LocalDateTime.now());
31697 amit.gupta 2000
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 2001
            int retailerAddressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(fofoOrder.getFofoId());
24548 amit.gupta 2002
 
31697 amit.gupta 2003
            Address retailerAddress = addressRepository.selectById(retailerAddressId);
2004
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2005
            Integer stateId = null;
2006
            if (customerAddress.getState().equals(retailerAddress.getState())) {
2007
                try {
2008
                    stateId = stateRepository.selectByName(customerAddress.getState()).getId();
2009
                } catch (Exception e) {
2010
                    LOGGER.error("Cannot found state named {}", customerAddress.getState());
2011
                    continue;
2012
                }
2013
            }
2014
            Map<Integer, GstRate> itemIdStateTaxRateMap = null;
24542 amit.gupta 2015
 
31697 amit.gupta 2016
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
2017
            List<Integer> itemIds = fofoOrderItems.stream().map(x -> x.getItemId()).collect(Collectors.toList());
2018
            if (stateId != null) {
2019
                itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(itemIds, stateId);
2020
            } else {
32145 tejbeer 2021
                itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(itemIds);
31697 amit.gupta 2022
            }
24580 amit.gupta 2023
 
31697 amit.gupta 2024
            for (FofoOrderItem foi : fofoOrderItems) {
2025
                float sgstRate = foi.getSgstRate();
2026
                float cgstRate = foi.getCgstRate();
2027
                float igstRate = foi.getIgstRate();
32145 tejbeer 2028
                foi.setCgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate());
2029
                foi.setSgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
2030
                foi.setIgstRate(itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
24587 amit.gupta 2031
 
32145 tejbeer 2032
                LOGGER.info("Invoice {}, Date {}", fofoOrder.getInvoiceNumber(), fofoOrder.getCreateTimestamp());
2033
                LOGGER.info("customerAddress.getState() {}, retailerAddress.getState() {}", customerAddress.getState(), retailerAddress.getState());
2034
                LOGGER.info("Rates getIgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getIgstRate());
2035
                LOGGER.info("Rates getCgstRate() {}, getSgstRate() {}", itemIdStateTaxRateMap.get(foi.getItemId()).getCgstRate(), itemIdStateTaxRateMap.get(foi.getItemId()).getSgstRate());
24587 amit.gupta 2036
 
2037
 
31697 amit.gupta 2038
            }
2039
        }
26092 amit.gupta 2040
 
31697 amit.gupta 2041
    }
24590 amit.gupta 2042
 
33256 amit.gupta 2043
    public void schemewalletmismatch() throws ProfitMandiBusinessException {
31697 amit.gupta 2044
        LocalDate dateToReconcile = LocalDate.of(2018, 4, 1);
2045
        while (dateToReconcile.isBefore(LocalDate.now())) {
2046
            reconcileSchemes(dateToReconcile);
2047
            // reconcileOrders(dateTime);
2048
            // reconcileRecharges(dateTime);
2049
            dateToReconcile = dateToReconcile.plusDays(1);
2050
        }
2051
    }
24587 amit.gupta 2052
 
33256 amit.gupta 2053
    private void reconcileSchemes(LocalDate date) throws ProfitMandiBusinessException {
31697 amit.gupta 2054
        LocalDateTime startDate = date.atStartOfDay();
2055
        LocalDateTime endDate = startDate.plusDays(1);
2056
        List<SchemeInOut> siosCreated = schemeInOutRepository.selectAllByCreateDate(startDate, endDate);
2057
        List<SchemeInOut> siosRefunded = schemeInOutRepository.selectAllByRefundDate(startDate, endDate);
2058
        double totalSchemeDisbursed = siosCreated.stream().mapToDouble(x -> x.getAmount()).sum();
2059
        double totalSchemeRolledback = siosRefunded.stream().mapToDouble(x -> x.getAmount()).sum();
2060
        double netSchemeDisbursed = totalSchemeDisbursed - totalSchemeRolledback;
31886 tejbeer 2061
        List<WalletReferenceType> walletReferenceTypes = Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT);
2062
        List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByDateType(startDate, endDate, walletReferenceTypes);
31697 amit.gupta 2063
        double schemeAmountWalletTotal = history.stream().mapToDouble(x -> x.getAmount()).sum();
2064
        if (Math.abs(netSchemeDisbursed - schemeAmountWalletTotal) > 10d) {
2065
            LOGGER.info("Scheme Amount mismatched for Date {}", date);
24590 amit.gupta 2066
 
31724 amit.gupta 2067
            Map<Integer, Double> inventoryItemSchemeIO = siosCreated.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 2068
 
31886 tejbeer 2069
            Map<Integer, Double> userSchemeMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIO.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIO.get(x.getId()))));
24635 amit.gupta 2070
 
31724 amit.gupta 2071
            Map<Integer, Double> inventoryItemSchemeIORefunded = siosRefunded.stream().collect(groupingBy(x -> x.getInventoryItemId(), Collectors.summingDouble(SchemeInOut::getAmount)));
24635 amit.gupta 2072
 
31886 tejbeer 2073
            Map<Integer, Double> userSchemeRefundedMap = inventoryItemRepository.selectByIds(inventoryItemSchemeIORefunded.keySet()).stream().collect(groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> inventoryItemSchemeIORefunded.get(x.getId()))));
24635 amit.gupta 2074
 
31697 amit.gupta 2075
            Map<Integer, Double> finalUserSchemeAmountMap = new HashMap<>();
24635 amit.gupta 2076
 
33452 amit.gupta 2077
            for (Entry<Integer, Double> schemeAmount : userSchemeRefundedMap.entrySet()) {
31697 amit.gupta 2078
                if (!finalUserSchemeAmountMap.containsKey(schemeAmount.getKey())) {
2079
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), schemeAmount.getValue());
2080
                } else {
31886 tejbeer 2081
                    finalUserSchemeAmountMap.put(schemeAmount.getKey(), finalUserSchemeAmountMap.get(schemeAmount.getKey()) + schemeAmount.getValue());
31697 amit.gupta 2082
                }
2083
            }
31886 tejbeer 2084
            Map<Integer, Integer> userWalletMap = userWalletRepository.selectByRetailerIds(finalUserSchemeAmountMap.keySet()).stream().collect(Collectors.toMap(UserWallet::getUserId, UserWallet::getId));
24635 amit.gupta 2085
 
31724 amit.gupta 2086
            Map<Integer, Double> walletAmountMap = history.stream().collect(groupingBy(
31697 amit.gupta 2087
                    UserWalletHistory::getWalletId, Collectors.summingDouble((UserWalletHistory::getAmount))));
33452 amit.gupta 2088
            for (Entry<Integer, Double> userAmount : walletAmountMap.entrySet()) {
31697 amit.gupta 2089
                double diff = Math.abs(finalUserSchemeAmountMap.get(userAmount.getKey()) - userAmount.getValue());
2090
                if (diff > 5) {
2091
                    LOGGER.info("Partner scheme mismatched for Userid {}", userWalletMap.get(userAmount.getKey()));
2092
                }
2093
            }
2094
        }
24635 amit.gupta 2095
 
31697 amit.gupta 2096
    }
24635 amit.gupta 2097
 
31697 amit.gupta 2098
    public void sendDailySalesNotificationToPartner(Integer fofoIdInt) throws Exception {
30982 tejbeer 2099
 
31697 amit.gupta 2100
        LocalDateTime now = LocalDateTime.now();
2101
        LocalDateTime from = now.with(LocalTime.MIN);
2102
        String timeString = "Today %s";
2103
        // Send yesterday's report
2104
        /*
2105
         * if (now.getHour() < 13) { timeString = "Yesterday %s"; from =
2106
         * now.minusDays(1).; now = from.with(LocalTime.MAX);
2107
         *
2108
         * }
2109
         */
30982 tejbeer 2110
 
31697 amit.gupta 2111
        List<Integer> fofoIds = null;
31886 tejbeer 2112
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getId(), x -> x));
30982 tejbeer 2113
 
24653 govind 2114
 
31697 amit.gupta 2115
        if (fofoIdInt == null) {
2116
            fofoIds = new ArrayList<>(fofoStoreMap.keySet());
2117
        } else {
2118
            fofoIds = Arrays.asList(fofoIdInt);
2119
        }
2120
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
28368 tejbeer 2121
 
31886 tejbeer 2122
        Map<Integer, Float> partnerPolicyAmountMap = insurancePolicyRepository.selectAmountSumGroupByRetailerId(now, null);
31697 amit.gupta 2123
        Map<Integer, Long> partnerPolicyQtyMap = insurancePolicyRepository.selectQtyGroupByRetailerId(now, null);
28368 tejbeer 2124
 
31886 tejbeer 2125
        Map<Integer, Double> spPartnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, true);
28377 tejbeer 2126
 
31886 tejbeer 2127
        Map<Integer, Double> spPartner3DaysOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from.minusDays(3), now, 0, true);
31697 amit.gupta 2128
        Map<Integer, Long> spPartnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, true);
28368 tejbeer 2129
 
31886 tejbeer 2130
        Map<Integer, Double> partnerOrderValMap = fofoOrderItemRepository.selectSumAmountGroupByRetailer(from, now, 0, false);
31697 amit.gupta 2131
        Map<Integer, Long> partnerOrderQtyMap = fofoOrderItemRepository.selectQtyGroupByRetailer(from, now, 0, false);
28377 tejbeer 2132
 
31697 amit.gupta 2133
        //4 days + current day running
2134
        Map<Integer, Double> partnerBilledValueMap = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(from.minusDays(4), now);
28377 tejbeer 2135
 
31697 amit.gupta 2136
        Map<Integer, SaleTargetReportModel> saleTargetReportModelMap = new HashMap<>();
2137
        for (int fofoId : fofoIds) {
2138
            SaleTargetReportModel model = new SaleTargetReportModel();
2139
            model.setInsuranceSale(
2140
                    partnerPolicyAmountMap.containsKey(fofoId) ? partnerPolicyAmountMap.get(fofoId).doubleValue() : 0);
2141
            model.setInsruanceQty(partnerPolicyQtyMap.containsKey(fofoId) ? partnerPolicyQtyMap.get(fofoId) : 0);
2142
            model.setSecondary(partnerBilledValueMap.containsKey(fofoId) ? partnerBilledValueMap.get(fofoId) : 0);
2143
            model.setSmartphoneSale(spPartnerOrderValMap.containsKey(fofoId) ? spPartnerOrderValMap.get(fofoId) : 0);
2144
            model.setSmartphoneQty(spPartnerOrderQtyMap.containsKey(fofoId) ? spPartnerOrderQtyMap.get(fofoId) : 0);
2145
            model.setTotalSale(partnerOrderValMap.containsKey(fofoId) ? partnerOrderValMap.get(fofoId) : 0);
2146
            model.setTotalQty(partnerOrderQtyMap.containsKey(fofoId) ? partnerOrderQtyMap.get(fofoId) : 0);
2147
            model.setPast3daysSale(
2148
                    spPartner3DaysOrderValMap.containsKey(fofoId) ? spPartner3DaysOrderValMap.get(fofoId) : 0);
2149
            model.setFofoId(fofoId);
2150
            model.setCode(fofoStoreMap.get(fofoId).getCode());
31724 amit.gupta 2151
            model.setActivationType(fofoStoreMap.get(fofoId).getActivationType());
31697 amit.gupta 2152
            saleTargetReportModelMap.put(fofoId, model);
2153
        }
28377 tejbeer 2154
 
31697 amit.gupta 2155
        Map<Integer, FofoReportingModel> partnerSalesHeadersMap = this.getPartnerIdSalesHeaders();
2156
        for (Integer fofoId : fofoIds) {
2157
            SaleTargetReportModel model = saleTargetReportModelMap.get(fofoId);
28368 tejbeer 2158
 
31697 amit.gupta 2159
            // com.spice.profitmandi.dao.entity.user.User user =
2160
            // userUserRepository.selectById(fofoId);
28377 tejbeer 2161
 
31697 amit.gupta 2162
            // Address address = addressRepository.selectById(user.getAddressId());
28377 tejbeer 2163
 
31697 amit.gupta 2164
            String title = "Sale Update";
31886 tejbeer 2165
            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 2166
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
2167
            sendNotificationModel.setCampaignName("Sales update alert");
2168
            sendNotificationModel.setTitle(title);
2169
            sendNotificationModel.setMessage(messageTemplate);
2170
            sendNotificationModel.setType("url");
2171
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
2172
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
2173
            sendNotificationModel.setMessageType(MessageType.notification);
2174
            int userId = userAccountRepository.selectUserIdByRetailerId(fofoId);
2175
            sendNotificationModel.setUserIds(Arrays.asList(userId));
2176
            notificationService.sendNotification(sendNotificationModel);
2177
            String whatsappMessageTemplate = String.format(
31886 tejbeer 2178
                    "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 2179
            // notificationService.sendWhatsappMessage(whatsappMessageTemplate, title,
2180
            // address.getPhoneNumber());
28377 tejbeer 2181
 
31697 amit.gupta 2182
        }
2183
        // String saleReport = this.getDailySalesReportHtml(partnerSalesHeadersMap,
2184
        // saleTargetReportModelMap);
2185
        this.getStateWiseSales(saleTargetReportModelMap, partnerSalesHeadersMap);
2186
    }
28377 tejbeer 2187
 
31697 amit.gupta 2188
    public void checkRazorPayPaymentStatus() throws Exception {
31886 tejbeer 2189
        List<PendingOrder> pendingOrder = pendingOrderRepository.selectAllByStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PENDING);
28377 tejbeer 2190
 
31697 amit.gupta 2191
        for (PendingOrder po : pendingOrder) {
2192
            RazorPay razorPay = razorPayRepository.selectByOrdeId(po.getId());
2193
            List<PendingOrderItem> poItems = pendingOrderItemRepository.selectByOrderId(po.getId());
28369 tejbeer 2194
 
31697 amit.gupta 2195
            LOGGER.info("razorPay" + razorPay);
2196
            if (razorPay != null) {
2197
                List<Payment> payments = razorPaymentService.fetchOrderForPayment(razorPay.getRazorOrderId());
28368 tejbeer 2198
 
31697 amit.gupta 2199
                if (!payments.isEmpty()) {
2200
                    List<String> statusList = new ArrayList<>();
2201
                    for (Payment payment : payments) {
25880 amit.gupta 2202
 
31697 amit.gupta 2203
                        JSONObject jsonObj = new JSONObject(payment.toString());
25880 amit.gupta 2204
 
31697 amit.gupta 2205
                        String status = jsonObj.getString("status");
25880 amit.gupta 2206
 
31697 amit.gupta 2207
                        statusList.add(status);
25865 amit.gupta 2208
 
31697 amit.gupta 2209
                    }
2210
                    LOGGER.info("statusList" + statusList);
26941 amit.gupta 2211
 
31697 amit.gupta 2212
                    if (statusList.contains("authorized") || statusList.contains("captured")) {
2213
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2214
                        po.setPaidAmount(po.getTotalAmount());
2215
                        for (PendingOrderItem poi : poItems) {
2216
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.PROCESSING);
2217
                        }
2218
                        Map<String, Object> emailModel = pendingOrderService.sendCreateOrderMail(po);
26941 amit.gupta 2219
 
31697 amit.gupta 2220
                        CustomRetailer customRetailer = retailerService.getFofoRetailer(po.getFofoId());
2221
                        Customer customer = customerRepository.selectById(po.getCustomerId());
2222
                        String[] customerEmail = null;
2223
                        if (customer.getEmailId() != null) {
2224
                            customerEmail = new String[]{customer.getEmailId()};
2225
                        }
31886 tejbeer 2226
                        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 2227
                        List<String> authUserEmails = csService.getAuthUserByPartnerId(customRetailer.getPartnerId());
2228
                        if (authUserEmails != null) {
2229
                            authUserEmails = new ArrayList<>();
2230
                        }
2231
                        authUserEmails.addAll(bccTo);
26945 amit.gupta 2232
 
31697 amit.gupta 2233
                        // emailService.sendMailWithAttachments("Order Created with SmartDukaan",
2234
                        // "order-confirm.vm",
2235
                        // emailModel, customerEmail, null, authUserEmails.toArray(new String[0]));
26945 amit.gupta 2236
 
31697 amit.gupta 2237
                    } else if (statusList.contains("refunded") || statusList.contains("failed")) {
2238
                        for (PendingOrderItem poi : poItems) {
2239
                            poi.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2240
                        }
25865 amit.gupta 2241
 
31697 amit.gupta 2242
                        po.setStatus(com.spice.profitmandi.dao.enumuration.transaction.OrderStatus.FAILED);
2243
                    }
25865 amit.gupta 2244
 
31697 amit.gupta 2245
                }
2246
                // LOGGER.info("payment" + payments);
25865 amit.gupta 2247
 
31697 amit.gupta 2248
            }
2249
        }
2250
    }
25865 amit.gupta 2251
 
31697 amit.gupta 2252
    public static class SaleTargetReportModel {
2253
        private double totalSale;
2254
        private long totalQty;
2255
        private double past3daysSale;
2256
        private int fofoId;
2257
        private String code;
31724 amit.gupta 2258
        private ActivationType activationType;
25865 amit.gupta 2259
 
31724 amit.gupta 2260
 
2261
        @Override
2262
        public boolean equals(Object o) {
2263
            if (this == o) return true;
2264
            if (o == null || getClass() != o.getClass()) return false;
2265
            SaleTargetReportModel that = (SaleTargetReportModel) o;
2266
            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;
2267
        }
2268
 
2269
        @Override
2270
        public int hashCode() {
2271
            return Objects.hash(totalSale, totalQty, past3daysSale, fofoId, code, activationType, secondary, smartphoneSale, smartphoneQty, insuranceSale, insruanceQty);
2272
        }
2273
 
2274
        public ActivationType getActivationType() {
2275
            return activationType;
2276
        }
2277
 
2278
        public void setActivationType(ActivationType activationType) {
2279
            this.activationType = activationType;
2280
        }
2281
 
31697 amit.gupta 2282
        public double getSecondary() {
2283
            return secondary;
2284
        }
25865 amit.gupta 2285
 
31697 amit.gupta 2286
        public void setSecondary(double secondary) {
2287
            this.secondary = secondary;
2288
        }
25865 amit.gupta 2289
 
31697 amit.gupta 2290
        private double secondary;
25865 amit.gupta 2291
 
31697 amit.gupta 2292
        public int getFofoId() {
2293
            return fofoId;
2294
        }
25865 amit.gupta 2295
 
31697 amit.gupta 2296
        @Override
2297
        public String toString() {
31886 tejbeer 2298
            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 2299
        }
25865 amit.gupta 2300
 
31697 amit.gupta 2301
        public String getCode() {
2302
            return code;
2303
        }
25865 amit.gupta 2304
 
31697 amit.gupta 2305
        public void setCode(String code) {
2306
            this.code = code;
2307
        }
25865 amit.gupta 2308
 
31697 amit.gupta 2309
        public void setFofoId(int fofoId) {
2310
            this.fofoId = fofoId;
2311
        }
25872 tejbeer 2312
 
31697 amit.gupta 2313
        private double smartphoneSale;
2314
        private long smartphoneQty;
2315
        private double insuranceSale;
2316
        private long insruanceQty;
26945 amit.gupta 2317
 
31697 amit.gupta 2318
        public long getTotalQty() {
2319
            return totalQty;
2320
        }
30765 tejbeer 2321
 
31697 amit.gupta 2322
        public void setTotalQty(long totalQty) {
2323
            this.totalQty = totalQty;
2324
        }
2325
 
2326
        public double getPast3daysSale() {
2327
            return past3daysSale;
2328
        }
2329
 
2330
        public void setPast3daysSale(double past3daysSale) {
2331
            this.past3daysSale = past3daysSale;
2332
        }
2333
 
2334
        public double getTotalSale() {
2335
            return totalSale;
2336
        }
2337
 
2338
        public void setTotalSale(double totalSale) {
2339
            this.totalSale = totalSale;
2340
        }
2341
 
2342
        public double getSmartphoneSale() {
2343
            return smartphoneSale;
2344
        }
2345
 
2346
        public void setSmartphoneSale(double smartphoneSale) {
2347
            this.smartphoneSale = smartphoneSale;
2348
        }
2349
 
2350
        public long getSmartphoneQty() {
2351
            return smartphoneQty;
2352
        }
2353
 
2354
        public void setSmartphoneQty(long smartphoneQty) {
2355
            this.smartphoneQty = smartphoneQty;
2356
        }
2357
 
2358
        public double getInsuranceSale() {
2359
            return insuranceSale;
2360
        }
2361
 
2362
        public void setInsuranceSale(double insuranceSale) {
2363
            this.insuranceSale = insuranceSale;
2364
        }
2365
 
2366
        public long getInsruanceQty() {
2367
            return insruanceQty;
2368
        }
2369
 
2370
        public void setInsruanceQty(long insruanceQty) {
2371
            this.insruanceQty = insruanceQty;
2372
        }
2373
 
2374
    }
2375
 
32482 amit.gupta 2376
    private void getStateWiseSales
2377
            (Map<Integer, SaleTargetReportModel> saleTargetReportModelMap, Map<Integer, FofoReportingModel> partnerSalesHeadersMap) throws
2378
            Exception {
31697 amit.gupta 2379
        String timeString = "Today %s";
2380
        LocalDateTime now = LocalDateTime.now();
2381
 
2382
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:m a");
34903 ranu 2383
        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_ABM, ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT, ProfitMandiConstants.TICKET_CATEGORY_TECHNOLOGY);
31697 amit.gupta 2384
 
2385
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
2386
 
31746 amit.gupta 2387
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
2388
            String email = storeGuyEntry.getKey();
2389
            Set<Integer> fofoIds = storeGuyEntry.getValue();
2390
            LOGGER.info("fofoIds {}", fofoIds);
24683 amit.gupta 2391
 
31746 amit.gupta 2392
            if (!fofoIds.isEmpty()) {
31886 tejbeer 2393
                List<FofoStore> stores = fofoStoreRepository.selectActivePartnersByRetailerIds(new ArrayList<>(fofoIds));
26945 amit.gupta 2394
 
31724 amit.gupta 2395
                Map<String, List<Integer>> stateMap = stores.stream().collect(groupingBy(
2396
                        x -> x.getCode().substring(0, 2), mapping(x -> x.getId(), Collectors.toList())));
31697 amit.gupta 2397
                List<List<Serializable>> stateWiseSales = new ArrayList<>();
33452 amit.gupta 2398
                for (Entry<String, List<Integer>> stateMapEntry : stateMap.entrySet()) {
31886 tejbeer 2399
                    long totalQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getTotalQty()));
2400
                    double totalSale = stateMapEntry.getValue().stream().collect(Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getTotalSale()));
2401
                    long smartPhoneQty = stateMapEntry.getValue().stream().collect(Collectors.summingLong(x -> saleTargetReportModelMap.get(x).getSmartphoneQty()));
31697 amit.gupta 2402
                    double smartPhoneSale = stateMapEntry.getValue().stream().collect(
2403
                            Collectors.summingDouble(x -> saleTargetReportModelMap.get(x).getSmartphoneSale()));
2404
                    stateWiseSales.add(
2405
                            Arrays.asList(stateMapEntry.getKey(), smartPhoneQty, smartPhoneSale, totalQty, totalSale));
2406
                }
2407
                StringBuilder sb = new StringBuilder();
2408
                sb.append("<html><body>");
2409
                sb.append("<p>Statewise Sale Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2410
                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 2411
                for (List<Serializable> stateSale : stateWiseSales) {
2412
                    sb.append("<tr>");
2413
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(0) + "</td>");
2414
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(1) + "</td>");
2415
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(2) + "</td>");
2416
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(3) + "</td>");
2417
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + stateSale.get(4) + "</td>");
2418
                    sb.append("</tr>");
2419
                }
2420
                sb.append("</tbody></table><br><br>");
26945 amit.gupta 2421
 
31697 amit.gupta 2422
                sb.append("<p>Partnerwise Report:</p><br/><table style=\"border-collapse: collapse;\">");
31886 tejbeer 2423
                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 2424
 
2425
 
31886 tejbeer 2426
                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 2427
 
31697 amit.gupta 2428
                String subject = String.format("Sale till %s", String.format(timeString, now.format(timeFormatter)));
31169 tejbeer 2429
 
31886 tejbeer 2430
                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 2431
                List<List<?>> rows = new ArrayList<>();
2432
                for (Integer fofoId : sortedSaleTargetReport) {
2433
                    FofoReportingModel fofoReportingModel = partnerSalesHeadersMap.get(fofoId);
31886 tejbeer 2434
                    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 2435
                    ));
31169 tejbeer 2436
 
31724 amit.gupta 2437
                    //Now try to populate html rows
2438
                    if (!saleTargetReportModelMap.get(fofoId).getActivationType().equals(ActivationType.ACTIVE)) {
31697 amit.gupta 2439
                        continue;
2440
                    }
2441
                    if (saleTargetReportModelMap.get(fofoId).getSecondary() == 0) {
2442
                        sb.append("<tr style='background-color:#D21F3C;color:white'>");
2443
                    } else {
2444
                        sb.append("<tr>");
2445
                    }
31886 tejbeer 2446
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getCode() + "</td>");
2447
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessName() + "</td>");
2448
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getBusinessManager() + "</td>");
2449
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getRegionalManager() + "</td>");
2450
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + partnerSalesHeadersMap.get(fofoId).getTerritoryManager() + "</td>");
2451
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSecondary() + "</td>");
2452
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getTotalSale() + "</td>");
2453
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneSale() + "</td>");
2454
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + saleTargetReportModelMap.get(fofoId).getSmartphoneQty() + "</td>");
31697 amit.gupta 2455
                    sb.append("</tr>");
24841 govind 2456
 
25300 tejbeer 2457
 
31697 amit.gupta 2458
                }
2459
                sb.append("</tr>");
2460
                sb.append("</body></html>");
2461
                String statewiseSaleReport = sb.toString();
25300 tejbeer 2462
 
2463
 
31697 amit.gupta 2464
                ByteArrayOutputStream baos = null;
2465
                try {
2466
                    baos = FileUtil.getCSVByteStream(headers, rows);
2467
                } catch (Exception e2) {
2468
                    e2.printStackTrace();
2469
                }
2470
                Attachment attachment = new Attachment("PartnerSalePerformance.csv", new ByteArrayResource(baos.toByteArray()));
2471
                Utils.sendHtmlMailWithAttachments(googleMailSender, new String[]{email}, null, "Statewise " + subject, statewiseSaleReport, attachment);
2472
            }
2473
        }
2474
    }
29668 tejbeer 2475
 
32350 amit.gupta 2476
 
32482 amit.gupta 2477
    private void sendMailOfHtmlFormat(JavaMailSender sender, String[] email, String body, String cc[], String subject) throws
2478
            MessagingException, ProfitMandiBusinessException, IOException {
32350 amit.gupta 2479
        MimeMessage message = sender.createMimeMessage();
31697 amit.gupta 2480
        MimeMessageHelper helper = new MimeMessageHelper(message);
2481
        helper.setSubject(subject);
2482
        helper.setText(body, true);
2483
        helper.setTo(email);
2484
        if (cc != null) {
2485
            helper.setCc(cc);
2486
        }
2487
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
2488
        helper.setFrom(senderAddress);
2489
        mailSender.send(message);
2490
    }
25694 amit.gupta 2491
 
31697 amit.gupta 2492
    public void sendNotification() throws Exception {
34042 vikas.jang 2493
        LOGGER.info("FCM sendNotification");
32610 amit.gupta 2494
        List<PushNotifications> pushNotifications = pushNotificationRepository.selectAllPendingNotifications();
31697 amit.gupta 2495
        if (!pushNotifications.isEmpty()) {
34042 vikas.jang 2496
            InputStream serviceAccount = getClass().getClassLoader().getResourceAsStream("service-account.json");
34039 vikas.jang 2497
            GoogleCredentials googleCredentials = GoogleCredentials.fromStream(serviceAccount).createScoped(FCM_SCOPED);
2498
            googleCredentials.refreshIfExpired();
2499
            String accessToken = googleCredentials.getAccessToken().getTokenValue();
2500
 
31697 amit.gupta 2501
            for (PushNotifications pushNotification : pushNotifications) {
2502
                Device device = deviceRepository.selectById(pushNotification.getDeviceId());
31886 tejbeer 2503
                NotificationCampaign notificationCampaign = notificationCampaignRepository.selectById(pushNotification.getNotificationCampaignid());
2504
                SimpleCampaignParams scp = gson.fromJson(notificationCampaign.getImplementationParams(), SimpleCampaignParams.class);
31697 amit.gupta 2505
                Campaign campaign = new SimpleCampaign(scp);
2506
                String result_url = campaign.getUrl() + "&user_id=" + device.getUser_id();
34039 vikas.jang 2507
 
2508
                JSONObject message = new JSONObject();
2509
                message.put("token", device.getFcmId());
2510
 
2511
                JSONObject notification = new JSONObject();
2512
                notification.put("title", campaign.getTitle());
2513
                notification.put("body", campaign.getMessage());
2514
                message.put("notification", notification);
2515
 
2516
                JSONObject data = new JSONObject();
2517
                data.put("type", campaign.getType());
2518
                data.put("url", result_url);
2519
                data.put("time_to_live", campaign.getExpireTimestamp());
2520
                data.put("image", campaign.getImageUrl());
2521
                data.put("largeIcon", "large_icon");
2522
                data.put("smallIcon", "small_icon");
34043 vikas.jang 2523
                data.put("vibrate", "1");
34044 vikas.jang 2524
                data.put("pid", String.valueOf(pushNotification.getId()));
34043 vikas.jang 2525
                data.put("sound", "1");
34039 vikas.jang 2526
                data.put("priority", "high");
2527
                message.put("data", data);
2528
 
2529
                JSONObject payload = new JSONObject();
2530
                payload.put("message", message);
2531
 
31697 amit.gupta 2532
                try {
2533
                    CloseableHttpClient client = HttpClients.createDefault();
2534
                    HttpPost httpPost = new HttpPost(FCM_URL);
25694 amit.gupta 2535
 
34039 vikas.jang 2536
                    httpPost.setHeader("Authorization", "Bearer " + accessToken);
2537
                    httpPost.setHeader("Content-Type", "application/json");
2538
 
2539
                    StringEntity entity = new StringEntity(payload.toString());
31697 amit.gupta 2540
                    httpPost.setEntity(entity);
2541
                    CloseableHttpResponse response = client.execute(httpPost);
34275 tejus.loha 2542
                    LOGGER.info("google FCM status code: {}", response.getStatusLine().getStatusCode());
34043 vikas.jang 2543
                    String responseBody = new BufferedReader(new InputStreamReader(response.getEntity().getContent()))
2544
                            .lines().collect(Collectors.joining("\n"));
31697 amit.gupta 2545
                    if (response.getStatusLine().getStatusCode() == 200) {
2546
                        pushNotification.setSentTimestamp(LocalDateTime.now());
2547
                    } else {
2548
                        pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
34043 vikas.jang 2549
                        LOGGER.info("FCM Response message" + responseBody);
31697 amit.gupta 2550
                        response.toString();
2551
                    }
25694 amit.gupta 2552
 
31697 amit.gupta 2553
                } catch (Exception e) {
2554
                    e.printStackTrace();
2555
                    pushNotification.setSentTimestamp(LocalDateTime.of(1970, 1, 1, 00, 00));
2556
                    LOGGER.info("message " + "not sent " + e.getMessage());
2557
                }
2558
            }
2559
        }
2560
    }
25721 tejbeer 2561
 
31697 amit.gupta 2562
    public void grouping() throws Exception {
2563
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yyyy hh:mm");
2564
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByStatus(PriceDropImeiStatus.APPROVED);
31886 tejbeer 2565
        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 2566
        Map<Integer, CustomRetailer> retailersMap = retailerService.getFofoRetailers(false);
2567
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
2568
            if (priceDropIMEI.getPartnerId() == 0)
2569
                continue;
2570
            HashSet<String> imeis = new HashSet<>();
2571
            PriceDrop priceDrop = priceDropRepository.selectById(priceDropIMEI.getPriceDropId());
2572
            imeis.add(priceDropIMEI.getImei());
31886 tejbeer 2573
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByFofoIdSerialNumbers(priceDropIMEI.getPartnerId(), imeis, false);
31697 amit.gupta 2574
            if (inventoryItems.size() == 0) {
2575
                LOGGER.info("Need to investigate partnerId - {} imeis - {}", priceDropIMEI.getPartnerId(), imeis);
2576
                continue;
2577
            }
2578
            InventoryItem inventoryItem = inventoryItems.get(0);
2579
            CustomRetailer customRetailer = retailersMap.get(inventoryItem.getFofoId());
31886 tejbeer 2580
            if (inventoryItem.getLastScanType().equals(ScanType.DOA_OUT) || inventoryItem.getLastScanType().equals(ScanType.PURCHASE_RET)) {
31697 amit.gupta 2581
                // check if pricedrop has been rolled out
31886 tejbeer 2582
                List<UserWalletHistory> uwh = walletService.getAllByReference(inventoryItem.getFofoId(), priceDropIMEI.getPriceDropId(), WalletReferenceType.PRICE_DROP);
31697 amit.gupta 2583
                if (uwh.size() > 0) {
2584
                    Item item = itemRepository.selectById(inventoryItem.getItemId());
31886 tejbeer 2585
                    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 2586
                }
2587
            }
2588
        }
2589
    }
25721 tejbeer 2590
 
31697 amit.gupta 2591
    public void toffeeRollback() throws Exception {
2592
        toffeeService.cancelPolicyCopy("110143521986");
2593
        toffeeService.getOrderId("110143521986");
2594
    }
27212 tejbeer 2595
 
31697 amit.gupta 2596
    public void attachToffeeInvoices() throws Exception {
31886 tejbeer 2597
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(3, Optional.of(false));
31697 amit.gupta 2598
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2599
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2600
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2601
            InvoicePdfModel pdfModel = orderService.getInvoicePdfModel(fofoOrder.getId());
2602
            java.io.ByteArrayOutputStream byteArrayOutputStream = new java.io.ByteArrayOutputStream();
2603
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
31886 tejbeer 2604
            String pdfInvoiceString = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
2605
            boolean attached = toffeeService.attachInvoice(insurancePolicy.getPolicyNumber().split("#")[1], pdfInvoiceString);
31697 amit.gupta 2606
            if (attached) {
2607
                insurancePolicy.setPosted(true);
2608
            }
2609
        }
2610
    }
25721 tejbeer 2611
 
31697 amit.gupta 2612
    public void sendBAGPendingPolicies() throws Exception {
31886 tejbeer 2613
        List<InsurancePolicy> insurancePolicies = insurancePolicyRepository.selectAllByProviderId(4, Optional.of(false));
31697 amit.gupta 2614
        for (InsurancePolicy insurancePolicy : insurancePolicies) {
2615
            String invoiceNumber = insurancePolicy.getInvoiceNumber();
2616
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
2617
            FofoOrderItem fofoOrderItem = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId()).get(0);
2618
            CustomerAddress customerAddress = customerAddressRepository.selectById(fofoOrder.getCustomerAddressId());
2619
            Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
2620
            BAGInsuranceModel bagInsuranceModel = new BAGInsuranceModel();
2621
            // bagInsuranceModel.setModelId();
2622
            bagInsuranceModel.setAddressLine1(customerAddress.getLine1());
2623
            bagInsuranceModel.setAddressLine2(customerAddress.getLine2());
2624
            bagInsuranceModel.setCity(customerAddress.getCity());
2625
            bagInsuranceModel.setBrandWarranty("1 Year");
2626
            Item item = itemRepository.selectById(fofoOrderItem.getId());
2627
            bagInsuranceModel.setModelName(item.getItemDescription());
2628
            bagInsuranceModel.setDateOfPurchase(fofoOrder.getFormattedDate());
2629
            bagInsuranceModel.setEmail(customer.getEmailId());
2630
            bagInsuranceModel.setImei1(insurancePolicy.getSerialNumber());
2631
            bagInsuranceModel.setFirstName(customer.getFirstName());
2632
            bagInsuranceModel.setLastName(customer.getLastName());
2633
            bagInsuranceModel.setMobileNumber(customer.getMobileNumber());
2634
            bagInsuranceModel.setPlanId("");
2635
            insurancePolicy.setPosted(true);
2636
        }
2637
    }
25721 tejbeer 2638
 
31697 amit.gupta 2639
    public void schemeRollback(List<String> schemeIds) throws Exception {
2640
        List<Integer> schemeIdsInt = schemeIds.stream().map(x -> Integer.parseInt(x)).collect(Collectors.toList());
31886 tejbeer 2641
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIdsInt, 0, schemeIds.size()).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
31697 amit.gupta 2642
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectBySchemeIds(new HashSet<>(schemeIdsInt));
2643
        for (SchemeInOut sio : schemeInOuts) {
2644
            Scheme scheme = schemesMap.get(sio.getSchemeId());
34324 amit.gupta 2645
            if (scheme.getType().getTransactionType().equals(StockTransactionType.IN)) {
25721 tejbeer 2646
 
34324 amit.gupta 2647
            } else if (scheme.getType().getTransactionType().equals(StockTransactionType.OUT)) {
31697 amit.gupta 2648
                InventoryItem inventoryItem = inventoryItemRepository.selectById(sio.getInventoryItemId());
2649
                List<ScanRecord> sr = scanRecordRepository.selectByInventoryItemId(sio.getInventoryItemId());
31886 tejbeer 2650
                ScanRecord scanRecord = sr.stream().filter(x -> x.getType().equals(ScanType.SALE)).max((x1, x2) -> x1.getCreateTimestamp().compareTo(x2.getCreateTimestamp())).get();
2651
                if (scanRecord.getCreateTimestamp().isAfter(scheme.getEndDateTime()) || scanRecord.getCreateTimestamp().isBefore(scheme.getStartDateTime())) {
31697 amit.gupta 2652
                    sio.setRolledBackTimestamp(LocalDateTime.now());
2653
                    FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(scanRecord.getOrderId());
31886 tejbeer 2654
                    String rollbackReason = "Scheme reversed for " + itemRepository.selectById(inventoryItem.getItemId()).getItemDescription() + "/Inv - " + fofoOrder.getInvoiceNumber();
2655
                    walletService.rollbackAmountFromWallet(scanRecord.getFofoId(), sio.getAmount(), scanRecord.getOrderId(), WalletReferenceType.SCHEME_OUT, rollbackReason, LocalDateTime.now());
2656
                    System.out.printf("Amount %f,SchemeId %d,Reason %s\n", sio.getAmount(), sio.getSchemeId(), rollbackReason);
31697 amit.gupta 2657
                }
2658
            }
2659
        }
2660
        // throw new Exception();
2661
    }
25721 tejbeer 2662
 
31697 amit.gupta 2663
    public void checkfocusedModelInPartnerStock() throws Exception {
25721 tejbeer 2664
 
35442 amit 2665
        // ========== PHASE 1: Batch fetch all data upfront ==========
2666
        Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectActiveStores().stream()
2667
                .collect(Collectors.toMap(FofoStore::getId, x -> x));
2668
        List<Integer> allPartnerIds = new ArrayList<>(fofoStoreMap.keySet());
2669
 
31886 tejbeer 2670
        Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
31697 amit.gupta 2671
        Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
2672
        Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
35442 amit 2673
        Map<Integer, List<FocusedModel>> regionFocusedModelsMap = focusedModelRepository.selectAll().stream()
2674
                .collect(Collectors.groupingBy(FocusedModel::getRegionId));
2675
        LOGGER.info("regionFocusedModelsMap - {}", regionFocusedModelsMap);
31886 tejbeer 2676
        Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
35442 amit 2677
 
2678
        // Batch fetch all customRetailers upfront
2679
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(allPartnerIds);
2680
        LOGGER.info("Fetched {} customRetailers", customRetailerMap.size());
2681
 
2682
        // Batch fetch all inventory snapshots upfront
2683
        Map<Integer, List<CurrentInventorySnapshot>> allInventorySnapshotsMap = currentInventorySnapshotRepository
2684
                .selectByFofoId(allPartnerIds).stream()
2685
                .collect(Collectors.groupingBy(CurrentInventorySnapshot::getFofoId));
2686
        LOGGER.info("Fetched inventory snapshots for {} partners", allInventorySnapshotsMap.size());
2687
 
2688
        // Batch fetch all pending GRN orders upfront
2689
        Map<Integer, List<Order>> allGrnPendingOrdersMap = orderRepository.selectPendingGrnOrders(allPartnerIds).stream()
2690
                .collect(Collectors.groupingBy(Order::getRetailerId));
2691
        LOGGER.info("Fetched GRN pending orders for {} partners", allGrnPendingOrdersMap.size());
2692
 
2693
        // Batch fetch all processing orders upfront
2694
        Map<Integer, List<Order>> allProcessingOrdersMap = orderRepository.selectOrders(allPartnerIds, orderStatusList).stream()
2695
                .collect(Collectors.groupingBy(Order::getRetailerId));
2696
        LOGGER.info("Fetched processing orders for {} partners", allProcessingOrdersMap.size());
2697
 
2698
        // Collect all focused catalog IDs
2699
        Set<Integer> allFocusedCatalogIds = regionFocusedModelsMap.values().stream()
2700
                .flatMap(List::stream)
2701
                .map(FocusedModel::getCatalogId)
2702
                .collect(Collectors.toSet());
2703
 
2704
        // Batch fetch all items by catalog IDs upfront
35446 amit 2705
        List<Item> allItemsByCatalogId = itemRepository.selectAllByCatalogIds(allFocusedCatalogIds);
2706
        Map<Integer, List<Item>> itemsByCatalogIdMap = allItemsByCatalogId.stream()
35442 amit 2707
                .collect(Collectors.groupingBy(Item::getCatalogItemId));
2708
        LOGGER.info("Fetched items for {} catalog IDs", itemsByCatalogIdMap.size());
2709
 
35446 amit 2710
        // Batch fetch all tagListings using pre-fetched items to avoid duplicate item fetch
35442 amit 2711
        Map<Integer, TagListing> tagListingByCatalogIdMap = tagListingRepository
35446 amit 2712
                .selectAllByItems(allItemsByCatalogId);
35442 amit 2713
        LOGGER.info("Fetched {} tagListings", tagListingByCatalogIdMap.size());
2714
 
2715
        // Collect all item IDs from inventory, GRN orders, and processing orders for batch item lookup
2716
        Set<Integer> allItemIds = new HashSet<>();
2717
        allInventorySnapshotsMap.values().forEach(list ->
2718
                list.forEach(cis -> allItemIds.add(cis.getItemId())));
2719
        allGrnPendingOrdersMap.values().forEach(orders ->
2720
                orders.forEach(o -> allItemIds.add(o.getLineItem().getItemId())));
2721
        allProcessingOrdersMap.values().forEach(orders ->
2722
                orders.forEach(o -> allItemIds.add(o.getLineItem().getItemId())));
2723
 
2724
        // Batch fetch all items and create itemId -> catalogId mapping
2725
        Map<Integer, Integer> itemIdToCatalogIdMap = new HashMap<>();
2726
        if (!allItemIds.isEmpty()) {
2727
            itemRepository.selectByIds(allItemIds).forEach(item ->
2728
                    itemIdToCatalogIdMap.put(item.getId(), item.getCatalogItemId()));
2729
        }
2730
        LOGGER.info("Built itemId->catalogId mapping for {} items", itemIdToCatalogIdMap.size());
2731
 
2732
        // ========== PHASE 2: Build partner region mappings ==========
34352 amit.gupta 2733
        Map<Integer, Set<Integer>> partnerToRegions = partnerRegionRepository.selectAll().stream()
2734
                .collect(Collectors.groupingBy(
2735
                        pr -> pr.getFofoId(),
2736
                        Collectors.mapping(pr -> pr.getRegionId(), Collectors.toSet())
2737
                ));
2738
        Map<Set<Integer>, List<Integer>> regionPartnerMap = partnerToRegions.entrySet().stream()
2739
                .collect(Collectors.groupingBy(
2740
                        Map.Entry::getValue,
2741
                        Collectors.mapping(Map.Entry::getKey, Collectors.toList())
2742
                ));
35442 amit 2743
        LOGGER.info("regionPartnerMap - {}", regionPartnerMap.keySet());
2744
 
2745
        // ========== PHASE 3: Process partners using pre-fetched data ==========
2746
        Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
2747
 
34352 amit.gupta 2748
        for (Map.Entry<Set<Integer>, List<Integer>> regionPartnerEntry : regionPartnerMap.entrySet()) {
2749
            Set<Integer> regionIds = regionPartnerEntry.getKey();
35442 amit 2750
            List<Integer> partnerIds = new ArrayList<>(regionPartnerEntry.getValue());
2751
 
34502 amit.gupta 2752
            if (regionIds.stream().anyMatch(x -> !regionFocusedModelsMap.containsKey(x))) continue;
34383 amit.gupta 2753
 
35442 amit 2754
            LOGGER.info("Processing regionIds: {}", regionIds);
2755
            if (regionIds == null || regionIds.isEmpty()) {
34352 amit.gupta 2756
                LOGGER.info("No region found for partner {}", partnerIds);
34343 amit.gupta 2757
                continue;
2758
            }
34502 amit.gupta 2759
            if (regionIds.contains(5)) {
34383 amit.gupta 2760
                partnerIds.addAll(fofoStoreMap.keySet());
2761
            }
35442 amit 2762
 
2763
            Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = regionIds.stream()
2764
                    .map(regionFocusedModelsMap::get)
2765
                    .flatMap(x -> x != null ? x.stream() : Stream.empty())
2766
                    .collect(groupingBy(FocusedModel::getCatalogId,
2767
                            mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
2768
 
2769
            if (focusedCatalogIdAndQtyMap.isEmpty()) continue;
2770
 
34352 amit.gupta 2771
            for (int partnerId : partnerIds) {
34502 amit.gupta 2772
                if (partnerId == 0) continue;
34352 amit.gupta 2773
                FofoStore fofoStore = fofoStoreMap.get(partnerId);
35442 amit 2774
                if (fofoStore == null) continue;
2775
 
2776
                CustomRetailer customRetailer = customRetailerMap.get(partnerId);
2777
                if (customRetailer == null) continue;
2778
 
34352 amit.gupta 2779
                List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
2780
                focusedModelShortageReportMap.put(fofoStore.getId(), focusedModelShortageList);
34343 amit.gupta 2781
 
35442 amit 2782
                // Build catalogIdAndQtyMap from pre-fetched inventory snapshots
2783
                Map<Integer, Integer> catalogIdAndQtyMap = new HashMap<>();
2784
                List<CurrentInventorySnapshot> inventorySnapshots = allInventorySnapshotsMap.get(partnerId);
2785
                if (inventorySnapshots != null) {
2786
                    Map<Integer, Integer> itemQtyMap = inventorySnapshots.stream()
2787
                            .collect(Collectors.toMap(CurrentInventorySnapshot::getItemId, CurrentInventorySnapshot::getAvailability));
2788
                    for (Map.Entry<Integer, Integer> e : itemQtyMap.entrySet()) {
2789
                        Integer catalogId = itemIdToCatalogIdMap.get(e.getKey());
2790
                        if (catalogId != null) {
2791
                            catalogIdAndQtyMap.merge(catalogId, e.getValue(), Integer::sum);
2792
                        }
2793
                    }
34352 amit.gupta 2794
                }
25721 tejbeer 2795
 
35442 amit 2796
                // Build grnPendingOrdersMap from pre-fetched orders
2797
                Map<Integer, Integer> grnPendingOrdersMap = new HashMap<>();
2798
                List<Order> grnOrders = allGrnPendingOrdersMap.get(partnerId);
2799
                if (grnOrders != null) {
2800
                    for (Order order : grnOrders) {
2801
                        Integer catalogId = itemIdToCatalogIdMap.get(order.getLineItem().getItemId());
2802
                        if (catalogId != null) {
2803
                            grnPendingOrdersMap.merge(catalogId, order.getLineItem().getQuantity(), Integer::sum);
2804
                        }
2805
                    }
34352 amit.gupta 2806
                }
25800 tejbeer 2807
 
35442 amit 2808
                // Build processingOrderMap from pre-fetched orders
2809
                Map<Integer, Integer> processingOrderMap = new HashMap<>();
2810
                List<Order> processingOrders = allProcessingOrdersMap.get(partnerId);
2811
                if (processingOrders != null) {
2812
                    for (Order order : processingOrders) {
2813
                        Integer catalogId = itemIdToCatalogIdMap.get(order.getLineItem().getItemId());
2814
                        if (catalogId != null) {
2815
                            processingOrderMap.merge(catalogId, order.getLineItem().getQuantity(), Integer::sum);
2816
                        }
2817
                    }
34352 amit.gupta 2818
                }
25721 tejbeer 2819
 
35442 amit 2820
                Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
2821
                Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
25721 tejbeer 2822
 
34352 amit.gupta 2823
                for (Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
35442 amit 2824
                    int catalogId = entry.getKey();
2825
                    int minQty = entry.getValue().orElse(0);
2826
                    int inStockQty = catalogIdAndQtyMap.getOrDefault(catalogId, 0);
2827
                    int processingQty = processingOrderMap.getOrDefault(catalogId, 0);
2828
                    int grnPendingQty = grnPendingOrdersMap.getOrDefault(catalogId, 0);
28526 tejbeer 2829
 
34352 amit.gupta 2830
                    int grnStockQty = grnPendingQty + inStockQty;
2831
                    int totalQty = processingQty + grnPendingQty + inStockQty;
2832
                    int shortageQty = minQty - totalQty;
27213 tejbeer 2833
 
35442 amit 2834
                    // Use pre-fetched items
2835
                    List<Item> items = itemsByCatalogIdMap.get(catalogId);
2836
                    if (items == null || items.isEmpty()) continue;
25721 tejbeer 2837
 
35442 amit 2838
                    // Use pre-fetched tagListing
2839
                    TagListing tagListing = tagListingByCatalogIdMap.get(catalogId);
2840
                    if (tagListing == null) continue;
27208 tejbeer 2841
 
35442 amit 2842
                    int allColorNetAvailability = 0;
2843
                    int allColorPoAvailability = 0;
28528 tejbeer 2844
 
34352 amit.gupta 2845
                    for (Item item : items) {
2846
                        if (itemAvailabilityMap != null) {
35442 amit 2847
                            List<SaholicCIS> currentAvailability = itemAvailabilityMap.get(item.getId());
2848
                            if (currentAvailability != null) {
2849
                                allColorNetAvailability += currentAvailability.stream()
2850
                                        .mapToInt(SaholicCIS::getNetavailability).sum();
2851
                            }
34352 amit.gupta 2852
                        }
2853
                        if (poItemAvailabilityMap != null) {
35442 amit 2854
                            List<SaholicPOItem> poItemAvailability = poItemAvailabilityMap.get(item.getId());
2855
                            if (poItemAvailability != null) {
2856
                                allColorPoAvailability += poItemAvailability.stream()
2857
                                        .mapToInt(SaholicPOItem::getUnfulfilledQty).sum();
2858
                            }
34352 amit.gupta 2859
                        }
31697 amit.gupta 2860
                    }
25721 tejbeer 2861
 
34352 amit.gupta 2862
                    FocusedModelShortageModel fm = new FocusedModelShortageModel();
2863
                    fm.setFofoId(fofoStore.getId());
2864
                    fm.setStoreCode(fofoStore.getCode());
2865
                    fm.setStoreName(customRetailer.getBusinessName());
2866
                    fm.setBrandName(items.get(0).getBrand());
2867
                    fm.setModelName(items.get(0).getModelName());
2868
                    fm.setModelNumber(items.get(0).getModelNumber());
2869
                    fm.setGrnStockQty(grnStockQty);
2870
                    fm.setPendingIndentQty(processingQty);
2871
                    fm.setShortageQty(shortageQty);
2872
                    fm.setPoAvailability(allColorPoAvailability);
2873
                    fm.setDp(tagListing.getSellingPrice());
2874
                    fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
35442 amit 2875
 
2876
                    // FIX: Use fofoStore.getId() instead of fofoStore object as key
2877
                    FofoReportingModel reportingModel = partnerIdSalesHeadersMap.get(fofoStore.getId());
2878
                    if (reportingModel != null) {
2879
                        fm.setStateManager(reportingModel.getRegionalManager());
2880
                        fm.setTerritoryManager(reportingModel.getTerritoryManager());
34352 amit.gupta 2881
                    } else {
2882
                        fm.setStateManager("");
2883
                        fm.setTerritoryManager("");
31697 amit.gupta 2884
                    }
25800 tejbeer 2885
 
34352 amit.gupta 2886
                    fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
2887
                    fm.setAvailability(allColorNetAvailability);
25800 tejbeer 2888
 
34352 amit.gupta 2889
                    focusedModelShortageList.add(fm);
31697 amit.gupta 2890
                }
2891
            }
34352 amit.gupta 2892
        }
25721 tejbeer 2893
 
35442 amit 2894
        // ========== PHASE 4: Send emails ==========
2895
        LOGGER.info("focusedModelShortageReportMap size: {}", focusedModelShortageReportMap.size());
31697 amit.gupta 2896
        if (!focusedModelShortageReportMap.isEmpty()) {
2897
            String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
2898
            Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
2899
            Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
28526 tejbeer 2900
 
35442 amit 2901
            for (Map.Entry<Integer, List<FocusedModelShortageModel>> x : focusedModelShortageReportMap.entrySet()) {
2902
                for (Map.Entry<String, Set<Integer>> y : storeGuyMap.entrySet()) {
2903
                    if (y.getValue().contains(x.getKey())) {
2904
                        emailRowsMap.computeIfAbsent(y.getKey(), k -> new ArrayList<>());
2905
                        List<List<? extends Serializable>> fms = x.getValue().stream()
2906
                                .map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
2907
                                        r.getModelName(), r.getModelNumber(), r.getDp(), r.getWarehouseName(),
2908
                                        r.getStateManager(), r.getTerritoryManager(), r.getPendingIndentQty(),
2909
                                        r.getGrnStockQty(), r.getShortageQty(), r.getAvailability()))
2910
                                .collect(Collectors.toList());
2911
                        emailRowsMap.get(y.getKey()).addAll(fms);
2912
                    }
31697 amit.gupta 2913
                }
35442 amit 2914
            }
25721 tejbeer 2915
 
35442 amit 2916
            List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
2917
                    "DP", "Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock",
2918
                    "Shortage Qty", "Availability");
25721 tejbeer 2919
 
35442 amit 2920
            for (Map.Entry<String, List<List<?>>> entry : emailRowsMap.entrySet()) {
31697 amit.gupta 2921
                try {
35442 amit 2922
                    ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, entry.getValue());
2923
                    String[] sendToArray = new String[]{entry.getKey()};
2924
                    Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA",
2925
                            fileName, new ByteArrayResource(baos.toByteArray()));
2926
                } catch (Exception e) {
2927
                    LOGGER.error("Failed to send email to {}", entry.getKey(), e);
31697 amit.gupta 2928
                }
35442 amit 2929
            }
31697 amit.gupta 2930
        }
2931
    }
25721 tejbeer 2932
 
31697 amit.gupta 2933
    private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2934
        StringBuilder sb = new StringBuilder();
2935
        sb.append("Focused Model Shortage in Your Stock : \n");
2936
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2937
 
31697 amit.gupta 2938
            sb.append(entry.getItemName() + "-" + entry.getShortageQty());
2939
            sb.append(String.format("%n", ""));
2940
        }
2941
        return sb.toString();
2942
    }
25721 tejbeer 2943
 
31697 amit.gupta 2944
    private void sendMailWithAttachments(String subject, String messageText, String email) throws Exception {
2945
        MimeMessage message = mailSender.createMimeMessage();
2946
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
25721 tejbeer 2947
 
31697 amit.gupta 2948
        helper.setSubject(subject);
2949
        helper.setText(messageText, true);
2950
        helper.setTo(email);
2951
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
2952
        helper.setFrom(senderAddress);
2953
        mailSender.send(message);
25721 tejbeer 2954
 
31697 amit.gupta 2955
    }
25721 tejbeer 2956
 
31697 amit.gupta 2957
    private String getMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
2958
        StringBuilder sb = new StringBuilder();
31886 tejbeer 2959
        sb.append("<html><body><p>Alert</p><p>Focused Model Shortage in Your Stock:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
2960
        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 2961
        for (FocusedModelShortageModel entry : focusedModelShortageModel) {
25721 tejbeer 2962
 
31697 amit.gupta 2963
            sb.append("<tr>");
2964
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getItemName() + "</td>");
25936 amit.gupta 2965
 
31697 amit.gupta 2966
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getShortageQty() + "</td>");
26790 tejbeer 2967
 
31697 amit.gupta 2968
            sb.append("</tr>");
25927 amit.gupta 2969
 
31697 amit.gupta 2970
        }
26790 tejbeer 2971
 
31697 amit.gupta 2972
        sb.append("</tbody></table></body></html>");
26945 amit.gupta 2973
 
31697 amit.gupta 2974
        return sb.toString();
2975
    }
26945 amit.gupta 2976
 
31697 amit.gupta 2977
    public void notifyLead() throws Exception {
31886 tejbeer 2978
        List<Lead> leadsToNotify = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
2979
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
31697 amit.gupta 2980
        LOGGER.info("authUserEmailMap {}", authUserEmailMap);
31886 tejbeer 2981
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
25982 amit.gupta 2982
 
31697 amit.gupta 2983
        LOGGER.info("dtrEmailMap {}", dtrEmailMap);
26283 tejbeer 2984
 
31697 amit.gupta 2985
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26283 tejbeer 2986
 
33452 amit.gupta 2987
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 2988
            int authId = authUserEmail.getKey();
2989
            String email = authUserEmail.getValue();
2990
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
2991
        }
2992
        LOGGER.info("authUserKeyMap", authUserKeyMap);
2993
        LOGGER.info("leadsToNotify {}", leadsToNotify);
26283 tejbeer 2994
 
31697 amit.gupta 2995
        String templateMessage = "Lead followup for %s %s, %s, %s is due by %s";
2996
        for (Lead lead : leadsToNotify) {
2997
            if (authUserKeyMap.get(lead.getAssignTo()) == null) {
2998
                LOGGER.info("Assignee no longer part of system {}", lead.getAssignTo());
2999
                continue;
3000
            }
3001
            String title = "Leads followup Reminder";
31886 tejbeer 3002
            String notificationMessage = String.format(templateMessage, lead.getFirstName(), lead.getLastName(), lead.getAddress(), lead.getLeadMobile(), leadTimeFormatter.format(lead.getScheduledTimestamp()));
31697 amit.gupta 3003
            String url = "https://app.smartdukaan.com/pages/home/leadUpdate?leadId=" + lead.getId();
3004
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
3005
            sendNotificationModel.setCampaignName("Lead Reminder");
3006
            sendNotificationModel.setTitle(title);
3007
            sendNotificationModel.setMessage(notificationMessage);
3008
            sendNotificationModel.setType("url");
3009
            sendNotificationModel.setUrl(url);
3010
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
3011
            sendNotificationModel.setMessageType(MessageType.reminder);
3012
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(lead.getAssignTo())));
3013
            System.out.println(sendNotificationModel);
3014
            notificationService.sendNotification(sendNotificationModel);
3015
        }
3016
    }
26790 tejbeer 3017
 
32350 amit.gupta 3018
    @Autowired
3019
    AuthService authService;
3020
 
3021
    public void sendUnscheduledFollowUpMail() throws Exception {
3022
        List<Lead> missedScheduleLeads = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay().minusDays(30), LocalDateTime.now().toLocalDate().atStartOfDay());
3023
        List<Lead> leadsScheduledForToday = leadRepository.selectLeadsScheduledBetweenDate(null, LocalDate.now().atStartOfDay(), LocalDate.now().atTime(LocalTime.MAX));
3024
        List<Integer> authIds = missedScheduleLeads.stream().map(x -> x.getAssignTo()).distinct().collect(Collectors.toList());
3025
        LOGGER.info(authIds.size());
35393 amit 3026
        Map<Integer, AuthUser> authUserMap = authRepository.selectByIds(authIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
32350 amit.gupta 3027
        LOGGER.info(authUserMap.size());
3028
        //if(true) return;
3029
 
3030
        missedScheduleLeads = missedScheduleLeads.stream().sorted(Comparator.comparing(Lead::getState, String.CASE_INSENSITIVE_ORDER).thenComparing(Lead::getAssignTo).thenComparing(Lead::getScheduledTimestamp)).collect(Collectors.toList());
3031
        //leadsScheduledForToday
3032
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
3033
        LOGGER.info("Auth Users Size - {}", authUsers.size());
3034
        for (AuthUser authUser : authUsers) {
3035
            LOGGER.info("Auth Name - {}", authUser.getFullName());
3036
            List<Integer> reporteeAuthIds = authService.getAllReportees(authUser.getId());
3037
            reporteeAuthIds.add(authUser.getId());
3038
            StringBuilder sb = new StringBuilder();
3039
            sb.append("<html><body>");
3040
            List<Lead> authMissedScheduledLeads = missedScheduleLeads.stream().filter(x -> reporteeAuthIds.contains(x.getAssignTo())).collect(Collectors.toList());
3041
            LOGGER.info("authMissedScheduledLeads {}", authMissedScheduledLeads.size());
3042
            if (authMissedScheduledLeads.size() > 0) {
3043
                addMissedScheduledLeadsTable(sb, authMissedScheduledLeads, authUserMap);
3044
                sb.append("</body></html>");
3045
 
3046
                String subject = "Lead Updates Summary";
32421 amit.gupta 3047
                String[] email = Arrays.asList(authUser.getEmailId()).toArray(new String[1]);
3048
                //String[] email = Arrays.asList("amit.gupta@smartdukaan.com").toArray(new String[1]);
32350 amit.gupta 3049
                this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
32421 amit.gupta 3050
                //break;
32350 amit.gupta 3051
            }
3052
        }
3053
 
3054
    }
3055
 
32482 amit.gupta 3056
    private void addMissedScheduledLeadsTable(StringBuilder
3057
                                                      sb, List<Lead> missedScheduleLeads, Map<Integer, AuthUser> authUserMap) {
32350 amit.gupta 3058
        sb.append("<h3>Leads That Missed the schedule</h3>");
32439 tejbeer 3059
        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 3060
        for (Lead lead : missedScheduleLeads) {
32439 tejbeer 3061
            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(
3062
                    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 3063
        }
3064
        sb.append("</table>");
3065
    }
3066
 
31697 amit.gupta 3067
    public void notifyVisits() throws Exception {
31886 tejbeer 3068
        List<FranchiseeVisit> franchiseeVisits = franchiseeVisitRepository.selectVisitsScheduledBetweenDate(LocalDateTime.now().minusDays(15), LocalDateTime.now().plusHours(4));
3069
        Map<Integer, String> authUserEmailMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getEmailId()));
3070
        Map<String, Integer> dtrEmailMap = dtrUserRepository.selectAllByEmailIds(new ArrayList<>(authUserEmailMap.values())).stream().collect(Collectors.toMap(x -> x.getEmailId(), x -> x.getId()));
31697 amit.gupta 3071
        Map<Integer, Integer> authUserKeyMap = new HashMap<>();
26790 tejbeer 3072
 
33452 amit.gupta 3073
        for (Entry<Integer, String> authUserEmail : authUserEmailMap.entrySet()) {
31697 amit.gupta 3074
            int authId = authUserEmail.getKey();
3075
            String email = authUserEmail.getValue();
3076
            authUserKeyMap.put(authId, dtrEmailMap.get(email));
3077
        }
3078
        String visitTemplate = "Planned visit to franchisee %s is due by %s";
3079
        String followupTemplate = "Lead followup for franchisee %s is due by %s";
3080
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("MMM 7, EEEE h:m a");
3081
        for (FranchiseeVisit visit : franchiseeVisits) {
3082
            if (authUserKeyMap.containsKey(visit.getAuthId())) {
3083
                continue;
3084
            }
3085
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
3086
            String message = null;
3087
            if (visit.getFranchiseActivityId() == 0) {
31886 tejbeer 3088
                message = String.format(visitTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3089
                sendNotificationModel.setCampaignName("Franchisee visit Reminder");
3090
            } else {
31886 tejbeer 3091
                message = String.format(followupTemplate, visit.getPartnerName(), timeFormatter.format(visit.getScheduleTimestamp()));
31697 amit.gupta 3092
                sendNotificationModel.setCampaignName("Franchisee followup Reminder");
3093
            }
3094
            sendNotificationModel.setMessage(message);
3095
            sendNotificationModel.setType("url");
3096
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
3097
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
3098
            sendNotificationModel.setMessageType(MessageType.reminder);
3099
            sendNotificationModel.setUserIds(Arrays.asList(authUserKeyMap.get(visit.getAuthId())));
3100
            // notificationService.sendNotification(sendNotificationModel);
3101
        }
3102
    }
26792 tejbeer 3103
 
31697 amit.gupta 3104
    public void ticketClosed() throws Exception {
26790 tejbeer 3105
 
31697 amit.gupta 3106
        List<Ticket> tickets = ticketRepository.selectAllNotClosedTicketsWithStatus(ActivityType.RESOLVED);
3107
        for (Ticket ticket : tickets) {
3108
            if (ticket.getUpdateTimestamp().toLocalDate().isBefore(LocalDate.now().minusDays(7))) {
3109
                ticket.setCloseTimestamp(LocalDateTime.now());
3110
                ticket.setLastActivity(ActivityType.RESOLVED_ACCEPTED);
3111
                ticket.setUpdateTimestamp(LocalDateTime.now());
3112
                ticketRepository.persist(ticket);
3113
            }
3114
        }
26790 tejbeer 3115
 
31697 amit.gupta 3116
    }
26790 tejbeer 3117
 
31697 amit.gupta 3118
    public void checkValidateReferral() throws Exception {
26790 tejbeer 3119
 
31697 amit.gupta 3120
        List<Refferal> referrals = refferalRepository.selectByStatus(RefferalStatus.pending);
3121
        LOGGER.info("referrals" + referrals);
3122
        if (!referrals.isEmpty()) {
3123
            String subject = "Referral Request";
3124
            String messageText = this.getMessageForReferral(referrals);
26790 tejbeer 3125
 
31697 amit.gupta 3126
            MimeMessage message = mailSender.createMimeMessage();
3127
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
3128
            String[] email = {"kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com"};
3129
            helper.setSubject(subject);
3130
            helper.setText(messageText, true);
3131
            helper.setTo(email);
3132
            InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3133
            helper.setFrom(senderAddress);
3134
            mailSender.send(message);
26790 tejbeer 3135
 
31697 amit.gupta 3136
        }
3137
    }
26790 tejbeer 3138
 
31697 amit.gupta 3139
    private String getMessageForReferral(List<Refferal> referrals) {
3140
        StringBuilder sb = new StringBuilder();
31886 tejbeer 3141
        sb.append("<html><body><p>Alert</p><p>Pending Referrals:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3142
        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 3143
        for (Refferal entry : referrals) {
26790 tejbeer 3144
 
31697 amit.gupta 3145
            sb.append("<tr>");
3146
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeName() + "</td>");
30421 tejbeer 3147
 
31697 amit.gupta 3148
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getRefereeEmail() + "</td>");
3149
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getFirstName() + "</td>");
3150
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMobile() + "</td>");
3151
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCity() + "</td>");
3152
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getState() + "</td>");
30421 tejbeer 3153
 
31697 amit.gupta 3154
            sb.append("</tr>");
30421 tejbeer 3155
 
31697 amit.gupta 3156
        }
30421 tejbeer 3157
 
31697 amit.gupta 3158
        sb.append("</tbody></table></body></html>");
30421 tejbeer 3159
 
31697 amit.gupta 3160
        return sb.toString();
3161
    }
30421 tejbeer 3162
 
32832 amit.gupta 3163
    private String getMessageForRBMEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
32482 amit.gupta 3164
            ProfitMandiBusinessException {
31697 amit.gupta 3165
        StringBuilder sb = new StringBuilder();
32832 amit.gupta 3166
        sb.append("<html><body><p>Alert</p><p>Escalated by RBM-L1:-</p>" + "<br/><table style='border:1px solid black ;padding: 5px';>");
3167
        sb.append("<tbody>" +
3168
                "<tr>" +
3169
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3170
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3171
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3172
                "</tr>");
30421 tejbeer 3173
 
31697 amit.gupta 3174
        for (PartnerCollectionRemark entry : pcrs) {
30421 tejbeer 3175
 
31697 amit.gupta 3176
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30421 tejbeer 3177
 
31697 amit.gupta 3178
            sb.append("<tr>");
31886 tejbeer 3179
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3180
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
32832 amit.gupta 3181
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
28205 tejbeer 3182
 
31697 amit.gupta 3183
            sb.append("</tr>");
28205 tejbeer 3184
 
31697 amit.gupta 3185
        }
28205 tejbeer 3186
 
31697 amit.gupta 3187
        sb.append("</tbody></table></body></html>");
28205 tejbeer 3188
 
31697 amit.gupta 3189
        return sb.toString();
3190
    }
28208 tejbeer 3191
 
32795 amit.gupta 3192
    private String getMessageForSalesEscalatedPartners(List<PartnerCollectionRemark> pcrs) throws
3193
            ProfitMandiBusinessException {
3194
        StringBuilder sb = new StringBuilder();
3195
        sb.append("<html><body><p>Alert</p><p>Escalated to Sales Team:-</p>" + "<br/>" +
3196
                "<table style='border:1px solid black ;padding: 5px';>");
3197
        sb.append("<tbody>" +
3198
                "<tr>" +
3199
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3200
                "<th style='border:1px solid black;padding: 5px'>Escalated Since</th>" +
3201
                "<th style='border:1px solid black;padding: 5px'>Message</th>" +
3202
                "</tr>");
3203
        for (PartnerCollectionRemark entry : pcrs) {
3204
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3205
            sb.append("<tr>");
3206
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3207
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3208
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getMessage() + "</td>");
3209
            sb.append("</tr>");
3210
        }
3211
 
3212
        sb.append("</tbody></table></body></html>");
3213
 
3214
        return sb.toString();
3215
    }
3216
 
33078 ranu 3217
    private String getMessageForUnauthorizedBuying(List<NonSdBuying> nsb) throws
3218
            ProfitMandiBusinessException {
3219
        StringBuilder sb = new StringBuilder();
3220
        sb.append("<html><body><p>Alert</p><p>Unauthorized Buying-</p>" + "<br/>" +
3221
                "<table style='border:1px solid black ;padding: 5px';>");
3222
        sb.append("<tbody>" +
3223
                "<tr>" +
3224
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>" +
3225
                "<th style='border:1px solid black;padding: 5px'>Brand Name</th>" +
3226
                "<th style='border:1px solid black;padding: 5px'>Brand Value</th>" +
3227
                "<th style='border:1px solid black;padding: 5px'>Created At</th>" +
3228
                "<th style='border:1px solid black;padding: 5px'>Reason</th>" +
3229
                "</tr>");
3230
        for (NonSdBuying entry : nsb) {
3231
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
3232
            List<Integer> brandIds = Collections.singletonList(entry.getBrandId());
3233
            BrandCatalog brandsDisplay = brandsRepository.selectByIds(brandIds).get(0);
3234
            sb.append("<tr>");
3235
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
3236
            sb.append("<td style='border:1px solid black;padding: 5px'>" + brandsDisplay.getName() + "</td>");
3237
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getBrandValue() + "</td>");
3238
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getCreateTimestamp().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
3239
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getReason() + "</td>");
3240
            sb.append("</tr>");
3241
        }
3242
 
3243
        sb.append("</tbody></table></body></html>");
3244
 
3245
        return sb.toString();
3246
    }
3247
 
31697 amit.gupta 3248
    public void reverseWallet() throws Exception {
3249
        LocalDate localDate = LocalDate.of(2020, 10, 28);
31886 tejbeer 3250
        List<UserWalletHistory> uwhList = userWalletHistoryRepository.selectAllByDateType(localDate.atStartOfDay(), localDate.plusDays(1).atStartOfDay(), Arrays.asList(WalletReferenceType.SCHEME_IN, WalletReferenceType.SCHEME_OUT));
31697 amit.gupta 3251
        for (UserWalletHistory uwh : uwhList) {
3252
            if (uwh.getBusinessTimestamp().getMonth().equals(Month.SEPTEMBER)) {
3253
                UserWallet uw = userWalletRepository.selectById(uwh.getWalletId());
3254
                // LOGGER.info("UWH - {}", uwh);
3255
                // amount += uwh.getAmount();
3256
                // System.out.println("Amount is - " + amount);
3257
                // walletService.rollbackAmountFromWallet(uw.getUserId(), uwh.getAmount(),
3258
                // uwh.getReference(), uwh.getReferenceType(), "Margin reversal for error prone
3259
                // run", uwh.getBusinessTimestamp());
3260
                int orderId = uwh.getReference();
3261
                FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
3262
                int inventoryItemId = 0;
3263
                // fofoOrderRepository.delete(fofoOrder);
3264
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3265
                /*
3266
                 * List<PaymentOptionTransaction> paymentOptionTransactions =
3267
                 * paymentOptionTransactionRepository.selectByReferenceIdAndType(fofoOrder.getId
3268
                 * (), PaymentOptionReferenceType.ORDER); for(PaymentOptionTransaction
3269
                 * paymentOptionTransaction : paymentOptionTransactions) {
3270
                 * //paymentOptionTransactionRepository.delete(paymentOptionTransaction); }
3271
                 */
3272
                for (FofoOrderItem foi : fofoOrderItems) {
3273
                    // fofoOrderItemRepository.delete(foi);
3274
                    List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(foi.getId());
3275
                    for (FofoLineItem fli : flis) {
3276
                        // fofoLineItemRepository.delete(fli);
3277
                        inventoryItemId = fli.getInventoryItemId();
3278
                    }
3279
                }
3280
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(
33452 amit.gupta 3281
                        Stream.of(inventoryItemId).collect(Collectors.toSet()));
31697 amit.gupta 3282
                for (SchemeInOut sio : schemeInOuts) {
3283
                    if (sio.getCreateTimestamp().toLocalDate().equals(localDate)) {
3284
                        LOGGER.info("SIO - {}", sio);
3285
                        sio.setRolledBackTimestamp(LocalDateTime.now());
3286
                    }
3287
                }
28208 tejbeer 3288
 
31697 amit.gupta 3289
            }
3290
        }
28208 tejbeer 3291
 
31697 amit.gupta 3292
    }
28208 tejbeer 3293
 
31697 amit.gupta 3294
    public void partnerProblemAlert() throws Exception {
3295
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
3296
        Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
3297
                curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
31886 tejbeer 3298
        Map<Integer, Double> mtdSales = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
3299
        Map<Integer, PartnerDailyInvestment> pdi = partnerDailyInvestmentRepository.selectAll(LocalDate.now()).stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3300
 
31697 amit.gupta 3301
        for (Entry<Integer, Double> ls : lmtdSale.entrySet()) {
28208 tejbeer 3302
 
31697 amit.gupta 3303
            double lmtdTwentyPercentSale = ls.getValue() * 0.2;
28208 tejbeer 3304
 
31697 amit.gupta 3305
            LOGGER.info("lmtdTwentyPercentSale" + lmtdTwentyPercentSale);
28208 tejbeer 3306
 
31697 amit.gupta 3307
            double mtdSale = mtdSales.get(ls.getKey()) == null ? 0 : mtdSales.get(ls.getKey());
28205 tejbeer 3308
 
31697 amit.gupta 3309
            LOGGER.info("mtdSale" + mtdSale);
28205 tejbeer 3310
 
31886 tejbeer 3311
            double totalSixtyPercentInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getTotalInvestment() * 0.6;
28205 tejbeer 3312
 
31697 amit.gupta 3313
            LOGGER.info("totalSixtyPercentInvestment" + totalSixtyPercentInvestment);
28205 tejbeer 3314
 
31697 amit.gupta 3315
            double stockInvestment = pdi.get(ls.getKey()) == null ? 0 : pdi.get(ls.getKey()).getInStockAmount();
28205 tejbeer 3316
 
31697 amit.gupta 3317
            LOGGER.info("stockInvestment" + stockInvestment);
28205 tejbeer 3318
 
31697 amit.gupta 3319
            boolean Investmentvalue = partnerInvestmentService.isInvestmentBelow(ls.getKey(), 25);
28205 tejbeer 3320
 
31697 amit.gupta 3321
            PartnerProblem partnerProblem = partnerProblemRepository.selectByFofoId(ls.getKey());
28205 tejbeer 3322
 
31697 amit.gupta 3323
            if (partnerProblem == null) {
3324
                partnerProblem = new PartnerProblem();
3325
                partnerProblem.setFofoId(ls.getKey());
3326
                if (mtdSale < lmtdTwentyPercentSale) {
3327
                    partnerProblem.setMtd(1);
3328
                }
3329
                if (Investmentvalue) {
3330
                    partnerProblem.setInvestment(1);
3331
                }
28205 tejbeer 3332
 
31697 amit.gupta 3333
                if (stockInvestment < totalSixtyPercentInvestment) {
3334
                    partnerProblem.setInvestment(1);
3335
                }
28205 tejbeer 3336
 
31697 amit.gupta 3337
                partnerProblemRepository.persist(partnerProblem);
3338
            } else {
3339
                if (mtdSale < lmtdTwentyPercentSale) {
3340
                    partnerProblem.setMtd(partnerProblem.getMtd() + 1);
28213 tejbeer 3341
 
31697 amit.gupta 3342
                } else {
3343
                    partnerProblem.setMtd(0);
28227 tejbeer 3344
 
31697 amit.gupta 3345
                }
3346
                if (Investmentvalue) {
3347
                    partnerProblem.setInvestment(partnerProblem.getInvestment() + 1);
3348
                } else {
3349
                    partnerProblem.setInvestment(0);
28227 tejbeer 3350
 
31697 amit.gupta 3351
                }
3352
                if (stockInvestment < totalSixtyPercentInvestment) {
3353
                    partnerProblem.setStockInvestment(partnerProblem.getStockInvestment() + 1);
3354
                } else {
3355
                    partnerProblem.setStockInvestment(0);
3356
                }
28213 tejbeer 3357
 
31697 amit.gupta 3358
            }
28213 tejbeer 3359
 
31697 amit.gupta 3360
        }
28213 tejbeer 3361
 
31886 tejbeer 3362
        List<PartnerProblem> partnerProblems = partnerProblemRepository.selectAll().stream().filter(x -> x.getMtd() + x.getInvestment() + x.getStockInvestment() > 0).collect(Collectors.toList());
28205 tejbeer 3363
 
31697 amit.gupta 3364
        partnerProblems = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3365
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3366
        }).collect(Collectors.toList());
28205 tejbeer 3367
 
31697 amit.gupta 3368
        Map<Integer, PartnerProblem> partnerProblemMap = partnerProblems.stream().sorted((x1, x2) -> {
31886 tejbeer 3369
            return x1.getMtd() + x1.getInvestment() + x1.getStockInvestment() < x2.getMtd() + x2.getInvestment() + x2.getStockInvestment() ? 1 : -1;
31697 amit.gupta 3370
        }).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
28205 tejbeer 3371
 
31697 amit.gupta 3372
        Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailers();
28205 tejbeer 3373
 
31697 amit.gupta 3374
        List<Integer> assignTo = Arrays.asList(15, 9, 54, 53);
28205 tejbeer 3375
 
35393 amit 3376
        Map<Integer, AuthUser> assignAuthUserMap = authRepository.selectByIds(assignTo).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
28222 tejbeer 3377
 
31886 tejbeer 3378
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com", "sm@smartdukaan.com");
31697 amit.gupta 3379
        LOGGER.info("partnerProblem" + partnerProblems);
3380
        StringBuilder sb = new StringBuilder();
3381
        sb.append("<htl><body>");
3382
        sb.append(
3383
                "<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 3384
        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 3385
 
31697 amit.gupta 3386
                + "	    				</tr>");
28218 tejbeer 3387
 
31697 amit.gupta 3388
        for (PartnerProblem pp : partnerProblems) {
3389
            int value = pp.getFofoId() % 4;
28218 tejbeer 3390
 
31697 amit.gupta 3391
            Map<EscalationType, AuthUser> authUserMap = csService.getAuthUserAndEsclationByPartnerId(pp.getFofoId());
3392
            LOGGER.info("authUserMap" + authUserMap);
3393
            sb.append("<tr>");
31886 tejbeer 3394
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3395
            sb.append("<td style='border:1px solid black;padding: 5px'>" + assignAuthUserMap.get(assignTo.get(value)).getName() + "</td>");
31697 amit.gupta 3396
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
3397
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
3398
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
31886 tejbeer 3399
            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 3400
 
31697 amit.gupta 3401
            sb.append("</tr>");
3402
        }
3403
        sb.append("</tbody></table><br><br>");
3404
        String subject = "Partner Problem Alert!";
3405
        String[] email = sendTo.toArray(new String[sendTo.size()]);
28227 tejbeer 3406
 
32350 amit.gupta 3407
        this.sendMailOfHtmlFormat(googleMailSender, email, sb.toString(), null, subject);
28227 tejbeer 3408
 
31697 amit.gupta 3409
        Map<Integer, List<Integer>> authUserPartnerMapping = csService.getAuthUserIdPartnerIdMapping();
28224 tejbeer 3410
 
31697 amit.gupta 3411
        for (Entry<Integer, List<Integer>> authUserPartner : authUserPartnerMapping.entrySet()) {
3412
            AuthUser authUser = authRepository.selectById(authUserPartner.getKey());
3413
            for (Integer patnerId : authUserPartner.getValue()) {
3414
                if (partnerProblemMap.get(patnerId) != null) {
28230 tejbeer 3415
 
31697 amit.gupta 3416
                    StringBuilder sbbuilder = new StringBuilder();
3417
                    sbbuilder.append("<hml><body>");
3418
                    sb.append(
3419
                            "<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 3420
                    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 3421
 
31697 amit.gupta 3422
                            + "	    				</tr>");
28205 tejbeer 3423
 
31697 amit.gupta 3424
                    for (Integer partnerId : authUserPartner.getValue()) {
3425
                        if (partnerProblemMap.get(partnerId) != null) {
3426
                            PartnerProblem pp = partnerProblemMap.get(partnerId);
3427
                            sbbuilder.append("<tr>");
31886 tejbeer 3428
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + customRetailers.get(pp.getFofoId()).getBusinessName() + "</td>");
3429
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getMtd() + "</td>");
31697 amit.gupta 3430
                            sbbuilder.append(
3431
                                    "<td style='border:1px solid black;padding: 5px'>" + pp.getInvestment() + "</td>");
31886 tejbeer 3432
                            sbbuilder.append("<td style='border:1px solid black;padding: 5px'>" + pp.getStockInvestment() + "</td>");
28790 amit.gupta 3433
 
31697 amit.gupta 3434
                            sbbuilder.append("</tr>");
3435
                        }
28790 amit.gupta 3436
 
31697 amit.gupta 3437
                    }
3438
                    sbbuilder.append("</tbody></table><br><br>");
29488 manish 3439
 
32350 amit.gupta 3440
                    this.sendMailOfHtmlFormat(googleMailSender, new String[]{authUser.getEmailId()}, sbbuilder.toString(), null, subject);
31697 amit.gupta 3441
                }
29488 manish 3442
 
31697 amit.gupta 3443
            }
3444
        }
3445
    }
28775 amit.gupta 3446
 
31697 amit.gupta 3447
    @Autowired
3448
    WarehouseRepository warehouseRepository;
29488 manish 3449
 
33256 amit.gupta 3450
    public void getVendorWarehouses(int warehouseId) throws ProfitMandiBusinessException {
31697 amit.gupta 3451
        LOGGER.info("Warehouses - {}", warehouseRepository.getVendorWarehouses().get(warehouseId));
29488 manish 3452
 
31697 amit.gupta 3453
    }
29488 manish 3454
 
31697 amit.gupta 3455
    public void checkImeiActivation() {
29801 manish 3456
 
31697 amit.gupta 3457
        try {
3458
            vivoImeiActivationService.checkImeiActivation();
3459
        } catch (ProfitMandiBusinessException e) {
3460
            // TODO Auto-generated catch block
3461
            e.printStackTrace();
3462
        } catch (IOException e) {
3463
            // TODO Auto-generated catch block
3464
            e.printStackTrace();
3465
        } catch (Exception e) {
3466
            // TODO Auto-generated catch block
3467
            e.printStackTrace();
3468
        }
29807 manish 3469
 
31697 amit.gupta 3470
    }
29801 manish 3471
 
31697 amit.gupta 3472
    public void checkItelImeiActivation(LocalDate date, Integer day) {
3473
        LOGGER.info("Hello - {}", "hhh");
29488 manish 3474
 
31697 amit.gupta 3475
        try {
3476
            itelImeiActivationService.checkItelImeiActivation(date, day);
3477
        } catch (ProfitMandiBusinessException e) {
3478
            // TODO Auto-generated catch block
3479
            e.printStackTrace();
3480
        } catch (IOException e) {
3481
            // TODO Auto-generated catch block
3482
            e.printStackTrace();
3483
        } catch (Exception e) {
3484
            // TODO Auto-generated catch block
3485
            e.printStackTrace();
3486
        }
29488 manish 3487
 
31697 amit.gupta 3488
    }
29488 manish 3489
 
32482 amit.gupta 3490
    public void selectFinServiceFollowUpDateByCurrDate(LocalDate currentDate) throws
3491
            MessagingException, ProfitMandiBusinessException, IOException {
31697 amit.gupta 3492
        LOGGER.info("selectfinServiceFollow - {}", "selectfinServiceFollowUpDateByCurrDate");
29308 tejbeer 3493
 
31697 amit.gupta 3494
        serviceConfigService.selectFinServicePartnerfollowUpDateByCurrentDate(currentDate);
29252 amit.gupta 3495
 
31697 amit.gupta 3496
    }
29451 manish 3497
 
31697 amit.gupta 3498
    public void checkTecnoImeiActivation(LocalDate date, Integer day) {
3499
        LOGGER.info("Hello - {}", "hhh");
29308 tejbeer 3500
 
31697 amit.gupta 3501
        try {
3502
            tecnoImeiActivation.checkTecnoImeiActivation(date, day);
3503
        } catch (ProfitMandiBusinessException e) {
3504
            // TODO Auto-generated catch block
3505
            e.printStackTrace();
3506
        } catch (IOException e) {
3507
            // TODO Auto-generated catch block
3508
            e.printStackTrace();
3509
        } catch (Exception e) {
3510
            // TODO Auto-generated catch block
3511
            e.printStackTrace();
3512
        }
29308 tejbeer 3513
 
31697 amit.gupta 3514
    }
29441 tejbeer 3515
 
31697 amit.gupta 3516
    public void checkCancellationMargin() throws Exception {
3517
        LocalDateTime startDate = LocalDate.of(2021, 4, 1).atStartOfDay();
3518
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectCancelledBetweenSaleDate(startDate, LocalDateTime.now());
3519
        LOGGER.info("Total Orders =  {}", fofoOrders.size());
3520
        for (FofoOrder fofoOrder : fofoOrders) {
31886 tejbeer 3521
            List<UserWalletHistory> history = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.SCHEME_OUT);
3522
            history.addAll(userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(fofoOrder.getId(), WalletReferenceType.ACTIVATION_SCHEME));
31697 amit.gupta 3523
            int walletSum = history.stream().mapToInt(x -> x.getAmount()).sum();
3524
            if (Math.abs(walletSum) > 1) {
3525
                // LOGGER.info("Cancelled invoice {}, Order Id = {}, = havent rolledback, Value
3526
                // = {}", fofoOrder.getInvoiceNumber(), fofoOrder.getId(), walletSum);
3527
                List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
3528
                List<FofoLineItem> flis = fofoLineItemRepository.selectByFofoOrderItemId(fofoOrderItems.get(0).getId());
3529
                FofoLineItem fli = flis.get(0);
3530
                if (StringUtils.isEmpty(fli.getSerialNumber()))
3531
                    continue;
31886 tejbeer 3532
                List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(fli.getInventoryItemId())));
31697 amit.gupta 3533
                InventoryItem inventoryItem = inventoryItemRepository.selectById(fli.getInventoryItemId());
31886 tejbeer 3534
                double schemeSum = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).mapToDouble(x -> x.getAmount()).sum();
31697 amit.gupta 3535
                /*
3536
                 * if(inventoryItem.getGoodQuantity()==1) {
3537
                 * LOGGER.info("GoodQty, Serial Number {}, InventoryItem = {}, Billed on {}",
3538
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3539
                 * inventoryItem.getUpdateTimestamp()); } else
3540
                 * if(inventoryItem.getBadQuantity()==1){
3541
                 * LOGGER.info("Bad Qty, Serial Number {}, InventoryItem = {}, Billed on {}",
3542
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3543
                 * inventoryItem.getUpdateTimestamp()); } else if
3544
                 * (inventoryItem.getLastScanType().equals(ScanType.SALE)) { LOGGER.
3545
                 * info("Problem Sold, Serial Number {}, InventoryItem = {}, Billed on {}",
3546
                 * inventoryItem.getSerialNumber(), inventoryItem.getId(),
3547
                 * inventoryItem.getUpdateTimestamp()); }
3548
                 */
31886 tejbeer 3549
                if (inventoryItem.getLastScanType().equals(ScanType.SALE) || inventoryItem.getLastScanType().equals(ScanType.SALE_RET)) {
3550
                    Map<String, Double> map = schemeInOuts.stream().collect(
3551
                            groupingBy(
3552
                                    x -> DateTimeFormatter.ofPattern("yyyyMMddHH").format(x.getCreateTimestamp()) + "- " + x.getSchemeId(), Collectors.summingDouble(x -> x.getAmount())));
33452 amit.gupta 3553
                    for (Entry<String, Double> entry : map.entrySet()) {
31697 amit.gupta 3554
                        LOGGER.info("{} = {}", entry.getKey(), entry.getValue());
3555
                    }
31886 tejbeer 3556
                    LOGGER.info("id- {}, imei- {}, lastScan = {}, Scheme sum - {}", inventoryItem.getId(), inventoryItem.getSerialNumber(), inventoryItem.getLastScanType(), schemeSum);
31697 amit.gupta 3557
                }
3558
            }
3559
        }
29441 tejbeer 3560
 
31697 amit.gupta 3561
    }
29308 tejbeer 3562
 
31697 amit.gupta 3563
    public static String readFileAsString(String file) throws Exception {
3564
        String data = "";
3565
        data = new String(Files.readAllBytes(Paths.get(file)));
3566
        return data;
3567
    }
29308 tejbeer 3568
 
31697 amit.gupta 3569
    @Autowired
3570
    private PartnerCollectionRemarkRepository partnerCollectionRemarkRepository;
30421 tejbeer 3571
 
32832 amit.gupta 3572
    //RBM L2 Escalations
32482 amit.gupta 3573
    public void reviewUncontactablePartner() throws
3574
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
30421 tejbeer 3575
 
31697 amit.gupta 3576
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
30421 tejbeer 3577
 
32832 amit.gupta 3578
        List<Integer> partnerLastCollectionRemarkIds = partnerCollectionRemarkRepository.selectMaxRemarkId(new ArrayList<>(customRetailerMap.keySet()));
30859 tejbeer 3579
 
32832 amit.gupta 3580
        if (!partnerLastCollectionRemarkIds.isEmpty()) {
3581
            List<PartnerCollectionRemark> partnerCollectionRemarks = partnerCollectionRemarkRepository.selectByIds(partnerLastCollectionRemarkIds);
30421 tejbeer 3582
 
33064 ranu 3583
            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 3584
            Map<Integer, PartnerCollectionRemark> salesEscalatedRemarksMap = partnerCollectionRemarks.stream().filter(x -> x.getRemark().equals(CollectionRemark.SALES_ESCALATION)).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
30859 tejbeer 3585
 
32832 amit.gupta 3586
 
3587
            if (!rbmEscalatedRemarksMap.isEmpty()) {
3588
                //
33452 amit.gupta 3589
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3590
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3591
                            .map(x -> rbmEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3592
                    String subject = "Partners escalated to RBM-L2";
3593
                    String messageText = this.getMessageForRBMEscalatedPartners(filteredRows);
3594
 
31697 amit.gupta 3595
                    MimeMessage message = mailSender.createMimeMessage();
3596
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3597
                    String[] email = new String[]{storeGuyEntry.getKey()};
30859 tejbeer 3598
 
31697 amit.gupta 3599
                    helper.setSubject(subject);
3600
                    helper.setText(messageText, true);
3601
                    helper.setTo(email);
31886 tejbeer 3602
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
31697 amit.gupta 3603
                    helper.setFrom(senderAddress);
3604
                    mailSender.send(message);
30859 tejbeer 3605
 
31697 amit.gupta 3606
                    LOGGER.info("filteredRows {}", filteredRows);
30859 tejbeer 3607
 
31697 amit.gupta 3608
                }
3609
            }
32832 amit.gupta 3610
            if (!salesEscalatedRemarksMap.isEmpty()) {
3611
                //
34903 ranu 3612
                for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_SALES,ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_RBM), true).entrySet()) {
32832 amit.gupta 3613
                    List<PartnerCollectionRemark> filteredRows = storeGuyEntry.getValue().stream()
3614
                            .map(x -> salesEscalatedRemarksMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
3615
                    String subject = "Partners escalated to Sales";
3616
                    String messageText = this.getMessageForSalesEscalatedPartners(filteredRows);
30936 tejbeer 3617
 
32832 amit.gupta 3618
                    MimeMessage message = mailSender.createMimeMessage();
3619
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3620
                    String[] email = new String[]{storeGuyEntry.getKey()};
3621
 
3622
                    helper.setSubject(subject);
3623
                    helper.setText(messageText, true);
3624
                    helper.setTo(email);
3625
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3626
                    helper.setFrom(senderAddress);
3627
                    mailSender.send(message);
3628
 
3629
                    LOGGER.info("filteredRows {}", filteredRows);
3630
 
3631
                }
3632
            }
3633
 
31697 amit.gupta 3634
        }
3635
    }
30936 tejbeer 3636
 
33078 ranu 3637
 
31697 amit.gupta 3638
    @Autowired
33078 ranu 3639
    private NonSdBuyingRepository nonSdBuyingRepository;
3640
 
3641
    //Non Sd Buying
3642
    public void reviewNonSdBuyingBrand() throws
3643
            ProfitMandiBusinessException, MessagingException, UnsupportedEncodingException {
3644
        List<NonSdBuying> nonSdByuingActiveList = nonSdBuyingRepository.selectAllActiveNonSDBuyingList(true);
3645
        Map<Integer, NonSdBuying> unAuthorizedBuyingMap = nonSdByuingActiveList.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
3646
 
3647
        if (!unAuthorizedBuyingMap.isEmpty()) {
34903 ranu 3648
            for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES,ProfitMandiConstants.TICKET_CATEGORY_ABM), true).entrySet()) {
33078 ranu 3649
                List<NonSdBuying> unAuthorizedfilteredRows = storeGuyEntry.getValue().stream()
3650
                        .map(x -> unAuthorizedBuyingMap.get(x)).filter(x -> x != null).collect(Collectors.toList());
33112 amit.gupta 3651
                if (!unAuthorizedfilteredRows.isEmpty()) {
33078 ranu 3652
                    String subject = "Unauthorized Buying";
3653
                    String messageText = this.getMessageForUnauthorizedBuying(unAuthorizedfilteredRows);
3654
 
3655
                    MimeMessage message = mailSender.createMimeMessage();
3656
                    MimeMessageHelper helper = new MimeMessageHelper(message, true);
3657
                    String[] email = new String[]{storeGuyEntry.getKey()};
3658
 
3659
                    helper.setSubject(subject);
3660
                    helper.setText(messageText, true);
3661
                    helper.setTo(email);
3662
                    InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smartdukaan Alerts");
3663
                    helper.setFrom(senderAddress);
3664
                    mailSender.send(message);
3665
                    LOGGER.info("unAuthorizedfilteredRows {}", unAuthorizedfilteredRows);
3666
                }
3667
 
3668
 
3669
            }
3670
 
3671
        }
3672
    }
3673
 
3674
    @Autowired
31697 amit.gupta 3675
    private LoanRepository loanRepository;
31020 tejbeer 3676
 
31697 amit.gupta 3677
    @Autowired
3678
    private LoanStatementRepository loanStatementRepository;
30859 tejbeer 3679
 
31697 amit.gupta 3680
    @Autowired
3681
    private SDCreditRequirementRepository sdCreditRequirementRepository;
30859 tejbeer 3682
 
31697 amit.gupta 3683
    @Autowired
3684
    private CurrentPartnerDailyInvestmentRepository currentPartnerDailyInvestmentRepository;
30859 tejbeer 3685
 
31697 amit.gupta 3686
    @Autowired
3687
    private TransactionRepository transactionRepository;
30859 tejbeer 3688
 
31697 amit.gupta 3689
    @Autowired
3690
    private SanctionRequestRepository sanctionRequestRepository;
30859 tejbeer 3691
 
31697 amit.gupta 3692
    public void calculateInterestAccured() throws ProfitMandiBusinessException {
34755 amit.gupta 3693
        List<Loan> loans = loanRepository.selectAllActiveLoan();
3694
        //List<Loan> loans = Arrays.asList(loanRepository.selectByLoanId(52669));
30859 tejbeer 3695
 
32724 amit.gupta 3696
        for (Loan loan : loans) {
3697
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
3698
            Map<LoanReferenceType, Double> loanStatusAmount = loanStatements.stream().collect(groupingBy(
3699
                    x -> x.getLoanReferenceType(), Collectors.summingDouble(x -> x.getAmount().doubleValue())));
30936 tejbeer 3700
 
32724 amit.gupta 3701
            int freeDays = loan.getFreeDays();
30936 tejbeer 3702
 
34710 amit.gupta 3703
            LocalDate freeDaysLimitDate = loan.getCreatedOn().plusDays(freeDays).toLocalDate();
30936 tejbeer 3704
 
34710 amit.gupta 3705
            LOGGER.info("Loan id - {}, freeDaysLimitDate {}", loan.getId(), freeDaysLimitDate);
3706
            if (LocalDate.now().isAfter(freeDaysLimitDate)) {
32724 amit.gupta 3707
                int loanStatementId = loanStatementRepository.selectLatestLoanSatement(loan.getFofoId(), loan.getId());
3708
                LOGGER.info("loanStatementId {}", loanStatementId);
3709
                if (loanStatementId != 0) {
3710
                    this.calculateInterest(loan, loanStatusAmount, loanStatementId);
31697 amit.gupta 3711
                } else {
34710 amit.gupta 3712
                    sdCreditService.addInterest(freeDaysLimitDate, LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3713
                }
32724 amit.gupta 3714
            }
31697 amit.gupta 3715
        }
3716
    }
30936 tejbeer 3717
 
31697 amit.gupta 3718
    @Autowired
3719
    FofoPaymentRepository fofoPaymentRepository;
30936 tejbeer 3720
 
31697 amit.gupta 3721
    @Autowired
3722
    CCAvenuePaymentService ccAvenuePaymentService;
30936 tejbeer 3723
 
31697 amit.gupta 3724
    public void settleCCAvePayments() throws Exception {
31886 tejbeer 3725
        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 3726
        for (FofoPayment fofoPayment : fofoPayments) {
3727
            ccAvenuePaymentService.updatePayment(fofoPayment);
3728
        }
3729
    }
30859 tejbeer 3730
 
31697 amit.gupta 3731
    /*
3732
     * public void getCCAvenuePendingOrderStatus(int pendingOrderId) { PendingOrder
3733
     * pendingOrder = pendingOrderRepository.selectById(pendingOrderId);
3734
     * ccAvenuePaymentService.getPaymentStatusMap(pendingOrder); }
3735
     */
30859 tejbeer 3736
 
32482 amit.gupta 3737
    private void calculateInterest(Loan loan, Map<LoanReferenceType, Double> loanStatusAmount,
3738
                                   int loanStatementId) throws ProfitMandiBusinessException {
31697 amit.gupta 3739
        LoanStatement loanStatement = loanStatementRepository.selectById(loanStatementId);
30859 tejbeer 3740
 
31697 amit.gupta 3741
        if (loanStatement.getLoanId() == loan.getId()) {
34710 amit.gupta 3742
            sdCreditService.addInterest(loanStatement.getCreatedAt().toLocalDate().plusDays(1), LocalDate.now(), loan, loanStatusAmount);
31697 amit.gupta 3743
        } else {
3744
            throw new ProfitMandiBusinessException("loanstament", loanStatement.getLoanId(), "Invalid LoanId");
3745
        }
3746
    }
31175 tejbeer 3747
 
31697 amit.gupta 3748
    public void loanSettlement() throws Exception {
34766 amit.gupta 3749
        List<Loan> loans = loanRepository.selectAllActiveLoanForSettlement().stream().filter(x -> x.canBeSettled()).collect(toList());
34275 tejus.loha 3750
        //TODO:Upto here
3751
        if (!loans.isEmpty()) {
31020 tejbeer 3752
 
34275 tejus.loha 3753
            for (Loan loan : loans) {
34710 amit.gupta 3754
                LOGGER.info("Loan - {},  {}", loan.getId(), loan.canBeSettled());
34275 tejus.loha 3755
                double settledAmount = sdCreditService.settleLoan(loan);
30859 tejbeer 3756
 
34275 tejus.loha 3757
                List<SanctionRequest> sanctionRequests = sanctionRequestRepository.selectHoldSanctionByFofoId(loan.getFofoId());
3758
                for (SanctionRequest sanctionRequest : sanctionRequests) {
31175 tejbeer 3759
 
34275 tejus.loha 3760
                    List<Order> orders = orderRepository.selectAllByTransactionId(sanctionRequest.getTransactionId());
3761
                    if (orders.size() == 0) {
3762
                        LOGGER.info("Could not find orders - for Sanction Request {}", sanctionRequest);
3763
                        continue;
3764
                    }
30999 tejbeer 3765
 
34275 tejus.loha 3766
                    if (settledAmount >= sanctionRequest.getPendingAmount().doubleValue()) {
3767
                        settledAmount -= sanctionRequest.getPendingAmount().doubleValue();
3768
                        sanctionRequest.setPendingAmount(BigDecimal.valueOf(0));
3769
                        this.sendUnholdEmail(orders);
3770
                    } else {
3771
                        double pendinAmount = sanctionRequest.getPendingAmount().doubleValue() - settledAmount;
3772
                        System.out.println("Pending Amount - " + pendinAmount);
3773
                        sanctionRequest.setPendingAmount(BigDecimal.valueOf(pendinAmount));
3774
                        break;
33828 ranu 3775
 
34275 tejus.loha 3776
                    }
34162 ranu 3777
 
3778
                }
32439 tejbeer 3779
            }
31020 tejbeer 3780
 
34275 tejus.loha 3781
        }
33664 amit.gupta 3782
 
33828 ranu 3783
 
32439 tejbeer 3784
    }
31020 tejbeer 3785
 
3786
 
32439 tejbeer 3787
    private void sendUnholdEmail(List<Order> orders) throws Exception {
30859 tejbeer 3788
 
3789
 
32439 tejbeer 3790
        orders.forEach(x -> x.setShipmentHold(false));
33452 amit.gupta 3791
        orders = orders.stream().filter(x -> x.getRefundTimestamp() != null).collect(Collectors.toList());
33506 amit.gupta 3792
        if (orders.size() > 0) {
33427 amit.gupta 3793
 
33664 amit.gupta 3794
            double totalAmount = orders.stream().collect(Collectors.summingDouble(x -> x.getTotalAmount()));
30859 tejbeer 3795
 
33506 amit.gupta 3796
            List<String> authUserEmail = csService.getAuthUserIdByPartnerId(orders.get(0).getRetailerId()).stream().map(x -> x.getEmailId()).collect(Collectors.toList());
3797
            authUserEmail.add("vinay.p@smartdukaan.com");
3798
            authUserEmail.add("shivam.gupta@smartdukaan.com");
30859 tejbeer 3799
 
33506 amit.gupta 3800
            String[] emailTo = authUserEmail.toArray(new String[authUserEmail.size()]);
30859 tejbeer 3801
 
33506 amit.gupta 3802
            String[] ccTo = {"tarun.verma@smartdukaan.com", "kamini.sharma@smartdukaan.com"};
30859 tejbeer 3803
 
33664 amit.gupta 3804
            String subject = "Dispatch held orders of - " + (orders.get(0).getRetailerName());
3805
            String message = String.format("Dear Team, \n" + "kindly note the material for the " + orders.get(0).getRetailerName() + "of Rs." + totalAmount + "is unhold now and needs to be dispatched.");
3806
            Utils.sendMailWithAttachments(mailSender, emailTo, ccTo, subject, message);
33506 amit.gupta 3807
        }
30859 tejbeer 3808
 
32439 tejbeer 3809
 
31697 amit.gupta 3810
    }
30859 tejbeer 3811
 
32307 amit.gupta 3812
    public void dailyLoanAlert() throws Exception {
31697 amit.gupta 3813
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30859 tejbeer 3814
 
31697 amit.gupta 3815
        Map<Integer, Double> partnerLoanAmount = new HashMap<>();
30859 tejbeer 3816
 
31697 amit.gupta 3817
        if (!loans.isEmpty()) {
30859 tejbeer 3818
 
31697 amit.gupta 3819
            for (Loan loan : loans) {
30859 tejbeer 3820
 
31697 amit.gupta 3821
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30859 tejbeer 3822
 
31886 tejbeer 3823
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31697 amit.gupta 3824
                if (partnerLoanAmount.get(loan.getFofoId()) != null) {
3825
                    amount += partnerLoanAmount.get(loan.getFofoId());
3826
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3827
                } else {
3828
                    partnerLoanAmount.put(loan.getFofoId(), amount);
3829
                }
30965 tejbeer 3830
 
31697 amit.gupta 3831
            }
30965 tejbeer 3832
 
31697 amit.gupta 3833
        }
30859 tejbeer 3834
 
31697 amit.gupta 3835
        if (!partnerLoanAmount.isEmpty()) {
30965 tejbeer 3836
 
31697 amit.gupta 3837
            for (Entry<Integer, Double> partnerLoanAmountEnrty : partnerLoanAmount.entrySet()) {
30859 tejbeer 3838
 
31697 amit.gupta 3839
                int fofoId = partnerLoanAmountEnrty.getKey();
30859 tejbeer 3840
 
31697 amit.gupta 3841
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(fofoId);
30859 tejbeer 3842
 
31697 amit.gupta 3843
                Address address = addressRepository.selectById(user.getAddressId());
30896 amit.gupta 3844
 
31697 amit.gupta 3845
                String title = "Alert Credit Outstanding!";
3846
                String url = "http://app.smartdukaan.com/pages/home/credit";
34729 amit.gupta 3847
                String message = "Your total outstanding Credit Balance is Rs." + FormattingUtils.formatDecimal(Math.abs(partnerLoanAmountEnrty.getValue())) + ".";
31697 amit.gupta 3848
                notificationService.sendNotification(fofoId, title, MessageType.notification, title, message, url);
30913 tejbeer 3849
 
32841 amit.gupta 3850
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30913 tejbeer 3851
 
31697 amit.gupta 3852
            }
30917 tejbeer 3853
 
31697 amit.gupta 3854
        }
30917 tejbeer 3855
 
31697 amit.gupta 3856
    }
30920 tejbeer 3857
 
31697 amit.gupta 3858
    public void processActivatedImeisForSchemes() throws ProfitMandiBusinessException {
3859
        schemeService.processActivatedImeisForSchemes();
3860
    }
30920 tejbeer 3861
 
33112 amit.gupta 3862
    @Autowired
33355 amit.gupta 3863
    SidbiService sidbiService;
33112 amit.gupta 3864
 
33364 amit.gupta 3865
    public void processSidbiDeductions() throws ProfitMandiBusinessException {
33434 amit.gupta 3866
        //sidbiService.migrateSanctions();
33355 amit.gupta 3867
        sidbiService.processDeductions();
3868
    }
35326 amit 3869
    public void updatePartnerLimit(int fofoId) throws ProfitMandiBusinessException {
3870
        LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
33355 amit.gupta 3871
 
35326 amit 3872
        CreditAccount creditAccount = creditAccountRepository.selectByFofoIdAndGateway(fofoId, Gateway.SDDIRECT);
35393 amit 3873
        BigDecimal utilizationAmount = sdCreditService.getUtilizationAmount(fofoId);
35326 amit 3874
        PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 0);
3875
        BigDecimal suggestedAmount = this.getSuggestedAmount(creditAccount, partnerDailyInvestment, utilizationAmount, null);
3876
        SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(fofoId);
3877
 
3878
        LOGGER.info("suggestedAmount {} ", suggestedAmount);
3879
 
3880
        if (sdCreditRequirement == null) {
3881
            sdCreditRequirement = new SDCreditRequirement();
3882
            sdCreditRequirement.setFofoId(fofoId);
3883
            sdCreditRequirement.setCreditDays(15);
3884
            sdCreditRequirement.setInterestRate(ProfitMandiConstants.NEW_INTEREST_RATE);
3885
            sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3886
            sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3887
            sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3888
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3889
            sdCreditRequirementRepository.persist(sdCreditRequirement);
3890
        }
3891
 
3892
        CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
3893
 
3894
        sdCreditRequirement.setRisk(creditRisk);
3895
        LOGGER.info("Suggested Amount - {}", suggestedAmount);
3896
        sdCreditRequirement.setSuggestedLimit(suggestedAmount);
3897
        if (!sdCreditRequirement.isHardLimit()) {
3898
            sdCreditRequirement.setLimit(suggestedAmount);
3899
        }
35393 amit 3900
        BigDecimal utilizedLimit = sdCreditService.getUtilizationAmount(fofoId);
35326 amit 3901
 
3902
        BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
3903
 
3904
        LOGGER.info("utilizedLimit {} ", utilizedLimit);
3905
 
3906
        LOGGER.info("availableLimit {} ", availableLimit);
3907
 
3908
        sdCreditRequirement.setUtilizedAmount(utilizedLimit);
3909
 
3910
        sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3911
 
3912
        if (creditAccount != null) {
3913
 
3914
            creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3915
            creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3916
            creditAccount.setAvailableAmount(availableLimit.floatValue());
3917
            creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3918
            creditAccount.setUpdatedOn(LocalDateTime.now());
3919
        }
3920
 
3921
    }
31697 amit.gupta 3922
    public void updatePartnerLimit() throws ProfitMandiBusinessException {
3923
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(true);
33355 amit.gupta 3924
        Map<Integer, BigDecimal> fofoSidbiLimitMap = sidbiService.getSuggestedLimitMap();
31886 tejbeer 3925
        Map<Integer, SDCreditRequirement> sdCreditRequirementMap = sdCreditRequirementRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
33159 amit.gupta 3926
        Map<Integer, CreditAccount> creditAccountMap = creditAccountRepository.selectAllByGateways(Arrays.asList(Gateway.SIDBI, Gateway.SDDIRECT))
33112 amit.gupta 3927
                .stream().filter(x -> x.isActive()).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31697 amit.gupta 3928
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailerMap.entrySet()) {
3929
            int fofoId = customRetailerEntry.getKey();
3930
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
33287 amit.gupta 3931
 
33112 amit.gupta 3932
            CreditAccount creditAccount = creditAccountMap.get(fofoId);
35393 amit 3933
            BigDecimal utilizationAmount = sdCreditService.getUtilizationAmount(fofoId);
35177 amit 3934
            PartnerDailyInvestment partnerDailyInvestment = partnerInvestmentService.getInvestment(fofoId, 0);
3935
            BigDecimal suggestedAmount = this.getSuggestedAmount(creditAccount, partnerDailyInvestment, utilizationAmount, fofoSidbiLimitMap.get(fofoId));
33112 amit.gupta 3936
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementMap.get(fofoId);
30929 tejbeer 3937
 
31697 amit.gupta 3938
            LOGGER.info("suggestedAmount {} ", suggestedAmount);
30913 tejbeer 3939
 
31697 amit.gupta 3940
            if (sdCreditRequirement == null) {
3941
                sdCreditRequirement = new SDCreditRequirement();
3942
                sdCreditRequirement.setFofoId(fofoId);
3943
                sdCreditRequirement.setCreditDays(15);
33452 amit.gupta 3944
                sdCreditRequirement.setInterestRate(ProfitMandiConstants.NEW_INTEREST_RATE);
31697 amit.gupta 3945
                sdCreditRequirement.setRisk(CreditRisk.HIGH_RISK);
3946
                sdCreditRequirement.setUtilizedAmount(BigDecimal.ZERO);
3947
                sdCreditRequirement.setCreateTimestamp(LocalDateTime.now());
3948
                sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
3949
                sdCreditRequirementRepository.persist(sdCreditRequirement);
3950
            }
30913 tejbeer 3951
 
31697 amit.gupta 3952
            CreditRisk creditRisk = sdCreditService.getCurrentRisk(sdCreditRequirement, firstBillingDate);
30913 tejbeer 3953
 
31697 amit.gupta 3954
            sdCreditRequirement.setRisk(creditRisk);
30913 tejbeer 3955
 
33874 ranu 3956
            sdCreditRequirement.setSuggestedLimit(suggestedAmount);
34275 tejus.loha 3957
            if (!sdCreditRequirement.isHardLimit()) {
34122 ranu 3958
                sdCreditRequirement.setLimit(suggestedAmount);
3959
            }
35393 amit 3960
            BigDecimal utilizedLimit = sdCreditService.getUtilizationAmount(fofoId);
30934 tejbeer 3961
 
31697 amit.gupta 3962
            BigDecimal availableLimit = sdCreditRequirement.getLimit().subtract(utilizedLimit);
30934 tejbeer 3963
 
31697 amit.gupta 3964
            LOGGER.info("utilizedLimit {} ", utilizedLimit);
30913 tejbeer 3965
 
31697 amit.gupta 3966
            LOGGER.info("availableLimit {} ", availableLimit);
30913 tejbeer 3967
 
31697 amit.gupta 3968
            sdCreditRequirement.setUtilizedAmount(utilizedLimit);
30929 tejbeer 3969
 
31697 amit.gupta 3970
            sdCreditRequirement.setUpdateTimestamp(LocalDateTime.now());
30929 tejbeer 3971
 
31697 amit.gupta 3972
            if (creditAccount != null) {
30929 tejbeer 3973
 
31697 amit.gupta 3974
                creditAccount.setInterestRate(sdCreditRequirement.getInterestRate().floatValue());
3975
                creditAccount.setSanctionedAmount(sdCreditRequirement.getLimit().floatValue());
3976
                creditAccount.setAvailableAmount(availableLimit.floatValue());
3977
                creditAccount.setFreeDays(sdCreditRequirement.getFreeDays());
3978
                creditAccount.setUpdatedOn(LocalDateTime.now());
3979
            }
30929 tejbeer 3980
 
31697 amit.gupta 3981
        }
31177 tejbeer 3982
 
31697 amit.gupta 3983
    }
34502 amit.gupta 3984
 
34374 amit.gupta 3985
    private static final NavigableMap<Double, Double> discountMap = new TreeMap<>();
34502 amit.gupta 3986
 
34374 amit.gupta 3987
    static {
34852 amit 3988
        discountMap.put(4 * ProfitMandiConstants.ONE_LAC - 1, 0.2);    // Up to 3,99,999 -> 20%
3989
        discountMap.put(10 * ProfitMandiConstants.ONE_LAC - 1, 0.25);  // 4,00,000 to 9,99,999 -> 25%
3990
        discountMap.put(20 * ProfitMandiConstants.ONE_LAC - 1, 0.3);   // 10,00,000 to 19,99,999 -> 30%
3991
        discountMap.put(Double.MAX_VALUE, 0.4);                        // 20,00,000 and above -> 40%
34374 amit.gupta 3992
    }
34502 amit.gupta 3993
 
3994
    public BigDecimal getSuggestedLimit(double investmentValue) {
34374 amit.gupta 3995
        double percentageValue = discountMap.ceilingEntry(investmentValue).getValue();
34510 amit.gupta 3996
        return this.getSuggestedAmount(investmentValue, percentageValue);
3997
 
3998
    }
3999
 
4000
    private BigDecimal getSuggestedAmount(double investmentValue, double percentageValue) {
34374 amit.gupta 4001
        return BigDecimal.valueOf(investmentValue * percentageValue);
4002
    }
34502 amit.gupta 4003
 
35299 amit 4004
    /*private static List<Integer> hundredPercentLimitPartnerIds = Arrays.asList(175139630,
34510 amit.gupta 4005
            175139815,
4006
            175139844,
4007
            175140101
35299 amit 4008
    );*/
34510 amit.gupta 4009
 
35299 amit 4010
    private static List<Integer> hundredPercentLimitPartnerIds = Arrays.asList();
4011
 
35177 amit 4012
    private BigDecimal getSuggestedAmount(CreditAccount creditAccount, PartnerDailyInvestment
35393 amit 4013
            partnerDailyInvestment, BigDecimal utilizationAmount, BigDecimal sidbiLimit) {
33112 amit.gupta 4014
        BigDecimal suggestedAmount = BigDecimal.ZERO;
35393 amit 4015
        double utilization = utilizationAmount != null ? utilizationAmount.doubleValue() : 0;
33112 amit.gupta 4016
        //1 LAC
33295 amit.gupta 4017
        if (creditAccount == null || creditAccount.getGateway().equals(Gateway.SDDIRECT)) {
33112 amit.gupta 4018
 
35177 amit 4019
            if (partnerDailyInvestment != null) {
4020
                if (hundredPercentLimitPartnerIds.contains(partnerDailyInvestment.getFofoId())) {
35393 amit 4021
                    suggestedAmount = getSuggestedAmount(partnerDailyInvestment.getTotalInvestment() - utilization, 1);
34512 amit.gupta 4022
                    suggestedAmount = suggestedAmount.min(BigDecimal.valueOf(1500000));
34510 amit.gupta 4023
                } else {
35393 amit 4024
                    suggestedAmount = getSuggestedLimit(partnerDailyInvestment.getTotalInvestment() - utilization);
34510 amit.gupta 4025
                }
33112 amit.gupta 4026
            }
4027
            if (suggestedAmount.doubleValue() < 0) {
4028
                suggestedAmount = BigDecimal.ZERO;
4029
            }
33355 amit.gupta 4030
        } else if (creditAccount.getGateway().equals(Gateway.SIDBI) && sidbiLimit != null) {
35393 amit 4031
            suggestedAmount = getSuggestedLimit(partnerDailyInvestment.getTotalInvestment() - utilization);
34993 ranu 4032
            suggestedAmount = suggestedAmount.max(sidbiLimit);
4033
 
4034
 
33112 amit.gupta 4035
        }
4036
        return suggestedAmount;
4037
    }
4038
 
31697 amit.gupta 4039
    public void notifyDefaultLoans() throws ProfitMandiBusinessException, MessagingException, IOException {
30929 tejbeer 4040
 
31697 amit.gupta 4041
        sdCreditService.updateRisk();
34729 amit.gupta 4042
        List<Loan> defaultLoans = sdCreditService.getDefaultLoans();
31697 amit.gupta 4043
        if (!defaultLoans.isEmpty()) {
4044
            this.sendDefaultLoanAlert(defaultLoans);
4045
        }
30929 tejbeer 4046
 
31697 amit.gupta 4047
    }
30929 tejbeer 4048
 
32482 amit.gupta 4049
    public void sendDefaultLoanAlert(List<Loan> defaultLoans) throws
4050
            ProfitMandiBusinessException, MessagingException, IOException {
31697 amit.gupta 4051
        String subject = "Default Partners";
30931 tejbeer 4052
 
34903 ranu 4053
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES,ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
30929 tejbeer 4054
 
33452 amit.gupta 4055
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
31697 amit.gupta 4056
            List<Loan> filteredRows = new ArrayList<>();
4057
            for (Loan loan : defaultLoans) {
30929 tejbeer 4058
 
31697 amit.gupta 4059
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30929 tejbeer 4060
 
31697 amit.gupta 4061
                    filteredRows.add(loan);
4062
                }
4063
            }
4064
            if (!filteredRows.isEmpty()) {
33628 tejus.loha 4065
                String[] email = new String[]{storeGuyEntry.getKey()};
31697 amit.gupta 4066
                String messageText = this.getMessageForDueDateExtend(filteredRows);
32350 amit.gupta 4067
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, subject);
30982 tejbeer 4068
 
31697 amit.gupta 4069
            }
30936 tejbeer 4070
 
31697 amit.gupta 4071
        }
33628 tejus.loha 4072
        String messageText = this.getMessageForDueDateExtend(defaultLoans);
34858 amit 4073
        this.sendMailOfHtmlFormat(googleMailSender, new String[]{"puneet.wahi@smartdukaan.com", "rahul.latwal@smartdukaan.com", "dilbag.singh@smartdukaan.com"}, messageText, null, subject);
30982 tejbeer 4074
 
31697 amit.gupta 4075
        for (Loan defaultLoan : defaultLoans) {
4076
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
30929 tejbeer 4077
 
31886 tejbeer 4078
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4079
 
31697 amit.gupta 4080
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
30936 tejbeer 4081
 
31697 amit.gupta 4082
            Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4083
 
34729 amit.gupta 4084
            String title = "Outstanding Credit Payment Overdue!";
31697 amit.gupta 4085
            String url = "http://app.smartdukaan.com/pages/home/credit";
34731 amit.gupta 4086
            String message = "Your Outstanding Credit payment due date " + defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + " has been exceeded. Please note " + ProfitMandiConstants.NEW_DELAYED_INTEREST_RATE + " shall be levied on daily basis." + " Your total pending Loan amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + ". !!Pay Now!!";
31886 tejbeer 4087
            notificationService.sendNotification(defaultLoan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4088
 
31697 amit.gupta 4089
            // notificationService.sendWhatsappMessage(message, title,
4090
            // address.getPhoneNumber());
30929 tejbeer 4091
 
31697 amit.gupta 4092
        }
4093
    }
30929 tejbeer 4094
 
31697 amit.gupta 4095
    private String getMessageForDueDateExtend(List<Loan> loans) throws ProfitMandiBusinessException {
33553 ranu 4096
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
4097
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
4098
        List<AST> asts = astRepository.selectAll();
4099
        Map<Integer, AST> astMap = asts.stream()
4100
                .collect(Collectors.toMap(AST::getId, ast -> ast));
31697 amit.gupta 4101
        StringBuilder sb = new StringBuilder();
4102
        sb.append(
33553 ranu 4103
                "<html><body><p>Alert</p><p>Default Partners :-</p>" + "<br/><p>EveryDay Rs.100 charged as Penalty</p>" + "<br/>" +
4104
                        "<table style='border:1px solid black ;padding: 5px';>");
4105
        sb.append("<tbody>\n" +
4106
                "<tr>\n" +
4107
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
33555 ranu 4108
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
4109
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
4110
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33553 ranu 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" +
33664 amit.gupta 4113
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 4114
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33553 ranu 4115
                "<th style='border:1px solid black;padding: 5px'>RBM L1</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" +
4118
                "</tr>");
31697 amit.gupta 4119
        for (Loan entry : loans) {
30929 tejbeer 4120
 
31697 amit.gupta 4121
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
30929 tejbeer 4122
 
31886 tejbeer 4123
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30929 tejbeer 4124
 
31697 amit.gupta 4125
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
30929 tejbeer 4126
 
31697 amit.gupta 4127
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
30929 tejbeer 4128
 
31697 amit.gupta 4129
            sb.append("<tr>");
31886 tejbeer 4130
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33555 ranu 4131
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
4132
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4133
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
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>");
33553 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>");
31397 tejbeer 4141
 
33555 ranu 4142
 
31697 amit.gupta 4143
            sb.append("</tr>");
31397 tejbeer 4144
 
31697 amit.gupta 4145
        }
31397 tejbeer 4146
 
31697 amit.gupta 4147
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4148
 
31697 amit.gupta 4149
        return sb.toString();
4150
    }
31397 tejbeer 4151
 
35111 ranu 4152
    private String getMessageForDueDateCross(List<Loan> dueDateCrossLoans) throws ProfitMandiBusinessException {
33161 ranu 4153
        Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
33452 amit.gupta 4154
        Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
33553 ranu 4155
        List<AST> asts = astRepository.selectAll();
4156
        Map<Integer, AST> astMap = asts.stream()
4157
                .collect(Collectors.toMap(AST::getId, ast -> ast));
4158
 
31697 amit.gupta 4159
        StringBuilder sb = new StringBuilder();
35110 ranu 4160
        sb.append("<html><body><p>Alert</p><p>Partner Credit Report :-</p>" + "<br/><p>Additional penal interest of  shall be levied on daily basis.</p>" + "<br/>" +
33161 ranu 4161
                "<table style='border:1px solid black ;padding: 5px';>");
4162
        sb.append("<tbody>\n" + "<tr>\n" +
33256 amit.gupta 4163
                "<th style='border:1px solid black;padding: 5px'>PartnerName</th>\n" +
4164
                "<th style='border:1px solid black;padding: 5px'>State Name</th>\n" +
33555 ranu 4165
                "<th style='border:1px solid black;padding: 5px'>Area</th>\n" +
33553 ranu 4166
                "<th style='border:1px solid black;padding: 5px'>Territory</th>\n" +
33256 amit.gupta 4167
                "<th style='border:1px solid black;padding: 5px'>due date</th>\n" +
4168
                "<th style='border:1px solid black;padding: 5px'>Days</th>\n" +
4169
                "<th style='border:1px solid black;padding: 5px'>Pending Amount</th>\n" +
33810 ranu 4170
                "<th style='border:1px solid black;padding: 5px'>RBM L2</th>\n" +
33256 amit.gupta 4171
                "<th style='border:1px solid black;padding: 5px'>RBM L1</th>\n" +
4172
                "<th style='border:1px solid black;padding: 5px'>Sales L1</th>\n" +
4173
                "<th style='border:1px solid black;padding: 5px'>Sales L2</th>\n" +
35107 ranu 4174
                "<th style='border:1px solid black;padding: 5px'>Limit Assigned</th>\n" +
33161 ranu 4175
                "</tr>");
31397 tejbeer 4176
 
35111 ranu 4177
        for (Loan entry : dueDateCrossLoans) {
4178
            DecimalFormat df = new DecimalFormat("#.##");
31397 tejbeer 4179
 
31697 amit.gupta 4180
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
31397 tejbeer 4181
 
31886 tejbeer 4182
            double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
31397 tejbeer 4183
 
31697 amit.gupta 4184
            long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
31397 tejbeer 4185
 
31697 amit.gupta 4186
            CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
31397 tejbeer 4187
 
35106 ranu 4188
            SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(customRetailer.getPartnerId());
4189
 
31697 amit.gupta 4190
            sb.append("<tr>");
31886 tejbeer 4191
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")" + "</td>");
33162 ranu 4192
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customRetailer.getAddress().getState() + "</td>");
33553 ranu 4193
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getArea() + "</td>");
4194
            sb.append("<td style='border:1px solid black;padding: 5px'>" + astMap.get(customRetailer.getAstId()).getTerritory() + "</td>");
30936 tejbeer 4195
 
31886 tejbeer 4196
            sb.append("<td style='border:1px solid black;padding: 5px'>" + entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")) + "</td>");
31697 amit.gupta 4197
            sb.append("<td style='border:1px solid black;padding: 5px'>" + noOfdaysBetween + "</td>");
31886 tejbeer 4198
            sb.append("<td style='border:1px solid black;padding: 5px'>" + new DecimalFormat("#.##").format(Math.abs(amount)) + "</td>");
33161 ranu 4199
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager() + "</td>");
4200
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager() + "</td>");
4201
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager() + "</td>");
4202
            sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager() + "</td>");
35111 ranu 4203
            sb.append("<td style='border:1px solid black;padding: 5px'>" + df.format(sdCreditRequirement.getLimit())  + "</td>");
31697 amit.gupta 4204
            sb.append("</tr>");
4205
        }
31397 tejbeer 4206
 
31697 amit.gupta 4207
        sb.append("</tbody></table></body></html>");
31397 tejbeer 4208
 
31697 amit.gupta 4209
        return sb.toString();
4210
    }
31397 tejbeer 4211
 
32307 amit.gupta 4212
    public void notifyLoanDueDateCross() throws Exception {
31397 tejbeer 4213
 
35111 ranu 4214
        List<Loan> dueDateCrossLoans = sdCreditService.getDueDateCrossLoan();
4215
        List<Loan> allActiveLoans = sdCreditService.getAllActiveLoan();
31697 amit.gupta 4216
        if (!dueDateCrossLoans.isEmpty()) {
35111 ranu 4217
            this.sendDueDateCrossLoanAlert(dueDateCrossLoans,allActiveLoans);
31697 amit.gupta 4218
        }
31397 tejbeer 4219
 
31697 amit.gupta 4220
    }
31397 tejbeer 4221
 
35111 ranu 4222
    private void sendDueDateCrossLoanAlert(List<Loan> dueDateCrossLoans,List<Loan> allActiveLoans) throws Exception {
34903 ranu 4223
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES,ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
31397 tejbeer 4224
 
35115 ranu 4225
        for (Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
33631 tejus.loha 4226
            List<Loan> filteredRows = new ArrayList<>();
31697 amit.gupta 4227
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4228
 
31697 amit.gupta 4229
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
30982 tejbeer 4230
 
31697 amit.gupta 4231
                    filteredRows.add(loan);
4232
                }
4233
            }
35111 ranu 4234
 
35112 ranu 4235
            List<Loan> filteredAllActiveLoans = new ArrayList<>();
35111 ranu 4236
            for (Loan loan : allActiveLoans) {
4237
 
4238
                if (storeGuyEntry.getValue().contains(loan.getFofoId())) {
4239
 
35112 ranu 4240
                    filteredAllActiveLoans.add(loan);
35111 ranu 4241
                }
4242
            }
4243
 
35112 ranu 4244
            ByteArrayOutputStream byteArrayOutputStream = null;
4245
            Utils.Attachment attachment1 = null;
4246
            if(!filteredAllActiveLoans.isEmpty()){
4247
                 byteArrayOutputStream = this.generateLoanCsv(filteredAllActiveLoans);
4248
                 attachment1 = new Utils.Attachment("partnner-credit.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
35111 ranu 4249
 
4250
            }
4251
 
4252
 
4253
 
31697 amit.gupta 4254
            if (!filteredRows.isEmpty()) {
4255
                String messageText = this.getMessageForDueDateCross(filteredRows);
33628 tejus.loha 4256
                String[] email = new String[]{storeGuyEntry.getKey()};
30982 tejbeer 4257
 
35112 ranu 4258
                if(attachment1 != null){
4259
                    Utils.sendMailWithAttachments(googleMailSender, email, null, null, "Partner Credit Report", messageText, true, attachment1);
4260
                }else {
4261
                this.sendMailOfHtmlFormat(googleMailSender, email, messageText, null, "Due Date Cross");
30936 tejbeer 4262
 
31697 amit.gupta 4263
            }
30936 tejbeer 4264
 
35115 ranu 4265
        }
35113 ranu 4266
 
35132 amit 4267
        }
4268
 
35113 ranu 4269
        String messageText = this.getMessageForDueDateCross(dueDateCrossLoans);
4270
        ByteArrayOutputStream byteArrayOutputStream = this.generateLoanCsv(allActiveLoans);
4271
        Utils.Attachment attachment = null;
4272
        if(byteArrayOutputStream != null){
4273
            attachment  = new Utils.Attachment("partnner-credit.csv", new ByteArrayResource(byteArrayOutputStream.toByteArray()));
4274
 
31697 amit.gupta 4275
        }
33628 tejus.loha 4276
 
35113 ranu 4277
        if(attachment != null){
35115 ranu 4278
            Utils.sendMailWithAttachments(googleMailSender, new String[]{"sdtech@smartdukaan.com"}, null, null, "Partner Credit Report", messageText, true, attachment);
35113 ranu 4279
        }else {
35115 ranu 4280
            this.sendMailOfHtmlFormat(googleMailSender, new String[]{"sdtech@smartdukaan.com"}, messageText, null, "Due Date Cross");
35113 ranu 4281
        }
33628 tejus.loha 4282
 
35111 ranu 4283
 
31697 amit.gupta 4284
        if (!dueDateCrossLoans.isEmpty()) {
4285
            for (Loan loan : dueDateCrossLoans) {
30936 tejbeer 4286
 
31697 amit.gupta 4287
                long noOfdaysBetween = ChronoUnit.DAYS.between(loan.getDueDate().toLocalDate(), LocalDate.now());
30989 tejbeer 4288
 
31697 amit.gupta 4289
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30989 tejbeer 4290
 
31697 amit.gupta 4291
                Address address = addressRepository.selectById(user.getAddressId());
30982 tejbeer 4292
 
31697 amit.gupta 4293
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4294
 
31697 amit.gupta 4295
                List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
30936 tejbeer 4296
 
31886 tejbeer 4297
                double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4298
 
31697 amit.gupta 4299
                String url = "http://app.smartdukaan.com/pages/home/credit";
30936 tejbeer 4300
 
31697 amit.gupta 4301
                String title = "Alert!";
34729 amit.gupta 4302
                String message = "Your Outstanding Credit Payment 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 4303
 
31886 tejbeer 4304
                notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
30936 tejbeer 4305
 
32841 amit.gupta 4306
                //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4307
 
31697 amit.gupta 4308
            }
4309
        }
30982 tejbeer 4310
 
31697 amit.gupta 4311
    }
30936 tejbeer 4312
 
35112 ranu 4313
    private ByteArrayOutputStream generateLoanCsv(List<Loan> loans) throws ProfitMandiBusinessException {
4314
        org.apache.commons.io.output.ByteArrayOutputStream byteArrayOutputStream = null;
4315
 
4316
 
4317
        if (!loans.isEmpty()) {
4318
            Map<Integer, com.spice.profitmandi.dao.model.FofoReportingModel> fofoReportingModelMap = csService.getPartnerIdSalesHeaders();
4319
            Map<Integer, FofoRBMReportingModel> fofoRbmReportingModelMap = csService.getPartnerIdRBMHeaders();
4320
            List<AST> asts = astRepository.selectAll();
4321
            Map<Integer, AST> astMap = asts.stream()
4322
                    .collect(Collectors.toMap(AST::getId, ast -> ast));
4323
            try {
4324
                List<String> headers = Arrays.asList(
4325
                        "PartnerName", "State Name", "Area", "Territory",
4326
                        "Due Date", "Days", "Pending Amount",
4327
                        "RBM L2", "RBM L1", "Sales L1", "Sales L2", "Limit Assigned"
4328
                );
4329
 
4330
                List<List<?>> rows = new ArrayList<>();
4331
 
4332
                for (Loan entry : loans) {
4333
 
4334
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(entry.getId());
4335
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
4336
 
35114 ranu 4337
//                    long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getDueDate().toLocalDate(), LocalDateTime.now());
4338
                    long noOfdaysBetween = ChronoUnit.DAYS.between(entry.getCreatedOn().toLocalDate(), LocalDateTime.now());
35112 ranu 4339
 
4340
                    CustomRetailer customRetailer = retailerService.getFofoRetailer(entry.getFofoId());
4341
                    SDCreditRequirement sdCreditRequirement = sdCreditRequirementRepository.selectByFofoId(customRetailer.getPartnerId());
4342
                    DecimalFormat df = new DecimalFormat("#.##");
4343
                    List<String> row = Arrays.asList(
4344
                            customRetailer.getBusinessName() + "(" + customRetailer.getCode() + ")",
4345
                            customRetailer.getAddress().getState(),
4346
                            astMap.get(customRetailer.getAstId()).getArea(),
4347
                            astMap.get(customRetailer.getAstId()).getTerritory(),
4348
                            entry.getDueDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")),
4349
                            String.valueOf(noOfdaysBetween),
4350
                            df.format(Math.abs(amount)),
4351
                            fofoRbmReportingModelMap.get(entry.getFofoId()).getL1Manager(),
4352
                            fofoRbmReportingModelMap.get(entry.getFofoId()).getL2Manager(),
4353
                            fofoReportingModelMap.get(entry.getFofoId()).getTerritoryManager(),
4354
                            fofoReportingModelMap.get(entry.getFofoId()).getRegionalManager(),
4355
                            df.format(sdCreditRequirement.getLimit())
4356
                    );
4357
 
4358
                    rows.add(row);
4359
                }
4360
 
4361
                byteArrayOutputStream = FileUtil.getCSVByteStream(headers, rows);
4362
 
4363
 
4364
            } catch (Exception e) {
4365
                throw new RuntimeException(e);
4366
            }
4367
 
4368
        }
4369
        return byteArrayOutputStream;
4370
    }
4371
 
4372
 
32307 amit.gupta 4373
    public void alertForDueDate() throws Exception {
30936 tejbeer 4374
 
31697 amit.gupta 4375
        List<Loan> loans = loanRepository.selectAllActiveLoan();
30936 tejbeer 4376
 
31697 amit.gupta 4377
        if (!loans.isEmpty()) {
4378
            for (Loan loan : loans) {
30936 tejbeer 4379
 
31697 amit.gupta 4380
                com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(loan.getFofoId());
30936 tejbeer 4381
 
31697 amit.gupta 4382
                Address address = addressRepository.selectById(user.getAddressId());
30936 tejbeer 4383
 
31697 amit.gupta 4384
                long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), loan.getDueDate().toLocalDate());
30936 tejbeer 4385
 
31697 amit.gupta 4386
                LOGGER.info("noOfdaysBetween {} ", noOfdaysBetween);
30982 tejbeer 4387
 
31697 amit.gupta 4388
                if (noOfdaysBetween <= 4 && noOfdaysBetween >= 0) {
4389
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(loan.getId());
31886 tejbeer 4390
                    double amount = loanStatements.stream().map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x.doubleValue()));
30936 tejbeer 4391
 
31697 amit.gupta 4392
                    String title = "Alert!";
4393
                    String url = "http://app.smartdukaan.com/pages/home/credit";
4394
                    String message = null;
4395
                    if (noOfdaysBetween == 0) {
30936 tejbeer 4396
 
34729 amit.gupta 4397
                        message = "Your total outstanding Credit amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due for Today, Pay Now!!";
30982 tejbeer 4398
 
31697 amit.gupta 4399
                    } else {
30982 tejbeer 4400
 
34729 amit.gupta 4401
                        message = "Your total outstanding Credit amount is Rs." + FormattingUtils.formatDecimal(Math.abs(amount)) + " is due by " + loan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + " , Pay Now!!";
30982 tejbeer 4402
 
31697 amit.gupta 4403
                    }
31886 tejbeer 4404
                    notificationService.sendNotification(loan.getFofoId(), title, MessageType.notification, title, message, url);
32841 amit.gupta 4405
                    //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
30982 tejbeer 4406
 
31697 amit.gupta 4407
                }
4408
            }
4409
        }
30984 tejbeer 4410
 
31697 amit.gupta 4411
    }
30982 tejbeer 4412
 
32307 amit.gupta 4413
    public void userMobileNumberOptIn() throws Exception {
30982 tejbeer 4414
 
31697 amit.gupta 4415
        List<FofoStore> fofoStores = fofoStoreRepository.selectActiveStores();
30982 tejbeer 4416
 
31886 tejbeer 4417
        List<com.spice.profitmandi.dao.entity.user.User> users = userUserRepository.selectByIds(fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList()));
30982 tejbeer 4418
 
31886 tejbeer 4419
        List<Address> addresses = addressRepository.selectByIds(users.stream().map(x -> x.getAddressId()).collect(Collectors.toList()));
30982 tejbeer 4420
 
31697 amit.gupta 4421
        LOGGER.info("addresses" + addresses);
30984 tejbeer 4422
 
31697 amit.gupta 4423
        for (Address address : addresses) {
32307 amit.gupta 4424
            notificationService.optIn(address.getPhoneNumber());
30982 tejbeer 4425
 
31697 amit.gupta 4426
        }
30982 tejbeer 4427
 
31697 amit.gupta 4428
    }
30982 tejbeer 4429
 
31697 amit.gupta 4430
    public void authUserMobileNumberOptIn() throws HttpHostConnectException, ProfitMandiBusinessException {
31206 tejbeer 4431
 
31697 amit.gupta 4432
        List<AuthUser> authUsers = authRepository.selectAllActiveUser();
4433
        LOGGER.info("authUsers" + authUsers);
31206 tejbeer 4434
 
31697 amit.gupta 4435
        for (AuthUser authUser : authUsers) {
4436
            Map<String, String> requestheaders = new HashMap<>();
4437
            requestheaders.put("Content-Type", "application/x-www-form-urlencoded");
4438
            Map<String, String> requestParams = new HashMap<>();
4439
            requestParams.put("userid", String.valueOf(2000215976));
4440
            requestParams.put("password", "MFRd!BBL");
4441
            requestParams.put("phone_number", authUser.getMobileNumber());
4442
            requestParams.put("auth_scheme", "plain");
4443
            requestParams.put("v", "1.1");
4444
            requestParams.put("format", "json");
31206 tejbeer 4445
 
31697 amit.gupta 4446
            requestParams.put("method", "OPT_IN");
31206 tejbeer 4447
 
31697 amit.gupta 4448
            requestParams.put("channel", "WHATSAPP");
31886 tejbeer 4449
            String response = restClient.get("https://media.smsgupshup.com/GatewayAPI/rest", requestParams, requestheaders);
31697 amit.gupta 4450
            LOGGER.info("response" + response);
4451
        }
31206 tejbeer 4452
 
31697 amit.gupta 4453
    }
31206 tejbeer 4454
 
31697 amit.gupta 4455
    @Autowired
4456
    private HygieneDataRepository hygieneDataRepository;
31209 tejbeer 4457
 
31697 amit.gupta 4458
    public void hygineAlertForPartner() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4459
 
31697 amit.gupta 4460
        List<String> remarks = new ArrayList<>();
4461
        remarks.add("Out of Service");
4462
        remarks.add("Duplicate number");
4463
        remarks.add("Partner number");
31886 tejbeer 4464
        List<HygieneData> hygieneData = hygieneDataRepository.selectAllByDisposedDateAndRemark(LocalDate.now(), remarks);
31206 tejbeer 4465
 
31697 amit.gupta 4466
        if (!hygieneData.isEmpty()) {
31206 tejbeer 4467
 
31886 tejbeer 4468
            Map<Integer, List<HygieneData>> partnerHygieneDataMap = hygieneData.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4469
 
31697 amit.gupta 4470
            for (Entry<Integer, List<HygieneData>> partnerHygieneDataMapEntry : partnerHygieneDataMap.entrySet()) {
31206 tejbeer 4471
 
31697 amit.gupta 4472
                CustomRetailer customRetailer = retailerService.getFofoRetailer(partnerHygieneDataMapEntry.getKey());
31206 tejbeer 4473
 
31697 amit.gupta 4474
                StringBuilder sb = new StringBuilder();
31886 tejbeer 4475
                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 4476
 
31886 tejbeer 4477
                        + " </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 4478
 
31697 amit.gupta 4479
                        + "<br/><table style='border:1px solid black ;padding: 5px';>");
4480
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4481
                sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4482
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Name</th>\n");
4483
                sb.append("<th style='border:1px solid black;padding: 5px'>Customer Number</th>\n");
4484
                sb.append("</tr>\n");
31206 tejbeer 4485
 
31697 amit.gupta 4486
                List<HygieneData> hygienes = partnerHygieneDataMapEntry.getValue();
31206 tejbeer 4487
 
31697 amit.gupta 4488
                List<Integer> orderIds = hygienes.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
31206 tejbeer 4489
 
31697 amit.gupta 4490
                List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
31206 tejbeer 4491
 
31697 amit.gupta 4492
                for (FofoOrder fofoOrder : fofoOrders) {
4493
                    Customer customer = customerRepository.selectById(fofoOrder.getCustomerId());
4494
                    sb.append("<tr>");
31886 tejbeer 4495
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + fofoOrder.getInvoiceNumber() + "</td>\n");
4496
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getFirstName() + "" + customer.getLastName() + "</td>\n");
4497
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customer.getMobileNumber() + "</td>\n");
31206 tejbeer 4498
 
31697 amit.gupta 4499
                    sb.append("</tr>\n");
4500
                }
31206 tejbeer 4501
 
31697 amit.gupta 4502
                sb.append("</tbody></table></body></html>");
4503
                String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4504
 
32350 amit.gupta 4505
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31206 tejbeer 4506
 
31697 amit.gupta 4507
            }
31206 tejbeer 4508
 
31697 amit.gupta 4509
        }
31206 tejbeer 4510
 
31697 amit.gupta 4511
    }
31206 tejbeer 4512
 
33046 amit.gupta 4513
    //
4514
    public void setInventoryItemIdToPriceDropImei() {
4515
        List<PriceDropIMEI> priceDropIMEIList = priceDropIMEIRepository.selectAllMissingInventoryItemIds();
4516
        LOGGER.info("Problems with - {} entries", priceDropIMEIList.size());
4517
        //priceDropIMEIList.stream().collect(C)
4518
        for (PriceDropIMEI priceDropIMEI : priceDropIMEIList) {
4519
            System.out.println(priceDropIMEI.getImei());
4520
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectAllBySerialNumberFofoId(priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
33051 amit.gupta 4521
            if (inventoryItems.size() == 0) {
33046 amit.gupta 4522
                LOGGER.info("Could not find Grn - FofoID {} , Imei {} ", priceDropIMEI);
33051 amit.gupta 4523
            } else if (inventoryItems.size() > 1) {
33046 amit.gupta 4524
                LOGGER.info("Found 2 such instance for - FofoID {} , Imei {} ", priceDropIMEI.getImei(), priceDropIMEI.getPartnerId());
4525
            } else {
4526
                priceDropIMEI.setInventoryItemId(inventoryItems.get(0).getId());
4527
            }
4528
 
4529
        }
4530
    }
4531
 
33051 amit.gupta 4532
    @Autowired
4533
    SaholicReservationSnapshotRepository saholicReservationSnapshotRepository;
4534
 
33256 amit.gupta 4535
    public void removePartialBillingForTransaction(int transactionId) throws ProfitMandiBusinessException {
35424 amit 4536
        // Fetch with pessimistic lock to prevent concurrent modifications
4537
        List<Order> orderList = orderRepository.selectAllByTransactionIdForUpdate(transactionId);
33051 amit.gupta 4538
        Map<Integer, Order> orderMap = orderList.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
4539
        //Delete scanRecords
4540
        List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(new ArrayList<>(orderMap.keySet()));
4541
        for (WarehouseScan warehouseScan : warehouseScans) {
4542
            warehouseScanRepository.delete(warehouseScan);
4543
            WarehouseInventoryItem warehouseInventoryItem = warehouseInventoryItemRepository.selectById(warehouseScan.getInventoryItemId());
4544
            warehouseInventoryItem.setLastScanType(in.shop2020.warehouse.ScanType.PURCHASE);
4545
            warehouseInventoryItem.setCurrentQuantity(warehouseInventoryItem.getCurrentQuantity() + warehouseScan.getQuantity());
4546
        }
4547
 
4548
        for (Order order : orderList) {
33078 ranu 4549
            if (order.getBillingTimestamp() != null) {
33056 amit.gupta 4550
                order.setStatus(OrderStatus.ACCEPTED);
4551
                order.setStatusDescription("Submitted for Processing");
4552
                order.setBillingTimestamp(null);
4553
                order.setBilledBy(null);
33057 amit.gupta 4554
                order.setSerialNumber(null);
33056 amit.gupta 4555
                order.setJacketNumber(null);
33060 amit.gupta 4556
                order.getLineItem().setSerialNumber(null);
33056 amit.gupta 4557
                List<LineItemImei> lineItemImeis = lineItemImeisRepository.selectByLineItemId(order.getLineItem().getId());
4558
                for (LineItemImei lineItemImei : lineItemImeis) {
4559
                    lineItemImeisRepository.delete(lineItemImei);
4560
                }
4561
                SaholicReservationSnapshot saholicReservationSnapshot = saholicReservationSnapshotRepository
4562
                        .selectByOrderId(order.getId());
4563
                if (saholicReservationSnapshot == null) {
4564
                    saholicInventoryService.addReservationCount(order.getLineItem().getItemId(),
4565
                            order.getFulfilmentWarehouseId(), order.getLineItem().getQuantity(), order.getId());
4566
                }
33055 amit.gupta 4567
            }
33051 amit.gupta 4568
        }
4569
    }
4570
 
31697 amit.gupta 4571
    public void hygineAlertForInternalTeam() throws ProfitMandiBusinessException, MessagingException, IOException {
31206 tejbeer 4572
 
31697 amit.gupta 4573
        List<String> remarks = new ArrayList<>();
4574
        remarks.add("Out of Service");
4575
        remarks.add("Duplicate number");
4576
        remarks.add("Partner number");
31886 tejbeer 4577
        List<HygieneData> hygieneDataLastThreeMonth = hygieneDataRepository.selectDisposedDateAndRemarks(
4578
                LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay(), LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX), remarks);
31206 tejbeer 4579
 
31886 tejbeer 4580
        List<HygieneData> hygieneDataRecentMonth = hygieneDataRepository.selectDisposedDateAndRemarks(LocalDate.now().withDayOfMonth(1), remarks);
31697 amit.gupta 4581
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
4582
        Map<Integer, List<HygieneData>> partnerHygieneLastThreeMonthMap = null;
31206 tejbeer 4583
 
31697 amit.gupta 4584
        Map<Integer, List<HygieneData>> partnerHygieneDataRecentMonth = null;
31206 tejbeer 4585
 
31697 amit.gupta 4586
        if (!hygieneDataLastThreeMonth.isEmpty()) {
31886 tejbeer 4587
            partnerHygieneLastThreeMonthMap = hygieneDataLastThreeMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31206 tejbeer 4588
 
31697 amit.gupta 4589
        }
31206 tejbeer 4590
 
31697 amit.gupta 4591
        if (!hygieneDataRecentMonth.isEmpty()) {
31886 tejbeer 4592
            partnerHygieneDataRecentMonth = hygieneDataRecentMonth.stream().collect(groupingBy(x -> x.getFofoId()));
31697 amit.gupta 4593
        }
31206 tejbeer 4594
 
31697 amit.gupta 4595
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31206 tejbeer 4596
 
31697 amit.gupta 4597
            String email = storeGuyEntry.getKey();
31206 tejbeer 4598
 
31697 amit.gupta 4599
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
31206 tejbeer 4600
 
31697 amit.gupta 4601
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData = new HashMap<>();
4602
            Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData = new HashMap<>();
4603
            for (Integer fofoId : fofoIds) {
31206 tejbeer 4604
 
31697 amit.gupta 4605
                partnerYearMonthData.put(fofoId, null);
4606
                partnerDateWiseData.put(fofoId, null);
4607
                if (!partnerHygieneLastThreeMonthMap.isEmpty()) {
4608
                    List<HygieneData> hygienes = partnerHygieneLastThreeMonthMap.get(fofoId);
31206 tejbeer 4609
 
31697 amit.gupta 4610
                    if (hygienes != null) {
31886 tejbeer 4611
                        Map<YearMonth, List<HygieneData>> yearMonthData = hygienes.stream().collect(groupingBy(x -> YearMonth.from(x.getDisposedTimestamp())));
31206 tejbeer 4612
 
31697 amit.gupta 4613
                        partnerYearMonthData.put(fofoId, yearMonthData);
31206 tejbeer 4614
 
31697 amit.gupta 4615
                    }
4616
                    List<HygieneData> dateWiseHygienes = partnerHygieneDataRecentMonth.get(fofoId);
31206 tejbeer 4617
 
31697 amit.gupta 4618
                    if (dateWiseHygienes != null) {
31206 tejbeer 4619
 
31886 tejbeer 4620
                        Map<LocalDate, List<HygieneData>> dateWiseData = hygienes.stream().collect(groupingBy(x -> (x.getDisposedTimestamp()).toLocalDate()));
31206 tejbeer 4621
 
31697 amit.gupta 4622
                        partnerDateWiseData.put(fofoId, dateWiseData);
31206 tejbeer 4623
 
31697 amit.gupta 4624
                    }
31206 tejbeer 4625
 
31697 amit.gupta 4626
                }
31206 tejbeer 4627
 
31697 amit.gupta 4628
            }
31206 tejbeer 4629
 
31697 amit.gupta 4630
            String subject = "Customer Info - Hygiene Alert";
31206 tejbeer 4631
 
31697 amit.gupta 4632
            LOGGER.info("hygieneData {}", partnerDateWiseData.values());
31206 tejbeer 4633
 
31697 amit.gupta 4634
            boolean partnerDateWise = partnerDateWiseData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4635
 
31697 amit.gupta 4636
            boolean partnerYearMonth = partnerYearMonthData.values().stream().allMatch(Objects::isNull);
31206 tejbeer 4637
 
31697 amit.gupta 4638
            if (!partnerDateWise && !partnerYearMonth) {
4639
                String sb = this.getMessageHygieneAlertForPartner(partnerYearMonthData, partnerDateWiseData);
32350 amit.gupta 4640
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb, null, subject);
31697 amit.gupta 4641
            }
31206 tejbeer 4642
 
31697 amit.gupta 4643
        }
31206 tejbeer 4644
 
31697 amit.gupta 4645
    }
31206 tejbeer 4646
 
31697 amit.gupta 4647
    private String getMessageHygieneAlertForPartner(
33256 amit.gupta 4648
            Map<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthData, Map<Integer, Map<LocalDate, List<HygieneData>>> partnerDateWiseData)
4649
            throws ProfitMandiBusinessException {
31206 tejbeer 4650
 
31697 amit.gupta 4651
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31206 tejbeer 4652
 
31697 amit.gupta 4653
        LocalDateTime startDate = LocalDate.now().withDayOfMonth(1).atStartOfDay();
4654
        LocalDateTime endDate = LocalDateTime.now();
31206 tejbeer 4655
 
31697 amit.gupta 4656
        LocalDateTime startYearMonth = LocalDate.now().withDayOfMonth(1).minusMonths(3).atStartOfDay();
31886 tejbeer 4657
        LocalDateTime endYearMonth = LocalDate.now().minusMonths(1).withDayOfMonth(LocalDate.now().minusMonths(1).lengthOfMonth()).atTime(LocalTime.MAX);
31206 tejbeer 4658
 
31697 amit.gupta 4659
        DateTimeFormatter dateYearMonthFormatter = DateTimeFormatter.ofPattern("MMM''uu");
31206 tejbeer 4660
 
31697 amit.gupta 4661
        List<YearMonth> yearMonthRange = new ArrayList<>();
4662
        yearMonthRange.add(YearMonth.from(startYearMonth));
31206 tejbeer 4663
 
31697 amit.gupta 4664
        yearMonthRange.add(YearMonth.from(startYearMonth.plusMonths(1)));
31206 tejbeer 4665
 
31697 amit.gupta 4666
        yearMonthRange.add(YearMonth.from(endYearMonth));
31206 tejbeer 4667
 
31697 amit.gupta 4668
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate.plusDays(1));
31206 tejbeer 4669
 
31886 tejbeer 4670
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
31206 tejbeer 4671
 
31697 amit.gupta 4672
        StringBuilder sb = new StringBuilder();
31886 tejbeer 4673
        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 4674
 
31697 amit.gupta 4675
                + "<table style='border:1px solid black ;padding: 5px';>");
4676
        sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4677
        sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31206 tejbeer 4678
 
31697 amit.gupta 4679
        for (YearMonth yearMonth : yearMonthRange) {
31886 tejbeer 4680
            sb.append("<th style='border:1px solid black;padding: 5px'>" + yearMonth.format(dateYearMonthFormatter) + "</th>\n");
31697 amit.gupta 4681
        }
31206 tejbeer 4682
 
31697 amit.gupta 4683
        for (LocalDate localDate : dateRange) {
4684
            sb.append("<th style='border:1px solid black;padding: 5px'>" + localDate + "</th>\n");
4685
        }
31206 tejbeer 4686
 
31697 amit.gupta 4687
        sb.append("</tr>\n");
31206 tejbeer 4688
 
31886 tejbeer 4689
        for (Entry<Integer, Map<YearMonth, List<HygieneData>>> partnerYearMonthEntry : partnerYearMonthData.entrySet()) {
31206 tejbeer 4690
 
31697 amit.gupta 4691
            int fofoId = partnerYearMonthEntry.getKey();
31206 tejbeer 4692
 
31697 amit.gupta 4693
            Map<YearMonth, List<HygieneData>> yearMonthData = partnerYearMonthEntry.getValue();
31206 tejbeer 4694
 
31697 amit.gupta 4695
            Map<LocalDate, List<HygieneData>> dateWiseData = partnerDateWiseData.get(fofoId);
31206 tejbeer 4696
 
31697 amit.gupta 4697
            if (yearMonthData == null && dateWiseData == null) {
4698
                continue;
4699
            }
31206 tejbeer 4700
 
31697 amit.gupta 4701
            sb.append("<tr>");
31886 tejbeer 4702
            sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31697 amit.gupta 4703
            for (YearMonth yearMonth : yearMonthRange) {
31206 tejbeer 4704
 
31697 amit.gupta 4705
                if (yearMonthData == null) {
4706
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4707
 
31697 amit.gupta 4708
                } else {
4709
                    List<HygieneData> hygieneList = yearMonthData.get(yearMonth);
31206 tejbeer 4710
 
31697 amit.gupta 4711
                    if (hygieneList != null) {
4712
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31206 tejbeer 4713
 
31697 amit.gupta 4714
                    } else {
4715
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4716
 
31697 amit.gupta 4717
                    }
4718
                }
4719
            }
31206 tejbeer 4720
 
31697 amit.gupta 4721
            for (LocalDate localDate : dateRange) {
31206 tejbeer 4722
 
31697 amit.gupta 4723
                if (dateWiseData == null) {
4724
                    sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31206 tejbeer 4725
 
31697 amit.gupta 4726
                } else {
4727
                    List<HygieneData> hygieneList = dateWiseData.get(localDate);
31206 tejbeer 4728
 
31697 amit.gupta 4729
                    if (hygieneList != null) {
4730
                        sb.append("<td style='border:1px solid black;padding: 5px'>" + hygieneList.size() + "</td>\n");
31218 tejbeer 4731
 
31697 amit.gupta 4732
                    } else {
4733
                        sb.append("<td style='border:1px solid black;padding: 5px'>-</td>\n");
31218 tejbeer 4734
 
31697 amit.gupta 4735
                    }
4736
                }
4737
            }
4738
            sb.append("</tr>");
31218 tejbeer 4739
 
31697 amit.gupta 4740
        }
31218 tejbeer 4741
 
31697 amit.gupta 4742
        sb.append("</tbody></table></body></html>");
31218 tejbeer 4743
 
31697 amit.gupta 4744
        return sb.toString();
4745
    }
31218 tejbeer 4746
 
33874 ranu 4747
    @Autowired
4748
    private MonthlyTargetRepository monthlyTargetRepository;
31218 tejbeer 4749
 
31697 amit.gupta 4750
    public void monthlyTargetForPartner() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4751
 
31697 amit.gupta 4752
        LocalDateTime curDate = LocalDateTime.now();
4753
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4754
 
31886 tejbeer 4755
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4756
 
31886 tejbeer 4757
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4758
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4759
 
31697 amit.gupta 4760
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4761
 
31697 amit.gupta 4762
        for (Entry<Integer, MonthlyTarget> partnerMonthlyTargetEntry : partnersMonthlyTarget.entrySet()) {
31249 tejbeer 4763
 
31697 amit.gupta 4764
            int fofoId = partnerMonthlyTargetEntry.getKey();
31249 tejbeer 4765
 
31697 amit.gupta 4766
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
31249 tejbeer 4767
 
31697 amit.gupta 4768
            Double purchaseTarget = partnerMonthlyTargetEntry.getValue().getPurchaseTarget();
31218 tejbeer 4769
 
31697 amit.gupta 4770
            Double saleTarget = partnerMonthlyTargetEntry.getValue().getSaleTarget();
31218 tejbeer 4771
 
31697 amit.gupta 4772
            if (purchaseTarget > 0) {
4773
                Double purchase = secondaryMtd.get(fofoId);
31249 tejbeer 4774
 
31697 amit.gupta 4775
                if (purchase == null) {
4776
                    purchase = 0.0;
4777
                }
31218 tejbeer 4778
 
31697 amit.gupta 4779
                Double balanceTarget = purchaseTarget - purchase;
31218 tejbeer 4780
 
31697 amit.gupta 4781
                if (balanceTarget <= 0) {
4782
                    balanceTarget = 0.0;
4783
                }
31651 tejbeer 4784
 
31697 amit.gupta 4785
                StringBuilder sb = new StringBuilder();
4786
                sb.append("<html><body><p>Dear Partner,\n");
31886 tejbeer 4787
                sb.append("<p>Pls note your agreed monthly target is Rs." + purchaseTarget + " and your achievement till date is Rs." + purchase + "</p>");
31697 amit.gupta 4788
                sb.append("<p>Pls note that your balance target is Rs." + balanceTarget + "</p>\n");
4789
                sb.append(
32350 amit.gupta 4790
                        "<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 4791
 
32350 amit.gupta 4792
                this.sendMailOfHtmlFormat(mailSender, new String[]{customRetailer.getEmail()}, sb.toString(), null, subject);
31697 amit.gupta 4793
            }
31218 tejbeer 4794
 
31697 amit.gupta 4795
        }
31218 tejbeer 4796
 
31697 amit.gupta 4797
    }
31218 tejbeer 4798
 
33444 ranu 4799
 
34502 amit.gupta 4800
    public void findAllLiveDemoBrandItemsByBillingDate() throws
4801
            MessagingException, ProfitMandiBusinessException, IOException {
33444 ranu 4802
        LocalDateTime endDate = LocalDate.now().atStartOfDay().minusDays(8);
4803
 
4804
        List<LiveDemoOrderLineItemModel> liveDemoOrderLineItemModels = orderRepository.findAllLiveDemoBrandItemsByBillingDate(endDate.minusDays(60), endDate);
4805
        LOGGER.info("liveDemoOrderLineItemModels {}", liveDemoOrderLineItemModels);
4806
        String subject = "Billed Live Demo Model";
4807
        StringBuilder sb = new StringBuilder();
4808
 
4809
        sb.append("<html><body><p>Hi,\n");
4810
        sb.append("<p>Please check live demo billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4811
 
4812
        sb.append("<th style='border:1px solid black;padding: 5px'>Item Id</th>\n");
4813
        sb.append("<th style='border:1px solid black;padding: 5px'>Invoice Number</th>\n");
4814
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4815
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4816
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4817
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4818
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Name</th>\n");
4819
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer City</th>\n");
4820
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer Pincode</th>\n");
4821
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4822
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4823
        sb.append("</tr>\n");
4824
        for (LiveDemoOrderLineItemModel liveDemoModel : liveDemoOrderLineItemModels) {
4825
            sb.append("<tr>");
4826
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getItemId() + "</td>\n");
4827
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getInvoiceNumber() + "</td>\n");
4828
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getBrand() + "</td>\n");
4829
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelNumber() + "</td>\n");
4830
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getModelName() + "</td>\n");
4831
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getSerialNumber() + "</td>\n");
4832
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerName() + "</td>\n");
4833
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerCity() + "</td>\n");
4834
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getRetailerPincode() + "</td>\n");
4835
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getState() + "</td>\n");
4836
            sb.append("<td style='border:1px solid black;padding: 5px'>" + liveDemoModel.getFormattedBillingDate() + "</td>\n");
4837
 
4838
            sb.append("</tr>\n");
4839
 
33506 amit.gupta 4840
        }
33444 ranu 4841
        List<String> sendTo = Arrays.asList("kamini.sharma@smartdukaan.com", "niranjan.kala@smartdukaan.com",
33506 amit.gupta 4842
                "mohit.gulati@smartdukaan.com", "vinay.p@smartdukaan.com", "shivam.gupta@smartdukaan.com");
33444 ranu 4843
 
4844
 
4845
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4846
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4847
 
4848
    }
4849
 
33464 ranu 4850
    public void findTodayPocoBillingItems() throws MessagingException, ProfitMandiBusinessException, IOException {
4851
        LocalDateTime endDate = LocalDate.now().atStartOfDay().plusDays(1);
4852
        LocalDateTime startDate = LocalDate.now().atStartOfDay().minusDays(1);
33444 ranu 4853
 
33464 ranu 4854
        List<LiveDemoOrderLineItemModel> pocoBillingOrderLineItemModels = orderRepository.findTodayPocoBillingItems(startDate, endDate);
4855
        LOGGER.info("pocoBillingOrderLineItemModels {}", pocoBillingOrderLineItemModels);
4856
        String subject = "Poco Billing";
4857
        StringBuilder sb = new StringBuilder();
4858
 
4859
        sb.append("<html><body><p>Hi,\n");
4860
        sb.append("<p>Please check poco billed order :</p>\n" + " <table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
4861
 
4862
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
4863
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
4864
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
4865
        sb.append("<th style='border:1px solid black;padding: 5px'>Serial Number</th>\n");
4866
        sb.append("<th style='border:1px solid black;padding: 5px'>Retailer State</th>\n");
4867
        sb.append("<th style='border:1px solid black;padding: 5px'>Billing Date</th>\n");
4868
        sb.append("</tr>\n");
4869
        for (LiveDemoOrderLineItemModel pocoModel : pocoBillingOrderLineItemModels) {
4870
            sb.append("<tr>");
4871
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getBrand() + "</td>\n");
4872
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelNumber() + "</td>\n");
4873
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getModelName() + "</td>\n");
4874
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getSerialNumber() + "</td>\n");
4875
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getState() + "</td>\n");
4876
            sb.append("<td style='border:1px solid black;padding: 5px'>" + pocoModel.getFormattedBillingDate() + "</td>\n");
4877
 
4878
            sb.append("</tr>\n");
4879
 
33506 amit.gupta 4880
        }
33664 amit.gupta 4881
        List<String> sendTo = Arrays.asList("uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com");
33464 ranu 4882
 
4883
        String[] email = sendTo.toArray(new String[sendTo.size()]);
4884
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
4885
 
4886
    }
4887
 
4888
 
31697 amit.gupta 4889
    public void monthlyTargetForInternalTeam() throws MessagingException, ProfitMandiBusinessException, IOException {
31218 tejbeer 4890
 
31697 amit.gupta 4891
        LocalDateTime curDate = LocalDateTime.now();
31218 tejbeer 4892
 
34903 ranu 4893
        List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, ProfitMandiConstants.TICKET_CATEGORY_RBM, ProfitMandiConstants.TICKET_CATEGORY_SALES, ProfitMandiConstants.TICKET_CATEGORY_ABM, ProfitMandiConstants.TICKET_CATEGORY_MARKETING, ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS, ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
31218 tejbeer 4894
 
31697 amit.gupta 4895
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false);
31218 tejbeer 4896
 
31697 amit.gupta 4897
        List<MonthlyTarget> monthlyTargets = monthlyTargetRepository.selectByDate(YearMonth.now());
31218 tejbeer 4898
 
31697 amit.gupta 4899
        Map<Integer, CustomRetailer> customeRetailerMap = retailerService.getAllFofoRetailers();
31218 tejbeer 4900
 
31886 tejbeer 4901
        Map<Integer, MonthlyTarget> partnersMonthlyTarget = monthlyTargets.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
31218 tejbeer 4902
 
31886 tejbeer 4903
        Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
4904
        Map<Integer, Double> todaytertiary = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate, curDate.with(LocalTime.MAX), 0, false);
31218 tejbeer 4905
 
31697 amit.gupta 4906
        String subject = "Monthly Target Vs Achievement";
31218 tejbeer 4907
 
31697 amit.gupta 4908
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
31218 tejbeer 4909
 
31697 amit.gupta 4910
            String email = storeGuyEntry.getKey();
31218 tejbeer 4911
 
31697 amit.gupta 4912
            List<Integer> fofoIds = new ArrayList<>(storeGuyEntry.getValue());
4913
            Map<Integer, MonthlyTarget> monthlyTargetAchievement = new HashMap<>();
4914
            for (Integer fofoId : fofoIds) {
31218 tejbeer 4915
 
31697 amit.gupta 4916
                MonthlyTarget monthlyTarget = partnersMonthlyTarget.get(fofoId);
4917
                if (monthlyTarget != null) {
4918
                    Double purchaseTarget = monthlyTarget.getPurchaseTarget();
31218 tejbeer 4919
 
31697 amit.gupta 4920
                    Double saleTarget = monthlyTarget.getSaleTarget();
31218 tejbeer 4921
 
31697 amit.gupta 4922
                    if (purchaseTarget != null && purchaseTarget > 0) {
4923
                        Double purchase = secondaryMtd.get(fofoId);
4924
                        if (purchase == null) {
4925
                            purchase = 0.0;
4926
                        }
4927
                        monthlyTarget.setPurchaseAchievement(purchase);
4928
                        monthlyTargetAchievement.put(fofoId, monthlyTarget);
31218 tejbeer 4929
 
31697 amit.gupta 4930
                    }
4931
                }
4932
            }
31218 tejbeer 4933
 
31697 amit.gupta 4934
            if (!monthlyTargetAchievement.isEmpty()) {
31218 tejbeer 4935
 
31697 amit.gupta 4936
                StringBuilder sb = new StringBuilder();
31218 tejbeer 4937
 
31697 amit.gupta 4938
                sb.append("<html><body><p>Hi,\n");
31886 tejbeer 4939
                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 4940
                sb.append("<tbody>\n" + "	" + "    				" + "<tr>\n");
4941
                sb.append("<th style='border:1px solid black;padding: 5px'>Partner Name</th>\n");
31218 tejbeer 4942
 
31697 amit.gupta 4943
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Target</th>\n");
31218 tejbeer 4944
 
31697 amit.gupta 4945
                sb.append("<th style='border:1px solid black;padding: 5px'>Purchase Achievement</th>\n");
4946
                sb.append("</tr>\n");
31218 tejbeer 4947
 
31886 tejbeer 4948
                for (Entry<Integer, MonthlyTarget> monthlyTargetAchievementEntry : monthlyTargetAchievement.entrySet()) {
31697 amit.gupta 4949
                    sb.append("<tr>");
4950
                    int fofoId = monthlyTargetAchievementEntry.getKey();
31218 tejbeer 4951
 
31697 amit.gupta 4952
                    MonthlyTarget monthlyTarget = monthlyTargetAchievementEntry.getValue();
31886 tejbeer 4953
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + customeRetailerMap.get(fofoId).getBusinessName() + "</td>\n");
31218 tejbeer 4954
 
31886 tejbeer 4955
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseTarget() + "</td>\n");
31218 tejbeer 4956
 
31886 tejbeer 4957
                    sb.append("<td style='border:1px solid black;padding: 5px'>" + monthlyTarget.getPurchaseAchievement() + "</td>\n");
31218 tejbeer 4958
 
31697 amit.gupta 4959
                    sb.append("</tr>\n");
31218 tejbeer 4960
 
31697 amit.gupta 4961
                }
31218 tejbeer 4962
 
32350 amit.gupta 4963
                this.sendMailOfHtmlFormat(googleMailSender, new String[]{email}, sb.toString(), null, subject);
31697 amit.gupta 4964
                // this.sendMailOfHtmlFormat("tejbeer.kaur@smartdukaan.com", sb.toString(),
4965
                // null, subject);
31218 tejbeer 4966
 
31697 amit.gupta 4967
            }
31604 tejbeer 4968
 
31697 amit.gupta 4969
        }
31604 tejbeer 4970
 
31697 amit.gupta 4971
    }
31604 tejbeer 4972
 
32061 amit.gupta 4973
    @Autowired
4974
    private PerformanceService performanceService;
4975
 
4976
 
4977
    public void sendFilteredRetailerPerformance() throws Exception {
4978
        RetailerFilterModel retailerFilterModel = performanceService.getRetailerFilterModel();
4979
 
4980
        Map<Integer, CustomRetailer> customRetailers = retailerService.getFofoRetailers(true);
4981
 
4982
 
4983
        List<RetailerPeformanceFilterModel> partnersPerformance = performanceService.getPerformance(retailerFilterModel, customRetailers);
4984
 
4985
        Map<Integer, RetailerPeformanceFilterModel> partnersPerformanceMap = new HashMap<>();
4986
 
4987
        if (!partnersPerformance.isEmpty()) {
4988
            partnersPerformanceMap = partnersPerformance.stream().collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
4989
            performanceService.sendPartnerPerformanceEmail(partnersPerformanceMap, retailerFilterModel, customRetailers);
4990
 
4991
        }
4992
 
4993
 
4994
    }
4995
 
32081 tejbeer 4996
    @Autowired
4997
    private VendorItemPricingRepository vendorItemPricingRepository;
32061 amit.gupta 4998
 
32081 tejbeer 4999
 
5000
    @Autowired
5001
    private VendorCatalogPricingService vendorCatalogPricingService;
5002
 
5003
 
33256 amit.gupta 5004
    public void migrateVendorItemPricing() throws ProfitMandiBusinessException {
32081 tejbeer 5005
 
5006
        List<VendorItemPricing> vendorItemPricings = vendorItemPricingRepository.selectAll();
32350 amit.gupta 5007
        LOGGER.info("At migrate VendorItemPricing");
32092 tejbeer 5008
        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 5009
        for (VendorItemPricing vendorItemPricing : vendorItemPricings) {
5010
            Item item = null;
32092 tejbeer 5011
            if (items.get(vendorItemPricing.getItemId()) != null) {
5012
                item = items.get(vendorItemPricing.getItemId());
5013
            } else {
32084 tejbeer 5014
                continue;
32081 tejbeer 5015
            }
32092 tejbeer 5016
 
32081 tejbeer 5017
            VendorCatalogPricingModel vendorCatalogPricingModel = new VendorCatalogPricingModel();
5018
            vendorCatalogPricingModel.setCatalogId(item.getCatalogItemId());
5019
            vendorCatalogPricingModel.setAuthId(13);
32088 tejbeer 5020
            vendorCatalogPricingModel.setDp(vendorItemPricing.getDp());
32081 tejbeer 5021
 
5022
            vendorCatalogPricingModel.setTp(vendorItemPricing.getTp());
5023
            vendorCatalogPricingModel.setMop(vendorItemPricing.getMop());
32384 amit.gupta 5024
            vendorCatalogPricingModel.setEffectedOn(LocalDate.of(2023, 8, 22));
32081 tejbeer 5025
            vendorCatalogPricingModel.setVendorId(vendorItemPricing.getVendorId());
5026
 
5027
 
5028
            try {
5029
                vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);
5030
            } catch (ProfitMandiBusinessException e) {
5031
                continue;
5032
            }
5033
 
5034
        }
5035
 
5036
    }
5037
 
5038
    public void approveVendorCatalogPricing() {
5039
        List<VendorCatalogPricingLog> vendorCatalogPricingLogs = vendorCatalogPricingLogRepository.selectByStatus(VendorCatalogPricingStatus.PENDING);
5040
 
32084 tejbeer 5041
 
32081 tejbeer 5042
        for (VendorCatalogPricingLog vendorCatalogPricingLog : vendorCatalogPricingLogs) {
32107 tejbeer 5043
            vendorCatalogPricingLog.setStatus(VendorCatalogPricingStatus.APPROVED);
5044
            vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());
5045
            vendorCatalogPricingLog.setApprovedBy(13);
5046
            vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());
32114 tejbeer 5047
            vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);
5048
        }
32081 tejbeer 5049
 
32114 tejbeer 5050
    }
32108 tejbeer 5051
 
32822 ranu 5052
    public void sendMailWhatsAppAfterLoanDueDate() throws Exception {
5053
        sdCreditService.updateRisk();
34729 amit.gupta 5054
        List<Loan> defaultLoans = sdCreditService.getDefaultLoans();
32822 ranu 5055
        if (!defaultLoans.isEmpty()) {
5056
            this.sendLoanAlert(defaultLoans);
5057
        }
32108 tejbeer 5058
 
32822 ranu 5059
 
5060
    }
5061
 
5062
    public void sendLoanAlert(List<Loan> defaultLoans) throws
5063
            Exception {
5064
 
5065
        List<Integer> categoryIds = Arrays.asList(
5066
                ProfitMandiConstants.TICKET_CATEGORY_CATEGORY,
5067
                ProfitMandiConstants.TICKET_CATEGORY_RBM,
5068
                ProfitMandiConstants.TICKET_CATEGORY_SALES,
34903 ranu 5069
                ProfitMandiConstants.TICKET_CATEGORY_ABM,
32822 ranu 5070
                ProfitMandiConstants.TICKET_CATEGORY_ACCOUNTS,
5071
                ProfitMandiConstants.TICKET_CATEGORY_BUSINESSINTELLIGENT);
5072
 
5073
        /*for (Map.Entry<String, Set<Integer>> storeGuyEntry : csService.getAuthUserPartnerIdMappingByCategoryIds(categoryIds, false).entrySet()) {
5074
            List<Loan> filteredRows = defaultLoans.stream()
5075
                    .filter(loan -> storeGuyEntry.getValue().contains(loan.getFofoId()))
5076
                    .collect(Collectors.toList());
5077
 
5078
            if (!filteredRows.isEmpty()) {
5079
                for (Loan defaultLoan : filteredRows) {
5080
                    List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
5081
                    double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
5082
                    String messageText = getMessageForDueDateExtend(defaultLoan,amount);
5083
                   // String[] email = new String[]{storeGuyEntry.getKey()};
33820 ranu 5084
 
32822 ranu 5085
                    sendMailOfHtmlFormat(mailSender, email, messageText, null, subject);
5086
 
5087
                }
5088
            }
5089
        }*/
32842 amit.gupta 5090
        //Send single whatsapp to tv
5091
        String title = "SD Credit Alert!";
32850 amit.gupta 5092
        boolean notYetSent = true;
32822 ranu 5093
        for (Loan defaultLoan : defaultLoans) {
5094
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(defaultLoan.getId());
5095
 
5096
            double amount = loanStatements.stream().map(LoanStatement::getAmount).collect(Collectors.summingDouble(BigDecimal::doubleValue));
5097
 
5098
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(defaultLoan.getFofoId());
5099
 
5100
            Address address = addressRepository.selectById(user.getAddressId());
5101
 
32842 amit.gupta 5102
            //String url = "http://app.smartdukaan.com/pages/home/credit";
32822 ranu 5103
 
32842 amit.gupta 5104
            String message = getMessageForDueDateExtend(defaultLoan, amount);
5105
            String whatsAppMessage = getWhatsAppMessageForDueDateExtend(defaultLoan, amount);
32948 amit.gupta 5106
            if (whatsAppMessage != null) {
32850 amit.gupta 5107
                notificationService.sendWhatsappMessage(whatsAppMessage, title, address.getPhoneNumber());
32948 amit.gupta 5108
                if (notYetSent) {
32850 amit.gupta 5109
                    notificationService.sendWhatsappMessage(whatsAppMessage, title, "9911565032");
5110
                    notYetSent = false;
5111
                }
5112
            }
5113
 
32822 ranu 5114
            String[] email = {user.getEmailId()};
5115
            sendMailOfHtmlFormat(mailSender, email, message, null, "Loan Alert - SmartDukaan");
5116
        }
5117
    }
5118
 
5119
    private String getMessageForDueDateExtend(Loan defaultLoan, double amount) throws ProfitMandiBusinessException {
5120
 
5121
        double absoluteAmount = Math.abs(amount);
5122
        long roundedAmount = Math.round(absoluteAmount);
5123
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
5124
 
5125
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
5126
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
5127
 
5128
        // Retrieve the name of the user associated with the loan
5129
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
5130
 
5131
        // Initialize a StringBuilder to construct the HTML message
5132
        StringBuilder sb = new StringBuilder();
5133
 
32842 amit.gupta 5134
        if (LocalDate.now().isBefore(dueDate)) {
5135
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
32822 ranu 5136
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5137
            // 5 Days Before Due Date - daily
5138
            if (noOfdaysBetween <= 5) {
5139
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
5140
                sb.append("<p>This is a friendly reminder that your loan payment is due in " + noOfdaysBetween + "days, on " +
5141
                        payDate +
5142
                        ". Please ensure that the payment is made on time to avoid any late fees or penalties.</p>");
5143
                sb.append("<p>As per the terms of your loan agreement, the total amount due is Rs. " + formattedAmount + ". " +
5144
                        "You can make the payment by adding money to your wallet. If you have any questions or need assistance, " +
5145
                        "our customer service team is available to help you.</p>");
5146
                sb.append("<p>Thank you for your cooperation and prompt attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
5147
            }
32842 amit.gupta 5148
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 5149
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
5150
 
5151
            // After Due Date – Alternate days
5152
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
5153
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
5154
                sb.append("<p>We would like to remind you that your payment for the outstanding balance on your account is now overdue. " +
5155
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs. " + formattedAmount + ".</p>");
34729 amit.gupta 5156
                sb.append("<p>To avoid further charges and any negative impact on your Credit score, we kindly request that you settle the " +
32822 ranu 5157
                        "outstanding balance as soon as possible.</p>");
5158
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
5159
            }
5160
            // 5 Days before default - daily
32842 amit.gupta 5161
            if (noOfdaysBetween <= 5) {
32822 ranu 5162
                sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br>");
5163
                sb.append("<p>Attention: High Alert</p>");
5164
                sb.append("<p>Dear " + name + "</p>");
5165
                sb.append("<p>This is to inform you that the due date for your payment of Rs. " + formattedAmount + " has been crossed, " +
5166
                        "and you are approaching the default date on " + defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")) + ". " +
34729 amit.gupta 5167
                        "Please be aware that this will have a significant impact on your Credit score and may result in substantial penalties as well.</p>");
32822 ranu 5168
                sb.append("<p>To rectify this situation, it is imperative that you take immediate action. " +
5169
                        "Please make the necessary payment immediately to avoid further consequences.</p>");
5170
                sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
5171
            }
32842 amit.gupta 5172
        } else {
32822 ranu 5173
            // Post Default - Daily
32842 amit.gupta 5174
            sb.append("<html><body><p><b>Loan Repayment Alert !</b></p></br><p>Dear " + name + "</p>");
5175
            sb.append("<p>We regret to inform you that you are currently in loan default. As a result, " +
34729 amit.gupta 5176
                    "higher penalties are being charged, which is also negatively impacting your Credit score. " +
32842 amit.gupta 5177
                    "It is imperative that you make an immediate payment to rectify this situation.</p>");
5178
            sb.append("<p>Please note that failing to make the payment promptly will result in further consequences, " +
5179
                    "including potential legal action and additional financial penalties. " +
5180
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible.</p>");
5181
            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>");
5182
            sb.append("<p>Thank you for your attention to this matter.</p></br><p> Smart Dukaan Team !!</p>");
32822 ranu 5183
 
5184
        }
5185
 
5186
        // Return the constructed HTML message
5187
        sb.append("</body></html>");
5188
        return sb.toString();
5189
    }
5190
 
34502 amit.gupta 5191
    private String getWhatsAppMessageForDueDateExtend(Loan defaultLoan, double amount) throws
5192
            ProfitMandiBusinessException {
32822 ranu 5193
 
5194
        double absoluteAmount = Math.abs(amount);
5195
        long roundedAmount = Math.round(absoluteAmount);
5196
        String formattedAmount = (amount < 0) ? "" + roundedAmount : "" + roundedAmount;
5197
 
5198
        LocalDate dueDate = defaultLoan.getDueDate().toLocalDate();
5199
        LocalDate defaultDate = defaultLoan.getDueDate().toLocalDate().plusDays(15);
5200
 
5201
        // Retrieve the name of the user associated with the loan
5202
        String name = userUserRepository.selectById(defaultLoan.getFofoId()).getName();
5203
 
5204
        // Initialize a StringBuilder to construct the HTML message
5205
        String message = null;
5206
 
32842 amit.gupta 5207
        if (LocalDate.now().isBefore(dueDate)) {
32822 ranu 5208
            long noOfdaysBetween = ChronoUnit.DAYS.between(LocalDate.now(), defaultLoan.getDueDate().toLocalDate());
5209
            String payDate = defaultLoan.getDueDate().toLocalDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5210
            // 5 Days Before Due Date - daily
5211
            if (noOfdaysBetween <= 5) {
5212
 
34729 amit.gupta 5213
                message = "Dear %s, This is a friendly reminder that your outstanding credit payment is due in %d days, on %s.\n" +
32822 ranu 5214
                        "\n" +
5215
                        "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" +
5216
                        "\n" +
5217
                        "If you have any questions or need assistance, our customer service team is available to help you.\n" +
5218
                        "Thank you for your cooperation and prompt attention to this matter.\n" +
5219
                        "\n" +
5220
                        "Team SmartDukaan";
32842 amit.gupta 5221
                message = String.format(message, name, noOfdaysBetween, payDate, formattedAmount);
5222
            }
5223
        } else if (LocalDate.now().isBefore(defaultDate)) {
32822 ranu 5224
            long noOfdaysBetween = ChronoUnit.DAYS.between(defaultDate, LocalDate.now());
5225
            // After Due Date – Alternate days
5226
            if ((noOfdaysBetween % 2 == 0) && (noOfdaysBetween > 5)) {
5227
                message = "Dear %s, We would like to remind you that your payment for the outstanding balance on your account is now overdue. \n" +
5228
                        "As per our terms and conditions, a higher interest rate will be levied on the overdue amount Rs.%s.\n" +
34729 amit.gupta 5229
                        "To avoid further charges and any negative impact on your Credit ratings, we kindly request that you settle the outstanding balance as soon as possible.\n" +
32822 ranu 5230
                        "Thank you for your attention to this matter. \n" +
5231
                        "\n" +
5232
                        "Team SmartDukaan";
5233
                message = String.format(message, name, formattedAmount);
5234
            }
5235
            // 5 Days before default - daily
32842 amit.gupta 5236
            if (noOfdaysBetween <= 5) {
32822 ranu 5237
                String defaultPayDate = defaultDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
5238
                message = "Attention: High Alert!! Dear %s, \n" +
5239
                        "\n" +
5240
                        "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" +
34729 amit.gupta 5241
                        "Please be aware that this will have a significant impact on your Credit score and may result in substantial penalties as well. To rectify this situation, it is imperative that you take immediate action.\n" +
32822 ranu 5242
                        "\n" +
5243
                        "Please make the necessary payment immediately to avoid further consequences. Thank you for your attention to this matter.\n" +
5244
                        "\n" +
5245
                        "Team SmartDukaan";
5246
                message = String.format(message, name, formattedAmount, defaultPayDate);
5247
            }
32842 amit.gupta 5248
        } else {
32822 ranu 5249
            // Post Default - Daily
34729 amit.gupta 5250
            message = "Dear %s, We regret to inform you that you are currently in Credit default. As a result, higher penalties are being charged, which is also negatively impacting your Credit score. \n" +
32822 ranu 5251
                    "\n" +
5252
                    "It is imperative that you make an immediate payment to rectify this situation. \n" +
5253
                    "\n" +
5254
                    "Please note that failing to make the payment promptly will result in further consequences, including potential legal action and additional financial penalties. \n" +
5255
                    "\n" +
5256
                    "We strongly urge you to take this matter seriously and settle the outstanding amount as soon as possible. \n" +
5257
                    "\n" +
5258
                    "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" +
5259
                    "\n" +
5260
                    "Team SmartDukaan";
5261
            message = String.format(message, name, formattedAmount);
5262
 
5263
        }
5264
        // Return the constructed HTML message
5265
        return message;
5266
    }
5267
 
33874 ranu 5268
    @Autowired
5269
    private FofoOpeningStockRepository fofoOpeningStockRepository;
34450 ranu 5270
    @Autowired
5271
    private SmartCartService smartCartService;
33874 ranu 5272
 
5273
    public void createOpeningStockPartyWise() throws Exception {
5274
        // Get all partner stock data
35329 ranu 5275
        Map<Integer, List<PartnerOpeningStockByTodayModel>> partnerOpeningStockByTodayInStockMap = currentInventorySnapshotRepository.getAllPartnerTodayInstock();
5276
        Map<Integer, List<PartnerOpeningStockByTodayModel>> partnerOpeningStockByTodayGrnPending = currentInventorySnapshotRepository.getAllPartnerTodayGrnPending();
5277
 
5278
        Map<Integer, List<PartnerOpeningStockByTodayModel>> partnerOpeningStockByTodayMap =
5279
                new HashMap<>();
5280
 
5281
// STEP 1: Copy in-stock data
5282
        partnerOpeningStockByTodayInStockMap.forEach((fofoId, list) ->
5283
                partnerOpeningStockByTodayMap.put(
5284
                        fofoId,
5285
                        new ArrayList<>(list)   // deep list copy
5286
                )
5287
        );
5288
 
5289
// STEP 2: Merge GRN pending using streams
5290
        partnerOpeningStockByTodayGrnPending.forEach((fofoId, grnList) -> {
5291
 
5292
            // If FOFO missing → simply insert GRN list (deep copy)
5293
            partnerOpeningStockByTodayMap
5294
                    .computeIfAbsent(fofoId, x -> new ArrayList<>())
5295
                    .addAll(
5296
                            grnList.stream()
5297
                                    .map(g -> new PartnerOpeningStockByTodayModel(
5298
                                            g.getFofoId(),
5299
                                            g.getCatalogId(),
5300
                                            g.getModelNumber(),
5301
                                            g.getOpeningQty()
5302
                                    ))
5303
                                    .collect(Collectors.toList())
5304
                    );
5305
        });
5306
 
5307
// STEP 3: Now merge duplicates per catalogId using grouping
5308
        partnerOpeningStockByTodayMap.replaceAll((fofoId, list) ->
5309
                list.stream()
5310
                        .collect(Collectors.toMap(
5311
                                PartnerOpeningStockByTodayModel::getCatalogId,
5312
                                m -> new PartnerOpeningStockByTodayModel(
5313
                                        m.getFofoId(),
5314
                                        m.getCatalogId(),
5315
                                        m.getModelNumber(),
5316
                                        m.getOpeningQty()
5317
                                ),
5318
                                // merge function: sum openingQty
5319
                                (m1, m2) -> {
5320
                                    m1.setOpeningQty(m1.getOpeningQty() + m2.getOpeningQty());
5321
                                    return m1;
5322
                                }
5323
                        ))
5324
                        .values()
5325
                        .stream()
5326
                        .collect(Collectors.toList())
5327
        );
5328
 
5329
 
5330
 
5331
 
5332
 
34460 ranu 5333
        Map<Integer, Map<Integer, Integer>> activatedButNotBilledCatalogQtyMap = smartCartService.activatedButNotBilledCatalogQtyMap();
34502 amit.gupta 5334
        LOGGER.info("PartnerOpeningStockByTodayModel {}", partnerOpeningStockByTodayMap);
33874 ranu 5335
        for (Map.Entry<Integer, List<PartnerOpeningStockByTodayModel>> entry : partnerOpeningStockByTodayMap.entrySet()) {
5336
            int fofoId = entry.getKey();
5337
            List<PartnerOpeningStockByTodayModel> partnerStockList = entry.getValue();
34450 ranu 5338
            // Get the sold (activated-but-not-billed) quantity for this fofo and catalog
34460 ranu 5339
            Map<Integer, Integer> activatedButNotBilledQtyMap = activatedButNotBilledCatalogQtyMap.getOrDefault(fofoId, Collections.emptyMap());
33874 ranu 5340
 
34450 ranu 5341
            //  if stock is avaialble in snapshot
33874 ranu 5342
            for (PartnerOpeningStockByTodayModel partnerStock : partnerStockList) {
5343
                int catalogId = partnerStock.getCatalogId();
34450 ranu 5344
                int stockCurrentQty = partnerStock.getOpeningQty();
33874 ranu 5345
                LocalDate openingDate = partnerStock.getOpeningDate();
5346
 
34460 ranu 5347
                int soldButNotBilledQty = activatedButNotBilledQtyMap.getOrDefault(catalogId, 0);
34450 ranu 5348
 
35329 ranu 5349
                if(catalogId ==1025656 && fofoId == 175140232 ){
5350
                    LOGGER.info("catalogId {}",catalogId);
5351
                    LOGGER.info("fofoId {}",fofoId);
5352
                    LOGGER.info("soldButNotBilledQty {}",soldButNotBilledQty);
5353
                    LOGGER.info("stockCurrentQty {}",stockCurrentQty);
5354
                }
5355
 
34450 ranu 5356
                // Subtract soldQty from partnerCurrentQty
34460 ranu 5357
                int partnerCurrentQty = Math.max(stockCurrentQty - soldButNotBilledQty, 0); // Ensure it doesn't go negative
34450 ranu 5358
 
5359
 
33874 ranu 5360
                // Check if an entry already exists in the FofoOpeningStock table
5361
                FofoOpeningStock existingStock = fofoOpeningStockRepository.findByFofoIdAndCatalogId(fofoId, catalogId);
5362
 
34162 ranu 5363
 
33874 ranu 5364
                if (existingStock != null) {
34363 ranu 5365
                    if (partnerCurrentQty < 1 && existingStock.getOpeningDate().isBefore(LocalDate.now().minusDays(5))) {
34160 tejus.loha 5366
                        fofoOpeningStockRepository.delete(existingStock);
5367
                    }
34162 ranu 5368
                    if (existingStock.getOpeningQty() < partnerCurrentQty) {
5369
                        existingStock.setOpeningQty(partnerCurrentQty);
5370
                        existingStock.setCurrentQty(partnerCurrentQty);
33874 ranu 5371
                        existingStock.setOpeningDate(openingDate);
5372
                        LOGGER.info("if condition exist {}");
34275 tejus.loha 5373
                    } else if (existingStock.getCurrentQty() >= existingStock.getOpeningQty()) {
5374
                        existingStock.setOpeningQty(existingStock.getCurrentQty());
5375
                        existingStock.setCurrentQty(partnerCurrentQty);
5376
                        existingStock.setOpeningDate(LocalDate.now());
34363 ranu 5377
                    } else if (existingStock.getOpeningDate().isBefore(LocalDate.now().minusDays(5))) {
33878 ranu 5378
                        int averageQty = Math.round((existingStock.getCurrentQty() + existingStock.getOpeningQty()) / 2.0f);
5379
 
5380
                        if (averageQty == 1 && existingStock.getOpeningQty() == 1 && existingStock.getCurrentQty() == 0) {
5381
                            // Delete the existing stock entry from the table
5382
                            fofoOpeningStockRepository.delete(existingStock);
5383
                            LOGGER.info("Deleted record with fofoId: {}, catalogId: {} because averageQty, openingQty, and currentQty meet deletion criteria", fofoId, catalogId);
5384
                        } else {
5385
                            // Update the existing stock with the new average quantity
5386
                            existingStock.setOpeningQty(averageQty);
34244 ranu 5387
                            existingStock.setCurrentQty(partnerCurrentQty);
33878 ranu 5388
                            existingStock.setOpeningDate(LocalDate.now());
34363 ranu 5389
                            LOGGER.info("Updated due to date being older than 5 days with average quantity: {}", averageQty);
33878 ranu 5390
                        }
34275 tejus.loha 5391
                    } else {
34244 ranu 5392
                        existingStock.setCurrentQty(partnerCurrentQty);
33874 ranu 5393
                    }
5394
                } else {
5395
                    LOGGER.info("else condition exist");
5396
                    FofoOpeningStock newStock = new FofoOpeningStock();
5397
                    newStock.setFofoId(fofoId);
5398
                    newStock.setCatalogId(catalogId);
34162 ranu 5399
                    newStock.setOpeningQty(partnerCurrentQty);
5400
                    newStock.setCurrentQty(partnerCurrentQty);
33874 ranu 5401
                    newStock.setOpeningDate(openingDate);
5402
                    fofoOpeningStockRepository.persist(newStock);
5403
 
5404
                }
5405
            }
34162 ranu 5406
 
5407
//            if stock is not available in snapshot but available in opening stock
34275 tejus.loha 5408
            List<FofoOpeningStock> fofoOpeningStockList = fofoOpeningStockRepository.selectAllByFofoId(fofoId);
34162 ranu 5409
 
34275 tejus.loha 5410
            for (FofoOpeningStock fofoOpeningStock : fofoOpeningStockList) {
34162 ranu 5411
 
34275 tejus.loha 5412
                if (!partnerStockList.stream().anyMatch(partnerStock -> partnerStock.getCatalogId() == fofoOpeningStock.getCatalogId())) {
34363 ranu 5413
                    if (fofoOpeningStock.getOpeningDate().isBefore(LocalDate.now().minusDays(5))) {
34275 tejus.loha 5414
                        LOGGER.info("not match stock{}", fofoOpeningStock);
5415
                        fofoOpeningStockRepository.delete(fofoOpeningStock);
5416
                    } else {
5417
                        LOGGER.info("not match stock2{}", fofoOpeningStock);
5418
                        fofoOpeningStock.setCurrentQty(0);
5419
                    }
34162 ranu 5420
 
34275 tejus.loha 5421
                }
5422
            }
34162 ranu 5423
 
33874 ranu 5424
        }
5425
    }
5426
 
5427
 
34162 ranu 5428
    @Autowired
5429
    private CategorisedCatalogRepository categorisedCatalogRepository;
5430
 
5431
    public void groupHidCatalogsByWeeks() throws ProfitMandiBusinessException, MessagingException, IOException {
5432
        List<CategorisedCatalogListModel> categorisedCatalogs = categorisedCatalogRepository.getListByStatus(CatalogMovingEnum.HID);
5433
        LocalDate currentDate = LocalDate.now();
5434
        LocalDate oneWeekAgo = currentDate.minusDays(7);
5435
        LocalDate twoWeeksAgo = currentDate.minusDays(14);
5436
        LocalDate threeWeeksAgo = currentDate.minusDays(21);
5437
 
5438
        // This Week (inclusive of the current date)
5439
        List<CategorisedCatalogListModel> thisWeekCatalogs = categorisedCatalogs.stream()
5440
                .filter(catalog -> !catalog.getStatusCreatedDate().isBefore(oneWeekAgo))
5441
                .collect(Collectors.toList());
5442
 
5443
        // Last Week (from one week ago to two weeks ago, exclusive of this week)
5444
        List<CategorisedCatalogListModel> lastWeekCatalogs = categorisedCatalogs.stream()
5445
                .filter(catalog -> catalog.getStatusCreatedDate().isBefore(oneWeekAgo) && !catalog.getStatusCreatedDate().isBefore(twoWeeksAgo))
5446
                .collect(Collectors.toList());
5447
 
5448
        // Two Weeks Ago (from two weeks ago to three weeks ago, exclusive of last week)
5449
        List<CategorisedCatalogListModel> twoWeeksAgoCatalogs = categorisedCatalogs.stream()
5450
                .filter(catalog -> catalog.getStatusCreatedDate().isBefore(twoWeeksAgo) && !catalog.getStatusCreatedDate().isBefore(threeWeeksAgo))
5451
                .collect(Collectors.toList());
5452
 
5453
        // Older than Two Weeks Ago (anything older than three weeks ago)
5454
        List<CategorisedCatalogListModel> olderCatalogs = categorisedCatalogs.stream()
5455
                .filter(catalog -> catalog.getStatusCreatedDate().isBefore(threeWeeksAgo))
5456
                .collect(Collectors.toList());
5457
 
5458
 
5459
        String subject = "Hid Catalogs";
5460
        StringBuilder sb = new StringBuilder();
5461
 
5462
        sb.append("<html><body><p>Hi Catagory Team,\n");
5463
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for this week:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5464
 
5465
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5466
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5467
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5468
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5469
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5470
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5471
        sb.append("</tr>\n");
5472
 
5473
        for (CategorisedCatalogListModel catalog : thisWeekCatalogs) {
5474
            sb.append("<tr>");
5475
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5476
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5477
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5478
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5479
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5480
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5481
 
5482
            sb.append("</tr>\n");
5483
 
5484
        }
5485
 
5486
        sb.append("</table>");
5487
 
5488
        sb.append("</br>");
5489
        sb.append("</br>");
5490
        sb.append("</br>");
5491
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for last week:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5492
 
5493
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5494
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5495
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5496
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5497
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5498
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5499
        sb.append("</tr>\n");
5500
 
5501
        for (CategorisedCatalogListModel catalog : lastWeekCatalogs) {
5502
            sb.append("<tr>");
5503
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5504
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5505
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5506
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5507
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5508
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5509
 
5510
            sb.append("</tr>\n");
5511
 
5512
        }
5513
        sb.append("</table>");
5514
 
5515
        sb.append("</br>");
5516
        sb.append("</br>");
5517
        sb.append("</br>");
5518
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for two week ago:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5519
 
5520
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5521
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5522
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5523
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5524
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5525
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5526
        sb.append("</tr>\n");
5527
 
5528
        for (CategorisedCatalogListModel catalog : twoWeeksAgoCatalogs) {
5529
            sb.append("<tr>");
5530
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5531
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5532
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5533
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5534
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5535
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5536
 
5537
            sb.append("</tr>\n");
5538
 
5539
        }
5540
        sb.append("</table>");
5541
 
5542
        sb.append("</br>");
5543
        sb.append("</br>");
5544
        sb.append("</br>");
5545
        sb.append("<p style='font-weight:500;'>Please review the HID catalogs for older than two weeks ago:</p>\n" + "<table style='border:1px solid black ;padding: 5px; border-collapse: collapse;'>");
5546
 
5547
        sb.append("<th style='border:1px solid black;padding: 5px'>Brand</th>\n");
5548
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Number</th>\n");
5549
        sb.append("<th style='border:1px solid black;padding: 5px'>Model Name</th>\n");
5550
        sb.append("<th style='border:1px solid black;padding: 5px'>Catalog Id</th>\n");
5551
        sb.append("<th style='border:1px solid black;padding: 5px'>Start Date</th>\n");
5552
        sb.append("<th style='border:1px solid black;padding: 5px'>End Date</th>\n");
5553
        sb.append("</tr>\n");
5554
 
5555
        for (CategorisedCatalogListModel catalog : olderCatalogs) {
5556
            sb.append("<tr>");
5557
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getBrand() + "</td>\n");
5558
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelNumber() + "</td>\n");
5559
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getModelId() + "</td>\n");
5560
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getCurrentStatus() + "</td>\n");
5561
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusCreatedDate() + "</td>\n");
5562
            sb.append("<td style='border:1px solid black;padding: 5px'>" + catalog.getStatusEndDate() + "</td>\n");
5563
 
5564
            sb.append("</tr>\n");
5565
 
5566
        }
5567
        sb.append("</table>");
5568
        sb.append("</body></html>");
5569
 
34275 tejus.loha 5570
        List<String> sendTo = Arrays.asList("uday.singh@smartdukaan.com", "kuldeep.kumar@smartdukaan.com", "nishant.ohri@smartdukaan.com", "ritesh.chauhan1@smartdukaan.com", "shobhit.tandon@smartdukaan.com", "tarun.verma@smartdukaan.com", "niranjan.kala@smartdukaan.com");
34162 ranu 5571
 
5572
 
5573
        String[] email = sendTo.toArray(new String[sendTo.size()]);
5574
 
5575
        this.sendMailOfHtmlFormat(mailSender, email, sb.toString(), null, subject);
5576
    }
5577
 
34275 tejus.loha 5578
    public void send10OrMoreOlderStockReport() throws Exception {
35094 ranu 5579
        System.out.print("testSTart");
34352 amit.gupta 5580
        purSaleService.moreThen10DaysEgedStockReport();
35094 ranu 5581
        System.out.print("testEnd");
34162 ranu 5582
 
34275 tejus.loha 5583
    }
34162 ranu 5584
 
34791 aman.kumar 5585
    public void sendUpdateMobileBrandMarketShareQuaterlyMail() throws Exception {
5586
        String subject = "Reminder: Please Update Brand-wise Market Share";
5587
 
5588
        String body = "Dear Team,\n\n" +
5589
                "This is a gentle reminder to kindly update the brand-wise market share data for the current quarter.\n\n" +
5590
                "Best regards,\n" +
5591
                "SmartDukaan Team";
5592
 
5593
        Utils.sendMailWithAttachments(
5594
                googleMailSender,
5595
                new String[]{"sm.@smartdukaan.com"},
5596
                new String[]{"tech@smartdukaan.com"},
5597
                subject,
5598
                body
5599
        );
5600
    }
5601
 
5602
 
32210 jai.hind 5603
}
33664 amit.gupta 5604
// 2284"