Subversion Repositories SmartDukaan

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
13479 kshitij.so 1
package com.amazonaws.mws.samples;
2
 
3
import in.shop2020.model.v1.order.AmazonFCWarehouseLocation;
4
import in.shop2020.model.v1.order.AmazonFbaOrderItem;
5
import in.shop2020.model.v1.order.AmazonHourlySaleSnapshot;
6
import in.shop2020.utils.GmailUtils;
7
 
8
import java.io.File;
9
import java.io.FileInputStream;
10
import java.io.FileNotFoundException;
11
import java.io.FileOutputStream;
12
import java.io.FileReader;
13
import java.io.IOException;
14
import java.io.OutputStream;
15
import java.text.ParseException;
16
import java.text.SimpleDateFormat;
17
import java.util.ArrayList;
18
import java.util.Arrays;
19
import java.util.Calendar;
20
import java.util.Date;
21
import java.util.GregorianCalendar;
22
import java.util.HashMap;
23
import java.util.List;
24
import java.util.Map;
25
import java.util.TimeZone;
26
import java.util.Map.Entry;
27
 
28
import javax.xml.bind.JAXBContext;
29
import javax.xml.bind.JAXBException;
30
import javax.xml.bind.Unmarshaller;
31
import javax.xml.datatype.DatatypeConfigurationException;
32
import javax.xml.datatype.DatatypeFactory;
33
import javax.xml.datatype.XMLGregorianCalendar;
34
 
35
import org.apache.commons.io.IOUtils;
36
import org.apache.thrift.TException;
37
import org.json.JSONException;
38
 
39
import com.amazonaws.mws.MarketplaceWebService;
40
import com.amazonaws.mws.MarketplaceWebServiceClient;
41
import com.amazonaws.mws.MarketplaceWebServiceConfig;
42
import com.amazonaws.mws.MarketplaceWebServiceException;
43
import com.amazonaws.mws.model.AmazonEnvelope;
44
import com.amazonaws.mws.model.FulfillmentData;
45
import com.amazonaws.mws.model.GetReportListRequest;
46
import com.amazonaws.mws.model.GetReportRequest;
47
import com.amazonaws.mws.model.IdList;
48
import com.amazonaws.mws.model.Message;
49
import com.amazonaws.mws.model.Order;
50
import com.amazonaws.mws.model.RequestReportRequest;
51
 
52
import com.amazonaws.mws.samples.Consumer;
53
 
54
public class AmazonOrderData {
55
 
56
    public final static String accessKeyId = "AKIAII3SGRXBJDPCHSGQ";
57
    public final static String secretAccessKey = "B92xTbNBTYygbGs98w01nFQUhbec1pNCkCsKVfpg";
58
 
59
    public final static String appName = "Test";
60
    public final static String appVersion = "1.0";
61
    public final static String merchantId = "AF6E3O0VE0X4D";
62
 
63
    public final static String FILE_PATH = "/tmp/amazon-order-dump.xml";
64
    public final static SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
65
 
66
    public static List<AmazonFbaOrderItem> sales = new ArrayList<AmazonFbaOrderItem>();
67
    public static Date startDate;
68
    public static Date endDate;
69
 
70
    public static void terminate(String msg){
71
        String emailFromAddress = "build@shop2020.in";
72
        String password = "cafe@nes";
73
        String[] sendTo = new String[]{ "kshitij.sood@saholic.com","anikendra.das@shop2020.in"};
74
        String emailSubjectTxt = msg;
75
        try {
76
            GmailUtils mailer = new GmailUtils();
77
            mailer.sendSSLMessage(sendTo, emailSubjectTxt, "", emailFromAddress, password,"");
78
        }
79
        catch (Exception ex) {
80
            ex.printStackTrace();
81
        }
82
 
83
        System.exit(1);
84
    }
85
 
86
    public static String invokeServiceRequest() throws InterruptedException{
87
 
88
        /* Returns request id of the OrderReport */
89
 
90
        MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
91
        config.setServiceURL("https://mws.amazonservices.in");
92
 
93
        MarketplaceWebService service = new MarketplaceWebServiceClient(accessKeyId, secretAccessKey, appName, appVersion, config);
94
 
95
        IdList marketplaces = new IdList(Arrays.asList("A21TJRUUN4KGV"));        
96
        RequestReportRequest orderreportrequest = new RequestReportRequest()
97
        .withMerchant(merchantId)
98
        .withMarketplaceIdList(marketplaces)
99
        .withReportType("_GET_XML_ALL_ORDERS_DATA_BY_ORDER_DATE_")
100
        .withReportOptions("ShowSalesChannel=true");
101
 
102
        DatatypeFactory df = null;
103
        try {
104
            df = DatatypeFactory.newInstance();
105
        } catch (DatatypeConfigurationException e) {
106
            e.printStackTrace();
107
            throw new RuntimeException(e);
108
        }
109
        try {
110
            startDate = dateFormatter.parse("2014-11-16");
111
            endDate = dateFormatter.parse("2014-11-20");
112
        } catch (ParseException e) {
113
            // TODO Auto-generated catch block
114
            e.printStackTrace();
115
        }
116
        GregorianCalendar ost = new GregorianCalendar();
117
        ost.setTimeInMillis(startDate.getTime());
118
        XMLGregorianCalendar  orderStartDate = df.newXMLGregorianCalendar(ost);
119
        ost = new GregorianCalendar();
120
        ost.setTimeInMillis(endDate.getTime());
121
        XMLGregorianCalendar orderEndDate = df.newXMLGregorianCalendar(ost);
122
        orderreportrequest.setStartDate(orderStartDate);
123
        orderreportrequest.setEndDate(orderEndDate);
124
        System.out.println(orderStartDate);
125
        System.out.println(orderEndDate);
126
        String orderreportrequestId = null;
127
        boolean retry=true;
128
        int retryCount =1;
129
        while(retry){
130
            if(retryCount==10){
131
                terminate("Amazon FBA Order Data  - Unable to get request id");
132
            }
133
            try {
134
                orderreportrequestId = RequestReportSample.invokeRequestReport(service, orderreportrequest);
135
                retry = false;
136
            } catch (MarketplaceWebServiceException e1) {
137
                e1.printStackTrace();
138
                Thread.sleep(60*1000);
139
                retryCount++;
140
            }
141
        }
142
        return orderreportrequestId;
143
    }
144
 
145
    public static void writeDataToDisk(String requestId) throws FileNotFoundException, IOException, InterruptedException{
146
 
147
        /* Write OrderXml file to disk */
148
 
149
        int retryCount = 1;
150
        while(true){
151
            GetReportListRequest requestreportlist = new GetReportListRequest();
152
            requestreportlist.setMerchant( merchantId );
153
            final IdList requestIdList = new IdList(Arrays.asList(requestId));        
154
            requestreportlist.setReportRequestIdList(requestIdList);
155
            MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
156
            config.setServiceURL("https://mws.amazonservices.in");
157
            MarketplaceWebService service = new MarketplaceWebServiceClient(accessKeyId, secretAccessKey, appName, appVersion, config);
158
            Map<String, String> requestIdreportIdmap = GetReportListSample.invokeGetReportList(service, requestreportlist);
159
            if(requestIdreportIdmap.get(requestId)!=null){
160
                GetReportRequest requestorderreport = new GetReportRequest();
161
                requestorderreport.setMerchant( merchantId );
162
                requestorderreport.setReportId( requestIdreportIdmap.get(requestId));
163
                OutputStream orderreport=null;
164
                try {
165
                    orderreport = new FileOutputStream( FILE_PATH );
166
                } catch (FileNotFoundException e) {
167
                    e.printStackTrace();
168
                }
169
                requestorderreport.setReportOutputStream(orderreport);
170
                GetReportSample.invokeGetReport(service, requestorderreport);
171
                System.out.println("Order Report is ready please check");
172
 
173
                String toFind = "<AmazonEnvelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"amzn-envelope.xsd\">";
174
                String toReplace = "<AmazonEnvelope xmlns=\"http://mws.amazonaws.com/doc/2009-01-01/\">";
175
                File orderReportFile = new File(FILE_PATH);
176
                String content = "";
177
                try {
178
                    content = IOUtils.toString(new FileInputStream(orderReportFile));
179
                } catch (FileNotFoundException e1) {
180
                    // TODO Auto-generated catch block
181
                    e1.printStackTrace();
182
                } catch (IOException e1) {
183
                    // TODO Auto-generated catch block
184
                    e1.printStackTrace();
185
                }
186
                content = content.replaceAll(toFind, toReplace);
187
                IOUtils.write(content, new FileOutputStream(orderReportFile));
188
                break;
189
            }
190
            else{
191
                if (retryCount == 5){
192
                    terminate("Unable to pull FBA Hourly sales report");
193
                }
194
                retryCount++;
195
                Thread.sleep(60*1000);
196
            }
197
        }
198
    }
199
 
200
    public static void populateAndCommitSale() throws ParseException{
201
        JAXBContext jc = null;
202
        Unmarshaller unmarshaller = null;
203
        AmazonEnvelope amazonOrderData = null;
204
        try {
205
            jc = JAXBContext.newInstance(AmazonEnvelope.class);
206
            unmarshaller = jc.createUnmarshaller();
207
            amazonOrderData = (AmazonEnvelope)unmarshaller.unmarshal(new File(FILE_PATH));
208
        } catch (JAXBException e1) {
209
            e1.printStackTrace();
210
        }
211
        List<Message> orderMessageList = amazonOrderData.getMessage();
212
        System.out.println("Amazon Order List ... "+orderMessageList.size());
213
 
214
        for(Message orderMessage : orderMessageList){
215
            Order amazonOrder = orderMessage.getOrder();
216
            FulfillmentData orderFullfillmentData = amazonOrder.getFulfillmentData();
217
            if("Amazon.in".equalsIgnoreCase(amazonOrder.getSalesChannel()) && "Amazon".equalsIgnoreCase(orderFullfillmentData.getFulfillmentChannel())){
218
                for (int i= 0 ; i < amazonOrder.getOrderItem().size(); i++){
219
                    Long itemid;
220
                    AmazonFCWarehouseLocation fcLocation;
221
 
222
                    if(amazonOrder.getOrderItem().get(i).getSKU().startsWith("FBA")){
223
                        try{
224
                            itemid = Long.parseLong(amazonOrder.getOrderItem().get(i).getSKU().replaceAll("FBA",""));
225
                        }
226
                        catch(Exception ex){
227
                            continue;
228
                        }
229
                        fcLocation = AmazonFCWarehouseLocation.Mumbai;
230
                    }
231
                    else if(amazonOrder.getOrderItem().get(i).getSKU().startsWith("FBB")){
232
                        try{
233
                            itemid = Long.parseLong(amazonOrder.getOrderItem().get(i).getSKU().replaceAll("FBB",""));
234
                        }
235
                        catch(Exception ex){
236
                            continue;
237
                        }
238
                        fcLocation = AmazonFCWarehouseLocation.Bangalore;
239
                    }
240
                    else if(amazonOrder.getOrderItem().get(i).getSKU().startsWith("FBG")){
241
                        try{
242
                            itemid = Long.parseLong(amazonOrder.getOrderItem().get(i).getSKU().replaceAll("FBG",""));
243
                        }
244
                        catch(Exception ex){
245
                            continue;
246
                        }
247
                        fcLocation = AmazonFCWarehouseLocation.Gurgaon;
248
                    }
249
                    else{
250
                        continue;
251
                    }
252
                    Integer qty=0;
253
                    if(amazonOrder.getOrderItem().get(i).getQuantity()!=0){
254
                        qty = new Integer(amazonOrder.getOrderItem().get(i).getQuantity());
255
                    }
256
                    Float itemSale = null;
257
                    if(amazonOrder.getOrderItem().get(i).getItemPrice()!=null && amazonOrder.getOrderItem().get(i).getItemPrice().getComponent()!=null && amazonOrder.getOrderItem().get(i).getItemPrice().getComponent().size()>0){
258
                        if(amazonOrder.getOrderItem().get(i).getItemPrice().getComponent().get(0).getAmount().getValue()!=0){
259
                            itemSale = new Float(amazonOrder.getOrderItem().get(i).getItemPrice().getComponent().get(0).getAmount().getValue());
260
                        }
261
                        else{
262
                            itemSale = (float) 0;
263
                        }
264
                    }
265
 
266
                    else{
267
                        itemSale = (float) 0;
268
                    }
269
 
270
                    Float itemDiscount; 
271
                    if(amazonOrder.getOrderItem().get(i).getPromotion()!=null){
272
                        if(amazonOrder.getOrderItem().get(i).getPromotion().getItemPromotionDiscount()!=null && amazonOrder.getOrderItem().get(i).getPromotion().getItemPromotionDiscount().floatValue()!=0.0f){
273
                            itemDiscount = amazonOrder.getOrderItem().get(i).getPromotion().getItemPromotionDiscount();
274
                        }
275
                        else{
276
                            itemDiscount = new Float(0);
277
                        }
278
                    }
279
                    else{
280
                        itemDiscount = new Float(0);
281
                    }
282
 
283
                    AmazonFbaOrderItem amazonFbaOrderItem = new AmazonFbaOrderItem();
284
                    amazonFbaOrderItem.setItem_id(itemid);
285
                    amazonFbaOrderItem.setAmazonOrderId(amazonOrder.getAmazonOrderID());
286
                    amazonFbaOrderItem.setOrderStatus(amazonOrder.getOrderItem().get(i).getItemStatus());
287
                    amazonFbaOrderItem.setFcLocation(fcLocation);
288
                    amazonFbaOrderItem.setTotalAmount(itemSale);
289
                    amazonFbaOrderItem.setPromotionDiscount(itemDiscount);
290
                    amazonFbaOrderItem.setQuantity(qty);
291
                    amazonFbaOrderItem.setPurchaseDate(getPurchaseDate(amazonOrder.getPurchaseDate().toString()));
292
                    sales.add(amazonFbaOrderItem);
293
                }
294
            }
295
        }
296
        boolean result=false;
297
        try {
298
            result = Consumer.addOrUpdateFbaSales(sales, startDate.getTime(), endDate.getTime());
299
 
300
        } catch (JSONException e) {
301
            terminate("Unable to commit hourly FBA sales data to mongo");
302
        }
303
        System.out.println("Data Committed ? " + result);
304
        if (!result){
305
            terminate("Unable to commit hourly FBA sales data to mongo");
306
        }
307
    }
308
 
309
    public static long getPurchaseDate(String purchaseDateString) throws ParseException{
310
        SimpleDateFormat istFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
311
        istFormatter.setLenient(false);
312
        TimeZone zone= TimeZone.getTimeZone("GMT");
313
        istFormatter.setTimeZone(zone);
314
        Date date = istFormatter.parse(purchaseDateString);
315
        return date.getTime();
316
    }
317
 
318
    public static void main (String[] args) throws InterruptedException, FileNotFoundException, IOException, TException, ParseException{
319
        String requestId= invokeServiceRequest();
320
        writeDataToDisk(requestId);
321
        //populateAndCommitSale();
322
    }
323
}