Subversion Repositories SmartDukaan

Rev

Rev 13696 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
12103 manish.sha 1
package com.amazonaws.mws.samples;
2
 
3
import in.shop2020.model.v1.order.AmazonFbaOrderReturns;
4
import in.shop2020.thrift.clients.CatalogClient;
5
import in.shop2020.thrift.clients.TransactionClient;
6
import in.shop2020.utils.GmailUtils;
7
 
8
import java.io.BufferedReader;
9
import java.io.BufferedWriter;
10
import java.io.File;
11
import java.io.FileInputStream;
12
import java.io.FileNotFoundException;
13
import java.io.FileOutputStream;
14
import java.io.FileReader;
15
import java.io.FileWriter;
16
import java.io.IOException;
17
import java.io.OutputStream;
18
import java.text.SimpleDateFormat;
19
import java.util.ArrayList;
20
import java.util.Arrays;
21
import java.util.Calendar;
22
import java.util.Collections;
23
import java.util.Date;
24
import java.util.GregorianCalendar;
25
import java.util.HashMap;
26
import java.util.List;
27
import java.util.Map;
28
import java.util.Set;
29
 
30
import javax.xml.bind.JAXBContext;
31
import javax.xml.bind.JAXBException;
32
import javax.xml.bind.Unmarshaller;
33
import javax.xml.datatype.DatatypeConfigurationException;
34
import javax.xml.datatype.DatatypeFactory;
35
import javax.xml.datatype.XMLGregorianCalendar;
36
 
37
import org.apache.commons.io.IOUtils;
38
import org.apache.commons.lang.StringUtils;
39
 
40
import com.amazonaws.mws.MarketplaceWebService;
41
import com.amazonaws.mws.MarketplaceWebServiceClient;
42
import com.amazonaws.mws.MarketplaceWebServiceConfig;
43
import com.amazonaws.mws.MarketplaceWebServiceException;
44
import com.amazonaws.mws.model.AmazonEnvelope;
45
import com.amazonaws.mws.model.FulfillmentData;
46
import com.amazonaws.mws.model.GetReportListRequest;
47
import com.amazonaws.mws.model.GetReportRequest;
48
import com.amazonaws.mws.model.IdList;
49
import com.amazonaws.mws.model.Message;
50
import com.amazonaws.mws.model.Order;
51
import com.amazonaws.mws.model.OrderItem;
52
import com.amazonaws.mws.model.RequestReportRequest;
53
 
54
 
55
public class FetchAmazonOrderReturnsData{
56
	static TransactionClient transactionServiceClient = null;
57
	static in.shop2020.model.v1.order.TransactionService.Client tclient;
58
	static CatalogClient catalogServiceClient = null;
59
	static in.shop2020.model.v1.catalog.CatalogService.Client catalogClient; 
60
	static List<AmazonFbaOrderReturns> amazonFbaOrderReturnsList = new ArrayList<AmazonFbaOrderReturns>();
61
	static String emailFromAddress;
62
	static String password;
63
	static GmailUtils mailer;
64
	static String sendTo[];
65
	static String sendMobTab[];
66
	static String sendExceptMobTab[];
67
	static Date startDateForOrder;
68
	static Date endDateForOrder;
69
 
70
	static {
71
		emailFromAddress = "build-staging@shop2020.in";
72
		password = "shop2020";
73
		mailer = new GmailUtils();
74
		sendTo = new String[] { "manish.sharma@shop2020.in" };
75
 
76
		sendMobTab = new String[]{ "rajneesh.arora@shop2020.in",
77
		  "khushal.bhatia@shop2020.in", "manoj.kumar@saholic.com", "chaitnaya.vats@saholic.com",
12970 amit.gupta 78
		   "manish.sharma@shop2020.in"};
12103 manish.sha 79
 
80
		sendExceptMobTab = new String[]{ "rajneesh.arora@shop2020.in",
81
				  "khushal.bhatia@shop2020.in", "chandan.kumar@saholic.com", "manoj.pal@saholic.com",
12970 amit.gupta 82
				   "manish.sharma@shop2020.in"};
12103 manish.sha 83
	}
84
 
85
 
86
	public static void getReportsFromAmazon(){
87
		final String accessKeyId = "AKIAII3SGRXBJDPCHSGQ";
88
		final String secretAccessKey = "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";
89
 
90
		final String appName = "Test";
91
		final String appVersion = "1.0";
92
		final String merchantId = "AF6E3O0VE0X4D";
93
 
94
		MarketplaceWebServiceConfig config = new MarketplaceWebServiceConfig();
95
		config.setServiceURL("https://mws.amazonservices.in");
96
 
97
		MarketplaceWebService service = new MarketplaceWebServiceClient(
98
				accessKeyId, secretAccessKey, appName, appVersion, config);
99
 
100
		final IdList marketplaces = new IdList(Arrays.asList(
101
		"A21TJRUUN4KGV"));        
102
		RequestReportRequest orderreportrequest = new RequestReportRequest()
103
		.withMerchant(merchantId)
104
		.withMarketplaceIdList(marketplaces)
105
		.withReportType("_GET_XML_ALL_ORDERS_DATA_BY_ORDER_DATE_")
106
		.withReportOptions("ShowSalesChannel=true");
107
 
108
		RequestReportRequest returnsreportrequest = new RequestReportRequest()
109
		.withMerchant(merchantId)
110
		.withMarketplaceIdList(marketplaces)
111
		.withReportType("_GET_FBA_FULFILLMENT_CUSTOMER_RETURNS_DATA_")
112
		.withReportOptions("ShowSalesChannel=true");
113
 
114
		DatatypeFactory df = null;
115
		try {
116
			df = DatatypeFactory.newInstance();
117
		} catch (DatatypeConfigurationException e) {
118
			e.printStackTrace();
119
			throw new RuntimeException(e);
120
		}
121
 
122
		Calendar cal = Calendar.getInstance();
123
		cal.add(Calendar.DAY_OF_MONTH, -45);
124
		long ordertimediff = cal.getTimeInMillis();
125
 
126
		GregorianCalendar ost = new GregorianCalendar();
127
		ost.setTimeInMillis(ordertimediff);
128
		//For Order Report StartDate
129
		XMLGregorianCalendar  orderStartDate = df.newXMLGregorianCalendar(ost);
130
		//For Order Report EndDate
131
		cal.add(Calendar.DAY_OF_MONTH, 15);
132
 
133
		ordertimediff = cal.getTimeInMillis();
134
		ost = new GregorianCalendar();
135
		ost.setTimeInMillis(ordertimediff);
136
		XMLGregorianCalendar orderEndDate = df.newXMLGregorianCalendar(ost);
137
 
138
		System.out.println("Order Start Date  " + orderStartDate  + "Order End Date  " + orderEndDate);
139
 
140
		orderreportrequest.setStartDate(orderStartDate);
141
		orderreportrequest.setEndDate(orderEndDate);
142
 
143
		Calendar cal1 = Calendar.getInstance();
144
		cal1.add(Calendar.DAY_OF_MONTH, -45);
145
		long returntimediff = cal1.getTimeInMillis();
146
		GregorianCalendar ist = new GregorianCalendar();
147
		ist.setTimeInMillis(returntimediff);
148
 
149
		//For Return Report StartDate
150
		XMLGregorianCalendar  returnStartDate = df.newXMLGregorianCalendar(ist);
151
		//For Return Report StartDate
152
		XMLGregorianCalendar returnEndDate = df.newXMLGregorianCalendar(new GregorianCalendar());
153
 
154
		System.out.println("Return Start Date  " + returnStartDate  + "Return End Date  " + returnEndDate);
155
 
156
		returnsreportrequest.setStartDate(returnStartDate);
157
		returnsreportrequest.setEndDate(returnEndDate);
158
 
159
		Map<String,String> requestIdreportIdmap;
160
		String orderreportrequestId = null;
161
		String returnreportrequestId = null;
162
		boolean retry=true;
163
		int retryCount =0;
164
 
165
 
166
		while(retry && retryCount!=5){
167
			if(retryCount==4){
168
				String emailFromAddress = "build-staging@shop2020.in";
169
				String password = "shop2020";
170
				String[] sendTo = new String[]{ "manish.sharma@shop2020.in"};
171
				String emailSubjectTxt = "Fetch FBA Order Returns Details failure";
172
				try {
173
					GmailUtils mailer = new GmailUtils();
174
					mailer.sendSSLMessage(sendTo, emailSubjectTxt, "", emailFromAddress, password,"");
175
				}
176
				catch (Exception ex) {
177
					ex.printStackTrace();
178
				}
179
 
180
				System.exit(1);
181
			}
182
			try {
183
				orderreportrequestId = RequestReportSample.invokeRequestReport(service, orderreportrequest);
184
				returnreportrequestId = RequestReportSample.invokeRequestReport(service, returnsreportrequest);
185
				retry = false;
186
			} catch (MarketplaceWebServiceException e) {
187
				// TODO Auto-generated catch block
188
				e.printStackTrace();
189
				try {
190
					Thread.sleep(10*60*1000);
191
					retryCount++;
192
				} catch (InterruptedException e1) {
193
					// TODO Auto-generated catch block
194
					e1.printStackTrace();
195
				}
196
			}
197
		}
198
 
199
		while(true){
200
			GetReportListRequest requestreportlist = new GetReportListRequest();
201
			requestreportlist.setMerchant( merchantId );
202
			final IdList requestIdList = new IdList(Arrays.asList(orderreportrequestId,returnreportrequestId));        
203
			requestreportlist.setReportRequestIdList(requestIdList);
204
			requestIdreportIdmap = GetReportListSample.invokeGetReportList(service, requestreportlist);
205
 
206
			if(requestIdreportIdmap.get(orderreportrequestId)!=null && requestIdreportIdmap.get(returnreportrequestId)!=null){
207
				GetReportRequest requestorderreport = new GetReportRequest();
208
				GetReportRequest requestreturnsreport = new GetReportRequest();
209
				requestorderreport.setMerchant( merchantId );
210
				requestreturnsreport.setMerchant(merchantId);
211
				requestorderreport.setReportId( requestIdreportIdmap.get(orderreportrequestId));
212
				requestreturnsreport.setReportId(requestIdreportIdmap.get(returnreportrequestId));
213
				OutputStream orderreport=null;
214
				OutputStream returnsreport=null;
215
				try {
216
					orderreport = new FileOutputStream( "/tmp/amazonorderreport.xml" );
217
					returnsreport = new FileOutputStream( "/tmp/fbareturnsreport.csv" );
218
				} catch (FileNotFoundException e) {
219
					// TODO Auto-generated catch block
220
					e.printStackTrace();
221
				}
222
 
223
				requestorderreport.setReportOutputStream(orderreport);
224
				requestreturnsreport.setReportOutputStream(returnsreport);
225
				GetReportSample.invokeGetReport(service, requestorderreport);
226
				GetReportSample.invokeGetReport(service, requestreturnsreport);
227
				System.out.println("Order and Return Reports are ready please check");
228
				break;
229
			} else {
230
				System.out.println("Report not ready");
231
				try {
232
					Thread.sleep(5*60*1000);
233
				} catch (InterruptedException e) {
234
					// TODO Auto-generated catch block
235
					e.printStackTrace();
236
				}
237
			}
238
		}
239
	}
240
 
241
	public static void readOrders(){
242
		String toFind = "<AmazonEnvelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"amzn-envelope.xsd\">";
243
		String toReplace = "<AmazonEnvelope xmlns=\"http://mws.amazonaws.com/doc/2009-01-01/\">";
244
		File orderReportFile = new File("/tmp/amazonorderreport.xml");
245
 
246
		String content = "";
247
		try {
248
			content = IOUtils.toString(new FileInputStream(orderReportFile));
249
		} catch (FileNotFoundException e1) {
250
			// TODO Auto-generated catch block
251
			e1.printStackTrace();
252
		} catch (IOException e1) {
253
			// TODO Auto-generated catch block
254
			e1.printStackTrace();
255
		}
256
		content = content.replaceAll(toFind, toReplace);
257
		try {
258
			IOUtils.write(content, new FileOutputStream(orderReportFile));
259
		} catch (FileNotFoundException e1) {
260
			e1.printStackTrace();
261
		} catch (IOException e1) {
262
			e1.printStackTrace();
263
		}
264
 
265
		JAXBContext jc = null;
266
		Unmarshaller unmarshaller = null;
267
		AmazonEnvelope amazonOrderData = null;
268
		try {
269
			jc = JAXBContext.newInstance(AmazonEnvelope.class);
270
			unmarshaller = jc.createUnmarshaller();
271
			amazonOrderData = (AmazonEnvelope)unmarshaller.unmarshal(orderReportFile);
272
		} catch (JAXBException e1) {
273
			e1.printStackTrace();
274
		}
275
 
276
 
277
 
278
		SimpleDateFormat istFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
279
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
280
 
281
 
282
 
283
		try {
284
			Date insertDate = dateFormat.parse(dateFormat.format(new Date()));
285
			int orderCount =1;
286
			if(amazonOrderData!=null){
287
				List<Message> orderMessageList = amazonOrderData.getMessage();
288
				System.out.println("Amazon Order List ... "+orderMessageList.size());
289
 
290
				transactionServiceClient = new TransactionClient();
291
				tclient  = transactionServiceClient.getClient();
292
 
293
 
294
				for(Message orderMessage : orderMessageList){
295
					if(orderCount%500==0){
296
						if(!tclient.isAlive()){
297
							tclient  = transactionServiceClient.getClient();
298
						}
299
						if(amazonFbaOrderReturnsList!=null && amazonFbaOrderReturnsList.size()>0){
300
							tclient.updateAmazonFbaOrdersReturns(amazonFbaOrderReturnsList);
301
							Thread.sleep(5*1000);
302
						}
303
						amazonFbaOrderReturnsList = new ArrayList<AmazonFbaOrderReturns>();
304
						orderCount = 1;
305
					}
306
					Order amazonOrder = orderMessage.getOrder();
307
					FulfillmentData orderFullfillmentData = amazonOrder.getFulfillmentData();
13696 manish.sha 308
					for(OrderItem orderItem : amazonOrder.getOrderItem()){
309
 
310
						if("Amazon.in".equalsIgnoreCase(amazonOrder.getSalesChannel()) && "Amazon".equalsIgnoreCase(orderFullfillmentData.getFulfillmentChannel()) && orderItem!=null && "Shipped".equalsIgnoreCase(orderItem.getItemStatus())){
311
 
312
							Date date = istFormatter.parse(amazonOrder.getPurchaseDate().toString());
313
							Date purchaseDate = dateFormat.parse(dateFormat.format(date));
314
							long sku = 0l;
315
							if(orderItem.getSKU().startsWith("FBB")){
316
								if(orderItem.getSKU().contains("_")){
317
									sku = Long.parseLong(orderItem.getSKU().replaceAll("FBB","").split("_")[0]);
318
								}else{
319
									sku = Long.parseLong(orderItem.getSKU().replaceAll("FBB",""));
320
								}
321
							} else if(orderItem.getSKU().startsWith("FBA")){
322
								if(orderItem.getSKU().contains("_")){
323
									sku = Long.parseLong(orderItem.getSKU().replaceAll("FBA","").split("_")[0]);
324
								}else{
325
									sku = Long.parseLong(orderItem.getSKU().replaceAll("FBA",""));
326
								}
13697 manish.sha 327
							} else if(orderItem.getSKU().startsWith("FBG")){
328
								if(orderItem.getSKU().contains("_")){
329
									sku = Long.parseLong(orderItem.getSKU().replaceAll("FBG","").split("_")[0]);
330
								}else{
331
									sku = Long.parseLong(orderItem.getSKU().replaceAll("FBG",""));
332
								}
13696 manish.sha 333
							} else {
334
								continue;
12103 manish.sha 335
							}
13696 manish.sha 336
							AmazonFbaOrderReturns amazonfbaOrderReturn = new AmazonFbaOrderReturns();
337
							amazonfbaOrderReturn.setAmazonOrderId(amazonOrder.getAmazonOrderID());
338
							amazonfbaOrderReturn.setInsertionTimestamp(insertDate.getTime());
339
							amazonfbaOrderReturn.setSku(sku);
340
							amazonfbaOrderReturn.setCreationTimestamp(purchaseDate.getTime());
341
							amazonfbaOrderReturn.setShippedQuantity(orderItem.getQuantity());
342
							amazonfbaOrderReturn.setSellableReturnQuantity(0);
343
							amazonfbaOrderReturn.setNonSellableReturnQuantity(0);
344
							amazonFbaOrderReturnsList.add(amazonfbaOrderReturn);
12103 manish.sha 345
						}
346
					}
347
					orderCount++;
348
				}
349
			}
350
 
351
			//System.out.println(orderCount);
352
 
353
			try{
354
				if(!tclient.isAlive()){
355
					tclient  = transactionServiceClient.getClient();
356
				}
357
				if(amazonFbaOrderReturnsList!=null && amazonFbaOrderReturnsList.size()>0){
358
					//amazonFbaOrderReturnsList.
359
					tclient.updateAmazonFbaOrdersReturns(amazonFbaOrderReturnsList);
360
				}
361
			} catch (Exception e){
362
				/*try {
363
					Thread.sleep(60*60*1000);
364
				} catch (InterruptedException e1) {
365
					// TODO Auto-generated catch block
366
					e.printStackTrace();
367
				}*/
368
			}
369
 
370
		} catch (Exception e) {
371
			// TODO Auto-generated catch block
372
			e.printStackTrace();
373
		}
374
	}
375
 
376
	private static void updateReturnsInOrderDetails() {
377
		try{
378
 
379
			BufferedReader returnsreportreader = null;
380
			try {
381
				/*orderreportreader = new CSVReader(new FileReader("/home/amazonorderreport.csv"),'\t');*/
382
				returnsreportreader = new BufferedReader(new FileReader("/tmp/fbareturnsreport.csv"));
383
			} catch (FileNotFoundException e) {
384
				// TODO Auto-generated catch block
385
				e.printStackTrace();
386
			}
387
 
388
			String [] nextLine;
389
			String line;
390
 
391
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
392
			Date insertDate = dateFormat.parse(dateFormat.format(new Date()));
393
 
394
			tclient  = transactionServiceClient.getClient();
395
			List<AmazonFbaOrderReturns> addedAmazonFbaOrderReturnsList = tclient.getAllAmazonFbaOrderReturnsByCurrentTime(insertDate.getTime());
396
 
397
			Map<String, AmazonFbaOrderReturns> addedAmazonFbaOrderReturnsMap = new HashMap<String, AmazonFbaOrderReturns>();
398
			Map<String, AmazonFbaOrderReturns> returnAmazonFbaOrderReturnsMap = new HashMap<String, AmazonFbaOrderReturns>();
399
 
400
			for(AmazonFbaOrderReturns orderReturn : addedAmazonFbaOrderReturnsList){
401
				addedAmazonFbaOrderReturnsMap.put(orderReturn.getAmazonOrderId(), orderReturn);
402
			}			
403
 
404
			File file = new File("/tmp/FBA_Returns_Report.xls");
405
			BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
406
			int count =1;
407
			amazonFbaOrderReturnsList = new ArrayList<AmazonFbaOrderReturns>();
408
			while((line = returnsreportreader.readLine())!= null){
409
				nextLine = line.split("\t");
410
				bufferedWriter.write(StringUtils.join(nextLine, '\t'));
411
				bufferedWriter.newLine();
412
				if(count!=1){					
413
					if(addedAmazonFbaOrderReturnsMap.containsKey(nextLine[1])){
414
						AmazonFbaOrderReturns orderReturn = null;
415
						if(returnAmazonFbaOrderReturnsMap.containsKey(nextLine[1])){
416
							orderReturn = returnAmazonFbaOrderReturnsMap.get(nextLine[1]);
417
							if("SELLABLE".equalsIgnoreCase(nextLine[8])){
418
								orderReturn.setSellableReturnQuantity(orderReturn.getSellableReturnQuantity()+Long.parseLong(nextLine[6]));
419
							}else{
420
								orderReturn.setNonSellableReturnQuantity(orderReturn.getNonSellableReturnQuantity()+Long.parseLong(nextLine[6]));
421
							}
422
							returnAmazonFbaOrderReturnsMap.put(orderReturn.getAmazonOrderId(), orderReturn);
423
						} else {
424
							orderReturn = addedAmazonFbaOrderReturnsMap.get(nextLine[1]);
425
							if("SELLABLE".equalsIgnoreCase(nextLine[8])){
426
								orderReturn.setSellableReturnQuantity(orderReturn.getSellableReturnQuantity()+Long.parseLong(nextLine[6]));
427
							}else{
428
								orderReturn.setNonSellableReturnQuantity(orderReturn.getNonSellableReturnQuantity()+Long.parseLong(nextLine[6]));
429
							}
430
							returnAmazonFbaOrderReturnsMap.put(orderReturn.getAmazonOrderId(), orderReturn);
431
						}
432
 
433
					}
434
				}
435
				count++;
436
			}
437
			bufferedWriter.close();
438
 
439
			for(String key : returnAmazonFbaOrderReturnsMap.keySet()){
440
				amazonFbaOrderReturnsList.add(returnAmazonFbaOrderReturnsMap.get(key));
441
			}
442
 
443
 
444
			int returnCount =1;
445
			List<AmazonFbaOrderReturns> amazonFbaOrderReturnsSubList = new ArrayList<AmazonFbaOrderReturns>();
446
			for(int i=0; i<amazonFbaOrderReturnsList.size(); i++){
447
				if(returnCount%500==0){
448
					if(amazonFbaOrderReturnsSubList!=null && amazonFbaOrderReturnsSubList.size()>0){
449
						if(!tclient.isAlive()){
450
							tclient  = transactionServiceClient.getClient();
451
						}
452
						if(amazonFbaOrderReturnsSubList!=null && amazonFbaOrderReturnsSubList.size()>0){
453
							tclient.updateAmazonFbaOrdersReturns(amazonFbaOrderReturnsSubList);
454
							Thread.sleep(5*1000);
455
						}
456
						amazonFbaOrderReturnsSubList = new ArrayList<AmazonFbaOrderReturns>();
457
						returnCount = 1;
458
					}
459
				}
460
				amazonFbaOrderReturnsSubList.add(amazonFbaOrderReturnsList.get(i));
461
				returnCount++;
462
			}
463
 
464
			if(!tclient.isAlive()){
465
				tclient  = transactionServiceClient.getClient();
466
			}
467
			try{
468
				if(amazonFbaOrderReturnsSubList!=null && amazonFbaOrderReturnsSubList.size()>0){
469
					tclient.updateAmazonFbaOrdersReturns(amazonFbaOrderReturnsSubList);
470
				}
471
			} catch(Exception e) {
472
 
473
			}
474
		} catch(Exception e){
475
			e.printStackTrace();
476
		}
477
 
478
	}
479
 
480
	private static void getReturnsReportDataAndSendMail(){
481
		try{
482
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
483
			Date insertDate = dateFormat.parse(dateFormat.format(new Date()));
484
			Calendar cal = Calendar.getInstance();
485
			cal.add(Calendar.DAY_OF_MONTH, -45);
486
			startDateForOrder = new Date(cal.getTimeInMillis());
487
			cal.add(Calendar.DAY_OF_MONTH, 15);
488
			endDateForOrder = new Date(cal.getTimeInMillis());
489
 
490
			transactionServiceClient = new TransactionClient();
491
			catalogServiceClient= new CatalogClient();
492
			catalogClient = catalogServiceClient.getClient();
493
			List<in.shop2020.model.v1.catalog.Item> allItems = catalogClient.getAllItems(false);
494
			Map<Long, in.shop2020.model.v1.catalog.Item> itemDetailsMap = new HashMap<Long, in.shop2020.model.v1.catalog.Item>();
495
			for(in.shop2020.model.v1.catalog.Item item : allItems){
496
				itemDetailsMap.put(item.getId(), item);
497
			}
498
			tclient  = transactionServiceClient.getClient();
499
 
500
			Map<Long, Map<String, Long>> amazonFbaReturnDataSkuMap = tclient.getTotalSaleReturnsFbaSkusCurentTime(insertDate.getTime());
501
			List<FbaSkuOrderSaleReturnDetail>  fbaSkuMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
502
			List<FbaSkuOrderSaleReturnDetail>  fbaSkuExceptMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
503
 
504
			Set<Long> itemIdSet = amazonFbaReturnDataSkuMap.keySet();
505
			long totalSaleMobileTablet = 0l;
506
			long totalNonSellableReturnsMobileTablet = 0l;
507
			long totalSaleExceptMobileTablet = 0l;
508
			long totalNonSellableReturnsExceptMobileTablet = 0l;
509
			for(Long itemId : itemIdSet){
510
				in.shop2020.model.v1.catalog.Item item = itemDetailsMap.get(itemId);
511
				long soldQuantity = amazonFbaReturnDataSkuMap.get(itemId).get("Sale");
512
 
513
				long saleableReturn = amazonFbaReturnDataSkuMap.get(itemId).get("SaleableReturn");
514
				long nonsaleableReturn = amazonFbaReturnDataSkuMap.get(itemId).get("NonSaleableReturn");
515
 
516
				FbaSkuOrderSaleReturnDetail skuDetail = new FbaSkuOrderSaleReturnDetail();
517
 
518
				skuDetail.setItemId(itemId.longValue());
519
				skuDetail.setBrand(item.getBrand());
520
				skuDetail.setProductName(item.getModelName()+" "+item.getModelNumber());
521
				skuDetail.setProductCategory(item.getProductGroup());
522
				skuDetail.setColor(item.getColor());
523
				skuDetail.setSoldQuantity(soldQuantity);
524
				skuDetail.setReturnQuantity(saleableReturn+nonsaleableReturn);
525
				skuDetail.setSellableReturns(saleableReturn);
526
				skuDetail.setNonsellableReturns(nonsaleableReturn);
527
				double returnPtage = (double)(saleableReturn+nonsaleableReturn)/(double)soldQuantity*100.0;
528
				skuDetail.setReturnPercentage(Math.round(returnPtage * 10.0)/10.0);
529
				returnPtage = (double)saleableReturn/(double)soldQuantity*100.0;
530
				skuDetail.setSellableReturnPercentage(Math.round(returnPtage * 10.0)/10.0);
531
				returnPtage = (double)nonsaleableReturn/(double)soldQuantity*100.0;
532
				skuDetail.setNonSellableReturnPercentage(Math.round(returnPtage * 10.0)/10.0);
533
 
534
				if("Handsets".equalsIgnoreCase(item.getProductGroup()) || "Tablets".equalsIgnoreCase(item.getProductGroup()) || "Handset".equalsIgnoreCase(item.getProductGroup())){
535
					totalSaleMobileTablet = totalSaleMobileTablet + soldQuantity;
536
					totalNonSellableReturnsMobileTablet = totalNonSellableReturnsMobileTablet + nonsaleableReturn;
537
					fbaSkuMobileTabletReturnDetailList.add(skuDetail);
538
				} else {
539
					totalSaleExceptMobileTablet = totalSaleExceptMobileTablet + soldQuantity;
540
					totalNonSellableReturnsExceptMobileTablet = totalNonSellableReturnsExceptMobileTablet + nonsaleableReturn;
541
					fbaSkuExceptMobileTabletReturnDetailList.add(skuDetail);
542
				}
543
			}
544
 
545
			double avgNonsellableReturnsPercentageMobileTablet = (double) totalNonSellableReturnsMobileTablet/(double)totalSaleMobileTablet * 100;
546
			avgNonsellableReturnsPercentageMobileTablet = Math.round(avgNonsellableReturnsPercentageMobileTablet * 10.0)/10.0;
547
			double avgNonsellableReturnsPercentageExceptMobileTablet = (double) totalNonSellableReturnsExceptMobileTablet/(double)totalSaleExceptMobileTablet * 100;
548
			avgNonsellableReturnsPercentageExceptMobileTablet = Math.round(avgNonsellableReturnsPercentageExceptMobileTablet * 10.0)/10.0;
549
 
550
			Map<String, FbaBrandCategorySaleReturnInfo> fbaBrandCategorySaleReturnsMobTabMap = new HashMap<String, FbaBrandCategorySaleReturnInfo>();
551
			Map<String, FbaBrandCategorySaleReturnInfo> fbaBrandCategorySaleReturnsExceptMobTabMap = new HashMap<String, FbaBrandCategorySaleReturnInfo>();
552
 
553
 
554
			List<FbaSkuOrderSaleReturnDetail>  mailBodySkuMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
555
			List<FbaSkuOrderSaleReturnDetail>  mailBodySkuExceptMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
556
 
557
			for(FbaSkuOrderSaleReturnDetail fba_detail: fbaSkuMobileTabletReturnDetailList){
558
				if(fba_detail.getSoldQuantity() >= 25){
559
					mailBodySkuMobileTabletReturnDetailList.add(fba_detail);
560
				}
561
				if(fbaBrandCategorySaleReturnsMobTabMap.containsKey(fba_detail.getBrand()+"-"+fba_detail.getProductCategory())){
562
					FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsMobTabMap.get(fba_detail.getBrand()+"-"+fba_detail.getProductCategory());
563
					saleReturnInfo.setSale(saleReturnInfo.getSale()+fba_detail.getSoldQuantity());
564
					saleReturnInfo.setNonSellReturn(saleReturnInfo.getNonSellReturn()+fba_detail.getNonsellableReturns());
565
					fbaBrandCategorySaleReturnsMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
566
				} else {
567
					FbaBrandCategorySaleReturnInfo saleReturnInfo = new FbaBrandCategorySaleReturnInfo();
568
					saleReturnInfo.setBrand(fba_detail.getBrand());
569
					saleReturnInfo.setCategory(fba_detail.getProductCategory());
570
					saleReturnInfo.setSale(fba_detail.getSoldQuantity());
571
					saleReturnInfo.setNonSellReturn(fba_detail.getNonsellableReturns());
572
					fbaBrandCategorySaleReturnsMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
573
				}
574
			}
575
 
576
			for(FbaSkuOrderSaleReturnDetail fba_detail: fbaSkuExceptMobileTabletReturnDetailList){
577
				if(fba_detail.getSoldQuantity() >= 25){
578
					mailBodySkuExceptMobileTabletReturnDetailList.add(fba_detail);
579
				}
580
				if(fbaBrandCategorySaleReturnsExceptMobTabMap.containsKey(fba_detail.getBrand()+"-"+fba_detail.getProductCategory())){
581
					FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsExceptMobTabMap.get(fba_detail.getBrand()+"-"+fba_detail.getProductCategory());
582
					saleReturnInfo.setSale(saleReturnInfo.getSale()+fba_detail.getSoldQuantity());
583
					saleReturnInfo.setNonSellReturn(saleReturnInfo.getNonSellReturn()+fba_detail.getNonsellableReturns());
584
					fbaBrandCategorySaleReturnsExceptMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
585
				} else {
586
					FbaBrandCategorySaleReturnInfo saleReturnInfo = new FbaBrandCategorySaleReturnInfo();
587
					saleReturnInfo.setBrand(fba_detail.getBrand());
588
					saleReturnInfo.setCategory(fba_detail.getProductCategory());
589
					saleReturnInfo.setSale(fba_detail.getSoldQuantity());
590
					saleReturnInfo.setNonSellReturn(fba_detail.getNonsellableReturns());
591
					fbaBrandCategorySaleReturnsExceptMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
592
				}
593
			}
594
 
595
			List<FbaBrandCategorySaleReturnInfo> mailBodyBCSaleReturnMobTabList = new ArrayList<FbaBrandCategorySaleReturnInfo>();
596
			List<FbaBrandCategorySaleReturnInfo> mailBodyBCSaleReturnExceptMobTabList = new ArrayList<FbaBrandCategorySaleReturnInfo>();
597
 
598
 
599
			for(String br_category : fbaBrandCategorySaleReturnsMobTabMap.keySet()){
600
				FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsMobTabMap.get(br_category);
601
				if(saleReturnInfo.getSale()>=100){
602
					double saleNonSellReturnPtage = (double)saleReturnInfo.getNonSellReturn()/(double)saleReturnInfo.getSale()*100;
603
					saleReturnInfo.setNonSellReturnPtage(Math.round(saleNonSellReturnPtage*10.0)/10.0);
604
					mailBodyBCSaleReturnMobTabList.add(saleReturnInfo);
605
				}
606
			}
607
 
608
			for(String br_category : fbaBrandCategorySaleReturnsExceptMobTabMap.keySet()){
609
				FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsExceptMobTabMap.get(br_category);
610
				if(saleReturnInfo.getSale()>=100){
611
					double saleNonSellReturnPtage = (double)saleReturnInfo.getNonSellReturn()/(double)saleReturnInfo.getSale()*100;
612
					saleReturnInfo.setNonSellReturnPtage(Math.round(saleNonSellReturnPtage*10.0)/10.0);
613
					mailBodyBCSaleReturnExceptMobTabList.add(saleReturnInfo);
614
				}
615
			}
616
 
617
 
618
			if (mailBodyBCSaleReturnMobTabList != null
619
					&& mailBodyBCSaleReturnMobTabList.size() >= 2) {
620
				Collections.sort(mailBodyBCSaleReturnMobTabList,
621
						new FbaBrandCategorySaleReturnInfoComparator());
622
			}
623
 
624
			if (mailBodyBCSaleReturnExceptMobTabList != null
625
					&& mailBodyBCSaleReturnExceptMobTabList.size() >= 2) {
626
				Collections.sort(mailBodyBCSaleReturnExceptMobTabList,
627
						new FbaBrandCategorySaleReturnInfoComparator());
628
			}
629
 
630
			if(mailBodySkuMobileTabletReturnDetailList!=null 
631
					&& mailBodySkuMobileTabletReturnDetailList.size() >= 2){
632
				Collections.sort(mailBodySkuMobileTabletReturnDetailList, 
633
						new FbaSkuOrderSaleReturnDetailComparator());
634
			}
635
 
636
			if(mailBodySkuExceptMobileTabletReturnDetailList!=null 
637
					&& mailBodySkuExceptMobileTabletReturnDetailList.size() >= 2){
638
				Collections.sort(mailBodySkuExceptMobileTabletReturnDetailList, 
639
						new FbaSkuOrderSaleReturnDetailComparator());
640
			}
641
 
642
			File file = new File("/tmp/MobileTablets-FBAOrdersReturns.xls");
643
			BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
644
			bufferedWriter.write(StringUtils.join(new String[] { "Sku",
645
					"Brand", "ProductName", "Category", "Color",
646
					"Sales", "Return", "Return%", "Sellable Return", "Sellable Return%",
647
					"Non Sellable Return", "Non Sellable Return%" }, '\t'));
648
 
649
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail:fbaSkuMobileTabletReturnDetailList){
650
				bufferedWriter.newLine();
651
				bufferedWriter.write(StringUtils.join(new String[] { String.valueOf(fbaReturndetail.getItemId()),
652
					fbaReturndetail.getBrand(), fbaReturndetail.getProductName(), fbaReturndetail.getProductCategory(), fbaReturndetail.getColor(),
653
					String.valueOf(fbaReturndetail.getSoldQuantity()), String.valueOf(fbaReturndetail.getSellableReturns()+fbaReturndetail.getNonsellableReturns()), 
654
					String.valueOf(fbaReturndetail.getReturnPercentage()), String.valueOf(fbaReturndetail.getSellableReturns()), String.valueOf(fbaReturndetail.getSellableReturnPercentage()),
655
					String.valueOf(fbaReturndetail.getNonsellableReturns()), String.valueOf(fbaReturndetail.getNonSellableReturnPercentage())}, '\t'));
656
			}
657
			bufferedWriter.close();
658
 
659
			file = new File("/tmp/ExceptMobileTablets-FBAOrdersReturns.xls");
660
			bufferedWriter = new BufferedWriter(new FileWriter(file));
661
			bufferedWriter.write(StringUtils.join(new String[] { "Sku",
662
					"Brand", "ProductName", "Category", "Color",
663
					"Sales", "Return", "Return%", "Sellable Return", "Sellable Return%",
664
					"Non Sellable Return", "Non Sellable Return%" }, '\t'));
665
 
666
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail:fbaSkuExceptMobileTabletReturnDetailList){
667
				bufferedWriter.newLine();
668
				bufferedWriter.write(StringUtils.join(new String[] { String.valueOf(fbaReturndetail.getItemId()),
669
					fbaReturndetail.getBrand(), fbaReturndetail.getProductName(), fbaReturndetail.getProductCategory(), fbaReturndetail.getColor(),
670
					String.valueOf(fbaReturndetail.getSoldQuantity()), String.valueOf(fbaReturndetail.getSellableReturns()+fbaReturndetail.getNonsellableReturns()), 
671
					String.valueOf(fbaReturndetail.getReturnPercentage()), String.valueOf(fbaReturndetail.getSellableReturns()), String.valueOf(fbaReturndetail.getSellableReturnPercentage()),
672
					String.valueOf(fbaReturndetail.getNonsellableReturns()), String.valueOf(fbaReturndetail.getNonSellableReturnPercentage())}, '\t'));
673
			}
674
			bufferedWriter.close();
675
 
676
			StringBuffer sb = new StringBuffer();
677
			sb.append("<html>" + "<p><b>" +"Date Range for Orders : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(endDateForOrder) + "</b></p><br>");
678
			sb.append("<p><b>" +"Date Range for Returns : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(insertDate) + "</b></p><br>");
679
			sb.append("<table border=\"1\" align=\"center\">"
680
					+ "<caption><b>" + "AVERGAGE NON SELLABLE RETURNS" + "</b></caption>"
681
					+ "<tr>" + "<td><b>" + "Avg Non Sellable Returns %" + "</b></td>" 
682
					+ "<td>" + avgNonsellableReturnsPercentageMobileTablet + "</td>"
683
					+ "</tr></table><br>");
684
			sb.append("<table border=\"1\" align=\"center\">" 
685
					+"<caption><b>" + "TOP BRAND- CATEGORY HIGH NON SELLABLE RETURN %" + "</b></caption>"
686
					+ "<tr>" + "<td><b>" + "Brand" + "</b></td>" 
687
					+ "<td><b>" + "Category" + "</b></td>"
688
					+ "<td><b>" + "Sale" + "</b></td>"
689
					+ "<td><b>" + "NonSellable Return" + "</b></td>"
690
					+ "<td><b>" + "NonSellable Return %" + "</b></td></tr>");
691
			for(FbaBrandCategorySaleReturnInfo fbaBCSaleReturnInfo : mailBodyBCSaleReturnMobTabList){
692
				sb.append("<tr>" + "<td>" + fbaBCSaleReturnInfo.getBrand() + "</td>"
693
						+ "<td>" + fbaBCSaleReturnInfo.getCategory()+ "</td>"
694
						+ "<td>" + fbaBCSaleReturnInfo.getSale() + "</td>"
695
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturn() + "</td>"
696
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturnPtage()+ "</td>"
697
						+ "</tr>");
698
			}
699
			sb.append("</table>");
700
			sb.append("<table border=\"1\" align=\"center\">" 
701
					+"<caption><b>" + "TOP TEN SKU WITH HIGH NON SELLABLE RETURNS" + "</b></caption>" +
702
					 "<tr>" + "<td><b>" + "Item Id" + "</b></td>" 
703
					+ "<td><b>" + "Product Name" + "</b></td>" 
704
					+ "<td><b>" + "Sale" + "</b></td>" 
705
					+ "<td><b>" + "Return" + "</b></td>" 
706
					+ "<td><b>" + "Return %" + "</b></td>"
707
					+ "<td><b>" + "Sellable Return" + "</b></td>" 
708
					+ "<td><b>" + "Sellable Return %" + "</b></td>" 
709
					+ "<td><b>" + "Non Sellable Return" + "</b></td>" 
710
					+ "<td><b>" + "Non Sellable Return %" + "</b></td>");
711
 
712
			int count =1;
713
 
714
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail : mailBodySkuMobileTabletReturnDetailList){
715
				if(count ==11)
716
					break;
717
				sb.append("<tr>" + "<td>" + fbaReturndetail.getItemId() + "</td>"
718
						+ "<td>" + fbaReturndetail.getBrand()+ " " 
719
						+ fbaReturndetail.getProductName() + " " + fbaReturndetail.getColor() + "</td>"
720
						+ "<td>" + fbaReturndetail.getSoldQuantity() + "</td>"
721
						+ "<td>" + fbaReturndetail.getReturnQuantity() + "</td>"
722
						+ "<td>" + fbaReturndetail.getReturnPercentage() + "</td>"
723
						+ "<td>" + fbaReturndetail.getSellableReturns() + "</td>"
724
						+ "<td>" + fbaReturndetail.getSellableReturnPercentage() + "</td>"
725
						+ "<td>" + fbaReturndetail.getNonsellableReturns() + "</td>"
726
						+ "<td>" + fbaReturndetail.getNonSellableReturnPercentage() + "</td>"
727
						+ "</tr>");
728
				count++;
729
			}
730
			sb.append("</table></html>");
731
 
732
			BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/MobileTablets-FBAOrdersReturns-file.htm"));
733
			out.write(sb.toString());
734
			out.flush();
735
			out.close();
736
 
737
 
738
 
739
			sb = new StringBuffer();
740
			sb.append("<html>" + "<p><b>" +"Date Range for Orders : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(endDateForOrder) + "</b></p><br>");
741
			sb.append("<p><b>" +"Date Range for Returns : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(insertDate) + "</b></p><br>");
742
			sb.append("<table border=\"1\" align=\"center\">"
743
					+ "<caption><b>" + "AVERGAGE NON SELLABLE RETURNS" + "</b></caption>"
744
					+ "<tr>" + "<td><b>" + "Avg Non Sellable Returns %" + "</b></td>" 
745
					+ "<td>" + avgNonsellableReturnsPercentageExceptMobileTablet + "</td>"
746
					+ "</tr></table><br>");
747
			sb.append("<table border=\"1\" align=\"center\">" 
748
					+"<caption><b>" + "TOP BRAND- CATEGORY HIGH NON SELLABLE RETURN %" + "</b></caption>"
749
					+ "<tr>" + "<td><b>" + "Brand" + "</b></td>" 
750
					+ "<td><b>" + "Category" + "</b></td>"
751
					+ "<td><b>" + "Sale" + "</b></td>"
752
					+ "<td><b>" + "NonSellable Return" + "</b></td>"
753
					+ "<td><b>" + "NonSellable Return %" + "</b></td></tr>");
754
			for(FbaBrandCategorySaleReturnInfo fbaBCSaleReturnInfo : mailBodyBCSaleReturnExceptMobTabList){
755
				sb.append("<tr>" + "<td>" + fbaBCSaleReturnInfo.getBrand() + "</td>"
756
						+ "<td>" + fbaBCSaleReturnInfo.getCategory()+ "</td>"
757
						+ "<td>" + fbaBCSaleReturnInfo.getSale() + "</td>"
758
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturn() + "</td>"
759
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturnPtage()+ "</td>"
760
						+ "</tr>");
761
			}
762
			sb.append("</table>");
763
			sb.append("<table border=\"1\" align=\"center\">" 
764
					+"<caption><b>" + "TOP TEN SKU WITH HIGH NON SELLABLE RETURNS" + "</b></caption>" +
765
					 "<tr>" + "<td><b>" + "Item Id" + "</b></td>" 
766
					+ "<td><b>" + "Product Name" + "</b></td>" 
767
					+ "<td><b>" + "Sale" + "</b></td>" 
768
					+ "<td><b>" + "Return" + "</b></td>" 
769
					+ "<td><b>" + "Return %" + "</b></td>"
770
					+ "<td><b>" + "Sellable Return" + "</b></td>" 
771
					+ "<td><b>" + "Sellable Return %" + "</b></td>" 
772
					+ "<td><b>" + "Non Sellable Return" + "</b></td>" 
773
					+ "<td><b>" + "Non Sellable Return %" + "</b></td>");
774
 
775
			count =1;
776
 
777
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail : mailBodySkuExceptMobileTabletReturnDetailList){
778
				if(count ==11)
779
					break;
780
				sb.append("<tr>" + "<td>" + fbaReturndetail.getItemId() + "</td>"
781
						+ "<td>" + fbaReturndetail.getBrand()+ " " 
782
						+ fbaReturndetail.getProductName() + " " + fbaReturndetail.getColor() + "</td>"
783
						+ "<td>" + fbaReturndetail.getSoldQuantity() + "</td>"
784
						+ "<td>" + fbaReturndetail.getReturnQuantity() + "</td>"
785
						+ "<td>" + fbaReturndetail.getReturnPercentage() + "</td>"
786
						+ "<td>" + fbaReturndetail.getSellableReturns() + "</td>"
787
						+ "<td>" + fbaReturndetail.getSellableReturnPercentage() + "</td>"
788
						+ "<td>" + fbaReturndetail.getNonsellableReturns() + "</td>"
789
						+ "<td>" + fbaReturndetail.getNonSellableReturnPercentage() + "</td>"
790
						+ "</tr>");
791
				count++;
792
			}
793
			sb.append("</table></html>");
794
 
795
			out = new BufferedWriter(new FileWriter("/tmp/ExceptMobileTablets-FBAOrdersReturns-file.htm"));
796
			out.write(sb.toString());
797
			out.flush();
798
			out.close();
799
 
800
			List<File> mobTabfiles = new ArrayList<File>();
801
			mobTabfiles.add(new File("/tmp/MobileTablets-FBAOrdersReturns.xls"));
802
			mobTabfiles.add(new File("/tmp/FBA_Returns_Report.xls"));
803
 
804
			List<File> exceptMobTabfiles = new ArrayList<File>();
805
			exceptMobTabfiles.add(new File("/tmp/ExceptMobileTablets-FBAOrdersReturns.xls"));
806
			exceptMobTabfiles.add(new File("/tmp/FBA_Returns_Report.xls"));
807
 
808
 
809
			mailer.sendSSLMessage(sendMobTab, "FBA Sale Return Data - Mobile & Tablets - "+dateFormat.format(insertDate), " ", emailFromAddress, password, mobTabfiles, "/tmp/MobileTablets-FBAOrdersReturns-file.htm");
810
			mailer.sendSSLMessage(sendExceptMobTab, "FBA Sale Return Data - Except Mobile & Tablets - "+dateFormat.format(insertDate), " ", emailFromAddress, password, exceptMobTabfiles, "/tmp/ExceptMobileTablets-FBAOrdersReturns-file.htm");
811
 
812
 
813
		} catch(Exception e){
814
			e.printStackTrace();
815
			System.out.println(e.getMessage());
816
		}
817
 
818
	}
819
 
820
 
821
 
822
	public static void main(String args[]){
823
		getReportsFromAmazon();
824
		readOrders();
825
		updateReturnsInOrderDetails();
826
		getReturnsReportDataAndSendMail();
827
	}
828
}