Subversion Repositories SmartDukaan

Rev

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

package in.shop2020;

import in.shop2020.model.v1.catalog.MarketPlaceItemPrice;
import in.shop2020.model.v1.catalog.SnapdealItemDetails;
import in.shop2020.thrift.clients.CatalogClient;
import in.shop2020.utils.GmailUtils;
import inventory.Inventory;
import inventory.InventoryHistoryItems;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.mail.MessagingException;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;

import pricing.CurrentPricing;
import pricing.CurrentPricingItems;
import pricing.PricingHistory;
import pricing.PricingHistoryItems;

import com.google.gson.Gson;

public class CreateSnapdealPricingFeed {

        private static DefaultHttpClient client = new DefaultHttpClient();
        private static long time = System.currentTimeMillis();
        private static String SNAPDEAL_PRICING_SHEET;
        static Map<String,SnapdealItemDetails> snapdealItemMap = new HashMap<String,SnapdealItemDetails>();
        static Map<Long,SnapdealItemDetails> itemSnapdealMap = new HashMap<Long,SnapdealItemDetails>();
        static List<MarketPlaceItemPrice> marketPlaceItemsPrices;
        static Map<String,CurrentPricing> currentPricesMap = new HashMap<String,CurrentPricing>();
        static PricingHistoryItems pricingHistoryItems;
        static CurrentPricingItems currentPricingItems;
        private static SimpleDateFormat sdf;
        private static String emailFromAddress;
        private static String password;
        private static GmailUtils mailer;
        private static String[] sendTo;

        static {
                sdf = new java.text.SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
                emailFromAddress = "build@shop2020.in";
                password = "cafe@nes";
                mailer = new GmailUtils();
                //sendTo = new String[]{"vikram.raghav@shop2020.in"};
                sendTo = new String[]{ "sandeep.sachdeva@shop2020.in", "vikram.raghav@shop2020.in", "rajneesh.arora@shop2020.in",
                                "khushal.bhatia@shop2020.in","manoj.kumar@saholic.com","chaitnaya.vats@saholic.com",
                                "yukti.jain@shop2020.in","manisha.sharma@shop2020.in","chandan.kumar@shop2020.in","ankush.dhingra@shop2020.in"};
                CatalogClient catalogServiceClient = null;
                try {
                        catalogServiceClient = new CatalogClient();
                } catch (TTransportException e1) {
                        e1.printStackTrace();
                }
                in.shop2020.model.v1.catalog.CatalogService.Client catalogClient = catalogServiceClient.getClient();
                List<SnapdealItemDetails> allSnapdealItems = null;
                try {
                        allSnapdealItems = catalogClient.getAllSnapdealItems();
                        time = System.currentTimeMillis();
                        SNAPDEAL_PRICING_SHEET = "/home/snapdeal/snapdeal-pricing-"+time+".xls";
                        marketPlaceItemsPrices = catalogClient.getMarketPlaceItemsForPriceUpdate(7);
                        if(marketPlaceItemsPrices.size()==0){
                                System.out.println("No Change in Price to update");
                                try {
                                        mailer.sendSSLMessage(sendTo,"No changes in Snapdeal Item Prices "+ sdf.format(System.currentTimeMillis()),"No change in Snapdeal Prices to be update ", emailFromAddress, password, new ArrayList<File>());
                                } catch (MessagingException e) {
                                        e.printStackTrace();
                                }
                                System.exit(0);
                        }
                } catch (TException e) {
                        e.printStackTrace();
                }
                for(SnapdealItemDetails snapdealItem:allSnapdealItems){
                        snapdealItemMap.put(snapdealItem.getSkuAtSnapdeal(),snapdealItem);
                        itemSnapdealMap.put(snapdealItem.getItem_id(), snapdealItem);
                }

        }
        public static void handleLogin() throws ClientProtocolException, IOException{
                HttpGet get = new HttpGet("http://selleraccounts.snapdeal.com/keymaker/login");
                HttpResponse response = null;
                try {
                        response = client.execute(get);
                } catch (ClientProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                BufferedReader rd = null;
                try {
                        rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                } catch (IllegalStateException e1) {
                        // TODO Auto-generated catch block      
                        e1.printStackTrace();
                } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
                String line = "";
                StringBuffer sb = new StringBuffer();
                try {
                        while ((line = rd.readLine()) != null) {
                                sb.append(line);
                                System.out.println(line);
                        }
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                int i= sb.toString().indexOf("name=\"lt\" value=");
                char[] charArray = sb.toString().toCharArray();
                String lt = "";
                int j=0;
                for(j=i+16;j<=charArray.length;j++){

                        if(charArray[j]==' '){
                                break;
                        }
                }
                lt = sb.substring(i+17,j-1);
                System.out.println("LT VALUE " + lt);
                i= sb.toString().indexOf("name=\"execution\" value=");
                charArray = sb.toString().toCharArray();
                String ex = "";
                j=0;
                for(j=i+24;j<=charArray.length;j++){
                        if(charArray[j]==' '){
                                break;
                        }
                }
                ex = sb.substring(i+24,j-1);
                System.out.println("EXECUTION VALUE " + ex);
                HttpPost post = new HttpPost("http://selleraccounts.snapdeal.com/login?service=http%3A%2F%2Fseller.snapdeal.com%2Fj_spring_cas_security_check");
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                //nameValuePairs.add(new BasicNameValuePair("username",
                //"khushal.bhatia@saholic.com"));
                nameValuePairs.add(new BasicNameValuePair("username",
                "saholic-snapdeal@saholic.com"));
                //nameValuePairs.add(new BasicNameValuePair("password",
                //"sonline"));
                nameValuePairs.add(new BasicNameValuePair("password",
                "bc452ce4"));
                nameValuePairs.add(new BasicNameValuePair("_eventId","submit"));
                nameValuePairs.add(new BasicNameValuePair("execution",ex));
                nameValuePairs.add(new BasicNameValuePair("lt",lt));
                nameValuePairs.add(new BasicNameValuePair("submit","LOGIN"));
                post.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8"));
                response = client.execute(post);
                rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                line = "";
                while ((line = rd.readLine()) != null) {
                        //System.out.println(line);
                }
                get = new HttpGet("http://seller.snapdeal.com/pricing/");
                response = client.execute(get);
                rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                while ((line = rd.readLine()) != null) {
                        //System.out.println(line);
                }
        }


        public static void main(String... args) throws IOException, InterruptedException{
                handleLogin();
                HttpGet get; 
                BufferedReader rd= null;
                Gson gson = new Gson();
                int i = 1;
                boolean exitfetchingcurrent = true;
                System.out.println("Fetching current prices");
                HttpResponse response;
                while(exitfetchingcurrent){
                        get = new HttpGet("http://seller.snapdeal.com/pricing/search?gridType=normal&_search=false&nd="+time+"&rows=30&page="+i+"&sidx=&sord=asc");
                        response = client.execute(get);
                        rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                        currentPricingItems = (CurrentPricingItems) gson.fromJson(rd, CurrentPricingItems.class);
                        if(currentPricingItems.getRows().size()!=0){
                                for(CurrentPricing currentPricing:currentPricingItems.getRows()){
                                        currentPricesMap.put(currentPricing.getSellerSku(),currentPricing);
                                        System.out.println(currentPricing.getSellerSku()+" "+currentPricing.getSellingPrice());
                                }
                        }
                        else{
                                exitfetchingcurrent = false;
                        }
                        i++;
                }
                FileInputStream fis = new FileInputStream("/root/code/trunk/SnapDealFeeds/SellerPricing.xls");
                Workbook hwb = new HSSFWorkbook(fis);
                Sheet sheet = hwb.getSheetAt(0);
                Row row;
                int iterator = 1;
                Map<String,Double> toUpdateSkuMap = new HashMap<String,Double>();
                for(MarketPlaceItemPrice marketPlaceItemPrice:marketPlaceItemsPrices){
                        System.out.println(marketPlaceItemPrice.getItem_id() + " " + marketPlaceItemPrice.getSellingPrice());
                        if(itemSnapdealMap.containsKey(marketPlaceItemPrice.getItem_id()) && marketPlaceItemPrice.getLastUpdatedOn() > marketPlaceItemPrice.getLastUpdatedOnMarketplace() && !marketPlaceItemPrice.isIsPriceOverride() && marketPlaceItemPrice.isIsListedOnSource()){
                                if(currentPricesMap.containsKey(itemSnapdealMap.get(marketPlaceItemPrice.getItem_id()).getSkuAtSnapdeal()) && Double.parseDouble(currentPricesMap.get(itemSnapdealMap.get(marketPlaceItemPrice.getItem_id()).getSkuAtSnapdeal()).getSellingPrice()) != marketPlaceItemPrice.getSellingPrice() && marketPlaceItemPrice.getSellingPrice()!=0){
                                        row =   sheet.getRow((short) iterator);
                                        row.getCell((short) 0).setCellValue(currentPricesMap.get(itemSnapdealMap.get(marketPlaceItemPrice.getItem_id()).getSkuAtSnapdeal()).getSupc());
                                        row.getCell((short) 1).setCellValue(itemSnapdealMap.get(marketPlaceItemPrice.getItem_id()).getSkuAtSnapdeal());
                                        row.getCell((short) 2).setCellValue(currentPricesMap.get(itemSnapdealMap.get(marketPlaceItemPrice.getItem_id()).getSkuAtSnapdeal()).getProductName());
                                        row.getCell((short) 3).setCellValue(marketPlaceItemPrice.getSellingPrice());
                                        row.getCell((short) 4).setCellValue(currentPricesMap.get(itemSnapdealMap.get(marketPlaceItemPrice.getItem_id()).getSkuAtSnapdeal()).getLive());
                                        toUpdateSkuMap.put(itemSnapdealMap.get(marketPlaceItemPrice.getItem_id()).getSkuAtSnapdeal(),marketPlaceItemPrice.getSellingPrice());
                                        iterator++;
                                }
                        }
                }
                if(iterator!=1){
                        FileOutputStream fileOut = null;
                        fis.close();
                        try {
                                System.out.println("Before writing file ");
                                fileOut = new FileOutputStream(SNAPDEAL_PRICING_SHEET);
                        } catch (FileNotFoundException e) {
                                e.printStackTrace();
                        }
                        try {

                                hwb.write(fileOut);
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        HttpPost post = new HttpPost("http://seller.snapdeal.com/pricing/upload?uploadType=SP");
                        File file = new File(SNAPDEAL_PRICING_SHEET);
                        MultipartEntity mpEntity = new MultipartEntity();
                        ContentBody cbFile = new FileBody(file,"application/vnd.ms-excel");
                        mpEntity.addPart("file", cbFile);
                        post.setEntity(mpEntity);
                        response = client.execute(post);
                        try {
                                rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                        } catch (IllegalStateException e1) {
                                e1.printStackTrace();
                        } catch (IOException e1) {
                                e1.printStackTrace();
                        }
                        String line = "";
                        String feedresponse = null;
                        try {
                                while ((line = rd.readLine()) != null) {
                                        feedresponse = line;
                                }
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                        int retry = 5;
                        boolean exitfetchinghistory;
                        int successfullyUpdated;
                        Map<String,Double> updatedSkuMap = new HashMap<String,Double>();
                        System.out.println("Feed response " + feedresponse);
                        if(feedresponse.contains("Error")){
                                System.out.println("Error while uploading sheet");
                                try {
                                        mailer.sendSSLMessage(sendTo,"Error at Snapdeal while Uploading Pricing feed "+ sdf.format(System.currentTimeMillis()),"This Error means that there is some problem while uploading pricing feed to snapdeal", emailFromAddress, password, new ArrayList<File>());
                                } catch (MessagingException e) {
                                        e.printStackTrace();
                                }
                                System.exit(0);
                        }
                        String uploadId = "UID"+feedresponse.split("UID")[1];
                        System.out.println("Feed Upload Id is " + uploadId);
                        int j = 1;
                        i=1;
                        while(retry > 0){
                                Thread.sleep(5*60*1000);
                                exitfetchinghistory = true;
                                System.out.println("Fetching history prices " + j);
                                successfullyUpdated =0;
                                while(exitfetchinghistory){
                                        get = new HttpGet("http://seller.snapdeal.com/pricing/search?gridType=history&_search=false&nd="+time+"&rows=30&page="+i+"&sidx=&sord=asc");
                                        response = client.execute(get);
                                        rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                                        pricingHistoryItems = (PricingHistoryItems) gson.fromJson(rd, PricingHistoryItems.class);
                                        if(pricingHistoryItems.getRows().size()!=0 &&  successfullyUpdated != (iterator - 1)){
                                                for(PricingHistory pricingHistory:pricingHistoryItems.getRows()){
                                                        if(Long.parseLong(pricingHistory.getModifiedOn()) > time && pricingHistory.getApprovalStatus().equals("Done") && pricingHistory.getUploadId().equals(uploadId)){
                                                                successfullyUpdated++;
                                                                updatedSkuMap.put(pricingHistory.getSellerSku(),Double.parseDouble(pricingHistory.getLineitems().get(0).getNewValue()));
                                                                System.out.println("SKU Updated " + pricingHistory.getSellerSku() + " " + pricingHistory.getUploadId());
                                                        }
                                                }
                                        }
                                        else{
                                                exitfetchinghistory = false;
                                                if(successfullyUpdated == (iterator-1)){
                                                        retry = 0;
                                                }
                                        }
                                        i++;
                                }
                                retry--;
                                j++;
                        }
                        CatalogClient catalogServiceClient = null;
                        try {
                                catalogServiceClient = new CatalogClient();
                        } catch (TTransportException e1) {
                                e1.printStackTrace();
                        }
                        in.shop2020.model.v1.catalog.CatalogService.Client catalogClient = catalogServiceClient.getClient();
                        List<Long> updatedItems = new ArrayList<Long>();
                        String tableHeader = "<tr>" 
                                + "<td>" + "Product Name" +"</td>"
                                +"<td>" + "Item ID" + "</td>"
                                +"<td>" + "SKU at Snapdeal" + "</td>"
                                +"<td>" + "Old Price" + "</td>"
                                +"<td>" + "New Price" + "</td>"
                                +"</tr>";
                        if(toUpdateSkuMap.size() != updatedSkuMap.size()){
                                StringBuffer notUpdatedMailBody =new StringBuffer();
                                for(Entry<String, Double> entry:updatedSkuMap.entrySet()){
                                        toUpdateSkuMap.remove(entry.getKey());
                                }
                                for(Entry<String, Double> entry:toUpdateSkuMap.entrySet()){
                                        notUpdatedMailBody.append("<tr>" + "<td>" + currentPricesMap.get(entry.getKey()).getProductName() + "</td>"
                                                        +"<td>" + snapdealItemMap.get(entry.getKey()).getItem_id() + "</td>"
                                                        +"<td>" + snapdealItemMap.get(entry.getKey()).getSkuAtSnapdeal() + "</td>"
                                                        +"<td>" + currentPricesMap.get(entry.getKey()).getSellingPrice() + "</td>" 
                                                        +"<td>" + entry.getValue() +"</td>");

                                }
                                String text = "<html><table border=\"1\" align=\"center\">" 
                                        + tableHeader  
                                        + notUpdatedMailBody.toString() + "</table></html>";

                                System.out.println("SKUs not updated");
                                try {
                                        mailer.sendSSLMessage(sendTo,"Snapdeal Item Prices were not updated "+ sdf.format(System.currentTimeMillis()),emailFromAddress, password, text);
                                } catch (MessagingException e) {
                                        e.printStackTrace();
                                }

                        }
                        if(updatedSkuMap.size()>0){
                                StringBuffer updatedMailBody =new StringBuffer();
                                for(Entry<String, Double> entry:updatedSkuMap.entrySet()){
                                        updatedMailBody.append("<tr>" + "<td>" + currentPricesMap.get(entry.getKey()).getProductName() + "</td>"
                                                        +"<td>" + snapdealItemMap.get(entry.getKey()).getItem_id() + "</td>"
                                                        +"<td>" + snapdealItemMap.get(entry.getKey()).getSkuAtSnapdeal() + "</td>"
                                                        +"<td>" + currentPricesMap.get(entry.getKey()).getSellingPrice() + "</td>" 
                                                        +"<td>" + entry.getValue() +"</td>");
                                        updatedItems.add(snapdealItemMap.get(entry.getKey()).getItem_id());
                                }
                                try {
                                        catalogClient.updateMarketPlacePriceUpdateStatus(updatedItems,time,7);
                                } catch (TException e) {
                                        try {
                                                new CatalogClient().getClient().updateMarketPlacePriceUpdateStatus(updatedItems, time,7);
                                        } catch (TTransportException e1) {
                                                e1.printStackTrace();
                                        } catch (TException e1) {
                                                e1.printStackTrace();
                                        }
                                        e.printStackTrace();
                                }
                                String text = "<html><table border=\"1\" align=\"center\">" 
                                        + tableHeader  
                                        + updatedMailBody.toString() + "</table></html>";

                                try {
                                        System.out.println("Snapdeal Item Prices updated Successfully");
                                        if(updatedSkuMap.size()==1){
                                                mailer.sendSSLMessage(sendTo,updatedSkuMap.size()+" Snapdeal Item Price updated Successfully "+ sdf.format(System.currentTimeMillis()), emailFromAddress, password,text);
                                        }
                                        else{
                                                mailer.sendSSLMessage(sendTo,updatedSkuMap.size()+" Snapdeal Items Price updated Successfully "+ sdf.format(System.currentTimeMillis()), emailFromAddress, password,text);                                              
                                        }
                                } catch (MessagingException e) {
                                        e.printStackTrace();
                                }
                        }
                }
                else{
                        try {
                                System.out.println("Prices are same as the snapdeal prices");
                                mailer.sendSSLMessage(sendTo,"No changes in Snapdeal Item Prices "+ sdf.format(System.currentTimeMillis()),"No change in Snapdeal Prices to be update ", emailFromAddress, password, new ArrayList<File>());
                        } catch (MessagingException e) {
                                e.printStackTrace();
                        }

                }

        }


}