Subversion Repositories SmartDukaan

Rev

Rev 34724 | Rev 34730 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
34306 ranu 1
package com.smartdukaan.cron.scheduled;
2
 
3
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
34619 ranu 4
import com.spice.profitmandi.common.model.BrandStockPrice;
34606 ranu 5
import com.spice.profitmandi.common.model.CustomRetailer;
34321 ranu 6
import com.spice.profitmandi.common.model.ProfitMandiConstants;
34619 ranu 7
import com.spice.profitmandi.common.util.FormattingUtils;
8
import com.spice.profitmandi.common.util.Utils;
34450 ranu 9
import com.spice.profitmandi.dao.cart.SmartCartService;
34321 ranu 10
import com.spice.profitmandi.dao.entity.auth.AuthUser;
34606 ranu 11
import com.spice.profitmandi.dao.entity.fofo.*;
12
import com.spice.profitmandi.dao.entity.logistics.AST;
13
import com.spice.profitmandi.dao.entity.logistics.ASTRepository;
34619 ranu 14
import com.spice.profitmandi.dao.entity.transaction.*;
34321 ranu 15
import com.spice.profitmandi.dao.entity.user.User;
16
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
34619 ranu 17
import com.spice.profitmandi.dao.enumuration.transaction.LoanReferenceType;
34641 ranu 18
import com.spice.profitmandi.dao.model.*;
34606 ranu 19
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
34321 ranu 20
import com.spice.profitmandi.dao.repository.cs.CsService;
21
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
34606 ranu 22
import com.spice.profitmandi.dao.repository.fofo.*;
23
import com.spice.profitmandi.dao.repository.inventory.StateRepository;
34619 ranu 24
import com.spice.profitmandi.dao.repository.transaction.*;
34321 ranu 25
import com.spice.profitmandi.dao.repository.user.UserRepository;
34655 ranu 26
import com.spice.profitmandi.service.PartnerStatsService;
34641 ranu 27
import com.spice.profitmandi.service.RbmTargetService;
34619 ranu 28
import com.spice.profitmandi.service.inventory.InventoryService;
34308 ranu 29
import com.spice.profitmandi.service.transaction.SDCreditService;
34606 ranu 30
import com.spice.profitmandi.service.user.RetailerService;
34619 ranu 31
import com.spice.profitmandi.service.wallet.WalletService;
34606 ranu 32
import in.shop2020.model.v1.order.OrderStatus;
34619 ranu 33
import in.shop2020.model.v1.order.WalletReferenceType;
34
import org.apache.commons.io.output.ByteArrayOutputStream;
34306 ranu 35
import org.apache.logging.log4j.LogManager;
36
import org.apache.logging.log4j.Logger;
34715 ranu 37
import org.apache.poi.common.usermodel.HyperlinkType;
34641 ranu 38
import org.apache.poi.ss.usermodel.*;
34619 ranu 39
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
34306 ranu 40
import org.springframework.beans.factory.annotation.Autowired;
34619 ranu 41
import org.springframework.beans.factory.annotation.Qualifier;
42
import org.springframework.core.io.ByteArrayResource;
34321 ranu 43
import org.springframework.mail.javamail.JavaMailSender;
44
import org.springframework.mail.javamail.MimeMessageHelper;
34306 ranu 45
import org.springframework.stereotype.Component;
46
import org.springframework.transaction.annotation.Transactional;
47
 
34321 ranu 48
import javax.mail.MessagingException;
49
import javax.mail.internet.InternetAddress;
50
import javax.mail.internet.MimeMessage;
34619 ranu 51
import java.io.*;
52
import java.math.BigDecimal;
34641 ranu 53
import java.time.*;
34306 ranu 54
import java.time.temporal.ChronoUnit;
55
import java.util.*;
34321 ranu 56
import java.util.stream.Collectors;
34306 ranu 57
 
58
@Component
59
@Transactional(rollbackFor = {Throwable.class, ProfitMandiBusinessException.class})
60
public class ScheduledTasksTest {
61
 
62
    private static final Logger LOGGER = LogManager.getLogger(ScheduledTasksTest.class);
63
 
64
    @Autowired
65
    TransactionRepository transactionRepository;
66
 
67
    @Autowired
34619 ranu 68
    @Qualifier(value = "googleMailSender")
69
    private JavaMailSender googleMailSender;
70
 
71
    @Autowired
34306 ranu 72
    LoanRepository loanRepository;
73
 
34308 ranu 74
    @Autowired
75
    SDCreditService sdCreditService;
76
 
34321 ranu 77
    @Autowired
78
    UserRepository userRepository;
79
 
80
    @Autowired
81
    CsService csService;
82
 
83
    @Autowired
84
    RbmRatingRepository rbmRatingRepository;
85
 
86
    @Autowired
87
    private JavaMailSender mailSender;
88
 
89
    @Autowired
90
    SalesRatingRepository salesRatingRepository;
91
 
92
    @Autowired
93
    FofoStoreRepository fofoStoreRepository;
94
 
34450 ranu 95
    @Autowired
96
    SmartCartService smartCartService;
97
 
34606 ranu 98
    @Autowired
99
    RetailerService retailerService;
100
 
101
    @Autowired
102
    ASTRepository astRepository;
103
 
104
    @Autowired
105
    AuthRepository authRepository;
106
 
107
    @Autowired
108
    StateRepository stateRepository;
109
 
110
    @Autowired
111
    MonthlyTargetRepository monthlyTargetRepository;
112
 
113
    @Autowired
114
    PartnerTypeChangeService partnerTypeChangeService;
115
 
116
    @Autowired
117
    ReturnOrderInfoRepository returnOrderInfoRepository;
118
 
119
    @Autowired
120
    OrderRepository orderRepository;
121
 
34619 ranu 122
    @Autowired
123
    FofoOrderItemRepository fofoOrderItemRepository;
124
 
125
    @Autowired
126
    InventoryService inventoryService;
127
 
128
    @Autowired
129
    UserWalletRepository userWalletRepository;
130
 
131
    @Autowired
132
    LoanStatementRepository loanStatementRepository;
133
 
134
    @Autowired
34641 ranu 135
    ActivatedImeiRepository activatedImeiRepository;
136
 
137
    @Autowired
138
    PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
139
 
140
    @Autowired
34619 ranu 141
    WalletService walletService;
142
 
34641 ranu 143
    @Autowired
144
    RbmTargetService rbmTargetService;
145
 
34655 ranu 146
    @Autowired
147
    PartnerStatsService partnerStatsService;
148
 
34715 ranu 149
    @Autowired
150
    UserWalletHistoryRepository userWalletHistoryRepository;
151
 
34321 ranu 152
    public void test() throws Exception {
34366 ranu 153
        System.out.println("test start");
34699 ranu 154
        //partnerStatsService.getAllPartnerStats();
155
        this.generateBiReportExcel();
34366 ranu 156
        System.out.println("test end");
34306 ranu 157
 
158
    }
159
 
34648 ranu 160
    public void generateBiReport() throws Exception {
161
        LOGGER.info("bi report started {-----}");
162
        this.generateBiReportExcel();
163
        LOGGER.info("bi report ended {-----}");
164
    }
165
 
34308 ranu 166
    public void createLoanForBillingByTransactionIdAndInvoiceNumber(int transactionId, double invoiceAmount, String invoiceNumber) throws Exception {
167
        sdCreditService.createLoanForBilling(transactionId, invoiceAmount, invoiceNumber);
34306 ranu 168
 
34308 ranu 169
    }
34306 ranu 170
 
34619 ranu 171
    public void loanSettle() throws Exception {
172
        List<Integer> refrences = Arrays.asList(25807,36003,38938,39506,42219,45084);
173
        for(Integer ref : refrences){
174
            List<LoanStatement> loanStatements = loanStatementRepository.selectByLoanId(ref);
175
            double amountSum = loanStatements.stream().map(LoanStatement::getAmount).mapToDouble(BigDecimal::doubleValue).sum();
176
            if(amountSum > 0){
177
                walletService.addAmountToWallet(loanStatements.get(0).getFofoId(),ref, WalletReferenceType.CREDIT_LIMIT,"Amount reversal against credit limit deduction",(float) amountSum,LocalDateTime.now());
34308 ranu 178
 
34619 ranu 179
//                Loan statement entry
180
                    BigDecimal adjustAmount = BigDecimal.valueOf(amountSum).negate(); // or multiply by -1
181
                    LoanStatement loanStatement = new LoanStatement();
182
                    loanStatement.setAmount(adjustAmount);
183
                    loanStatement.setFofoId(loanStatements.get(0).getFofoId());
184
                    loanStatement.setLoanReferenceType(LoanReferenceType.PRINCIPAL);
185
                    loanStatement.setCreatedAt(LocalDateTime.now());
186
                    loanStatement.setDescription("Amount reversal due to access debit against limit");
187
                    loanStatement.setLoanId(ref);
188
                    loanStatement.setBusinessDate(LocalDateTime.now());
189
                    loanStatementRepository.persist(loanStatement);
190
 
191
                    Loan loan = loanRepository.selectByLoanId(ref);
192
                    loan.setPendingAmount(BigDecimal.valueOf(0));
193
                    loan.setSettledOn(LocalDateTime.now());
194
                }
195
 
196
 
197
        }
198
    }
199
 
200
 
201
 
34321 ranu 202
    private void sendMailHtmlFormat(String email[], String body, String cc[], String bcc[], String subject)
203
            throws MessagingException, ProfitMandiBusinessException, IOException {
204
        MimeMessage message = mailSender.createMimeMessage();
205
        MimeMessageHelper helper = new MimeMessageHelper(message);
206
        helper.setSubject(subject);
207
        helper.setText(body, true);
208
        helper.setTo(email);
209
        if (cc != null) {
210
            helper.setCc(cc);
211
        }
212
        if (bcc != null) {
213
            helper.setBcc(bcc);
34308 ranu 214
 
34321 ranu 215
        }
216
 
217
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");
218
        helper.setFrom(senderAddress);
219
        mailSender.send(message);
220
    }
221
 
34307 ranu 222
    public Map<Integer,Integer> findLoanTransactionMapingAccordingLoan(List<Integer> loanIds) throws ProfitMandiBusinessException {
34306 ranu 223
 
224
        Map<Integer, Integer> transactionLoanMap = new HashMap<>();
225
 
226
        for(int loanId : loanIds){
227
            Transaction transaction = null;
228
            Loan loan = loanRepository.selectByLoanId(loanId);
229
            List<Transaction> transactions = transactionRepository.selectByRetailerId(loan.getFofoId());
230
 
231
            LocalDateTime nearestDateTime = transactions.stream().map(x -> x.getCreateTimestamp())
232
                    .min(Comparator.comparingLong(x -> Math.abs(ChronoUnit.MILLIS.between(x, loan.getCreatedOn()))))
233
                    .orElse(null);
234
 
235
            if (nearestDateTime != null && loan.getCreatedOn().plusMinutes(2).isAfter(nearestDateTime) &&
236
                    loan.getCreatedOn().minusMinutes(1).isBefore(nearestDateTime)) {
237
                // Here transaction is still null
238
                transaction = transactions.stream()
239
                        .filter(x -> x.getCreateTimestamp().equals(nearestDateTime))
240
                        .findFirst().get();
241
                transactionLoanMap.put(transaction.getId(), loanId);
242
            }
243
 
244
        }
245
        LOGGER.info("transactionLoanMap {}",transactionLoanMap);
246
        return transactionLoanMap;
247
    }
34321 ranu 248
 
249
 
250
 
251
    public void sendRbmFeedbackSummaryEmail() throws MessagingException, ProfitMandiBusinessException, IOException {
252
        LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
253
        LocalDateTime endOfMonth = LocalDateTime.now();
34323 ranu 254
        String[] bcc = {"tarun.verma@smartdukaan.com"};
34321 ranu 255
 
256
        // Get all RBM users
257
        List<AuthUser> authUsers = csService.getAuthUserIds(
258
                ProfitMandiConstants.TICKET_CATEGORY_RBM,
259
                Arrays.asList(EscalationType.L1)
260
        );
261
 
262
        if (authUsers.isEmpty()) {
263
            LOGGER.info("No RBMs found.");
264
            return;
265
        }
266
 
267
        List<Integer> rbmIds = authUsers.stream().map(AuthUser::getId).collect(Collectors.toList());
268
 
269
        // Fetch ratings for all RBMs for current month
270
        List<RbmRating> feedbackList = rbmRatingRepository.selectByRbmIdsAndDateRange(rbmIds, startOfMonth, endOfMonth);
271
 
272
        if (feedbackList.isEmpty()) {
273
            LOGGER.info("No feedback entries found for RBMs.");
274
            return;
275
        }
276
 
277
        // Sort feedback by createTimeStamp DESC
278
        feedbackList.sort((a, b) -> b.getCreateTimeStamp().compareTo(a.getCreateTimeStamp()));
279
 
280
        // Fetch and map FOFO (partner) names
281
        Map<Integer, String> fofoNameMap = new HashMap<>();
282
        for (RbmRating rating : feedbackList) {
283
            int fofoId = rating.getFofoId();
284
            if (!fofoNameMap.containsKey(fofoId)) {
285
                User fofoUser = userRepository.selectById(fofoId);
286
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
287
 
288
                String partnerName = fofoUser != null ? fofoUser.getName() : "Unknown Partner";
289
                String storeCode = fofoStore != null ? fofoStore.getCode() : "Unknown Code";
290
 
291
                String displayName = partnerName + " (" + storeCode + ")";
292
                fofoNameMap.put(fofoId, displayName);
293
            }
294
        }
295
 
296
        // Map RBM ID to name for quick lookup
297
        Map<Integer, String> rbmNameMap = authUsers.stream()
298
                .collect(Collectors.toMap(AuthUser::getId, AuthUser::getFullName));
299
 
300
        // Generate HTML content
301
        StringBuilder emailContent = new StringBuilder();
302
        emailContent.append("<html><body>");
303
        emailContent.append("<p>Dear Team,</p>");
304
        emailContent.append("<p>Here is the <b>latest RBM Rating and Feedback Summary</b> for ")
305
                .append(LocalDate.now().getMonth()).append(":</p>");
306
 
307
        emailContent.append("<table border='1' cellspacing='0' cellpadding='5'>");
308
        emailContent.append("<tr>")
309
                .append("<th>RBM Name</th>")
310
                .append("<th>Partner Name</th>")
311
                .append("<th>Rating</th>")
312
                .append("<th>Comment</th>")
313
                .append("<th>Date</th>")
314
                .append("</tr>");
315
 
316
        for (RbmRating rating : feedbackList) {
317
            String rbmName = rbmNameMap.getOrDefault(rating.getRbmId(), "Unknown RBM");
318
            String partnerName = fofoNameMap.getOrDefault(rating.getFofoId(), "Unknown Partner");
319
            emailContent.append("<tr>")
320
                    .append("<td>").append(rbmName).append("</td>")
321
                    .append("<td>").append(partnerName).append("</td>")
322
                    .append("<td>").append(rating.getRating()).append("</td>")
323
                    .append("<td>").append(rating.getComment() != null ? rating.getComment() : "-").append("</td>")
324
                    .append("<td>").append(rating.getCreateTimeStamp().toLocalDate()).append("</td>")
325
                    .append("</tr>");
326
        }
327
 
328
        emailContent.append("</table>");
329
        emailContent.append("<br><p>Regards,<br>Smart Dukaan Team</p>");
330
        emailContent.append("</body></html>");
331
 
332
        String subject = "Monthly RBM Feedback Summary - " + LocalDate.now().getMonth();
333
 
334
        List<String> sendTo = new ArrayList<>();
34323 ranu 335
        sendTo.add("sm@smartdukaan.com"); //
336
        sendTo.add("chiranjib.sarkar@smartdukaan.com"); //
337
        sendTo.add("kamini.sharma@smartdukaan.com"); //
34321 ranu 338
 
339
        String[] emailRecipients = sendTo.toArray(new String[0]);
340
 
341
 
342
        this.sendMailHtmlFormat(emailRecipients, emailContent.toString(), null, bcc, subject);
343
 
344
        LOGGER.info("Consolidated RBM feedback summary email sent.");
345
    }
346
 
347
 
348
    public void sendSalesFeedbackSummaryEmail() throws MessagingException, ProfitMandiBusinessException, IOException {
349
        LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
350
        LocalDateTime endOfMonth = LocalDateTime.now();
34323 ranu 351
        String[] bcc = {"tarun.verma@smartdukaan.com"};
34411 tejus.loha 352
//        String[] bcc = {"tejus.lohani@smartdukaan.com"};
34321 ranu 353
 
354
        // Get all RBM users
355
        List<AuthUser> authUsers = csService.getAuthUserIds(
356
                ProfitMandiConstants.TICKET_CATEGORY_SALES,
357
                Arrays.asList(EscalationType.L1)
358
        );
359
 
360
        if (authUsers.isEmpty()) {
361
            LOGGER.info("No sales person found.");
362
            return;
363
        }
364
 
365
        List<Integer> salesL1Ids = authUsers.stream().map(AuthUser::getId).collect(Collectors.toList());
366
 
367
        // Fetch ratings for all RBMs for current month
368
        List<SalesRating> feedbackList = salesRatingRepository.selectBySalesL1IdsAndDateRange(salesL1Ids, startOfMonth, endOfMonth);
369
 
370
        if (feedbackList.isEmpty()) {
371
            LOGGER.info("No feedback entries found for Sales.");
372
            return;
373
        }
374
 
375
        // Sort feedback by createTimeStamp DESC
376
        feedbackList.sort((a, b) -> b.getCreateTimeStamp().compareTo(a.getCreateTimeStamp()));
377
 
378
        // Fetch and map FOFO (partner) names
379
        Map<Integer, String> fofoNameMap = new HashMap<>();
380
        for (SalesRating rating : feedbackList) {
381
            int fofoId = rating.getFofoId();
382
            if (!fofoNameMap.containsKey(fofoId)) {
383
                User fofoUser = userRepository.selectById(fofoId);
384
                FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
385
 
386
                String partnerName = fofoUser != null ? fofoUser.getName() : "Unknown Partner";
387
                String storeCode = fofoStore != null ? fofoStore.getCode() : "Unknown Code";
388
 
389
                String displayName = partnerName + " (" + storeCode + ")";
390
                fofoNameMap.put(fofoId, displayName);
391
            }
392
        }
393
 
394
        // Map RBM ID to name for quick lookup
395
        Map<Integer, String> salesL1NameMap = authUsers.stream()
396
                .collect(Collectors.toMap(AuthUser::getId, AuthUser::getFullName));
397
 
398
        // Generate HTML content
399
        StringBuilder emailContent = new StringBuilder();
400
        emailContent.append("<html><body>");
401
        emailContent.append("<p>Dear Team,</p>");
402
        emailContent.append("<p>Here is the <b>latest Sales L1 Rating and Feedback Summary</b> for ")
403
                .append(LocalDate.now().getMonth()).append(":</p>");
404
 
405
        emailContent.append("<table border='1' cellspacing='0' cellpadding='5'>");
406
        emailContent.append("<tr>")
407
                .append("<th>Sales L1 Name</th>")
408
                .append("<th>Partner Name</th>")
34411 tejus.loha 409
                .append("<th>Partner Category</th>")
34321 ranu 410
                .append("<th>Rating</th>")
411
                .append("<th>Comment</th>")
412
                .append("<th>Date</th>")
413
                .append("</tr>");
414
 
415
        for (SalesRating rating : feedbackList) {
416
            String salesL1 = salesL1NameMap.getOrDefault(rating.getSalesL1Id(), "Unknown Sales Person");
417
            String partnerName = fofoNameMap.getOrDefault(rating.getFofoId(), "Unknown Partner");
34411 tejus.loha 418
            PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(rating.getFofoId(), LocalDate.now());
34321 ranu 419
            emailContent.append("<tr>")
420
                    .append("<td>").append(salesL1).append("</td>")
421
                    .append("<td>").append(partnerName).append("</td>")
34411 tejus.loha 422
                    .append("<td>").append(partnerType).append("</td>")
34321 ranu 423
                    .append("<td>").append(rating.getRating()).append("</td>")
424
                    .append("<td>").append(rating.getComment() != null ? rating.getComment() : "-").append("</td>")
425
                    .append("<td>").append(rating.getCreateTimeStamp().toLocalDate()).append("</td>")
426
                    .append("</tr>");
427
        }
428
 
429
        emailContent.append("</table>");
430
        emailContent.append("<br><p>Regards,<br>Smartdukaan Team</p>");
431
        emailContent.append("</body></html>");
432
 
34411 tejus.loha 433
        String subject = "Monthly Sales L1 Feedback Summary Test test - " + LocalDate.now().getMonth();
34321 ranu 434
 
435
        List<String> sendTo = new ArrayList<>();
34323 ranu 436
         sendTo.add("sm@smartdukaan.com"); //
437
         sendTo.add("chiranjib.sarkar@smartdukaan.com"); //
34606 ranu 438
         sendTo.add("kamini.sharma@smartdukaan.com"); //
34321 ranu 439
 
440
        String[] emailRecipients = sendTo.toArray(new String[0]);
441
 
442
 
443
        this.sendMailHtmlFormat(emailRecipients, emailContent.toString(), null, bcc, subject);
444
 
445
        LOGGER.info("Consolidated Sales L1 feedback summary email sent.");
446
    }
447
 
448
 
34606 ranu 449
    public void generateBiReportExcel() throws Exception {
34619 ranu 450
 
34606 ranu 451
        LocalDateTime startOfToday = LocalDate.now().atStartOfDay();
34321 ranu 452
 
34701 ranu 453
        /*Map<Integer, CustomRetailer> customRetailers = retailerService.getAllFofoRetailersInternalFalse();
34321 ranu 454
 
34701 ranu 455
        List<Integer> retailerIds = customRetailers.values().stream().map(CustomRetailer::getPartnerId).collect(Collectors.toList());*/
34606 ranu 456
 
34722 ranu 457
        List<Integer> retailerIds = Arrays.asList(175139615,175139391,175135707,175139854,175139302,175139710,175139749);
34701 ranu 458
        Map<Integer,CustomRetailer> customRetailers = retailerService.getFofoRetailers(retailerIds);
34648 ranu 459
 
34641 ranu 460
        //partner daily investment
34729 amit.gupta 461
        List<Loan> defaultLoans = sdCreditService.getDefaultLoans();
34641 ranu 462
        Map<Integer,List<Loan>> defaultLoanMap = defaultLoans.stream().collect(Collectors.groupingBy(Loan::getFofoId));
34619 ranu 463
 
34641 ranu 464
        Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = new HashMap<>();
465
        List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
466
                .selectAll(new ArrayList<>(retailerIds), LocalDate.now().minusDays(1));
467
        if (!partnerDailyInvestments.isEmpty()) {
468
            partnerDailyInvestmentMap = partnerDailyInvestments.stream()
469
                    .collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
470
        }
471
 
34648 ranu 472
    //  this month return data
34619 ranu 473
        YearMonth currentMonth = YearMonth.now();
474
        String currentMonthStringValue = String.valueOf(currentMonth);
34606 ranu 475
        LocalDateTime currentMonthStartDate = YearMonth.now().atDay(1).atStartOfDay();
34722 ranu 476
        LocalDateTime currentMonthEndDate = LocalDateTime.now().minusDays(1).toLocalDate().atTime(23, 59, 59);
34606 ranu 477
 
478
        List<ReturnOrderInfoModel> currentMonthReturnOrderInfoModels = returnOrderInfoRepository.selectAllByBetweenDate(currentMonthStartDate, currentMonthEndDate);
479
        Map<Integer, Long> currentMonthPartnerReturnOrderInfoModelMap = currentMonthReturnOrderInfoModels.stream().collect(Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingLong(x -> Math.round(x.getRefundAmount()))));
480
 
481
        List<Order> currentMonthRtoRefundOrders = orderRepository.selectAllOrderDatesBetweenByStatus(currentMonthStartDate, currentMonthEndDate, OrderStatus.RTO_REFUNDED);
482
        Map<Integer, Long> currentMonthRtoRefundOrderMap = currentMonthRtoRefundOrders.stream().collect(Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingLong(x -> Math.round(x.getTotalAmount()))));
483
 
484
 
34619 ranu 485
//  last month return data
34606 ranu 486
        YearMonth lastMonth = YearMonth.now().minusMonths(1);
34619 ranu 487
        String lastMonthStringValue = String.valueOf(lastMonth);
34606 ranu 488
        LocalDateTime lastMontStartDate = lastMonth.atDay(1).atStartOfDay();
489
        LocalDateTime lastMonthEndDate = lastMonth.atEndOfMonth().atTime(23, 59, 59);
490
 
491
        List<ReturnOrderInfoModel> lastMonthReturnOrderInfoModels = returnOrderInfoRepository.selectAllByBetweenDate(lastMontStartDate, lastMonthEndDate);
492
        Map<Integer, Long> lastMonthPartnerReturnOrderInfoModelMap = lastMonthReturnOrderInfoModels.stream().collect(Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingLong(x -> Math.round(x.getRefundAmount()))));
493
 
494
        List<Order> lastMonthRtoRefundOrders = orderRepository.selectAllOrderDatesBetweenByStatus(lastMontStartDate, lastMonthEndDate, OrderStatus.RTO_REFUNDED);
495
        Map<Integer, Long> lastMonthRtoRefundOrderMap = lastMonthRtoRefundOrders.stream().collect(Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingLong(x -> Math.round(x.getTotalAmount()))));
496
 
497
 
34619 ranu 498
//  twoMonthsAgo return data
34606 ranu 499
        YearMonth twoMonthsAgo = YearMonth.now().minusMonths(2);
34619 ranu 500
        String twoMonthAgoStringValue = String.valueOf(twoMonthsAgo);
34606 ranu 501
        LocalDateTime twoMonthsAgoStartDate = twoMonthsAgo.atDay(1).atStartOfDay();
502
        LocalDateTime twoMonthsAgoEndDate = twoMonthsAgo.atEndOfMonth().atTime(23, 59, 59);
503
 
504
        List<ReturnOrderInfoModel> twoMonthAgoReturnOrderInfoModels = returnOrderInfoRepository.selectAllByBetweenDate(twoMonthsAgoStartDate, twoMonthsAgoEndDate);
505
        Map<Integer, Long> twoMonthAgoPartnerReturnOrderInfoModelMap = twoMonthAgoReturnOrderInfoModels.stream().collect(Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingLong(x -> Math.round(x.getRefundAmount()))));
34724 ranu 506
LOGGER.info("twoMonthAgoReturnOrderInfoModels {}",twoMonthAgoReturnOrderInfoModels);
34606 ranu 507
        List<Order> twoMonthRtoRefundOrders = orderRepository.selectAllOrderDatesBetweenByStatus(twoMonthsAgoStartDate, twoMonthsAgoEndDate, OrderStatus.RTO_REFUNDED);
34619 ranu 508
        Map<Integer, Long> twoMonthAgoRtoRefundOrderMap = twoMonthRtoRefundOrders.stream().collect(Collectors.groupingBy(x -> x.getRetailerId(), Collectors.summingLong(x -> Math.round(x.getTotalAmount()))));
34724 ranu 509
        LOGGER.info("twoMonthRtoRefundOrders {}",twoMonthRtoRefundOrders);
34606 ranu 510
 
34648 ranu 511
        Map<Integer , String> assessmentMap = new HashMap<>();
512
        Map<Integer , String> zeroBillingMap = new HashMap<>();
513
        Map<Integer , Float> billingNeededMap = new HashMap<>();
514
        Map<Integer , Integer> countAMap = new HashMap<>();
34606 ranu 515
 
34619 ranu 516
        Map<Integer , BIRetailerModel> biRetailerModelMap = new HashMap<>();
34606 ranu 517
 
34641 ranu 518
        Map<Integer , FofoInvestmentModel> biInvestmentModelMap = new HashMap<>();
519
 
34619 ranu 520
        Map<Integer, Map<YearMonth, BiSecondaryModel>> allRetailerMonthlyData = new HashMap<>();
34606 ranu 521
 
34619 ranu 522
        Map<Integer,Double> fofoTotalStockPriceMap = new HashMap<>();
523
 
524
        Map<Integer,Map<String, BrandStockPrice>> fofoBrandStockPriceMap = new HashMap<>();
525
 
34641 ranu 526
        Map<Integer,Long> fofoTotalMtdSecondaryMap = new HashMap<>();
34619 ranu 527
 
528
 
34641 ranu 529
        Map<Integer,Map<String, Long>> fofoBrandWiseMtdSecondaryMap = new HashMap<>();
34619 ranu 530
 
34641 ranu 531
        Map<Integer,Double> fofoTotalMtdTertiaryMap = new HashMap<>();
532
 
533
        Map<Integer,Map<String, Double>> fofoBrandMtdTertiaryMap = new HashMap<>();
534
 
34606 ranu 535
        for(Integer fofoId: retailerIds){
34619 ranu 536
            String rbmName = "";
34606 ranu 537
            int rbmL1 = csService.getAuthUserId(ProfitMandiConstants.TICKET_CATEGORY_RBM,EscalationType.L1,fofoId);
34619 ranu 538
            if(rbmL1 != 0){
539
                 rbmName = authRepository.selectById(rbmL1).getFullName();
34677 ranu 540
            }else {
541
                int rbmL2 = csService.getAuthUserId(ProfitMandiConstants.TICKET_CATEGORY_RBM, EscalationType.L2, fofoId);
542
                if(rbmL2 != 0){
543
                    rbmName = authRepository.selectById(rbmL2).getFullName();
544
                }
34619 ranu 545
            }
546
            String bmName ="";
34606 ranu 547
            int bmId = csService.getAuthUserId(ProfitMandiConstants.TICKET_CATEGORY_SALES,EscalationType.L2,fofoId);
34619 ranu 548
            if(bmId !=0){
549
                bmName = authRepository.selectById(bmId).getFullName();
550
            }
34606 ranu 551
 
552
            int managerId = csService.getAuthUserId(ProfitMandiConstants.TICKET_CATEGORY_SALES,EscalationType.L1,fofoId);
553
            String managerName = " ";
554
            if(managerId != 0){
555
                 managerName = authRepository.selectById(managerId).getFullName();
556
            }else {
557
                managerName = bmName;
558
            }
559
 
560
            AST ast = astRepository.selectById(customRetailers.get(fofoId).getAstId());
561
 
562
            PartnerType partnerTypeThisMonth = partnerTypeChangeService.getTypeOnMonth(fofoId, YearMonth.now());
563
 
564
//            generate retaile detail
565
 
566
            BIRetailerModel biRetailerModel = new BIRetailerModel();
567
            biRetailerModel.setBmName(bmName);
568
            biRetailerModel.setCode(customRetailers.get(fofoId).getCode());
34619 ranu 569
            if(ast != null){
570
                biRetailerModel.setArea(ast.getArea());
571
            }else {
572
                biRetailerModel.setArea("-");
573
            }
34606 ranu 574
            biRetailerModel.setCity(customRetailers.get(fofoId).getAddress().getCity());
575
            biRetailerModel.setStoreName(customRetailers.get(fofoId).getBusinessName());
34619 ranu 576
            biRetailerModel.setStatus(String.valueOf(customRetailers.get(fofoId).getActivationType()));
34606 ranu 577
            biRetailerModel.setCategory(String.valueOf(partnerTypeThisMonth));
578
            biRetailerModel.setSalesManager(managerName);
579
            biRetailerModel.setRbm(rbmName);
580
 
34619 ranu 581
            biRetailerModelMap.put(fofoId,biRetailerModel);
582
 
34641 ranu 583
 
34606 ranu 584
//            generate secondary data
585
 
34641 ranu 586
            List<PartnerWiseActivatedNotBilledTotal> partnerWiseActivatedNotBilledMonthlyTotals = activatedImeiRepository.getTotalMonthlyActivatedNotBilled(fofoId,twoMonthsAgoStartDate);
587
            Map<YearMonth , PartnerWiseActivatedNotBilledTotal> partnerWiseActivatedNotBilledTotalMap = partnerWiseActivatedNotBilledMonthlyTotals.stream().collect(Collectors.toMap(x-> YearMonth.parse(x.getYearMonth()),x->x));
588
 
34606 ranu 589
//            this month secondary target
590
 
34619 ranu 591
            double currentSecondaryTarget =  monthlyTargetRepository.selectByDateAndFofoId(YearMonth.now(), fofoId) != null ? monthlyTargetRepository.selectByDateAndFofoId(YearMonth.now(), fofoId).getPurchaseTarget() : 0;
34606 ranu 592
 
34619 ranu 593
 
594
            long currentMonthReturn = currentMonthPartnerReturnOrderInfoModelMap.getOrDefault(fofoId, 0L) + currentMonthRtoRefundOrderMap.getOrDefault(fofoId, 0L);
595
 
596
 
34715 ranu 597
            Map<Integer, Double> secondaryMtd = orderRepository.selectOrderValueBetweenBillingDatesGroupByFofoId(Arrays.asList(fofoId),
34699 ranu 598
                    startOfToday.withDayOfMonth(1), startOfToday.with(LocalTime.MAX).minusDays(1)).stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getAmount()));
34606 ranu 599
 
600
            double secondaryAchievedMtd = secondaryMtd.getOrDefault(fofoId, 0.0);
601
 
34619 ranu 602
            double currentMonthNetSecondary = secondaryAchievedMtd - currentMonthReturn;
34606 ranu 603
 
34701 ranu 604
            double currentMonthSecondaryPercent = currentSecondaryTarget == 0 ? 0.0 : Math.round(Math.abs((secondaryAchievedMtd / currentSecondaryTarget) * 100));
34619 ranu 605
 
34641 ranu 606
            double currentMonthUnbilled = partnerWiseActivatedNotBilledTotalMap.get(currentMonth) != null ? partnerWiseActivatedNotBilledTotalMap.get(currentMonth).getTotalUnbilledAmount() : 0d;
34619 ranu 607
 
608
//          this month tertiary----------
609
 
610
            LocalDateTime now = LocalDateTime.now();
611
            double todaySale = fofoOrderItemRepository.selectSumMopGroupByRetailer(startOfToday, now, fofoId, false).get(fofoId);
612
            double mtdSaleTillYesterDay = fofoOrderItemRepository.selectSumMopGroupByRetailer(startOfToday.withDayOfMonth(1), startOfToday, fofoId, false).get(fofoId);
34724 ranu 613
            double mtdSale = mtdSaleTillYesterDay;
34619 ranu 614
 
615
 
34606 ranu 616
//            last month secondary target
617
 
34619 ranu 618
            double lastMonthSecondaryTarget = monthlyTargetRepository.selectByDateAndFofoId(lastMonth, fofoId) != null ?  monthlyTargetRepository.selectByDateAndFofoId(lastMonth, fofoId).getPurchaseTarget() : 0;
34606 ranu 619
 
34619 ranu 620
            long lastMonthReturn = (lastMonthPartnerReturnOrderInfoModelMap.getOrDefault(fofoId,0L) + lastMonthRtoRefundOrderMap.getOrDefault(fofoId,0L));
621
 
34715 ranu 622
            Map<Integer, Double> lastMonthSecondary = orderRepository.selectOrderValueBetweenBillingDatesGroupByFofoId(Arrays.asList(fofoId),
34606 ranu 623
                    lastMontStartDate, lastMonthEndDate).stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getAmount()));
624
 
625
            double lastMonthSecondaryAchieved = lastMonthSecondary.getOrDefault(fofoId, 0.0);
626
 
34619 ranu 627
            double lastMonthNetSecondary = lastMonthSecondaryAchieved - lastMonthReturn;
34606 ranu 628
 
34701 ranu 629
            double lastMonthSecondaryPercent = lastMonthSecondaryTarget == 0 ? 0.0 : Math.round(Math.abs((lastMonthSecondaryAchieved / lastMonthSecondaryTarget) * 100));
34606 ranu 630
 
34641 ranu 631
            double lastMonthUnbilled = partnerWiseActivatedNotBilledTotalMap.get(lastMonth) != null ? partnerWiseActivatedNotBilledTotalMap.get(lastMonth).getTotalUnbilledAmount() : 0d;
34606 ranu 632
 
34619 ranu 633
//           last month tertiary
634
            Double lastMonthSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
635
                    lastMontStartDate, lastMonthEndDate, fofoId, false).get(fofoId);
636
 
637
 
638
//            two month ago secondary target
639
 
34703 ranu 640
            double twoMonthAgoSecondaryTarget = monthlyTargetRepository.selectByDateAndFofoId(twoMonthsAgo, fofoId) != null ? monthlyTargetRepository.selectByDateAndFofoId(twoMonthsAgo, fofoId).getPurchaseTarget() : 0;
34619 ranu 641
 
642
            long twoMonthAgoReturn = (twoMonthAgoPartnerReturnOrderInfoModelMap.getOrDefault(fofoId,0L) + twoMonthAgoRtoRefundOrderMap.getOrDefault(fofoId,0L));
643
 
34715 ranu 644
            Map<Integer, Double> twoMonthAgoSecondary = orderRepository.selectOrderValueBetweenBillingDatesGroupByFofoId(Arrays.asList(fofoId),
34606 ranu 645
                    twoMonthsAgoStartDate, twoMonthsAgoEndDate).stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getAmount()));
646
 
647
            double twoMonthAgoSecondaryAchieved = twoMonthAgoSecondary.getOrDefault(fofoId, 0.0);
648
 
34619 ranu 649
            double twoMonthAgoNetSecondary = twoMonthAgoSecondaryAchieved - twoMonthAgoReturn;
34606 ranu 650
 
34701 ranu 651
            double twoMonthAgoSecondaryPercent = twoMonthAgoSecondaryTarget == 0 ? 0.0 : Math.round(Math.abs((twoMonthAgoSecondaryAchieved / twoMonthAgoSecondaryTarget) * 100));
34619 ranu 652
 
34641 ranu 653
            double twoMonthAgoUnbilled = partnerWiseActivatedNotBilledTotalMap.get(twoMonthsAgo) != null ? partnerWiseActivatedNotBilledTotalMap.get(twoMonthsAgo).getTotalUnbilledAmount() : 0d;
34619 ranu 654
 
655
//          second Month Tertiary
656
            double twoMonthAgoSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
657
                    twoMonthsAgoStartDate, twoMonthsAgoEndDate, fofoId, false).get(fofoId);
658
 
659
 
660
            Map<YearMonth, BiSecondaryModel> monthlySecondaryModels = new HashMap<>();
661
 
662
            BiSecondaryModel currentMonthSecondaryModel = new BiSecondaryModel(
663
                    currentSecondaryTarget,
664
                    secondaryAchievedMtd,
665
                    currentMonthReturn,
666
                    currentMonthNetSecondary,
667
                    currentMonthSecondaryPercent,
668
                    mtdSale,
669
                    currentMonthUnbilled // for now, unbilled tertiary value
670
            );
671
 
672
            BiSecondaryModel lastMonthSecondaryModel = new BiSecondaryModel(
673
                    lastMonthSecondaryTarget,
674
                    lastMonthSecondaryAchieved,
675
                    lastMonthReturn,
676
                    lastMonthNetSecondary,
677
                    lastMonthSecondaryPercent,
678
                    lastMonthSale,
679
                    lastMonthUnbilled // for now, unbilled tertiary value
680
            );
681
 
682
            BiSecondaryModel twoMonthAgoSecondaryModel = new BiSecondaryModel(
683
                    twoMonthAgoSecondaryTarget,
684
                    twoMonthAgoSecondaryAchieved,
685
                    twoMonthAgoReturn,
686
                    twoMonthAgoNetSecondary,
687
                    twoMonthAgoSecondaryPercent,
688
                    twoMonthAgoSale,
689
                    twoMonthAgoUnbilled // for now, unbilled tertiary value
690
            );
691
 
692
            monthlySecondaryModels.put(currentMonth, currentMonthSecondaryModel);
693
            monthlySecondaryModels.put(lastMonth, lastMonthSecondaryModel);
694
            monthlySecondaryModels.put(twoMonthsAgo, twoMonthAgoSecondaryModel);
695
 
696
            allRetailerMonthlyData.put(fofoId, monthlySecondaryModels);
697
 
698
//            brandwiseStock value price
699
 
700
            Map<String, BrandStockPrice> brandStockPriceMap = inventoryService.getBrandWiseStockValue(fofoId);
701
 
702
            fofoBrandStockPriceMap.put(fofoId,brandStockPriceMap);
703
 
704
            double totalStockPrice = brandStockPriceMap.values().stream().mapToDouble(x->x.getTotalValue()).sum();
705
 
706
            fofoTotalStockPriceMap.put(fofoId,totalStockPrice);
707
 
708
            Map<String, Double> brandMtdTertiaryAmount = fofoOrderItemRepository.selectSumAmountGroupByBrand(
34722 ranu 709
                    currentMonthStartDate, currentMonthEndDate, fofoId);
34619 ranu 710
 
34719 ranu 711
 
34641 ranu 712
            fofoBrandMtdTertiaryMap.put(fofoId,brandMtdTertiaryAmount);
34619 ranu 713
 
714
            double totalMtdTertiaryAmount = brandMtdTertiaryAmount.values().stream().mapToDouble(Double::doubleValue).sum();
715
 
34641 ranu 716
            fofoTotalMtdTertiaryMap.put(fofoId,totalMtdTertiaryAmount);
34619 ranu 717
 
34719 ranu 718
            LOGGER.info("fofoTotalMtdTertiaryMap- {}",fofoTotalMtdTertiaryMap);
719
            LOGGER.info("fofoBrandMtdTertiaryMap- {}",fofoBrandMtdTertiaryMap);
720
 
721
 
34721 ranu 722
            List<BrandWiseModel> brandWiseMtdSecondary = orderRepository.selectAllBilledByCategoryOrderGroupByBrandFofoId(fofoId, currentMonthStartDate,Arrays.asList(10006,10009,10010));
34641 ranu 723
            Map<String,Long> brandWiseMtdSecondaryMap = brandWiseMtdSecondary.stream().collect(Collectors.toMap(BrandWiseModel::getBrand,BrandWiseModel::getAmount));
724
            fofoBrandWiseMtdSecondaryMap.put(fofoId,brandWiseMtdSecondaryMap);
34619 ranu 725
 
34641 ranu 726
            long mtdTotalSecondary = brandWiseMtdSecondary.stream().mapToLong(x -> x.getAmount() != 0 ? x.getAmount() : 0L).sum();
34619 ranu 727
 
34641 ranu 728
            fofoTotalMtdSecondaryMap.put(fofoId,mtdTotalSecondary);
729
 
730
            //            generate investment info
731
            FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
732
            float shortInvestment = partnerDailyInvestmentMap.get(fofoId) != null ? partnerDailyInvestmentMap.get(fofoId).getShortInvestment() : 0f;
733
            float agreedInvestment = partnerDailyInvestmentMap.get(fofoId) != null ? partnerDailyInvestmentMap.get(fofoId).getMinInvestment() : 0f;
34677 ranu 734
            float investmentLevel = partnerDailyInvestmentMap.get(fofoId) != null
735
                    ? Math.abs(((shortInvestment - agreedInvestment) / agreedInvestment) * 100)
736
                    : 0f;
34641 ranu 737
 
34677 ranu 738
 
34641 ranu 739
            List<Loan> fofoDefaultLoans = new ArrayList<>();
740
            if(defaultLoanMap != null){
741
                 fofoDefaultLoans  =  defaultLoanMap.get(fofoId);
742
                LOGGER.info("fofoDefaultLoans {}",fofoDefaultLoans);
743
            }
744
 
745
            float defaultLoanAmount = 0f;
746
            if(fofoDefaultLoans != null ){
747
                if (!fofoDefaultLoans.isEmpty()) {
748
                    defaultLoanAmount =  fofoDefaultLoans.stream().map(Loan::getPendingAmount).reduce(BigDecimal.ZERO, BigDecimal::add).floatValue(); // or .floatValue() directly
749
                }
750
            }
751
 
34719 ranu 752
            List<Loan> activeLoans = loanRepository.selectAllActiveLoan(fofoId);
34641 ranu 753
 
34719 ranu 754
            LOGGER.info("activeLoans- {}",activeLoans);
34641 ranu 755
 
34719 ranu 756
            float activeLoan = activeLoans.stream().map(Loan::getPendingAmount).reduce(BigDecimal.ZERO,BigDecimal::add).floatValue();
757
 
34641 ranu 758
            float poValue = partnerDailyInvestmentMap.get(fofoId) != null ?  partnerDailyInvestmentMap.get(fofoId).getUnbilledAmount() : 0f;
759
 
34719 ranu 760
            float poAndBilledValue = (float) (currentMonthNetSecondary + poValue);
34641 ranu 761
 
34724 ranu 762
            double todayRequiredDrr = rbmTargetService.calculateFofoIdTodayTarget(fofoId, currentMonthNetSecondary,LocalDate.now());
34641 ranu 763
 
764
            double monthDay1Drr = rbmTargetService.calculateFofoIdTodayTarget(fofoId,0d,YearMonth.now().atDay(1));
765
 
766
 
767
            double gotDrrPercent = (todayRequiredDrr / monthDay1Drr) * 100;
768
 
34701 ranu 769
            long drrPercentDisplay = Math.round(Math.abs(gotDrrPercent));
770
 
771
 
34641 ranu 772
            int orderId = orderRepository.getLastOrderByFofoId(fofoId);
773
 
34644 ranu 774
            // Determine alert level
775
            String alertLevel = "-";
776
            int lastPurchaseDays = 0;
34641 ranu 777
            if (orderId != 0) {
778
                Order order = orderRepository.selectById(orderId);
779
 
34715 ranu 780
                LOGGER.info("last billing order - {}",order);
781
 
34641 ranu 782
                // Calculate the number of days since the last purchase (billing)
34644 ranu 783
                lastPurchaseDays = (int) Duration.between(order.getCreateTimestamp().plusDays(1), LocalDateTime.now()).toDays();
34641 ranu 784
 
785
                if (lastPurchaseDays >= 11) {
786
                    alertLevel = "Alert for Management";
34676 ranu 787
                } else if (lastPurchaseDays >= 10) {
34641 ranu 788
                    alertLevel = " Alert for RSM/SH";
34676 ranu 789
                } else if (lastPurchaseDays >= 7) {
34641 ranu 790
                    alertLevel = "Must be Billed";
791
                } else if (lastPurchaseDays >= 3) {
792
                    alertLevel = "OK";
793
                } else {
34676 ranu 794
                    alertLevel = "OK";
34641 ranu 795
                }
34644 ranu 796
            }
34641 ranu 797
 
34644 ranu 798
            //investment modal set all related value
799
            FofoInvestmentModel fofoInvestmentModel = new FofoInvestmentModel();
34641 ranu 800
 
34644 ranu 801
            fofoInvestmentModel.setCounterPotential(fofoStore.getCounterPotential());
802
            fofoInvestmentModel.setShortInvestment(shortInvestment);
803
            fofoInvestmentModel.setDefaultLoan(defaultLoanAmount);
804
            fofoInvestmentModel.setInvestmentLevel(investmentLevel);
805
            fofoInvestmentModel.setActiveLoan(activeLoan);
806
            fofoInvestmentModel.setPoValue(poValue);
807
            fofoInvestmentModel.setPoAndBilled(poAndBilledValue);
808
            fofoInvestmentModel.setAgreedInvestment(agreedInvestment);
809
            fofoInvestmentModel.setWallet(partnerDailyInvestmentMap.get(fofoId) != null ? partnerDailyInvestmentMap.get(fofoId).getWalletAmount() : 0);
810
            fofoInvestmentModel.setMonthBeginingDrr(monthDay1Drr);
811
            fofoInvestmentModel.setRequiredDrr(todayRequiredDrr);
34701 ranu 812
            fofoInvestmentModel.setDrrPercent(drrPercentDisplay);
34644 ranu 813
            fofoInvestmentModel.setLastBillingDone(lastPurchaseDays);
814
            fofoInvestmentModel.setSlab(alertLevel);
34641 ranu 815
 
34644 ranu 816
            biInvestmentModelMap.put(fofoId, fofoInvestmentModel);
34641 ranu 817
                String assessment = "";
818
                if(defaultLoanAmount > 0 ){
819
                    assessment = "Loan Default";
820
                }else if(investmentLevel <= 75 && defaultLoanAmount < 1){
821
                    assessment = "Low Invest";
822
                }else {
823
                    assessment = "-";
824
                }
825
                assessmentMap.put(fofoId,assessment);
826
 
827
                String zeroBilling = "";
828
                if(currentMonthNetSecondary <= 100000 ){
829
                    zeroBilling = "Zero Billing";
830
                }else {
831
                    zeroBilling = "-";
832
                }
833
                zeroBillingMap.put(fofoId,zeroBilling);
834
 
835
                float billingNeeded = 0f;
34701 ranu 836
                if(drrPercentDisplay >= 110 ){
34641 ranu 837
                    billingNeeded = (float) todayRequiredDrr;
838
                }else {
839
                    billingNeeded = 0f;
840
                }
841
                billingNeededMap.put(fofoId,billingNeeded);
842
 
843
                int counta = 0;
34701 ranu 844
                if(defaultLoanAmount > 0 || investmentLevel <= 75 || currentMonthNetSecondary <= 100000 || drrPercentDisplay >= 110 ){
34641 ranu 845
                    counta = 1;
846
                }else {
847
                    counta = 0;
848
                }
849
                countAMap.put(fofoId,counta);
850
 
34606 ranu 851
        }
852
 
34619 ranu 853
        LOGGER.info("Total BI Retailers processed: {}", biRetailerModelMap.size());
34606 ranu 854
 
34619 ranu 855
        //generate excel and sent to mail
856
        List<List<String>> headerGroup = new ArrayList<>();
34606 ranu 857
 
34619 ranu 858
        List<String> headers1 = Arrays.asList(
34641 ranu 859
                "","","","",
34715 ranu 860
                "Retailer Detail", "","", "", "", "", "", "", "", "","","","",
34677 ranu 861
 
862
                twoMonthAgoStringValue, "", "", "", "", "", "",
863
                lastMonthStringValue, "", "", "", "", "", "",
34619 ranu 864
                currentMonthStringValue, "", "", "", "", "", "",
34641 ranu 865
 
866
                "","", "", "", "", "", "", "", "", "", "", "", "", "",
867
 
868
                "", "", "", "", "", "", "", "", "", "", "", "", "",
869
                "", "", "", "", "", "", "", "", "", "", "", "", ""
870
 
34619 ranu 871
        );
34606 ranu 872
 
34619 ranu 873
        List<String> headers2 = Arrays.asList(
34641 ranu 874
                "Assessment","Zero billing","Billing needed","Counta",
34715 ranu 875
                "BM","Partner Id","Link","Wallet Date","Creation Date","Code","Area",  "City", "Store Name", "Status","Category","Sales Manager", "RBM",
34619 ranu 876
                "Secondary Target", "Secondary Achieved", "Returns", "Net Secondary", "Secondary %",
877
                "Tertiary Sale", "Unbilled",
878
                "Secondary Target", "Secondary Achieved", "Returns", "Net Secondary", "Secondary %",
879
                "Tertiary Sale", "Unbilled",
880
                "Secondary Target", "Secondary Achieved", "Returns", "Net Secondary", "Secondary %",
881
                "Tertiary Sale", "Unbilled",
34641 ranu 882
                "Counter Potential", "Short investment", "Default", "INVESTMENT LEVEL", "Loan", "PO value", "Agreed investment",
883
                "Wallet", "po+bill", "MONTH BEGINNING DRR", "REQ DRR", "Drr %", "Last billing Done", "Slab",
34606 ranu 884
 
34721 ranu 885
              "Total Stock",  "Apple","Xiaomi", "Vivo", "Tecno", "Samsung", "Realme", "Oppo", "OnePlus", "POCO", "Lava", "Itel", "Almost New",
886
              "Total Secondary", "Apple", "Xiaomi", "Vivo", "Tecno", "Samsung", "Realme", "Oppo", "OnePlus", "POCO", "Lava", "Itel", "Almost New",
887
              "Total Tertiary",  "Apple", "Xiaomi", "Vivo", "Tecno", "Samsung", "Realme", "Oppo", "OnePlus", "POCO", "Lava", "Itel", "Almost New"
34619 ranu 888
        );
889
 
890
        headerGroup.add(headers1);
891
        headerGroup.add(headers2);
892
 
893
 
894
        List<List<?>> rows = new ArrayList<>();
895
        for (Map.Entry<Integer, BIRetailerModel> entry : biRetailerModelMap.entrySet()) {
896
            Integer fofoId = entry.getKey();
34715 ranu 897
            User user = userRepository.selectById(fofoId);
898
            LocalDateTime walletCreationDate = userWalletHistoryRepository.selectFirstCreatedDate(fofoId);
34619 ranu 899
            BIRetailerModel retailer = entry.getValue();
34641 ranu 900
 
34619 ranu 901
            Map<YearMonth, BiSecondaryModel> monthlyData = allRetailerMonthlyData.get(fofoId);
902
 
903
            BiSecondaryModel current = monthlyData.getOrDefault(YearMonth.now(), new BiSecondaryModel(0,0,0,0,0,0,0));
904
            BiSecondaryModel last = monthlyData.getOrDefault(YearMonth.now().minusMonths(1), new BiSecondaryModel(0,0,0,0,0,0,0));
905
            BiSecondaryModel twoAgo = monthlyData.getOrDefault(YearMonth.now().minusMonths(2), new BiSecondaryModel(0,0,0,0,0,0,0));
906
 
907
            List<Object> row = new ArrayList<>();
908
            row.addAll(Arrays.asList(
34641 ranu 909
                    assessmentMap.get(fofoId),zeroBillingMap.get(fofoId),billingNeededMap.get(fofoId),countAMap.get(fofoId),
34715 ranu 910
                    retailer.getBmName(),fofoId ,"https://partners.smartdukaan.com/partnerPerformance?fofoId="+fofoId,walletCreationDate,user.getCreateTimestamp(), retailer.getCode(), retailer.getArea(), retailer.getCity(),  retailer.getStoreName(), retailer.getStatus(),
34677 ranu 911
                    retailer.getCategory(),  retailer.getSalesManager(), retailer.getRbm()
912
 
34619 ranu 913
            ));
914
 
34677 ranu 915
 
916
            // Two Months Ago
34619 ranu 917
            row.addAll(Arrays.asList(
34677 ranu 918
                    twoAgo.getSecondaryTarget(),
919
                    twoAgo.getSecondaryAchieved(),
920
                    twoAgo.getSecondaryReturn(),
921
                    twoAgo.getNetSecondary(),
34704 ranu 922
                    twoAgo.getSecondaryAchievedPercent()+"%",
34677 ranu 923
                    twoAgo.getTertiary(),
924
                    twoAgo.getTertiaryUnBilled()
34619 ranu 925
            ));
926
 
927
            // Last Month
928
            row.addAll(Arrays.asList(
929
                    last.getSecondaryTarget(),
930
                    last.getSecondaryAchieved(),
931
                    last.getSecondaryReturn(),
932
                    last.getNetSecondary(),
34704 ranu 933
                    last.getSecondaryAchievedPercent()+"%",
34619 ranu 934
                    last.getTertiary(),
935
                    last.getTertiaryUnBilled()
936
            ));
937
 
34677 ranu 938
            // Current Month
34619 ranu 939
            row.addAll(Arrays.asList(
34677 ranu 940
                    current.getSecondaryTarget(),
941
                    current.getSecondaryAchieved(),
942
                    current.getSecondaryReturn(),
943
                    current.getNetSecondary(),
34704 ranu 944
                    current.getSecondaryAchievedPercent()+"%",
34677 ranu 945
                    current.getTertiary(),
946
                    current.getTertiaryUnBilled()
34619 ranu 947
            ));
34677 ranu 948
 
949
 
950
 
34641 ranu 951
            FofoInvestmentModel fofoInvestmentModelValue = biInvestmentModelMap.get(fofoId);
952
            if(fofoInvestmentModelValue != null){
953
                row.addAll(Arrays.asList(
954
                        fofoInvestmentModelValue.getCounterPotential(),
955
                        fofoInvestmentModelValue.getShortInvestment(),
956
                        fofoInvestmentModelValue.getDefaultLoan(),
957
                        fofoInvestmentModelValue.getInvestmentLevel(),
34715 ranu 958
                       "-"+fofoInvestmentModelValue.getActiveLoan(),
34641 ranu 959
                        fofoInvestmentModelValue.getPoValue(),
960
                        fofoInvestmentModelValue.getAgreedInvestment(),
961
                        fofoInvestmentModelValue.getWallet(),
962
                        fofoInvestmentModelValue.getPoAndBilled(),
963
                        fofoInvestmentModelValue.getMonthBeginingDrr(),
964
                        fofoInvestmentModelValue.getRequiredDrr(),
34704 ranu 965
                        fofoInvestmentModelValue.getDrrPercent()+"%",
34641 ranu 966
                        fofoInvestmentModelValue.getLastBillingDone(),
967
                        fofoInvestmentModelValue.getSlab()
968
                ));
969
            }else {
970
                row.addAll(Arrays.asList(
971
                        "-","-","-","-","-","-","-","-","-","-","-",""
972
                ));
973
            }
974
 
975
            Map<String, BrandStockPrice> brandStockMap = fofoBrandStockPriceMap.get(fofoId);
34619 ranu 976
            row.addAll(Arrays.asList(
977
                    fofoTotalStockPriceMap.getOrDefault(fofoId, 0.0),
34641 ranu 978
                    brandStockMap.get("Apple") != null ? brandStockMap.get("Apple").getTotalValue() : 0.0,
979
                    brandStockMap.get("Xiaomi") != null ? brandStockMap.get("Xiaomi").getTotalValue() : 0.0,
980
                    brandStockMap.get("Vivo") != null ? brandStockMap.get("Vivo").getTotalValue() : 0.0,
981
                    brandStockMap.get("Tecno") != null ? brandStockMap.get("Tecno").getTotalValue() : 0.0,
982
                    brandStockMap.get("Samsung") != null ? brandStockMap.get("Samsung").getTotalValue() : 0.0,
983
                    brandStockMap.get("Realme") != null ? brandStockMap.get("Realme").getTotalValue() : 0.0,
984
                    brandStockMap.get("Oppo") != null ? brandStockMap.get("Oppo").getTotalValue() : 0.0,
985
                    brandStockMap.get("OnePlus") != null ? brandStockMap.get("OnePlus").getTotalValue() : 0.0,
34721 ranu 986
                    brandStockMap.get("POCO") != null ? brandStockMap.get("POCO").getTotalValue() : 0.0,
34641 ranu 987
                    brandStockMap.get("Lava") != null ? brandStockMap.get("Lava").getTotalValue() : 0.0,
988
                    brandStockMap.get("Itel") != null ? brandStockMap.get("Itel").getTotalValue() : 0.0,
989
                    brandStockMap.get("Almost New") != null ? brandStockMap.get("Almost New").getTotalValue() : 0.0
34619 ranu 990
            ));
991
 
34641 ranu 992
            Map<String, Long> brandSecondaryMap = fofoBrandWiseMtdSecondaryMap.get(fofoId);
993
            row.addAll(Arrays.asList(
34648 ranu 994
                    fofoTotalMtdSecondaryMap.get(fofoId),
34641 ranu 995
                    brandSecondaryMap.getOrDefault("Apple", 0L),
996
                    brandSecondaryMap.getOrDefault("Xiaomi", 0L),
997
                    brandSecondaryMap.getOrDefault("Vivo", 0L),
998
                    brandSecondaryMap.getOrDefault("Tecno", 0L),
999
                    brandSecondaryMap.getOrDefault("Samsung", 0L),
1000
                    brandSecondaryMap.getOrDefault("Realme", 0L),
1001
                    brandSecondaryMap.getOrDefault("Oppo", 0L),
1002
                    brandSecondaryMap.getOrDefault("OnePlus", 0L),
34721 ranu 1003
                    brandSecondaryMap.getOrDefault("POCO", 0L),
34641 ranu 1004
                    brandSecondaryMap.getOrDefault("Lava", 0L),
1005
                    brandSecondaryMap.getOrDefault("Itel", 0L),
1006
                    brandSecondaryMap.getOrDefault("Almost New", 0L)
1007
            ));
1008
 
1009
            Map<String, Double> brandTertiaryMap = fofoBrandMtdTertiaryMap.get(fofoId);
1010
            row.addAll(Arrays.asList(
34648 ranu 1011
                    fofoTotalMtdTertiaryMap.get(fofoId),
34641 ranu 1012
                    brandTertiaryMap.getOrDefault("Apple", 0d),
1013
                    brandTertiaryMap.getOrDefault("Xiaomi", 0d),
1014
                    brandTertiaryMap.getOrDefault("Vivo", 0d),
1015
                    brandTertiaryMap.getOrDefault("Tecno", 0d),
1016
                    brandTertiaryMap.getOrDefault("Samsung", 0d),
1017
                    brandTertiaryMap.getOrDefault("Realme", 0d),
1018
                    brandTertiaryMap.getOrDefault("Oppo", 0d),
1019
                    brandTertiaryMap.getOrDefault("OnePlus", 0d),
34721 ranu 1020
                    brandTertiaryMap.getOrDefault("POCO", 0d),
34641 ranu 1021
                    brandTertiaryMap.getOrDefault("Lava", 0d),
1022
                    brandTertiaryMap.getOrDefault("Itel", 0d),
1023
                    brandTertiaryMap.getOrDefault("Almost New", 0d)
1024
            ));
1025
            rows.add(row);
34619 ranu 1026
        }
1027
 
1028
 
34641 ranu 1029
        // Send to email
1030
//        ByteArrayOutputStream csvStream = FileUtil.getCSVByteStreamWithMultiHeaders(headerGroup, rows);
1031
        ByteArrayOutputStream csvStream = getExcelStreamWithMultiHeaders(headerGroup, rows);
1032
        String fileName = "BI-Retailer-Monthly-Report-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".xlsx";
34722 ranu 1033
        String[] sendToArray = new String[]{"ranu.rajput@smartdukaan.com","ashutosh.verma@smartdukaan.com","sm@smartdukaan.com","raj.singh@smartdukaan.com"};
1034
//        String[] sendToArray = new String[]{"ranu.rajput@smartdukaan.com"};
34619 ranu 1035
 
1036
        Utils.sendMailWithAttachment(googleMailSender, sendToArray, new String[]{}, "BI Retailer Monthly Report", "Please find attached the BI retailer secondary/tertiary monthly report.", fileName, new ByteArrayResource(csvStream.toByteArray()));
1037
 
1038
 
34606 ranu 1039
    }
1040
 
34641 ranu 1041
    public static ByteArrayOutputStream getExcelStreamWithMultiHeaders(List<List<String>> headerGroup, List<List<?>> rows) {
1042
        Workbook workbook = new XSSFWorkbook();
1043
        Sheet sheet = workbook.createSheet("BI Report");
34715 ranu 1044
        CreationHelper creationHelper = workbook.getCreationHelper();
34641 ranu 1045
        int rowIndex = 0;
34606 ranu 1046
 
34641 ranu 1047
        CellStyle centeredStyle = workbook.createCellStyle();
1048
        centeredStyle.setAlignment(HorizontalAlignment.CENTER); // Center horizontally
1049
        centeredStyle.setVerticalAlignment(VerticalAlignment.CENTER); // Center vertically
34606 ranu 1050
 
34641 ranu 1051
    // Optional: bold font
1052
        Font font1 = workbook.createFont();
1053
        font1.setBold(true);
1054
        centeredStyle.setFont(font1);
34606 ranu 1055
 
34619 ranu 1056
 
34641 ranu 1057
 
1058
        // Create styles
1059
        Map<String, CellStyle> headerStyles = new HashMap<>();
1060
 
1061
        // fontPurpleStyle
1062
        CellStyle purpleStyle = workbook.createCellStyle();
1063
        purpleStyle.setFillForegroundColor(IndexedColors.ROSE.getIndex());
1064
        purpleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
1065
        purpleStyle.setFont(font1);
1066
        headerStyles.put("Assessment", purpleStyle);
1067
        headerStyles.put("Zero billing", purpleStyle);
1068
        headerStyles.put("Billing needed", purpleStyle);
1069
        headerStyles.put("Counta", purpleStyle);
1070
        headerStyles.put("MONTH BEGINNING DRR", purpleStyle);
1071
        headerStyles.put("REQ DRR", purpleStyle);
1072
        headerStyles.put("Drr %", purpleStyle);
1073
 
1074
        // Light Blue
1075
        CellStyle blueStyle = workbook.createCellStyle();
1076
        blueStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());
1077
        blueStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
1078
        blueStyle.setFont(font1);
1079
        headerStyles.put("Code", blueStyle);
1080
        headerStyles.put("Store Name", blueStyle);
1081
        headerStyles.put("City", blueStyle);
1082
        headerStyles.put("Area", blueStyle);
1083
        headerStyles.put("BM", blueStyle);
1084
        headerStyles.put("RBM", blueStyle);
1085
        headerStyles.put("Sales Manager", blueStyle);
1086
        headerStyles.put("Status", blueStyle);
1087
        headerStyles.put("Category", blueStyle);
34715 ranu 1088
        headerStyles.put("Wallet Date", blueStyle);
1089
        headerStyles.put("Creation Date", blueStyle);
1090
        headerStyles.put("Partner Id", blueStyle);
34641 ranu 1091
 
34715 ranu 1092
        //for link
1093
        // Create hyperlink style
1094
        CellStyle hyperlinkStyle = workbook.createCellStyle();
1095
        Font hlinkFont = workbook.createFont();
1096
        hlinkFont.setUnderline(Font.U_SINGLE);
1097
        hlinkFont.setColor(IndexedColors.BLUE.getIndex());
1098
        hyperlinkStyle.setFont(hlinkFont);
1099
 
1100
 
34641 ranu 1101
        // Light Yellow
1102
        CellStyle yellowStyle = workbook.createCellStyle();
1103
        yellowStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
1104
        yellowStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
1105
        yellowStyle.setFont(font1);
1106
        headerStyles.put("Last billing Done", yellowStyle);
1107
        headerStyles.put("Total Stock", yellowStyle);
1108
 
1109
        // Light Orange
1110
        CellStyle orangeStyle = workbook.createCellStyle();
1111
        orangeStyle.setFillForegroundColor(IndexedColors.LIGHT_ORANGE.getIndex());
1112
        orangeStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
1113
        orangeStyle.setFont(font1);
1114
        headerStyles.put("Total Tertiary", orangeStyle);
1115
        headerStyles.put("Total Secondary", orangeStyle);
1116
        headerStyles.put("Default", orangeStyle);
1117
 
1118
 
1119
        // Light green
1120
        CellStyle lightGreenStyle = workbook.createCellStyle();
1121
        lightGreenStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
1122
        lightGreenStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
1123
        lightGreenStyle.setFont(font1);
1124
        headerStyles.put("Short investment", lightGreenStyle);
1125
        headerStyles.put("INVESTMENT LEVEL", lightGreenStyle);
1126
        headerStyles.put("Loan", lightGreenStyle);
1127
        headerStyles.put("PO value", lightGreenStyle);
1128
        headerStyles.put("Agreed investment", lightGreenStyle);
1129
        headerStyles.put("Wallet", lightGreenStyle);
1130
        headerStyles.put("po+bill", lightGreenStyle);
1131
 
1132
        // Light Green
1133
        CellStyle secondary1 = createStyle(workbook, IndexedColors.LIGHT_GREEN);
1134
        CellStyle secondary2 = createStyle(workbook, IndexedColors.LIGHT_YELLOW);
1135
        CellStyle secondary3 = createStyle(workbook, IndexedColors.LIGHT_ORANGE);
1136
 
1137
        Map<String, CellStyle> brandStyles = new HashMap<>();
1138
        brandStyles.put("Apple", createStyle(workbook, IndexedColors.GREY_25_PERCENT));
1139
        brandStyles.put("Xiaomi", createStyle(workbook, IndexedColors.ORANGE));
1140
        brandStyles.put("Vivo", createStyle(workbook, IndexedColors.SKY_BLUE));
1141
        brandStyles.put("Tecno", createStyle(workbook, IndexedColors.LIGHT_BLUE));
1142
        brandStyles.put("Samsung", createStyle(workbook, IndexedColors.ROYAL_BLUE));
1143
        brandStyles.put("Realme", createStyle(workbook, IndexedColors.YELLOW));
1144
        brandStyles.put("Oppo", createStyle(workbook, IndexedColors.LIGHT_GREEN));
1145
        brandStyles.put("OnePlus", createStyle(workbook, IndexedColors.RED));
34721 ranu 1146
        brandStyles.put("POCO", createStyle(workbook, IndexedColors.ORANGE));
34641 ranu 1147
        brandStyles.put("Lava", createStyle(workbook, IndexedColors.LIGHT_YELLOW));
1148
        brandStyles.put("Itel", createStyle(workbook, IndexedColors.LIGHT_YELLOW));
1149
        brandStyles.put("Almost New", createStyle(workbook, IndexedColors.WHITE));
1150
 
1151
 
1152
        CellStyle defaultHeaderStyle = workbook.createCellStyle();
1153
        defaultHeaderStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
1154
        defaultHeaderStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
1155
        defaultHeaderStyle.setFont(font1);
1156
 
1157
 
1158
        Map<String, Integer> headerCount = new HashMap<>();
1159
 
1160
        for (int headerRowIndex = 0; headerRowIndex < headerGroup.size(); headerRowIndex++) {
1161
            List<String> headerRow = headerGroup.get(headerRowIndex);
1162
            Row row = sheet.createRow(rowIndex++);
1163
 
1164
            for (int i = 0; i < headerRow.size(); i++) {
1165
                String headerText = headerRow.get(i);
1166
                sheet.setColumnWidth(i, 25 * 256);
1167
                row.setHeightInPoints(20); // 25-point height
1168
                Cell cell = row.createCell(i);
1169
                cell.setCellValue(headerText);
1170
                cell.setCellStyle(centeredStyle);
1171
                // Count how many times this header has appeared
1172
                int count = headerCount.getOrDefault(headerText, 0) + 1;
1173
                headerCount.put(headerText, count);
1174
                // Apply special style for repeated headers
1175
                if (headerText.equals("Secondary Target") || headerText.equals("Secondary Achieved") || headerText.equals("Returns") || headerText.equals("Net Secondary") || headerText.equals("Secondary %") || headerText.equals("Tertiary Sale") || headerText.equals("Unbilled")) {
1176
                    if (count == 1) {
1177
                        cell.setCellStyle(secondary1);
1178
                    } else if (count == 2) {
1179
                        cell.setCellStyle(secondary2);
1180
                    } else if (count == 3) {
1181
                        cell.setCellStyle(secondary3);
1182
                    }
1183
                }
1184
                // Brand header styling (apply only for the 2nd row of headers)
1185
                else if (headerRowIndex == 1 && brandStyles.containsKey(headerText)) {
1186
                    cell.setCellStyle(brandStyles.get(headerText));
1187
                }else if (headerStyles.containsKey(headerText)) {
1188
                    cell.setCellStyle(headerStyles.get(headerText));
1189
                } else {
1190
                    cell.setCellStyle(defaultHeaderStyle); // default style for others
1191
                }
1192
            }
1193
        }
1194
 
1195
        // Write data rows
1196
        for (List<?> dataRow : rows) {
1197
            Row row = sheet.createRow(rowIndex++);
1198
            for (int i = 0; i < dataRow.size(); i++) {
1199
                Cell cell = row.createCell(i);
1200
                Object value = dataRow.get(i);
34715 ranu 1201
 
1202
                if (i == 6 && value != null) { // Assuming column 6 is "Link"
1203
                    Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL);
1204
                    hyperlink.setAddress(value.toString());
34719 ranu 1205
                    cell.setCellValue("View Link"); // Display text
34715 ranu 1206
                    cell.setHyperlink(hyperlink);
1207
                    cell.setCellStyle(hyperlinkStyle);
34719 ranu 1208
                } else if (value instanceof Number) {
1209
                    cell.setCellValue(((Number) value).doubleValue());
34715 ranu 1210
                } else {
1211
                    cell.setCellValue(value != null ? value.toString() : "");
1212
                }
34641 ranu 1213
            }
34719 ranu 1214
 
34641 ranu 1215
        }
1216
 
1217
        // Auto-size columns
1218
        if (!rows.isEmpty()) {
1219
            for (int i = 0; i < rows.get(0).size(); i++) {
1220
                sheet.autoSizeColumn(i);
1221
            }
1222
        }
1223
 
1224
        // Output as ByteArray
1225
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
1226
            workbook.write(outputStream);
1227
            workbook.close();
1228
            return outputStream;
1229
        } catch (IOException e) {
1230
            throw new RuntimeException("Failed to generate Excel file", e);
1231
        }
1232
    }
1233
 
1234
 
1235
    private static CellStyle createStyle(Workbook workbook, IndexedColors color) {
1236
        CellStyle style = workbook.createCellStyle();
1237
        style.setFillForegroundColor(color.getIndex());
1238
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
1239
        Font font = workbook.createFont();
1240
        font.setBold(true);
1241
        style.setFont(font);
1242
        return style;
1243
    }
1244
 
1245
 
1246
 
1247
 
34306 ranu 1248
}