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 nothingbreak;}}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();}}