Subversion Repositories SmartDukaan

Rev

Rev 34592 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.spice.profitmandi.dao.service;

import com.spice.profitmandi.common.model.BulkOrderModel;
import com.spice.profitmandi.common.model.ProfitMandiConstants;
import com.spice.profitmandi.common.util.StringUtils;
import com.spice.profitmandi.dao.entity.catalog.Bid;
import com.spice.profitmandi.dao.entity.catalog.Item;
import com.spice.profitmandi.dao.entity.catalog.Liquidation;
import com.spice.profitmandi.dao.entity.catalog.TagListing;
import com.spice.profitmandi.dao.entity.inventory.SaholicCISTable;
import com.spice.profitmandi.dao.repository.catalog.BidRepository;
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
import com.spice.profitmandi.dao.repository.catalog.LiquidationRepository;
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
import com.spice.profitmandi.dao.repository.inventory.SaholicCISTableRepository;
import com.spice.profitmandi.service.NotificationService;
import com.spice.profitmandi.service.order.BulkOrderService;
import com.spice.profitmandi.service.whatsapp.WhatsappMessageType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.*;

@Component
public class LiquidationService {
    private static final Logger LOGGER = LogManager.getLogger(LiquidationService.class);

    @Autowired
    BidRepository bidRepository;

    @Autowired
    LiquidationRepository liquidationRepository;

    @Autowired
    private ItemRepository itemRepository;

    @Autowired
    private BidService bidService;

    @Autowired
    SaholicCISTableRepository saholicCISTableRepository;

    @Autowired
    private BulkOrderService bulkOrderService;

    @Autowired
    private TagListingRepository tagListingRepository;

    @Autowired
    private NotificationService notificationService;

    public void processBids(ProfitMandiConstants.BID_CRON_ENUM type) throws Exception {
        List<Liquidation> liquidations;
        boolean canRefund = true;
        List<Map<String, Object>> liquidationList = new ArrayList<>();
        if (type.equals(ProfitMandiConstants.BID_CRON_ENUM.YESTERDAY)){
            liquidations = liquidationRepository.selectAllByEndDate(LocalDateTime.now().minusDays(1));
            canRefund = false;
        } else {
            liquidations = liquidationRepository.selectAllByEndDate(LocalDateTime.now());
        }
        LOGGER.info("liquidations for {}: {}",type,liquidations);

        if (liquidations.size() > 0) {
            for (Liquidation liquidation : liquidations) {
                Map<String, Object> liquidationsMap = new HashMap<>();
                try {
                    List<Item> items = itemRepository.selectAllByCatalogItemId(liquidation.getCatalogId());
                    if (items.size() > 0) {
                        long remainingQty = 0;
                        for (Item item : items) {
                            List<SaholicCISTable> saholicCISTable = saholicCISTableRepository.selectAllByItemId(item.getId());
                            remainingQty += saholicCISTable.stream().mapToInt(SaholicCISTable::getAvailability).sum();
                        }
                        List<Bid> bids = bidRepository.selectAllBidByLiquidationIdAndStatus(liquidation.getId(), Arrays.asList(ProfitMandiConstants.BID_ENUM.PENDING, ProfitMandiConstants.BID_ENUM.PROCESSING));
                        liquidationsMap.put("id",liquidation.getId());
                        liquidationsMap.put("catalog",items.get(0).getItemDescription());
                        liquidationsMap.put("basePrice",liquidation.getPrice());
                        liquidationsMap.put("openingStock",liquidation.getQuantity());
                        liquidationsMap.put("endDate",StringUtils.toLocalDateTime(String.valueOf(liquidation.getEndDate())));
                        List<Bid> bidsList = new ArrayList<>();
                        if (bids.size() > 0) {
                            ProfitMandiConstants.BID_ENUM bidStatus = ProfitMandiConstants.BID_ENUM.PENDING;
                            for (Bid bid : bids) {
                                LOGGER.info("remainingQty: {}", remainingQty);
                                if (remainingQty >= bid.getQuantity()) {
                                    try {
                                        List<BulkOrderModel> bulkOrderModels = new ArrayList<>();
                                        BulkOrderModel bulkOrderModel = new BulkOrderModel();
                                        bulkOrderModel.setRowIndex(bid.getId());
                                        bulkOrderModel.setFofoId(bid.getFofoId());
                                        bulkOrderModel.setItemId(items.get(0).getId());
                                        bulkOrderModel.setQuantity(bid.getQuantity());
                                        bulkOrderModel.setDescription(items.get(0).getItemDescription());
                                        bulkOrderModel.setItemPrice(bid.getBiddingAmount());

                                        bulkOrderModels.add(bulkOrderModel);

                                        bidStatus = bulkOrderService.generatePurchaseOrder(bulkOrderModels, bid.getFofoId(), ProfitMandiConstants.PO_TYPE.AUTO, type);
                                        remainingQty -= bid.getQuantity();
                                    } catch (Exception exception) {
                                        LOGGER.info("generatePurchaseOrder if exception: ", exception);
                                    }
                                } else {
                                    try {
                                        bidStatus = bidService.cancelYesterdayProcessBid(bid);
                                        if (canRefund || remainingQty < 1) {
                                            bidService.refundBidAmountToWallet(bid, bidStatus);
                                        }
                                    } catch (Exception exception) {
                                        LOGGER.info("generatePurchaseOrder else exception: ", exception);
                                    }
                                }
                                bid.setStatus(bidStatus);
                                bidsList.add(bid);
                            }
                        }
                        liquidationsMap.put("bids",bidsList);
                        liquidation.setQuantity((int) remainingQty);
                        liquidation.setStatus(ProfitMandiConstants.LIQUIDATION_ENUM.CLOSED);
                        LOGGER.info("generatePurchaseOrder qty final: {} = {}",remainingQty, liquidation.getStatus());
                        liquidationsMap.put("closingStock",liquidation.getQuantity());
                    }
                } catch (Exception exception){
                    LOGGER.info("generatePurchaseOrder loop: ",exception);
                }
                liquidationList.add(liquidationsMap);
            }
            LOGGER.info("liquidationList: {}",liquidationList);
            bidService.sendLiquidationReport(liquidationList);
        }
    }

    public void consolidatedBiddingMessage() throws Exception {
        List<Liquidation> liquidations = liquidationRepository.selectAllByStatus(ProfitMandiConstants.LIQUIDATION_ENUM.PUBLISHED);
        LOGGER.info("consolidatedBiddingMessage liquidations: {}",liquidations);

        if (liquidations.size() > 0) {
            StringBuilder message = new StringBuilder("*Bidding Update!*\n" +
                    "Place your best bids and unlock unbeatable price on smartphones!\n");
            //StringBuilder templateMessage = new StringBuilder("bidd_live");
            for (Liquidation liquidation : liquidations) {
                List<Item> items = itemRepository.selectAllByCatalogItemId(liquidation.getCatalogId());
                List<Bid> bids = bidRepository.selectBidByLiquidationId(liquidation.getId());
                if (items.size() > 0) {
                    long remainingQty = 0;
                    for (Item item : items) {
                        List<SaholicCISTable> saholicCISTable = saholicCISTableRepository.selectAllByItemId(item.getId());
                        remainingQty += saholicCISTable.stream().mapToInt(SaholicCISTable::getAvailability).sum();
                    }
                    TagListing tagListing = tagListingRepository.selectByItemId(items.get(0).getId());
                    liquidation.setQuantity((int) remainingQty);
                    if (liquidation.getQuantity() > 0){
                        double mrp = tagListing.getMrp();
                        double discountPercentage = ((mrp - liquidation.getPrice()) / mrp) * 100;
                        message.append("\n")
                            .append("*").append(items.get(0).getItemDescription())
                            .append(" at ").append(Math.round(discountPercentage)).append("% Off*\n")
                            .append("Starting price: *").append(liquidation.getPrice()).append("*\n");
                        if (bids.size() > 0) {
                            message.append("Top Bid: *").append(bids.get(0).getBiddingAmount()).append("*\n");
                        }
                        message.append("Ending on: *").append(StringUtils.toLocalDateTime(liquidation.getEndDate().toString())).append("*\n");
                        //templateMessage.append("|").append(items.get(0).getItemDescription()).append("|").append(liquidation.getPrice()).append("|").append(StringUtils.toLocalDateTime(liquidation.getEndDate().toString()));
                    }
                }
            }

            message.append("\nDon't miss out. Submit your bid now and grab the deal before it's gone!");

            LOGGER.info("templateMessage : {}",message.toString());

            bidService.biddingLiveNotification(message.toString(), "https://images.smartdukaan.com/uploads/whatsapp.jpeg");
            //notificationService.sendWhatsappMessage(message, "Bidding Live Now!", "8529003611");
            //notificationService.sendWhatsappMediaMessage(message.toString(), "8529003611", "https://images.smartdukaan.com/uploads/whatsapp.jpeg","whatsapp.jpeg", WhatsappMessageType.IMAGE);
        }
    }
}