Subversion Repositories SmartDukaan

Rev

Rev 13479 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.amazonaws.mws.samples;

import in.shop2020.model.v1.order.AmazonFCWarehouseLocation;
import in.shop2020.model.v1.order.AmazonFbaOrderItem;
import in.shop2020.model.v1.order.AmazonHourlySaleSnapshot;
import in.shop2020.utils.GmailUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import java.util.Map.Entry;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.io.IOUtils;
import org.apache.thrift.TException;
import org.json.JSONException;

import com.amazonaws.mws.MarketplaceWebService;
import com.amazonaws.mws.MarketplaceWebServiceClient;
import com.amazonaws.mws.MarketplaceWebServiceConfig;
import com.amazonaws.mws.MarketplaceWebServiceException;
import com.amazonaws.mws.model.AmazonEnvelope;
import com.amazonaws.mws.model.FulfillmentData;
import com.amazonaws.mws.model.GetReportListRequest;
import com.amazonaws.mws.model.GetReportRequest;
import com.amazonaws.mws.model.IdList;
import com.amazonaws.mws.model.Message;
import com.amazonaws.mws.model.Order;
import com.amazonaws.mws.model.RequestReportRequest;

import com.amazonaws.mws.samples.Consumer;

public class AmazonOrderData {

    public final static String accessKeyId = "AKIAII3SGRXBJDPCHSGQ";
    public final static String secretAccessKey = "B92xTbNBTYygbGs98w01nFQUhbec1pNCkCsKVfpg";

    public final static String appName = "Test";
    public final static String appVersion = "1.0";
    public final static String merchantId = "AF6E3O0VE0X4D";

    public final static String FILE_PATH = "/tmp/amazon-order-dump.xml";
    public final static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
    
    public static List<AmazonFbaOrderItem> sales = new ArrayList<AmazonFbaOrderItem>();
    public static Date startDate;
    public static Date endDate;
    
    public static void terminate(String msg){
        String emailFromAddress = "build@shop2020.in";
        String password = "cafe@nes";
        String[] sendTo = new String[]{ "kshitij.sood@saholic.com","anikendra.das@shop2020.in"};
        String emailSubjectTxt = msg;
        try {
            GmailUtils mailer = new GmailUtils();
            mailer.sendSSLMessage(sendTo, emailSubjectTxt, "", emailFromAddress, password,"");
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }

        System.exit(1);
    }

    public static String invokeServiceRequest() throws InterruptedException{

        /* Returns request id of the OrderReport */

        MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
        config.setServiceURL("https://mws.amazonservices.in");

        MarketplaceWebService service = new MarketplaceWebServiceClient(accessKeyId, secretAccessKey, appName, appVersion, config);

        IdList marketplaces = new IdList(Arrays.asList("A21TJRUUN4KGV"));        
        RequestReportRequest orderreportrequest = new RequestReportRequest()
        .withMerchant(merchantId)
        .withMarketplaceIdList(marketplaces)
        .withReportType("_GET_XML_ALL_ORDERS_DATA_BY_ORDER_DATE_")
        .withReportOptions("ShowSalesChannel=true");

        DatatypeFactory df = null;
        try {
            df = DatatypeFactory.newInstance();
        } catch (DatatypeConfigurationException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        try {
            startDate = dateFormatter.parse("2014-11-16");
            endDate = dateFormatter.parse("2014-11-20");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        GregorianCalendar ost = new GregorianCalendar();
        ost.setTimeInMillis(startDate.getTime());
        XMLGregorianCalendar  orderStartDate = df.newXMLGregorianCalendar(ost);
        ost = new GregorianCalendar();
        ost.setTimeInMillis(endDate.getTime());
        XMLGregorianCalendar orderEndDate = df.newXMLGregorianCalendar(ost);
        orderreportrequest.setStartDate(orderStartDate);
        orderreportrequest.setEndDate(orderEndDate);
        System.out.println(orderStartDate);
        System.out.println(orderEndDate);
        String orderreportrequestId = null;
        boolean retry=true;
        int retryCount =1;
        while(retry){
            if(retryCount==10){
                terminate("Amazon FBA Order Data  - Unable to get request id");
            }
            try {
                orderreportrequestId = RequestReportSample.invokeRequestReport(service, orderreportrequest);
                retry = false;
            } catch (MarketplaceWebServiceException e1) {
                e1.printStackTrace();
                Thread.sleep(60*1000);
                retryCount++;
            }
        }
        return orderreportrequestId;
    }

    public static void writeDataToDisk(String requestId) throws FileNotFoundException, IOException, InterruptedException{

        /* Write OrderXml file to disk */

        int retryCount = 1;
        while(true){
            GetReportListRequest requestreportlist = new GetReportListRequest();
            requestreportlist.setMerchant( merchantId );
            final IdList requestIdList = new IdList(Arrays.asList(requestId));        
            requestreportlist.setReportRequestIdList(requestIdList);
            MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
            config.setServiceURL("https://mws.amazonservices.in");
            MarketplaceWebService service = new MarketplaceWebServiceClient(accessKeyId, secretAccessKey, appName, appVersion, config);
            Map<String, String> requestIdreportIdmap = GetReportListSample.invokeGetReportList(service, requestreportlist);
            if(requestIdreportIdmap.get(requestId)!=null){
                GetReportRequest requestorderreport = new GetReportRequest();
                requestorderreport.setMerchant( merchantId );
                requestorderreport.setReportId( requestIdreportIdmap.get(requestId));
                OutputStream orderreport=null;
                try {
                    orderreport = new FileOutputStream( FILE_PATH );
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                requestorderreport.setReportOutputStream(orderreport);
                GetReportSample.invokeGetReport(service, requestorderreport);
                System.out.println("Order Report is ready please check");

                String toFind = "<AmazonEnvelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"amzn-envelope.xsd\">";
                String toReplace = "<AmazonEnvelope xmlns=\"http://mws.amazonaws.com/doc/2009-01-01/\">";
                File orderReportFile = new File(FILE_PATH);
                String content = "";
                try {
                    content = IOUtils.toString(new FileInputStream(orderReportFile));
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                content = content.replaceAll(toFind, toReplace);
                IOUtils.write(content, new FileOutputStream(orderReportFile));
                break;
            }
            else{
                if (retryCount == 5){
                    terminate("Unable to pull FBA Hourly sales report");
                }
                retryCount++;
                Thread.sleep(60*1000);
            }
        }
    }

    public static void populateAndCommitSale() throws ParseException{
        JAXBContext jc = null;
        Unmarshaller unmarshaller = null;
        AmazonEnvelope amazonOrderData = null;
        try {
            jc = JAXBContext.newInstance(AmazonEnvelope.class);
            unmarshaller = jc.createUnmarshaller();
            amazonOrderData = (AmazonEnvelope)unmarshaller.unmarshal(new File(FILE_PATH));
        } catch (JAXBException e1) {
            e1.printStackTrace();
        }
        List<Message> orderMessageList = amazonOrderData.getMessage();
        System.out.println("Amazon Order List ... "+orderMessageList.size());

        for(Message orderMessage : orderMessageList){
            Order amazonOrder = orderMessage.getOrder();
            FulfillmentData orderFullfillmentData = amazonOrder.getFulfillmentData();
            if("Amazon.in".equalsIgnoreCase(amazonOrder.getSalesChannel()) && "Amazon".equalsIgnoreCase(orderFullfillmentData.getFulfillmentChannel())){
                for (int i= 0 ; i < amazonOrder.getOrderItem().size(); i++){
                    Long itemid;
                    AmazonFCWarehouseLocation fcLocation;
                    
                    if(amazonOrder.getOrderItem().get(i).getSKU().startsWith("FBA")){
                        try{
                            itemid = Long.parseLong(amazonOrder.getOrderItem().get(i).getSKU().replaceAll("FBA",""));
                        }
                        catch(Exception ex){
                            continue;
                        }
                        fcLocation = AmazonFCWarehouseLocation.Mumbai;
                    }
                    else if(amazonOrder.getOrderItem().get(i).getSKU().startsWith("FBB")){
                        try{
                            itemid = Long.parseLong(amazonOrder.getOrderItem().get(i).getSKU().replaceAll("FBB",""));
                        }
                        catch(Exception ex){
                            continue;
                        }
                        fcLocation = AmazonFCWarehouseLocation.Bangalore;
                    }
                    else if(amazonOrder.getOrderItem().get(i).getSKU().startsWith("FBG")){
                        try{
                            itemid = Long.parseLong(amazonOrder.getOrderItem().get(i).getSKU().replaceAll("FBG",""));
                        }
                        catch(Exception ex){
                            continue;
                        }
                        fcLocation = AmazonFCWarehouseLocation.Gurgaon;
                    }
                    else{
                        continue;
                    }
                    Integer qty=0;
                    if(amazonOrder.getOrderItem().get(i).getQuantity()!=0){
                        qty = new Integer(amazonOrder.getOrderItem().get(i).getQuantity());
                    }
                    Float itemSale = null;
                    if(amazonOrder.getOrderItem().get(i).getItemPrice()!=null && amazonOrder.getOrderItem().get(i).getItemPrice().getComponent()!=null && amazonOrder.getOrderItem().get(i).getItemPrice().getComponent().size()>0){
                        if(amazonOrder.getOrderItem().get(i).getItemPrice().getComponent().get(0).getAmount().getValue()!=0){
                            itemSale = new Float(amazonOrder.getOrderItem().get(i).getItemPrice().getComponent().get(0).getAmount().getValue());
                        }
                        else{
                            itemSale = (float) 0;
                        }
                    }

                    else{
                        itemSale = (float) 0;
                    }

                    Float itemDiscount; 
                    if(amazonOrder.getOrderItem().get(i).getPromotion()!=null){
                        if(amazonOrder.getOrderItem().get(i).getPromotion().getItemPromotionDiscount()!=null && amazonOrder.getOrderItem().get(i).getPromotion().getItemPromotionDiscount().floatValue()!=0.0f){
                            itemDiscount = amazonOrder.getOrderItem().get(i).getPromotion().getItemPromotionDiscount();
                        }
                        else{
                            itemDiscount = new Float(0);
                        }
                    }
                    else{
                        itemDiscount = new Float(0);
                    }
                    
                    AmazonFbaOrderItem amazonFbaOrderItem = new AmazonFbaOrderItem();
                    amazonFbaOrderItem.setItem_id(itemid);
                    amazonFbaOrderItem.setAmazonOrderId(amazonOrder.getAmazonOrderID());
                    amazonFbaOrderItem.setOrderStatus(amazonOrder.getOrderItem().get(i).getItemStatus());
                    amazonFbaOrderItem.setFcLocation(fcLocation);
                    amazonFbaOrderItem.setTotalAmount(itemSale);
                    amazonFbaOrderItem.setPromotionDiscount(itemDiscount);
                    amazonFbaOrderItem.setQuantity(qty);
                    amazonFbaOrderItem.setPurchaseDate(getPurchaseDate(amazonOrder.getPurchaseDate().toString()));
                    sales.add(amazonFbaOrderItem);
                }
            }
        }
        boolean result=false;
        try {
            result = Consumer.addOrUpdateFbaSales(sales, startDate.getTime(), endDate.getTime());

        } catch (JSONException e) {
            terminate("Unable to commit hourly FBA sales data to mongo");
        }
        System.out.println("Data Committed ? " + result);
        if (!result){
            terminate("Unable to commit hourly FBA sales data to mongo");
        }
    }

    public static long getPurchaseDate(String purchaseDateString) throws ParseException{
        SimpleDateFormat istFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        istFormatter.setLenient(false);
        TimeZone zone= TimeZone.getTimeZone("GMT");
        istFormatter.setTimeZone(zone);
        Date date = istFormatter.parse(purchaseDateString);
        return date.getTime();
    }

    public static void main (String[] args) throws InterruptedException, FileNotFoundException, IOException, TException, ParseException{
        String requestId= invokeServiceRequest();
        writeDataToDisk(requestId);
        populateAndCommitSale();
    }
}