Subversion Repositories SmartDukaan

Rev

Rev 12970 | Go to most recent revision | Details | 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",
78
		  "vikram.raghav@shop2020.in", "manish.sharma@shop2020.in"};
79
 
80
		sendExceptMobTab = new String[]{ "rajneesh.arora@shop2020.in",
81
				  "khushal.bhatia@shop2020.in", "chandan.kumar@saholic.com", "manoj.pal@saholic.com",
82
				  "vikram.raghav@shop2020.in", "manish.sharma@shop2020.in"};
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
					OrderItem orderItem = null;
308
					if(amazonOrder.getOrderItem()!=null && amazonOrder.getOrderItem().size()>0){
309
						orderItem = amazonOrder.getOrderItem().get(0);
310
					}
311
					FulfillmentData orderFullfillmentData = amazonOrder.getFulfillmentData();
312
					if("Amazon.in".equalsIgnoreCase(amazonOrder.getSalesChannel()) && "Amazon".equalsIgnoreCase(orderFullfillmentData.getFulfillmentChannel()) && orderItem!=null && "Shipped".equalsIgnoreCase(orderItem.getItemStatus())){
313
 
314
						Date date = istFormatter.parse(amazonOrder.getPurchaseDate().toString());
315
						Date purchaseDate = dateFormat.parse(dateFormat.format(date));
316
						long sku = 0l;
317
						if(orderItem.getSKU().startsWith("FBB")){
318
							if(orderItem.getSKU().contains("_")){
319
								sku = Long.parseLong(orderItem.getSKU().replaceAll("FBB","").split("_")[0]);
320
							}else{
321
								sku = Long.parseLong(orderItem.getSKU().replaceAll("FBB",""));
322
							}
323
						} else if(orderItem.getSKU().startsWith("FBA")){
324
							if(orderItem.getSKU().contains("_")){
325
								sku = Long.parseLong(orderItem.getSKU().replaceAll("FBA","").split("_")[0]);
326
							}else{
327
								sku = Long.parseLong(orderItem.getSKU().replaceAll("FBA",""));
328
							}
329
						} else {
330
							continue;
331
						}
332
						AmazonFbaOrderReturns amazonfbaOrderReturn = new AmazonFbaOrderReturns();
333
						amazonfbaOrderReturn.setAmazonOrderId(amazonOrder.getAmazonOrderID());
334
						amazonfbaOrderReturn.setInsertionTimestamp(insertDate.getTime());
335
						amazonfbaOrderReturn.setSku(sku);
336
						amazonfbaOrderReturn.setCreationTimestamp(purchaseDate.getTime());
337
						amazonfbaOrderReturn.setShippedQuantity(orderItem.getQuantity());
338
						amazonfbaOrderReturn.setSellableReturnQuantity(0);
339
						amazonfbaOrderReturn.setNonSellableReturnQuantity(0);
340
						amazonFbaOrderReturnsList.add(amazonfbaOrderReturn);
341
					}
342
					orderCount++;
343
				}
344
			}
345
 
346
			//System.out.println(orderCount);
347
 
348
			try{
349
				if(!tclient.isAlive()){
350
					tclient  = transactionServiceClient.getClient();
351
				}
352
				if(amazonFbaOrderReturnsList!=null && amazonFbaOrderReturnsList.size()>0){
353
					//amazonFbaOrderReturnsList.
354
					tclient.updateAmazonFbaOrdersReturns(amazonFbaOrderReturnsList);
355
				}
356
			} catch (Exception e){
357
				/*try {
358
					Thread.sleep(60*60*1000);
359
				} catch (InterruptedException e1) {
360
					// TODO Auto-generated catch block
361
					e.printStackTrace();
362
				}*/
363
			}
364
 
365
		} catch (Exception e) {
366
			// TODO Auto-generated catch block
367
			e.printStackTrace();
368
		}
369
	}
370
 
371
	private static void updateReturnsInOrderDetails() {
372
		try{
373
 
374
			BufferedReader returnsreportreader = null;
375
			try {
376
				/*orderreportreader = new CSVReader(new FileReader("/home/amazonorderreport.csv"),'\t');*/
377
				returnsreportreader = new BufferedReader(new FileReader("/tmp/fbareturnsreport.csv"));
378
			} catch (FileNotFoundException e) {
379
				// TODO Auto-generated catch block
380
				e.printStackTrace();
381
			}
382
 
383
			String [] nextLine;
384
			String line;
385
 
386
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
387
			Date insertDate = dateFormat.parse(dateFormat.format(new Date()));
388
 
389
			tclient  = transactionServiceClient.getClient();
390
			List<AmazonFbaOrderReturns> addedAmazonFbaOrderReturnsList = tclient.getAllAmazonFbaOrderReturnsByCurrentTime(insertDate.getTime());
391
 
392
			Map<String, AmazonFbaOrderReturns> addedAmazonFbaOrderReturnsMap = new HashMap<String, AmazonFbaOrderReturns>();
393
			Map<String, AmazonFbaOrderReturns> returnAmazonFbaOrderReturnsMap = new HashMap<String, AmazonFbaOrderReturns>();
394
 
395
			for(AmazonFbaOrderReturns orderReturn : addedAmazonFbaOrderReturnsList){
396
				addedAmazonFbaOrderReturnsMap.put(orderReturn.getAmazonOrderId(), orderReturn);
397
			}			
398
 
399
			File file = new File("/tmp/FBA_Returns_Report.xls");
400
			BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
401
			int count =1;
402
			amazonFbaOrderReturnsList = new ArrayList<AmazonFbaOrderReturns>();
403
			while((line = returnsreportreader.readLine())!= null){
404
				nextLine = line.split("\t");
405
				bufferedWriter.write(StringUtils.join(nextLine, '\t'));
406
				bufferedWriter.newLine();
407
				if(count!=1){					
408
					if(addedAmazonFbaOrderReturnsMap.containsKey(nextLine[1])){
409
						AmazonFbaOrderReturns orderReturn = null;
410
						if(returnAmazonFbaOrderReturnsMap.containsKey(nextLine[1])){
411
							orderReturn = returnAmazonFbaOrderReturnsMap.get(nextLine[1]);
412
							if("SELLABLE".equalsIgnoreCase(nextLine[8])){
413
								orderReturn.setSellableReturnQuantity(orderReturn.getSellableReturnQuantity()+Long.parseLong(nextLine[6]));
414
							}else{
415
								orderReturn.setNonSellableReturnQuantity(orderReturn.getNonSellableReturnQuantity()+Long.parseLong(nextLine[6]));
416
							}
417
							returnAmazonFbaOrderReturnsMap.put(orderReturn.getAmazonOrderId(), orderReturn);
418
						} else {
419
							orderReturn = addedAmazonFbaOrderReturnsMap.get(nextLine[1]);
420
							if("SELLABLE".equalsIgnoreCase(nextLine[8])){
421
								orderReturn.setSellableReturnQuantity(orderReturn.getSellableReturnQuantity()+Long.parseLong(nextLine[6]));
422
							}else{
423
								orderReturn.setNonSellableReturnQuantity(orderReturn.getNonSellableReturnQuantity()+Long.parseLong(nextLine[6]));
424
							}
425
							returnAmazonFbaOrderReturnsMap.put(orderReturn.getAmazonOrderId(), orderReturn);
426
						}
427
 
428
					}
429
				}
430
				count++;
431
			}
432
			bufferedWriter.close();
433
 
434
			for(String key : returnAmazonFbaOrderReturnsMap.keySet()){
435
				amazonFbaOrderReturnsList.add(returnAmazonFbaOrderReturnsMap.get(key));
436
			}
437
 
438
 
439
			int returnCount =1;
440
			List<AmazonFbaOrderReturns> amazonFbaOrderReturnsSubList = new ArrayList<AmazonFbaOrderReturns>();
441
			for(int i=0; i<amazonFbaOrderReturnsList.size(); i++){
442
				if(returnCount%500==0){
443
					if(amazonFbaOrderReturnsSubList!=null && amazonFbaOrderReturnsSubList.size()>0){
444
						if(!tclient.isAlive()){
445
							tclient  = transactionServiceClient.getClient();
446
						}
447
						if(amazonFbaOrderReturnsSubList!=null && amazonFbaOrderReturnsSubList.size()>0){
448
							tclient.updateAmazonFbaOrdersReturns(amazonFbaOrderReturnsSubList);
449
							Thread.sleep(5*1000);
450
						}
451
						amazonFbaOrderReturnsSubList = new ArrayList<AmazonFbaOrderReturns>();
452
						returnCount = 1;
453
					}
454
				}
455
				amazonFbaOrderReturnsSubList.add(amazonFbaOrderReturnsList.get(i));
456
				returnCount++;
457
			}
458
 
459
			if(!tclient.isAlive()){
460
				tclient  = transactionServiceClient.getClient();
461
			}
462
			try{
463
				if(amazonFbaOrderReturnsSubList!=null && amazonFbaOrderReturnsSubList.size()>0){
464
					tclient.updateAmazonFbaOrdersReturns(amazonFbaOrderReturnsSubList);
465
				}
466
			} catch(Exception e) {
467
 
468
			}
469
		} catch(Exception e){
470
			e.printStackTrace();
471
		}
472
 
473
	}
474
 
475
	private static void getReturnsReportDataAndSendMail(){
476
		try{
477
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
478
			Date insertDate = dateFormat.parse(dateFormat.format(new Date()));
479
			Calendar cal = Calendar.getInstance();
480
			cal.add(Calendar.DAY_OF_MONTH, -45);
481
			startDateForOrder = new Date(cal.getTimeInMillis());
482
			cal.add(Calendar.DAY_OF_MONTH, 15);
483
			endDateForOrder = new Date(cal.getTimeInMillis());
484
 
485
			transactionServiceClient = new TransactionClient();
486
			catalogServiceClient= new CatalogClient();
487
			catalogClient = catalogServiceClient.getClient();
488
			List<in.shop2020.model.v1.catalog.Item> allItems = catalogClient.getAllItems(false);
489
			Map<Long, in.shop2020.model.v1.catalog.Item> itemDetailsMap = new HashMap<Long, in.shop2020.model.v1.catalog.Item>();
490
			for(in.shop2020.model.v1.catalog.Item item : allItems){
491
				itemDetailsMap.put(item.getId(), item);
492
			}
493
			tclient  = transactionServiceClient.getClient();
494
 
495
			Map<Long, Map<String, Long>> amazonFbaReturnDataSkuMap = tclient.getTotalSaleReturnsFbaSkusCurentTime(insertDate.getTime());
496
			List<FbaSkuOrderSaleReturnDetail>  fbaSkuMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
497
			List<FbaSkuOrderSaleReturnDetail>  fbaSkuExceptMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
498
 
499
			Set<Long> itemIdSet = amazonFbaReturnDataSkuMap.keySet();
500
			long totalSaleMobileTablet = 0l;
501
			long totalNonSellableReturnsMobileTablet = 0l;
502
			long totalSaleExceptMobileTablet = 0l;
503
			long totalNonSellableReturnsExceptMobileTablet = 0l;
504
			for(Long itemId : itemIdSet){
505
				in.shop2020.model.v1.catalog.Item item = itemDetailsMap.get(itemId);
506
				long soldQuantity = amazonFbaReturnDataSkuMap.get(itemId).get("Sale");
507
 
508
				long saleableReturn = amazonFbaReturnDataSkuMap.get(itemId).get("SaleableReturn");
509
				long nonsaleableReturn = amazonFbaReturnDataSkuMap.get(itemId).get("NonSaleableReturn");
510
 
511
				FbaSkuOrderSaleReturnDetail skuDetail = new FbaSkuOrderSaleReturnDetail();
512
 
513
				skuDetail.setItemId(itemId.longValue());
514
				skuDetail.setBrand(item.getBrand());
515
				skuDetail.setProductName(item.getModelName()+" "+item.getModelNumber());
516
				skuDetail.setProductCategory(item.getProductGroup());
517
				skuDetail.setColor(item.getColor());
518
				skuDetail.setSoldQuantity(soldQuantity);
519
				skuDetail.setReturnQuantity(saleableReturn+nonsaleableReturn);
520
				skuDetail.setSellableReturns(saleableReturn);
521
				skuDetail.setNonsellableReturns(nonsaleableReturn);
522
				double returnPtage = (double)(saleableReturn+nonsaleableReturn)/(double)soldQuantity*100.0;
523
				skuDetail.setReturnPercentage(Math.round(returnPtage * 10.0)/10.0);
524
				returnPtage = (double)saleableReturn/(double)soldQuantity*100.0;
525
				skuDetail.setSellableReturnPercentage(Math.round(returnPtage * 10.0)/10.0);
526
				returnPtage = (double)nonsaleableReturn/(double)soldQuantity*100.0;
527
				skuDetail.setNonSellableReturnPercentage(Math.round(returnPtage * 10.0)/10.0);
528
 
529
				if("Handsets".equalsIgnoreCase(item.getProductGroup()) || "Tablets".equalsIgnoreCase(item.getProductGroup()) || "Handset".equalsIgnoreCase(item.getProductGroup())){
530
					totalSaleMobileTablet = totalSaleMobileTablet + soldQuantity;
531
					totalNonSellableReturnsMobileTablet = totalNonSellableReturnsMobileTablet + nonsaleableReturn;
532
					fbaSkuMobileTabletReturnDetailList.add(skuDetail);
533
				} else {
534
					totalSaleExceptMobileTablet = totalSaleExceptMobileTablet + soldQuantity;
535
					totalNonSellableReturnsExceptMobileTablet = totalNonSellableReturnsExceptMobileTablet + nonsaleableReturn;
536
					fbaSkuExceptMobileTabletReturnDetailList.add(skuDetail);
537
				}
538
			}
539
 
540
			double avgNonsellableReturnsPercentageMobileTablet = (double) totalNonSellableReturnsMobileTablet/(double)totalSaleMobileTablet * 100;
541
			avgNonsellableReturnsPercentageMobileTablet = Math.round(avgNonsellableReturnsPercentageMobileTablet * 10.0)/10.0;
542
			double avgNonsellableReturnsPercentageExceptMobileTablet = (double) totalNonSellableReturnsExceptMobileTablet/(double)totalSaleExceptMobileTablet * 100;
543
			avgNonsellableReturnsPercentageExceptMobileTablet = Math.round(avgNonsellableReturnsPercentageExceptMobileTablet * 10.0)/10.0;
544
 
545
			Map<String, FbaBrandCategorySaleReturnInfo> fbaBrandCategorySaleReturnsMobTabMap = new HashMap<String, FbaBrandCategorySaleReturnInfo>();
546
			Map<String, FbaBrandCategorySaleReturnInfo> fbaBrandCategorySaleReturnsExceptMobTabMap = new HashMap<String, FbaBrandCategorySaleReturnInfo>();
547
 
548
 
549
			List<FbaSkuOrderSaleReturnDetail>  mailBodySkuMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
550
			List<FbaSkuOrderSaleReturnDetail>  mailBodySkuExceptMobileTabletReturnDetailList = new ArrayList<FbaSkuOrderSaleReturnDetail>();
551
 
552
			for(FbaSkuOrderSaleReturnDetail fba_detail: fbaSkuMobileTabletReturnDetailList){
553
				if(fba_detail.getSoldQuantity() >= 25){
554
					mailBodySkuMobileTabletReturnDetailList.add(fba_detail);
555
				}
556
				if(fbaBrandCategorySaleReturnsMobTabMap.containsKey(fba_detail.getBrand()+"-"+fba_detail.getProductCategory())){
557
					FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsMobTabMap.get(fba_detail.getBrand()+"-"+fba_detail.getProductCategory());
558
					saleReturnInfo.setSale(saleReturnInfo.getSale()+fba_detail.getSoldQuantity());
559
					saleReturnInfo.setNonSellReturn(saleReturnInfo.getNonSellReturn()+fba_detail.getNonsellableReturns());
560
					fbaBrandCategorySaleReturnsMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
561
				} else {
562
					FbaBrandCategorySaleReturnInfo saleReturnInfo = new FbaBrandCategorySaleReturnInfo();
563
					saleReturnInfo.setBrand(fba_detail.getBrand());
564
					saleReturnInfo.setCategory(fba_detail.getProductCategory());
565
					saleReturnInfo.setSale(fba_detail.getSoldQuantity());
566
					saleReturnInfo.setNonSellReturn(fba_detail.getNonsellableReturns());
567
					fbaBrandCategorySaleReturnsMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
568
				}
569
			}
570
 
571
			for(FbaSkuOrderSaleReturnDetail fba_detail: fbaSkuExceptMobileTabletReturnDetailList){
572
				if(fba_detail.getSoldQuantity() >= 25){
573
					mailBodySkuExceptMobileTabletReturnDetailList.add(fba_detail);
574
				}
575
				if(fbaBrandCategorySaleReturnsExceptMobTabMap.containsKey(fba_detail.getBrand()+"-"+fba_detail.getProductCategory())){
576
					FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsExceptMobTabMap.get(fba_detail.getBrand()+"-"+fba_detail.getProductCategory());
577
					saleReturnInfo.setSale(saleReturnInfo.getSale()+fba_detail.getSoldQuantity());
578
					saleReturnInfo.setNonSellReturn(saleReturnInfo.getNonSellReturn()+fba_detail.getNonsellableReturns());
579
					fbaBrandCategorySaleReturnsExceptMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
580
				} else {
581
					FbaBrandCategorySaleReturnInfo saleReturnInfo = new FbaBrandCategorySaleReturnInfo();
582
					saleReturnInfo.setBrand(fba_detail.getBrand());
583
					saleReturnInfo.setCategory(fba_detail.getProductCategory());
584
					saleReturnInfo.setSale(fba_detail.getSoldQuantity());
585
					saleReturnInfo.setNonSellReturn(fba_detail.getNonsellableReturns());
586
					fbaBrandCategorySaleReturnsExceptMobTabMap.put(fba_detail.getBrand()+"-"+fba_detail.getProductCategory(), saleReturnInfo);
587
				}
588
			}
589
 
590
			List<FbaBrandCategorySaleReturnInfo> mailBodyBCSaleReturnMobTabList = new ArrayList<FbaBrandCategorySaleReturnInfo>();
591
			List<FbaBrandCategorySaleReturnInfo> mailBodyBCSaleReturnExceptMobTabList = new ArrayList<FbaBrandCategorySaleReturnInfo>();
592
 
593
 
594
			for(String br_category : fbaBrandCategorySaleReturnsMobTabMap.keySet()){
595
				FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsMobTabMap.get(br_category);
596
				if(saleReturnInfo.getSale()>=100){
597
					double saleNonSellReturnPtage = (double)saleReturnInfo.getNonSellReturn()/(double)saleReturnInfo.getSale()*100;
598
					saleReturnInfo.setNonSellReturnPtage(Math.round(saleNonSellReturnPtage*10.0)/10.0);
599
					mailBodyBCSaleReturnMobTabList.add(saleReturnInfo);
600
				}
601
			}
602
 
603
			for(String br_category : fbaBrandCategorySaleReturnsExceptMobTabMap.keySet()){
604
				FbaBrandCategorySaleReturnInfo saleReturnInfo = fbaBrandCategorySaleReturnsExceptMobTabMap.get(br_category);
605
				if(saleReturnInfo.getSale()>=100){
606
					double saleNonSellReturnPtage = (double)saleReturnInfo.getNonSellReturn()/(double)saleReturnInfo.getSale()*100;
607
					saleReturnInfo.setNonSellReturnPtage(Math.round(saleNonSellReturnPtage*10.0)/10.0);
608
					mailBodyBCSaleReturnExceptMobTabList.add(saleReturnInfo);
609
				}
610
			}
611
 
612
 
613
			if (mailBodyBCSaleReturnMobTabList != null
614
					&& mailBodyBCSaleReturnMobTabList.size() >= 2) {
615
				Collections.sort(mailBodyBCSaleReturnMobTabList,
616
						new FbaBrandCategorySaleReturnInfoComparator());
617
			}
618
 
619
			if (mailBodyBCSaleReturnExceptMobTabList != null
620
					&& mailBodyBCSaleReturnExceptMobTabList.size() >= 2) {
621
				Collections.sort(mailBodyBCSaleReturnExceptMobTabList,
622
						new FbaBrandCategorySaleReturnInfoComparator());
623
			}
624
 
625
			if(mailBodySkuMobileTabletReturnDetailList!=null 
626
					&& mailBodySkuMobileTabletReturnDetailList.size() >= 2){
627
				Collections.sort(mailBodySkuMobileTabletReturnDetailList, 
628
						new FbaSkuOrderSaleReturnDetailComparator());
629
			}
630
 
631
			if(mailBodySkuExceptMobileTabletReturnDetailList!=null 
632
					&& mailBodySkuExceptMobileTabletReturnDetailList.size() >= 2){
633
				Collections.sort(mailBodySkuExceptMobileTabletReturnDetailList, 
634
						new FbaSkuOrderSaleReturnDetailComparator());
635
			}
636
 
637
			File file = new File("/tmp/MobileTablets-FBAOrdersReturns.xls");
638
			BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
639
			bufferedWriter.write(StringUtils.join(new String[] { "Sku",
640
					"Brand", "ProductName", "Category", "Color",
641
					"Sales", "Return", "Return%", "Sellable Return", "Sellable Return%",
642
					"Non Sellable Return", "Non Sellable Return%" }, '\t'));
643
 
644
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail:fbaSkuMobileTabletReturnDetailList){
645
				bufferedWriter.newLine();
646
				bufferedWriter.write(StringUtils.join(new String[] { String.valueOf(fbaReturndetail.getItemId()),
647
					fbaReturndetail.getBrand(), fbaReturndetail.getProductName(), fbaReturndetail.getProductCategory(), fbaReturndetail.getColor(),
648
					String.valueOf(fbaReturndetail.getSoldQuantity()), String.valueOf(fbaReturndetail.getSellableReturns()+fbaReturndetail.getNonsellableReturns()), 
649
					String.valueOf(fbaReturndetail.getReturnPercentage()), String.valueOf(fbaReturndetail.getSellableReturns()), String.valueOf(fbaReturndetail.getSellableReturnPercentage()),
650
					String.valueOf(fbaReturndetail.getNonsellableReturns()), String.valueOf(fbaReturndetail.getNonSellableReturnPercentage())}, '\t'));
651
			}
652
			bufferedWriter.close();
653
 
654
			file = new File("/tmp/ExceptMobileTablets-FBAOrdersReturns.xls");
655
			bufferedWriter = new BufferedWriter(new FileWriter(file));
656
			bufferedWriter.write(StringUtils.join(new String[] { "Sku",
657
					"Brand", "ProductName", "Category", "Color",
658
					"Sales", "Return", "Return%", "Sellable Return", "Sellable Return%",
659
					"Non Sellable Return", "Non Sellable Return%" }, '\t'));
660
 
661
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail:fbaSkuExceptMobileTabletReturnDetailList){
662
				bufferedWriter.newLine();
663
				bufferedWriter.write(StringUtils.join(new String[] { String.valueOf(fbaReturndetail.getItemId()),
664
					fbaReturndetail.getBrand(), fbaReturndetail.getProductName(), fbaReturndetail.getProductCategory(), fbaReturndetail.getColor(),
665
					String.valueOf(fbaReturndetail.getSoldQuantity()), String.valueOf(fbaReturndetail.getSellableReturns()+fbaReturndetail.getNonsellableReturns()), 
666
					String.valueOf(fbaReturndetail.getReturnPercentage()), String.valueOf(fbaReturndetail.getSellableReturns()), String.valueOf(fbaReturndetail.getSellableReturnPercentage()),
667
					String.valueOf(fbaReturndetail.getNonsellableReturns()), String.valueOf(fbaReturndetail.getNonSellableReturnPercentage())}, '\t'));
668
			}
669
			bufferedWriter.close();
670
 
671
			StringBuffer sb = new StringBuffer();
672
			sb.append("<html>" + "<p><b>" +"Date Range for Orders : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(endDateForOrder) + "</b></p><br>");
673
			sb.append("<p><b>" +"Date Range for Returns : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(insertDate) + "</b></p><br>");
674
			sb.append("<table border=\"1\" align=\"center\">"
675
					+ "<caption><b>" + "AVERGAGE NON SELLABLE RETURNS" + "</b></caption>"
676
					+ "<tr>" + "<td><b>" + "Avg Non Sellable Returns %" + "</b></td>" 
677
					+ "<td>" + avgNonsellableReturnsPercentageMobileTablet + "</td>"
678
					+ "</tr></table><br>");
679
			sb.append("<table border=\"1\" align=\"center\">" 
680
					+"<caption><b>" + "TOP BRAND- CATEGORY HIGH NON SELLABLE RETURN %" + "</b></caption>"
681
					+ "<tr>" + "<td><b>" + "Brand" + "</b></td>" 
682
					+ "<td><b>" + "Category" + "</b></td>"
683
					+ "<td><b>" + "Sale" + "</b></td>"
684
					+ "<td><b>" + "NonSellable Return" + "</b></td>"
685
					+ "<td><b>" + "NonSellable Return %" + "</b></td></tr>");
686
			for(FbaBrandCategorySaleReturnInfo fbaBCSaleReturnInfo : mailBodyBCSaleReturnMobTabList){
687
				sb.append("<tr>" + "<td>" + fbaBCSaleReturnInfo.getBrand() + "</td>"
688
						+ "<td>" + fbaBCSaleReturnInfo.getCategory()+ "</td>"
689
						+ "<td>" + fbaBCSaleReturnInfo.getSale() + "</td>"
690
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturn() + "</td>"
691
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturnPtage()+ "</td>"
692
						+ "</tr>");
693
			}
694
			sb.append("</table>");
695
			sb.append("<table border=\"1\" align=\"center\">" 
696
					+"<caption><b>" + "TOP TEN SKU WITH HIGH NON SELLABLE RETURNS" + "</b></caption>" +
697
					 "<tr>" + "<td><b>" + "Item Id" + "</b></td>" 
698
					+ "<td><b>" + "Product Name" + "</b></td>" 
699
					+ "<td><b>" + "Sale" + "</b></td>" 
700
					+ "<td><b>" + "Return" + "</b></td>" 
701
					+ "<td><b>" + "Return %" + "</b></td>"
702
					+ "<td><b>" + "Sellable Return" + "</b></td>" 
703
					+ "<td><b>" + "Sellable Return %" + "</b></td>" 
704
					+ "<td><b>" + "Non Sellable Return" + "</b></td>" 
705
					+ "<td><b>" + "Non Sellable Return %" + "</b></td>");
706
 
707
			int count =1;
708
 
709
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail : mailBodySkuMobileTabletReturnDetailList){
710
				if(count ==11)
711
					break;
712
				sb.append("<tr>" + "<td>" + fbaReturndetail.getItemId() + "</td>"
713
						+ "<td>" + fbaReturndetail.getBrand()+ " " 
714
						+ fbaReturndetail.getProductName() + " " + fbaReturndetail.getColor() + "</td>"
715
						+ "<td>" + fbaReturndetail.getSoldQuantity() + "</td>"
716
						+ "<td>" + fbaReturndetail.getReturnQuantity() + "</td>"
717
						+ "<td>" + fbaReturndetail.getReturnPercentage() + "</td>"
718
						+ "<td>" + fbaReturndetail.getSellableReturns() + "</td>"
719
						+ "<td>" + fbaReturndetail.getSellableReturnPercentage() + "</td>"
720
						+ "<td>" + fbaReturndetail.getNonsellableReturns() + "</td>"
721
						+ "<td>" + fbaReturndetail.getNonSellableReturnPercentage() + "</td>"
722
						+ "</tr>");
723
				count++;
724
			}
725
			sb.append("</table></html>");
726
 
727
			BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/MobileTablets-FBAOrdersReturns-file.htm"));
728
			out.write(sb.toString());
729
			out.flush();
730
			out.close();
731
 
732
 
733
 
734
			sb = new StringBuffer();
735
			sb.append("<html>" + "<p><b>" +"Date Range for Orders : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(endDateForOrder) + "</b></p><br>");
736
			sb.append("<p><b>" +"Date Range for Returns : "+ dateFormat.format(startDateForOrder) + " - "+ dateFormat.format(insertDate) + "</b></p><br>");
737
			sb.append("<table border=\"1\" align=\"center\">"
738
					+ "<caption><b>" + "AVERGAGE NON SELLABLE RETURNS" + "</b></caption>"
739
					+ "<tr>" + "<td><b>" + "Avg Non Sellable Returns %" + "</b></td>" 
740
					+ "<td>" + avgNonsellableReturnsPercentageExceptMobileTablet + "</td>"
741
					+ "</tr></table><br>");
742
			sb.append("<table border=\"1\" align=\"center\">" 
743
					+"<caption><b>" + "TOP BRAND- CATEGORY HIGH NON SELLABLE RETURN %" + "</b></caption>"
744
					+ "<tr>" + "<td><b>" + "Brand" + "</b></td>" 
745
					+ "<td><b>" + "Category" + "</b></td>"
746
					+ "<td><b>" + "Sale" + "</b></td>"
747
					+ "<td><b>" + "NonSellable Return" + "</b></td>"
748
					+ "<td><b>" + "NonSellable Return %" + "</b></td></tr>");
749
			for(FbaBrandCategorySaleReturnInfo fbaBCSaleReturnInfo : mailBodyBCSaleReturnExceptMobTabList){
750
				sb.append("<tr>" + "<td>" + fbaBCSaleReturnInfo.getBrand() + "</td>"
751
						+ "<td>" + fbaBCSaleReturnInfo.getCategory()+ "</td>"
752
						+ "<td>" + fbaBCSaleReturnInfo.getSale() + "</td>"
753
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturn() + "</td>"
754
						+ "<td>" + fbaBCSaleReturnInfo.getNonSellReturnPtage()+ "</td>"
755
						+ "</tr>");
756
			}
757
			sb.append("</table>");
758
			sb.append("<table border=\"1\" align=\"center\">" 
759
					+"<caption><b>" + "TOP TEN SKU WITH HIGH NON SELLABLE RETURNS" + "</b></caption>" +
760
					 "<tr>" + "<td><b>" + "Item Id" + "</b></td>" 
761
					+ "<td><b>" + "Product Name" + "</b></td>" 
762
					+ "<td><b>" + "Sale" + "</b></td>" 
763
					+ "<td><b>" + "Return" + "</b></td>" 
764
					+ "<td><b>" + "Return %" + "</b></td>"
765
					+ "<td><b>" + "Sellable Return" + "</b></td>" 
766
					+ "<td><b>" + "Sellable Return %" + "</b></td>" 
767
					+ "<td><b>" + "Non Sellable Return" + "</b></td>" 
768
					+ "<td><b>" + "Non Sellable Return %" + "</b></td>");
769
 
770
			count =1;
771
 
772
			for(FbaSkuOrderSaleReturnDetail fbaReturndetail : mailBodySkuExceptMobileTabletReturnDetailList){
773
				if(count ==11)
774
					break;
775
				sb.append("<tr>" + "<td>" + fbaReturndetail.getItemId() + "</td>"
776
						+ "<td>" + fbaReturndetail.getBrand()+ " " 
777
						+ fbaReturndetail.getProductName() + " " + fbaReturndetail.getColor() + "</td>"
778
						+ "<td>" + fbaReturndetail.getSoldQuantity() + "</td>"
779
						+ "<td>" + fbaReturndetail.getReturnQuantity() + "</td>"
780
						+ "<td>" + fbaReturndetail.getReturnPercentage() + "</td>"
781
						+ "<td>" + fbaReturndetail.getSellableReturns() + "</td>"
782
						+ "<td>" + fbaReturndetail.getSellableReturnPercentage() + "</td>"
783
						+ "<td>" + fbaReturndetail.getNonsellableReturns() + "</td>"
784
						+ "<td>" + fbaReturndetail.getNonSellableReturnPercentage() + "</td>"
785
						+ "</tr>");
786
				count++;
787
			}
788
			sb.append("</table></html>");
789
 
790
			out = new BufferedWriter(new FileWriter("/tmp/ExceptMobileTablets-FBAOrdersReturns-file.htm"));
791
			out.write(sb.toString());
792
			out.flush();
793
			out.close();
794
 
795
			List<File> mobTabfiles = new ArrayList<File>();
796
			mobTabfiles.add(new File("/tmp/MobileTablets-FBAOrdersReturns.xls"));
797
			mobTabfiles.add(new File("/tmp/FBA_Returns_Report.xls"));
798
 
799
			List<File> exceptMobTabfiles = new ArrayList<File>();
800
			exceptMobTabfiles.add(new File("/tmp/ExceptMobileTablets-FBAOrdersReturns.xls"));
801
			exceptMobTabfiles.add(new File("/tmp/FBA_Returns_Report.xls"));
802
 
803
 
804
			mailer.sendSSLMessage(sendMobTab, "FBA Sale Return Data - Mobile & Tablets - "+dateFormat.format(insertDate), " ", emailFromAddress, password, mobTabfiles, "/tmp/MobileTablets-FBAOrdersReturns-file.htm");
805
			mailer.sendSSLMessage(sendExceptMobTab, "FBA Sale Return Data - Except Mobile & Tablets - "+dateFormat.format(insertDate), " ", emailFromAddress, password, exceptMobTabfiles, "/tmp/ExceptMobileTablets-FBAOrdersReturns-file.htm");
806
 
807
 
808
		} catch(Exception e){
809
			e.printStackTrace();
810
			System.out.println(e.getMessage());
811
		}
812
 
813
	}
814
 
815
 
816
 
817
	public static void main(String args[]){
818
		getReportsFromAmazon();
819
		readOrders();
820
		updateReturnsInOrderDetails();
821
		getReturnsReportDataAndSendMail();
822
	}
823
}