Subversion Repositories SmartDukaan

Rev

Rev 11975 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.support.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mysql.jdbc.log.LogFactory;

import in.shop2020.model.v1.catalog.CatalogService;
import in.shop2020.model.v1.catalog.Category;
import in.shop2020.model.v1.catalog.Item;
import in.shop2020.model.v1.inventory.InventoryService;
import in.shop2020.model.v1.inventory.InventoryType;
import in.shop2020.model.v1.inventory.ItemInventory;
import in.shop2020.model.v1.inventory.OOSStatus;
import in.shop2020.model.v1.inventory.VendorItemPricing;
import in.shop2020.model.v1.inventory.Warehouse;
import in.shop2020.model.v1.inventory.WarehouseType;
import in.shop2020.thrift.clients.CatalogClient;
import in.shop2020.thrift.clients.InventoryClient;
import in.shop2020.utils.GmailUtils;

public class StockSalesReportFetcher {
        private static final int NUMBER_OF_DAYS_SALE = 5;
        private static final String[] mailTo = {"manish.sharma@shop2020.in", "rajveer.singh@shop2020.in", "chaitnaya.vats@saholic.com", 
                        "manoj.kumar@saholic.com", "chandan.kumar@saholic.com", "khushal.bhatia@saholic.com", "rajneesh.arora@saholic.com"};
        private static final String senderAccountMail = "cnc.center@shop2020.in";
        private static final String senderAccountPswd = "5h0p2o2o";
        
        private static Logger logger = LoggerFactory.getLogger(StockSalesReportFetcher.class);
        
        private static void createAndMailReport() {
                try {
                        CatalogClient catalogServiceClient = new CatalogClient();
                        CatalogService.Client catalogClient = catalogServiceClient.getClient();
                        List<Item> itemList = catalogClient.getAllAliveItems();
                        
                        if(!catalogClient.isAlive()){
                                catalogClient = catalogServiceClient.getClient();
                        }
                        List<Category> allCategories = catalogClient.getAllCategories();
                        Map<Long, String> categoryIdLabelMap = new Hashtable<Long, String>();
                        for(Category category : allCategories) {
                                categoryIdLabelMap.put(category.getId(), category.getLabel());
                        }
                        
                        InventoryClient inventoryServiceClient = new InventoryClient();         
                        InventoryService.Client inventoryClient = inventoryServiceClient.getClient();
                        Map<Long, ItemInventory> inventoryMap = inventoryClient.getInventorySnapshot(0);
                        
                        if(!inventoryClient.isAlive()){
                                inventoryClient = inventoryServiceClient.getClient();
                        }
                        List<OOSStatus> oosStatuses = inventoryClient.getOosStatusesForXDays(-1, NUMBER_OF_DAYS_SALE);
                        Map<Long, List<OOSStatus>> oosStatusMapByItem = new Hashtable<Long, List<OOSStatus>>(5000);
                        for(OOSStatus oosStatus : oosStatuses) {
                                List<OOSStatus> oosStatusList;
                                Long itemId = oosStatus.getItem_id();
                                if(oosStatusMapByItem.containsKey(itemId)) {
                                        oosStatusList = oosStatusMapByItem.get(itemId);
                                        oosStatusList.add(oosStatus);
                                } else {
                                        oosStatusList = new ArrayList<OOSStatus>(6);
                                        oosStatusList.add(oosStatus);
                                }
                                oosStatusMapByItem.put(itemId, oosStatusList);
                        }
                        
                        if(!inventoryClient.isAlive()){
                                inventoryClient = inventoryServiceClient.getClient();
                        }
                        List<Warehouse>  ourGoodWarehouses = inventoryClient.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, 0, 0);
                        Map<Long, Warehouse> ourWarehouseMap = new Hashtable<Long, Warehouse>(200);
                        for(Warehouse warehouse : ourGoodWarehouses) {
                                //System.out.println("Warehouse = " + warehouse.getId());
                                ourWarehouseMap.put(warehouse.getId(), warehouse);
                        }
                        
                        if(!inventoryClient.isAlive()){
                                inventoryClient = inventoryServiceClient.getClient();
                        }
                        List<VendorItemPricing> vendorItemPricings = inventoryClient.getAllVendorItemPricing(0, 0);
                        Map<Long, List<VendorItemPricing>> itemPricingMap = new Hashtable<Long, List<VendorItemPricing>>(5000);
                        for(VendorItemPricing vendorItemPricing : vendorItemPricings) {
                                List<VendorItemPricing> pricingListForItem;
                                Long itemId = vendorItemPricing.getItemId();
                                if(itemPricingMap.containsKey(itemId)) {
                                        pricingListForItem = itemPricingMap.get(itemId);
                                        pricingListForItem.add(vendorItemPricing);
                                } else {
                                        pricingListForItem = new ArrayList<VendorItemPricing>();
                                        pricingListForItem.add(vendorItemPricing);
                                }
                                itemPricingMap.put(itemId, pricingListForItem);
                        }
                        
                        String tmpDir = System.getProperty("java.io.tmpdir");
            File nonMovingFile = new File(tmpDir + "/StockSaleReport-NonMoving" + (new Date()) + ".xls");
            File slowMovingFile = new File(tmpDir + "/StockSaleReport-SlowMoving" + (new Date()) + ".xls");
            File movingFile = new File(tmpDir + "/StockSaleReport-Moving" + (new Date()) + ".xls");
            BufferedWriter nonMovingBufferedWriter = new BufferedWriter(new FileWriter(
                        nonMovingFile));
            BufferedWriter slowMovingBufferedWriter = new BufferedWriter(new FileWriter(
                        slowMovingFile));
            BufferedWriter movingBufferedWriter = new BufferedWriter(new FileWriter(
                        movingFile));
            nonMovingBufferedWriter.write(StringUtils.join(new String[] { "ItemId", "Category", "ProductGroup", 
                        "Brand", "Model Name", "Model Number", "Color", "Product", "Stock Qty", "Stock Value", "NOD Stock", 
                    "Sales History(All-Sources)", "Avg Sales(All-Sources)", "Sales History(Website)", 
                    "Avg Sales(Website)", "Sales History(Ebay)", "Avg Sales(Ebay)", "Sales History(Snapdeal)", 
                    "Avg Sales(Snapdeal)", "Sales History(Flipkart)", "Avg Sales(Flipkart)",  
                    "Sales History(Amazon-MFN)", "Avg Sales(Amazon-MFN)"}, '\t'));
            slowMovingBufferedWriter.write(StringUtils.join(new String[] { "ItemId", "Category", "ProductGroup", 
                        "Brand", "Model Name", "Model Number", "Color", "Product", "Stock Qty", "Stock Value", "NOD Stock", 
                    "Sales History(All-Sources)", "Avg Sales(All-Sources)", "Sales History(Website)", 
                    "Avg Sales(Website)", "Sales History(Ebay)", "Avg Sales(Ebay)", "Sales History(Snapdeal)", 
                    "Avg Sales(Snapdeal)", "Sales History(Flipkart)", "Avg Sales(Flipkart)",  
                    "Sales History(Amazon-MFN)", "Avg Sales(Amazon-MFN)"}, '\t'));
            movingBufferedWriter.write(StringUtils.join(new String[] { "ItemId", "Category", "ProductGroup", 
                        "Brand", "Model Name", "Model Number", "Color", "Product", "Stock Qty", "Stock Value", "NOD Stock", 
                    "Sales History(All-Sources)", "Avg Sales(All-Sources)", "Sales History(Website)", 
                    "Avg Sales(Website)", "Sales History(Ebay)", "Avg Sales(Ebay)", "Sales History(Snapdeal)", 
                    "Avg Sales(Snapdeal)", "Sales History(Flipkart)", "Avg Sales(Flipkart)",  
                    "Sales History(Amazon-MFN)", "Avg Sales(Amazon-MFN)"}, '\t'));
            
            Long stockCount;
            Double stockValue;
            for (Item item : itemList) {
                stockCount = 0L;
                stockValue = 0.0;
                Long totalOrderCount    = 0L;
                Long websiteOrderCount  = 0L;
                Long ebayOrderCount     = 0L;
                Long snapdealOrderCount = 0L;
                Long flipkartOrderCount = 0L;
                Long amzn_mfnOrderCount = 0L;
                Long totalInStockDays    = 0L;
                Long websiteInStockDays  = 0L;
                Long ebayInStockDays     = 0L;
                Long snapdealInStockDays = 0L;
                Long flipkartInStockDays = 0L;
                Long amzn_mfnInStockDays = 0L;
                Double websiteAverageSale  = 0.0;
                Double totalAverageSale = 0.0;
                Double ebayAverageSale     = 0.0;
                Double snapdealAverageSale = 0.0;
                Double flipkartAverageSale = 0.0;
                Double amzn_mfnAverageSale  = 0.0;
                StringBuilder totalSaleHistory    = new StringBuilder("");
                StringBuilder websiteSaleHistory  = new StringBuilder("");
                StringBuilder ebaySaleHistory     = new StringBuilder("");
                StringBuilder snapdealSaleHistory = new StringBuilder("");
                StringBuilder flipkartSaleHistory = new StringBuilder("");
                StringBuilder amzn_mfnSaleHistory = new StringBuilder("");
                
                ItemInventory itemInventory = inventoryMap.get(item.getId());
                Map<Long, Long> availabilityMap;
                if(itemInventory!= null) {
                        //System.out.println("itemId =" + item.getId());
                        availabilityMap = itemInventory.getAvailability();
                        for (Long warehouseId : availabilityMap.keySet()) {
                                if(ourWarehouseMap.containsKey(warehouseId)) {
                                        long currentAvailability = availabilityMap.get(warehouseId);
                                        //System.out.println("itemId =" + item.getId() + " availability = "+ currentAvailability);
                                        stockCount += currentAvailability;
                                if(currentAvailability>0) {
                                        List<VendorItemPricing> pricingList = itemPricingMap.get(item.getId());
                                        for(VendorItemPricing vendorItemPricing: pricingList) {
                                                if(vendorItemPricing.getVendorId() == ourWarehouseMap.get(warehouseId).getVendor().getId()) {
                                                        stockValue = stockValue + (vendorItemPricing.getNlc()*currentAvailability); 
                                                }
                                        }
                                }
                                }
                        }
                }
                if(stockCount<=0) {
                        continue;
                }
                for(OOSStatus oosStatus : oosStatusMapByItem.get(item.getId())) {
                        switch(oosStatus.getSourceId()) {
                                case 0: 
                                        if(oosStatus.isIs_oos()== false) {
                                                totalInStockDays++;
                                                totalOrderCount += oosStatus.getNum_orders();
                                                totalSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                totalSaleHistory.append("X-");
                                        }
                                        break;
                                case 1: 
                                        if(oosStatus.isIs_oos()== false) {
                                                websiteInStockDays++;
                                                websiteOrderCount += oosStatus.getNum_orders();
                                                websiteSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                websiteSaleHistory.append("X-");
                                        }
                                        break;
                                case 3: 
                                        if(oosStatus.isIs_oos()== false) {
                                                amzn_mfnInStockDays++;
                                                amzn_mfnOrderCount += oosStatus.getNum_orders();
                                                amzn_mfnSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                amzn_mfnSaleHistory.append("X-");
                                        }
                                        break;
                                case 6: 
                                        if(oosStatus.isIs_oos()== false) {
                                                ebayInStockDays++;
                                                ebayOrderCount += oosStatus.getNum_orders();
                                                ebaySaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                ebaySaleHistory.append("X-");
                                        }
                                        break;
                                case 7: 
                                        if(oosStatus.isIs_oos()== false) {
                                                snapdealInStockDays++;
                                                snapdealOrderCount += oosStatus.getNum_orders();
                                                snapdealSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                snapdealSaleHistory.append("X-");
                                        }
                                        break;
                                case 8: 
                                        if(oosStatus.isIs_oos()== false) {
                                                flipkartInStockDays++;
                                                flipkartOrderCount += oosStatus.getNum_orders();
                                                flipkartSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                flipkartSaleHistory.append("X-");
                                        }
                                        break;
                                default:
                                        //do nothing
                                        break;
                        }
                }
                totalAverageSale    = (double)totalOrderCount/totalInStockDays;
                websiteAverageSale  = (double)websiteOrderCount/websiteInStockDays;
                ebayAverageSale     = (double)ebayOrderCount/ebayInStockDays;
                snapdealAverageSale = (double)snapdealOrderCount/snapdealInStockDays;
                flipkartAverageSale = (double)flipkartOrderCount/flipkartInStockDays;
                amzn_mfnAverageSale = (double)amzn_mfnOrderCount/amzn_mfnInStockDays;
            
                if(totalAverageSale<=0.0) {
                        nonMovingBufferedWriter.write('\n');
                        nonMovingBufferedWriter.write(StringUtils.join(
                                        new String[] {
                                String.valueOf(item.getId()),
                                categoryIdLabelMap.get(item.getCategory()),
                                item.getProductGroup(),
                                item.getBrand(),
                                item.getModelName(),
                                item.getModelNumber(),
                                item.getColor(),
                                item.getBrand() + " " + item.getModelName() + " " + item.getModelNumber() + " " + item.getColor(),   
                                stockCount.toString(),
                                stockValue.toString(),
                                totalAverageSale>0 ? new Long(new Double(stockCount/totalAverageSale).longValue()).toString(): "0",
                                totalSaleHistory.substring(0, totalSaleHistory.length()-1),
                                totalAverageSale.toString(),
                                websiteSaleHistory.substring(0, websiteSaleHistory.length()-1),
                                websiteAverageSale.toString(),
                                ebaySaleHistory.substring(0, ebaySaleHistory.length()-1),
                                ebayAverageSale.toString(),
                                snapdealSaleHistory.substring(0, snapdealSaleHistory.length()-1),
                                snapdealAverageSale.toString(),
                                flipkartSaleHistory.substring(0, flipkartSaleHistory.length()-1),
                                flipkartAverageSale.toString(),
                                amzn_mfnSaleHistory.substring(0, amzn_mfnSaleHistory.length()-1),
                                amzn_mfnAverageSale.toString()}, '\t'));
                }
                else {
                        double nodStock = totalAverageSale > 0 ? new Double(stockCount/totalAverageSale): 0;
                        if(nodStock>30) {
                                slowMovingBufferedWriter.write('\n');
                                slowMovingBufferedWriter.write(StringUtils.join(
                                        new String[] {
                                String.valueOf(item.getId()),
                                categoryIdLabelMap.get(item.getCategory()),
                                item.getProductGroup(),
                                item.getBrand(),
                                item.getModelName(),
                                item.getModelNumber(),
                                item.getColor(),
                                item.getBrand() + " " + item.getModelName() + " " + item.getModelNumber() + " " + item.getColor(),
                                stockCount.toString(),
                                stockValue.toString(),
                                totalAverageSale>0 ? new Long(new Double(stockCount/totalAverageSale).longValue()).toString(): "0",
                                totalSaleHistory.substring(0, totalSaleHistory.length()-1),
                                totalAverageSale.toString(),
                                websiteSaleHistory.substring(0, websiteSaleHistory.length()-1),
                                websiteAverageSale.toString(),
                                ebaySaleHistory.substring(0, ebaySaleHistory.length()-1),
                                ebayAverageSale.toString(),
                                snapdealSaleHistory.substring(0, snapdealSaleHistory.length()-1),
                                snapdealAverageSale.toString(),
                                flipkartSaleHistory.substring(0, flipkartSaleHistory.length()-1),
                                flipkartAverageSale.toString(),
                                amzn_mfnSaleHistory.substring(0, amzn_mfnSaleHistory.length()-1),
                                amzn_mfnAverageSale.toString()}, '\t'));
                        } else {
                                movingBufferedWriter.write('\n');
                                movingBufferedWriter.write(StringUtils.join(
                                        new String[] {
                                String.valueOf(item.getId()),
                                categoryIdLabelMap.get(item.getCategory()),
                                item.getProductGroup(),
                                item.getBrand(),
                                item.getModelName(),
                                item.getModelNumber(),
                                item.getColor(),
                                item.getBrand() + " " + item.getModelName() + " " + item.getModelNumber() + " " + item.getColor(),
                                stockCount.toString(),
                                stockValue.toString(),
                                totalAverageSale>0 ? new Long(new Double(stockCount/totalAverageSale).longValue()).toString(): "0",
                                totalSaleHistory.substring(0, totalSaleHistory.length()-1),
                                totalAverageSale.toString(),
                                websiteSaleHistory.substring(0, websiteSaleHistory.length()-1),
                                websiteAverageSale.toString(),
                                ebaySaleHistory.substring(0, ebaySaleHistory.length()-1),
                                ebayAverageSale.toString(),
                                snapdealSaleHistory.substring(0, snapdealSaleHistory.length()-1),
                                snapdealAverageSale.toString(),
                                flipkartSaleHistory.substring(0, flipkartSaleHistory.length()-1),
                                flipkartAverageSale.toString(),
                                amzn_mfnSaleHistory.substring(0, amzn_mfnSaleHistory.length()-1),
                                amzn_mfnAverageSale.toString()}, '\t'));
                        }
                }
            }
            nonMovingBufferedWriter.close();
            slowMovingBufferedWriter.close();
            movingBufferedWriter.close();
            
            List<File> files = new ArrayList<File>(1);
            files.add(nonMovingFile);
            files.add(slowMovingFile);
            files.add(movingFile);
                GmailUtils mailer = new GmailUtils();
                mailer.sendSSLMessage(mailTo, "Stock Sales Report ", "", senderAccountMail, senderAccountPswd, files);
                } catch (Exception e) {
                        logger.error("Error in generating/sending Stock Sales Report", e);
                }
                
                
        }
        
        public static void main(String[] args) {
                createAndMailReport();
        }

}