Subversion Repositories SmartDukaan

Rev

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