Subversion Repositories SmartDukaan

Rev

Rev 10134 | Rev 10352 | 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.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.support.controllers.ProductNotificationsController;
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 {
                        CatalogService.Client catalogClient = new CatalogClient().getClient();
                        List<Item> itemList = catalogClient.getAllAliveItems();
                        
                        InventoryService.Client inventoryClient = new InventoryClient().getClient();
                        Map<Long, ItemInventory> inventoryMap = inventoryClient.getInventorySnapshot(0);
                        
                        inventoryClient = new InventoryClient().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);
                        }
                        
                        inventoryClient = new InventoryClient().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);
                        }
                        
                        inventoryClient = new InventoryClient().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 file = new File(tmpDir + "/StockSaleReport-" + (new Date()) + ".xls");
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(
                    file));
            bufferedWriter.write(StringUtils.join(new String[] { "ItemId", "ProductGroup", "Brand",
                    "Model Name", "Model Number", "Color", "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;
                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); 
                                                }
                                        }
                                }
                                }
                        }
                }
                for(OOSStatus oosStatus : oosStatusMapByItem.get(item.getId())) {
                        switch(oosStatus.getSourceId()) {
                                case 0: 
                                        if(oosStatus.isIs_oos()== false) {
                                                totalOrderCount += oosStatus.getNum_orders();
                                                totalSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                totalSaleHistory.append("X-");
                                        }
                                        break;
                                case 1: 
                                        if(oosStatus.isIs_oos()== false) {
                                                websiteOrderCount += oosStatus.getNum_orders();
                                                websiteSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                websiteSaleHistory.append("X-");
                                        }
                                        break;
                                case 3: 
                                        if(oosStatus.isIs_oos()== false) {
                                                amzn_mfnOrderCount += oosStatus.getNum_orders();
                                                amzn_mfnSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                amzn_mfnSaleHistory.append("X-");
                                        }
                                        break;
                                case 6: 
                                        if(oosStatus.isIs_oos()== false) {
                                                ebayOrderCount += oosStatus.getNum_orders();
                                                ebaySaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                ebaySaleHistory.append("X-");
                                        }
                                        break;
                                case 7: 
                                        if(oosStatus.isIs_oos()== false) {
                                                snapdealOrderCount += oosStatus.getNum_orders();
                                                snapdealSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                snapdealSaleHistory.append("X-");
                                        }
                                        break;
                                case 8: 
                                        if(oosStatus.isIs_oos()== false) {
                                                flipkartOrderCount += oosStatus.getNum_orders();
                                                flipkartSaleHistory.append(oosStatus.getNum_orders() + "-");
                                        } else {
                                                flipkartSaleHistory.append("X-");
                                        }
                                        break;
                                default:
                                        //do nothing
                                        break;
                        }
                }
                totalAverageSale    = (double)totalOrderCount/NUMBER_OF_DAYS_SALE;
                websiteAverageSale  = (double)websiteOrderCount/NUMBER_OF_DAYS_SALE;
                ebayAverageSale     = (double)ebayOrderCount/NUMBER_OF_DAYS_SALE;
                snapdealAverageSale = (double)snapdealOrderCount/NUMBER_OF_DAYS_SALE;
                flipkartAverageSale = (double)flipkartOrderCount/NUMBER_OF_DAYS_SALE;
                amzn_mfnAverageSale = (double)amzn_mfnOrderCount/NUMBER_OF_DAYS_SALE;
            
                bufferedWriter.write('\n');
                bufferedWriter.write(StringUtils.join(
                                new String[] {
                        String.valueOf(item.getId()),
                        item.getProductGroup(),
                        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'));
                }
            bufferedWriter.close();
            
            List<File> files = new ArrayList<File>(1);
            files.add(file);
                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();
        }

}