Rev 34411 | Rev 34606 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
package com.smartdukaan.cron.scheduled;import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;import com.spice.profitmandi.common.model.ProfitMandiConstants;import com.spice.profitmandi.dao.cart.CartService;import com.spice.profitmandi.dao.cart.SmartCartService;import com.spice.profitmandi.dao.entity.auth.AuthUser;import com.spice.profitmandi.dao.entity.fofo.FofoStore;import com.spice.profitmandi.dao.entity.fofo.PartnerType;import com.spice.profitmandi.dao.entity.fofo.RbmRating;import com.spice.profitmandi.dao.entity.fofo.SalesRating;import com.spice.profitmandi.dao.entity.transaction.Loan;import com.spice.profitmandi.dao.entity.transaction.Transaction;import com.spice.profitmandi.dao.entity.user.User;import com.spice.profitmandi.dao.enumuration.cs.EscalationType;import com.spice.profitmandi.dao.repository.cs.CsService;import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;import com.spice.profitmandi.dao.repository.fofo.RbmRatingRepository;import com.spice.profitmandi.dao.repository.fofo.SalesRatingRepository;import com.spice.profitmandi.dao.repository.transaction.LoanRepository;import com.spice.profitmandi.dao.repository.transaction.TransactionRepository;import com.spice.profitmandi.dao.repository.user.UserRepository;import com.spice.profitmandi.service.transaction.SDCreditService;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.javamail.MimeMessageHelper;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Transactional;import javax.mail.MessagingException;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import java.io.IOException;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.temporal.ChronoUnit;import java.util.*;import java.util.stream.Collectors;@Component@Transactional(rollbackFor = {Throwable.class, ProfitMandiBusinessException.class})public class ScheduledTasksTest {private static final Logger LOGGER = LogManager.getLogger(ScheduledTasksTest.class);@AutowiredTransactionRepository transactionRepository;@AutowiredLoanRepository loanRepository;@AutowiredSDCreditService sdCreditService;@AutowiredUserRepository userRepository;@AutowiredCsService csService;@AutowiredRbmRatingRepository rbmRatingRepository;@Autowiredprivate JavaMailSender mailSender;@AutowiredSalesRatingRepository salesRatingRepository;@AutowiredFofoStoreRepository fofoStoreRepository;@AutowiredSmartCartService smartCartService;public void test() throws Exception {System.out.println("test start");smartCartService.activatedButNotBilledCatalogQtyMap();System.out.println("test end");}public void createLoanForBillingByTransactionIdAndInvoiceNumber(int transactionId, double invoiceAmount, String invoiceNumber) throws Exception {sdCreditService.createLoanForBilling(transactionId, invoiceAmount, invoiceNumber);}private void sendMailHtmlFormat(String email[], String body, String cc[], String bcc[], String subject)throws MessagingException, ProfitMandiBusinessException, IOException {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message);helper.setSubject(subject);helper.setText(body, true);helper.setTo(email);if (cc != null) {helper.setCc(cc);}if (bcc != null) {helper.setBcc(bcc);}InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "Smart Dukaan");helper.setFrom(senderAddress);mailSender.send(message);}public Map<Integer,Integer> findLoanTransactionMapingAccordingLoan(List<Integer> loanIds) throws ProfitMandiBusinessException {Map<Integer, Integer> transactionLoanMap = new HashMap<>();for(int loanId : loanIds){Transaction transaction = null;Loan loan = loanRepository.selectByLoanId(loanId);List<Transaction> transactions = transactionRepository.selectByRetailerId(loan.getFofoId());LocalDateTime nearestDateTime = transactions.stream().map(x -> x.getCreateTimestamp()).min(Comparator.comparingLong(x -> Math.abs(ChronoUnit.MILLIS.between(x, loan.getCreatedOn())))).orElse(null);if (nearestDateTime != null && loan.getCreatedOn().plusMinutes(2).isAfter(nearestDateTime) &&loan.getCreatedOn().minusMinutes(1).isBefore(nearestDateTime)) {// Here transaction is still nulltransaction = transactions.stream().filter(x -> x.getCreateTimestamp().equals(nearestDateTime)).findFirst().get();transactionLoanMap.put(transaction.getId(), loanId);}}LOGGER.info("transactionLoanMap {}",transactionLoanMap);return transactionLoanMap;}public void sendRbmFeedbackSummaryEmail() throws MessagingException, ProfitMandiBusinessException, IOException {LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();LocalDateTime endOfMonth = LocalDateTime.now();String[] bcc = {"tarun.verma@smartdukaan.com"};// Get all RBM usersList<AuthUser> authUsers = csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_RBM,Arrays.asList(EscalationType.L1));if (authUsers.isEmpty()) {LOGGER.info("No RBMs found.");return;}List<Integer> rbmIds = authUsers.stream().map(AuthUser::getId).collect(Collectors.toList());// Fetch ratings for all RBMs for current monthList<RbmRating> feedbackList = rbmRatingRepository.selectByRbmIdsAndDateRange(rbmIds, startOfMonth, endOfMonth);if (feedbackList.isEmpty()) {LOGGER.info("No feedback entries found for RBMs.");return;}// Sort feedback by createTimeStamp DESCfeedbackList.sort((a, b) -> b.getCreateTimeStamp().compareTo(a.getCreateTimeStamp()));// Fetch and map FOFO (partner) namesMap<Integer, String> fofoNameMap = new HashMap<>();for (RbmRating rating : feedbackList) {int fofoId = rating.getFofoId();if (!fofoNameMap.containsKey(fofoId)) {User fofoUser = userRepository.selectById(fofoId);FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);String partnerName = fofoUser != null ? fofoUser.getName() : "Unknown Partner";String storeCode = fofoStore != null ? fofoStore.getCode() : "Unknown Code";String displayName = partnerName + " (" + storeCode + ")";fofoNameMap.put(fofoId, displayName);}}// Map RBM ID to name for quick lookupMap<Integer, String> rbmNameMap = authUsers.stream().collect(Collectors.toMap(AuthUser::getId, AuthUser::getFullName));// Generate HTML contentStringBuilder emailContent = new StringBuilder();emailContent.append("<html><body>");emailContent.append("<p>Dear Team,</p>");emailContent.append("<p>Here is the <b>latest RBM Rating and Feedback Summary</b> for ").append(LocalDate.now().getMonth()).append(":</p>");emailContent.append("<table border='1' cellspacing='0' cellpadding='5'>");emailContent.append("<tr>").append("<th>RBM Name</th>").append("<th>Partner Name</th>").append("<th>Rating</th>").append("<th>Comment</th>").append("<th>Date</th>").append("</tr>");for (RbmRating rating : feedbackList) {String rbmName = rbmNameMap.getOrDefault(rating.getRbmId(), "Unknown RBM");String partnerName = fofoNameMap.getOrDefault(rating.getFofoId(), "Unknown Partner");emailContent.append("<tr>").append("<td>").append(rbmName).append("</td>").append("<td>").append(partnerName).append("</td>").append("<td>").append(rating.getRating()).append("</td>").append("<td>").append(rating.getComment() != null ? rating.getComment() : "-").append("</td>").append("<td>").append(rating.getCreateTimeStamp().toLocalDate()).append("</td>").append("</tr>");}emailContent.append("</table>");emailContent.append("<br><p>Regards,<br>Smart Dukaan Team</p>");emailContent.append("</body></html>");String subject = "Monthly RBM Feedback Summary - " + LocalDate.now().getMonth();List<String> sendTo = new ArrayList<>();sendTo.add("sm@smartdukaan.com"); //sendTo.add("chiranjib.sarkar@smartdukaan.com"); //sendTo.add("kamini.sharma@smartdukaan.com"); //String[] emailRecipients = sendTo.toArray(new String[0]);this.sendMailHtmlFormat(emailRecipients, emailContent.toString(), null, bcc, subject);LOGGER.info("Consolidated RBM feedback summary email sent.");}@AutowiredPartnerTypeChangeService partnerTypeChangeService;public void sendSalesFeedbackSummaryEmail() throws MessagingException, ProfitMandiBusinessException, IOException {LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();LocalDateTime endOfMonth = LocalDateTime.now();String[] bcc = {"tarun.verma@smartdukaan.com"};// String[] bcc = {"tejus.lohani@smartdukaan.com"};// Get all RBM usersList<AuthUser> authUsers = csService.getAuthUserIds(ProfitMandiConstants.TICKET_CATEGORY_SALES,Arrays.asList(EscalationType.L1));if (authUsers.isEmpty()) {LOGGER.info("No sales person found.");return;}List<Integer> salesL1Ids = authUsers.stream().map(AuthUser::getId).collect(Collectors.toList());// Fetch ratings for all RBMs for current monthList<SalesRating> feedbackList = salesRatingRepository.selectBySalesL1IdsAndDateRange(salesL1Ids, startOfMonth, endOfMonth);if (feedbackList.isEmpty()) {LOGGER.info("No feedback entries found for Sales.");return;}// Sort feedback by createTimeStamp DESCfeedbackList.sort((a, b) -> b.getCreateTimeStamp().compareTo(a.getCreateTimeStamp()));// Fetch and map FOFO (partner) namesMap<Integer, String> fofoNameMap = new HashMap<>();for (SalesRating rating : feedbackList) {int fofoId = rating.getFofoId();if (!fofoNameMap.containsKey(fofoId)) {User fofoUser = userRepository.selectById(fofoId);FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);String partnerName = fofoUser != null ? fofoUser.getName() : "Unknown Partner";String storeCode = fofoStore != null ? fofoStore.getCode() : "Unknown Code";String displayName = partnerName + " (" + storeCode + ")";fofoNameMap.put(fofoId, displayName);}}// Map RBM ID to name for quick lookupMap<Integer, String> salesL1NameMap = authUsers.stream().collect(Collectors.toMap(AuthUser::getId, AuthUser::getFullName));// Generate HTML contentStringBuilder emailContent = new StringBuilder();emailContent.append("<html><body>");emailContent.append("<p>Dear Team,</p>");emailContent.append("<p>Here is the <b>latest Sales L1 Rating and Feedback Summary</b> for ").append(LocalDate.now().getMonth()).append(":</p>");emailContent.append("<table border='1' cellspacing='0' cellpadding='5'>");emailContent.append("<tr>").append("<th>Sales L1 Name</th>").append("<th>Partner Name</th>").append("<th>Partner Category</th>").append("<th>Rating</th>").append("<th>Comment</th>").append("<th>Date</th>").append("</tr>");for (SalesRating rating : feedbackList) {String salesL1 = salesL1NameMap.getOrDefault(rating.getSalesL1Id(), "Unknown Sales Person");String partnerName = fofoNameMap.getOrDefault(rating.getFofoId(), "Unknown Partner");PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(rating.getFofoId(), LocalDate.now());emailContent.append("<tr>").append("<td>").append(salesL1).append("</td>").append("<td>").append(partnerName).append("</td>").append("<td>").append(partnerType).append("</td>").append("<td>").append(rating.getRating()).append("</td>").append("<td>").append(rating.getComment() != null ? rating.getComment() : "-").append("</td>").append("<td>").append(rating.getCreateTimeStamp().toLocalDate()).append("</td>").append("</tr>");}emailContent.append("</table>");emailContent.append("<br><p>Regards,<br>Smartdukaan Team</p>");emailContent.append("</body></html>");String subject = "Monthly Sales L1 Feedback Summary Test test - " + LocalDate.now().getMonth();List<String> sendTo = new ArrayList<>();sendTo.add("sm@smartdukaan.com"); //sendTo.add("chiranjib.sarkar@smartdukaan.com"); //sendTo.add("kamini.sharma@smartdukaan.com"); //String[] emailRecipients = sendTo.toArray(new String[0]);this.sendMailHtmlFormat(emailRecipients, emailContent.toString(), null, bcc, subject);LOGGER.info("Consolidated Sales L1 feedback summary email sent.");}}