Subversion Repositories SmartDukaan

Rev

Rev 8638 | Blame | Last modification | View Log | RSS feed

package in.shop2020;

import in.shop2020.logistics.DeliveryType;
import in.shop2020.logistics.LogisticsInfo;
import in.shop2020.logistics.LogisticsServiceException;
import in.shop2020.model.v1.catalog.Item;
import in.shop2020.model.v1.catalog.CatalogService.Client;
import in.shop2020.model.v1.inventory.InventoryType;
import in.shop2020.model.v1.inventory.ItemInventory;
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.thrift.clients.LogisticsClient;
import in.shop2020.utils.GmailUtils;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;

import utilities.ScpService;
import inventory.SaholicAPI;
import inventory.SaholicAPI.Inventory;;

public class CreateSnapDealInventoryFeed {
        private static final String SNAPDEAL_INVENTORY_XML = "/home/snapdeal-inventory.xml";

        public static void main(String... args){
                CatalogClient catalogServiceClient = null;
                Map<Long,Long> itemInventoryMap = new HashMap<Long,Long>();
                try {
                        catalogServiceClient = new CatalogClient();
                } catch (TTransportException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                Client catalogClient = catalogServiceClient.getClient();
                try {
                        List<Item> items = catalogClient.getAllSnapdealListedActiveItems();
                        File file = new File(SNAPDEAL_INVENTORY_XML);
                        JAXBContext context;
                        Marshaller m=null;
                        try {
                                context = JAXBContext.newInstance(SaholicAPI.class);
                                m = context.createMarshaller();
                        } catch (JAXBException e1) {
                                e1.printStackTrace();
                        }

                        SaholicAPI saholicAPI =  new SaholicAPI();
                        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        Date date = new Date();
                        Random rand = new Random();
                        saholicAPI.setCreateDate(dateFormat.format(date));
                        saholicAPI.setFeedIdentifier(Math.abs(rand.nextInt()));
                        List<Inventory> inventoryList = saholicAPI.getInventory();
                        InventoryClient inventoryServiceClient = null;
                        try {
                                inventoryServiceClient = new InventoryClient();
                        } catch (TTransportException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        in.shop2020.model.v1.inventory.InventoryService.Client inventoryClient = inventoryServiceClient.getClient();
                        List<in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems> ignoreItems = inventoryClient.getIgnoredWarehouseidsAndItemids();
                        Map<Long, ItemInventory> availability = inventoryClient.getInventorySnapshot(0);
                        List<Warehouse> warehouses = inventoryClient.getWarehouses(WarehouseType.OURS_THIRDPARTY,null,0,0,0);
                        List<Warehouse> ours_warehouses = inventoryClient.getWarehouses(WarehouseType.OURS, InventoryType.GOOD, 0, 0, 0);
                        List<Long> thirdpartywarehouseids = new ArrayList<Long>();
                        List<Long> oursGoodWarehouse = new ArrayList<Long>();
                        for(Warehouse warehouse:warehouses){
                                thirdpartywarehouseids.add(warehouse.getId());
                                //System.out.println("Warehouse id is " + warehouse.getId());
                        }
                        for (Warehouse warehouse:ours_warehouses){
                                oursGoodWarehouse.add(warehouse.getId());
                        }
                        for(in.shop2020.model.v1.catalog.Item thriftItem:items){
                                long available=0;
                                long reserve=0;
                                List<Warehouse> vendor_warehouses=null;
                                if(availability.get(thriftItem.getId())!=null){ 
                                        ItemInventory iteminventory = availability.get(thriftItem.getId());
                                        Map<Long,Long> itemavailability = new HashMap<Long,Long>();
                                        itemavailability = iteminventory.getAvailability();
                                        if (thriftItem.isIsWarehousePreferenceSticky() && thriftItem.getPreferredVendor()!=0){
                                                vendor_warehouses = inventoryClient.getWarehouses(WarehouseType.THIRD_PARTY,InventoryType.GOOD , thriftItem.getPreferredVendor(), 0, 0);
                                                vendor_warehouses.addAll(ours_warehouses);
                                                for (Warehouse warehouse:vendor_warehouses){
                                                        in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems ignoredItem = new in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems();
                                                        ignoredItem.setItemId(thriftItem.getId());
                                                        ignoredItem.setWarehouseId(warehouse.getId());
                                                        if (itemavailability.get(warehouse.getId())!=null && !thirdpartywarehouseids.contains(warehouse.getId()) && !ignoreItems.contains(ignoredItem))
                                                                available = available + itemavailability.get(warehouse.getId());
                                                }
                                        }
                                        else{
                                                for (Map.Entry<Long,Long> entry :  itemavailability.entrySet()) {
                                                        in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems ignoredItem = new in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems();
                                                        ignoredItem.setItemId(thriftItem.getId());
                                                        ignoredItem.setWarehouseId(entry.getKey());
                                                        if(!thirdpartywarehouseids.contains(entry.getKey()) && !ignoreItems.contains(ignoredItem)){
                                                                available =  available + entry.getValue();      
                                                        }
                                                }
                                        }
                                        Map<Long,Long> itemreserve = new HashMap<Long,Long>();
                                        itemreserve = iteminventory.getReserved();
                                        if (thriftItem.isIsWarehousePreferenceSticky() && thriftItem.getPreferredVendor()!=0){
                                                System.out.println("Item id "+thriftItem.getId()+".Found prefered vendor and warehouse is marked sticky (Calculating Reserve)"+thriftItem.getPreferredVendor());
                                                for (Warehouse warehouse:vendor_warehouses){
                                                        in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems ignoredItem = new in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems();
                                                        ignoredItem.setItemId(thriftItem.getId());
                                                        ignoredItem.setWarehouseId(warehouse.getId());
                                                        if (itemreserve.get(warehouse.getId())!=null && !thirdpartywarehouseids.contains(warehouse.getId()) && !ignoreItems.contains(warehouse.getId()))
                                                                reserve = reserve + itemreserve.get(warehouse.getId());
                                                }
                                        }else{
                                                for (Map.Entry<Long,Long> entry : itemreserve.entrySet()) {
                                                        in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems ignoredItem = new in.shop2020.model.v1.inventory.IgnoredInventoryUpdateItems();
                                                        ignoredItem.setItemId(thriftItem.getId());
                                                        ignoredItem.setWarehouseId(entry.getKey());
                                                        if(!thirdpartywarehouseids.contains(entry.getKey()) && !ignoreItems.contains(ignoredItem)){
                                                                reserve =  reserve + entry.getValue();
                                                        }
                                                        else{
                                                                System.out.println("skipping inventory for warehouse id " + entry.getKey());
                                                        }
                                                }
                                        }
                                        itemInventoryMap.put(thriftItem.getId(), available);
                                }
                                else{
                                        itemInventoryMap.put(thriftItem.getId(),(long) 0);
                                }
                        }
                        if(!itemInventoryMap.isEmpty()){
                                in.shop2020.logistics.LogisticsService.Client logisticsClient=null;
                                LogisticsClient logisticsServiceClient = null;
                                try {
                                        logisticsServiceClient = new LogisticsClient("logistics_service_prod_server_host","logistics_service_prod_server_port");
                                        logisticsClient = logisticsServiceClient.getClient();

                                } catch (TTransportException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }

                                for (Map.Entry<Long, Long> entry : itemInventoryMap.entrySet()) {
                                        LogisticsInfo logisticinfo=new LogisticsInfo();
                                        boolean ex=true;
                                        int logisticCheck=0;
                                        while(ex){
                                                try {
                                                        System.out.println("Fetching Logistics estimation for Item Id " + " " + entry.getKey());
                                                        try {
                                                                logisticinfo = logisticsClient.getLogisticsEstimation(entry.getKey(),"110001",DeliveryType.COD);
                                                        } catch (LogisticsServiceException e) {
                                                                // TODO Auto-generated catch block
                                                                e.printStackTrace();
                                                        }
                                                        ex=false;

                                                } catch (TTransportException e) {
                                                        // TODO Auto-generated catch  lock
                                                        logisticsServiceClient = new LogisticsClient("logistics_service_prod_server_host","logistics_service_prod_server_port");
                                                        logisticsClient = logisticsServiceClient.getClient();
                                                        ex =true;
                                                        e.printStackTrace();
                                                        if (++logisticCheck==10){
                                                                StringWriter errors = new StringWriter();
                                                                e.printStackTrace(new PrintWriter(errors));
                                                                String text = errors.toString(); 
                                                                String[] sendTo = { "eng@shop2020.in" };
                                                                String emailSubjectTxt = "Unable To Send Non FBA Inventory Feed ";
                                                                String emailFromAddress = "build@shop2020.in";
                                                                String password = "cafe@nes";
                                                                GmailUtils mailer = new GmailUtils();
                                                                try {
                                                                        mailer.sendSSLMessage(sendTo, emailSubjectTxt, text, emailFromAddress, password, new ArrayList<File>());
                                                                }
                                                                catch (Exception exc) {
                                                                        exc.printStackTrace();
                                                                }
                                                                System.exit(1);
                                                        }

                                                }
                                        }
                                        Inventory inventory = new Inventory();
                                        inventory.setSKU(entry.getKey());
                                        inventory.setFulfillmentLatency(logisticinfo.getShippingTime());
                                        if(entry.getValue() >=0){
                                                inventory.setQuantity(entry.getValue());
                                        }
                                        else{
                                                inventory.setQuantity((long) 0);
                                        }
                                        inventoryList.add(inventory);
                                }
                                try {
                                        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
                                        m.marshal(saholicAPI, file);
                                        m.marshal(saholicAPI, System.out);

                                } catch (Exception e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                        else{
                                System.out.println("No Snapdeal listed Active items");
                        }
                        ScpService scpService = new ScpService();
                        scpService.scpFile("/var/www/static.saholic.com/partners",SNAPDEAL_INVENTORY_XML);
                } catch (TException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

}