Subversion Repositories SmartDukaan

Rev

Rev 4295 | Rev 4956 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
992 varun.gupt 1
package in.shop2020.support.controllers;
2
 
3213 chandransh 3
import in.shop2020.model.v1.catalog.InventoryServiceException;
992 varun.gupt 4
import in.shop2020.model.v1.catalog.Warehouse;
5
import in.shop2020.model.v1.order.LineItem;
6
import in.shop2020.model.v1.order.Order;
4139 chandransh 7
import in.shop2020.model.v1.order.ReturnOrder;
992 varun.gupt 8
import in.shop2020.model.v1.order.TransactionServiceException;
2492 ankur.sing 9
import in.shop2020.support.utils.ReportsUtils;
3125 rajveer 10
import in.shop2020.thrift.clients.CatalogClient;
11
import in.shop2020.thrift.clients.TransactionClient;
992 varun.gupt 12
 
13
import java.text.DateFormat;
14
import java.text.SimpleDateFormat;
15
import java.text.ParseException;
16
 
17
import java.io.ByteArrayOutputStream;
18
import java.io.IOException;
19
import java.util.ArrayList;
20
import java.util.Date;
21
import java.util.List;
22
 
2492 ankur.sing 23
import javax.servlet.ServletContext;
992 varun.gupt 24
import javax.servlet.ServletOutputStream;
25
import javax.servlet.http.HttpServletRequest;
26
import javax.servlet.http.HttpServletResponse;
2492 ankur.sing 27
import javax.servlet.http.HttpSession;
992 varun.gupt 28
 
29
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
30
import org.apache.poi.ss.usermodel.Cell;
31
import org.apache.poi.ss.usermodel.CellStyle;
32
import org.apache.poi.ss.usermodel.Font;
4139 chandransh 33
import org.apache.poi.ss.usermodel.HorizontalAlignment;
992 varun.gupt 34
import org.apache.poi.ss.usermodel.Row;
35
import org.apache.poi.ss.usermodel.Sheet;
36
import org.apache.poi.ss.usermodel.Workbook;
37
import org.apache.poi.ss.util.CellRangeAddress;
2492 ankur.sing 38
import org.apache.struts2.convention.annotation.InterceptorRef;
39
import org.apache.struts2.convention.annotation.InterceptorRefs;
3936 chandransh 40
import org.apache.struts2.convention.annotation.Result;
41
import org.apache.struts2.convention.annotation.Results;
992 varun.gupt 42
import org.apache.struts2.interceptor.ServletRequestAware;
43
import org.apache.struts2.interceptor.ServletResponseAware;
44
import org.apache.struts2.rest.DefaultHttpHeaders;
45
import org.apache.struts2.rest.HttpHeaders;
2492 ankur.sing 46
import org.apache.struts2.util.ServletContextAware;
3213 chandransh 47
import org.apache.thrift.TException;
48
import org.slf4j.Logger;
49
import org.slf4j.LoggerFactory;
992 varun.gupt 50
 
51
/**
52
 * 
53
 * @author Varun Gupta
54
 * @version 1.0
55
 * @description HotspotReconciliationController handles requests to generate a reconciliation
56
 * report in XLS format for all the transactions with HotSpot within a given date range.
57
 * 
58
 */
59
 
4600 varun.gupt 60
//@InterceptorRefs({
61
//    @InterceptorRef("defaultStack"),
62
//    @InterceptorRef("login")
63
//})
64
//@Results({
65
//    @Result(name="authfail", type="redirectAction", params = {"actionName" , "reports"})
66
//})
3936 chandransh 67
@Results({
4600 varun.gupt 68
	@Result(name="report1", location="my-report.vm")
3936 chandransh 69
})
2492 ankur.sing 70
public class HotspotReconciliationController implements ServletResponseAware, ServletRequestAware, ServletContextAware {
71
 
3213 chandransh 72
    private static Logger logger = LoggerFactory.getLogger(HotspotReconciliationController.class);
73
 
4139 chandransh 74
	private enum OrderReportColumn {
2360 ankur.sing 75
	    ORDER_ID(0),
76
		BILLING_NUMBER(1),
77
		BILLING_DATE(2),
78
		CUSTOMER_NAME(3),
79
		BRAND(4),
80
		MODEL_NAME(5),
81
		MODEL_NUMBER(6),
82
		COLOR(7),
83
		XFER_PRICE(8),
4600 varun.gupt 84
		SELLING_PRICE(9),
85
		DELIVERY_DATE(10),
86
		STATUS(11);
2008 chandransh 87
 
88
		private int value;
89
 
4139 chandransh 90
		OrderReportColumn(int value) {
2008 chandransh 91
			this.value = value;
92
		}
93
		public int getValue(){
94
			return this.value;
95
		}
96
	}
97
 
4139 chandransh 98
	private enum ReturnOrderReportColumn {
99
		ORDER_ID(0),
100
		WAREHOUSE_ID(1),
101
		INVOICE_NUMBER(2),
102
		PRODUCT_GROUP(3),
103
		BRAND(4),
104
		MODEL_NUMBER(5),
105
		COLOR(6),
106
		CREATED_ON(7),
107
		XFER_PRICE(8);
108
 
109
		private int value;
110
 
111
		ReturnOrderReportColumn(int value) {
112
			this.value = value;
113
		}
114
		public int getValue(){
115
			return this.value;
116
		}
117
	}
118
 
1075 chandransh 119
	//FIXME: Read this configuration from the config server
1884 chandransh 120
	//private String hotspotReconciliationReportPath = "/HotspotReports";
992 varun.gupt 121
 
122
	private HttpServletRequest request;
123
	private HttpServletResponse response;
2492 ankur.sing 124
    private HttpSession session;
125
    private ServletContext context;
992 varun.gupt 126
	private String id;
127
 
4139 chandransh 128
	private final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
129
 
992 varun.gupt 130
	public HotspotReconciliationController(){
131
 
132
	}
133
 
2492 ankur.sing 134
	public String index() {
4295 varun.gupt 135
//	    if(!ReportsUtils.canAccessReport((Long)session.getAttribute(ReportsUtils.ROLE), request.getServletPath())) {
136
//	        return "authfail";
137
//	    }
2492 ankur.sing 138
	    return "report";
992 varun.gupt 139
	}
140
 
141
	// Handles the POST request (Form Submission)
142
	public HttpHeaders create(){
143
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
3213 chandransh 144
 
992 varun.gupt 145
		try	{
146
			//Formatting Form input parameters
3213 chandransh 147
		    Date startDate = dateFormat.parse(request.getParameter("start"));
148
		    Date endDate = dateFormat.parse(request.getParameter("end"));
992 varun.gupt 149
 
3125 rajveer 150
			CatalogClient csc = new CatalogClient();
992 varun.gupt 151
			in.shop2020.model.v1.catalog.InventoryService.Client catalogClient= csc.getClient();
152
			List<Warehouse> warehouses = catalogClient.getAllWarehouses(true);
153
 
3125 rajveer 154
			TransactionClient transactionServiceClient = new TransactionClient();
992 varun.gupt 155
			in.shop2020.model.v1.order.TransactionService.Client client = transactionServiceClient.getClient();
156
 
4139 chandransh 157
			List<Order> orders = new ArrayList<Order>();
158
			List<ReturnOrder> returnOrders = new ArrayList<ReturnOrder>();
992 varun.gupt 159
 
160
			//Retrieving all the orders across all the warehouses
4139 chandransh 161
			long fromTime = startDate.getTime();
162
			long toTime = endDate.getTime();
992 varun.gupt 163
			for(Warehouse warehouse : warehouses)	{
4139 chandransh 164
				orders.addAll(client.getOrdersByBillingDate(null, fromTime, toTime, warehouse.getId()));
165
				returnOrders.addAll(client.getReturnOrders(warehouse.getId(), fromTime, toTime));
992 varun.gupt 166
			}
3213 chandransh 167
			logger.debug("Total number of Orders: " + orders.size());
992 varun.gupt 168
 
169
			// Preparing XLS file for output
170
			response.setContentType("application/vnd.ms-excel");
171
 
2008 chandransh 172
			DateFormat dateFormatForFile = new SimpleDateFormat("dd.MM.yyyy");
173
			response.setHeader("Content-disposition", "inline; filename=hotspot-reconciliation-from-" + dateFormatForFile.format(startDate) + "-" + dateFormatForFile.format(endDate) + ".xls");
174
 
992 varun.gupt 175
			ServletOutputStream sos;
176
			try {
4139 chandransh 177
				ByteArrayOutputStream baos = getReconciliationReport(orders, returnOrders, startDate, endDate);
992 varun.gupt 178
				sos = response.getOutputStream();
179
				baos.writeTo(sos);
180
				sos.flush();
181
			} catch (IOException e) {
3213 chandransh 182
				logger.error("Error while streaming the hotspot reconciliation report", e);
992 varun.gupt 183
			}
184
 
185
		} catch (ParseException e)	{
3213 chandransh 186
			logger.error("Unable to parse the start or end date", e);
992 varun.gupt 187
		} catch (TransactionServiceException e)	{
3213 chandransh 188
			logger.error("Error while getting order information from the transaction service", e);
189
		} catch (InventoryServiceException e) {
190
		    logger.error("Error while getting the list of warehouses from the catalog service", e);
191
        } catch (TException e) {
192
            logger.error("Unable to get the orders or the warehouses", e);
193
        } catch (Exception e)   {
194
            logger.error("Unexpected exception", e);
195
        }
4600 varun.gupt 196
		return new DefaultHttpHeaders("report1");
992 varun.gupt 197
	}
198
 
199
	// Prepares the XLS worksheet object and fills in the data with proper formatting
4139 chandransh 200
	private ByteArrayOutputStream getReconciliationReport(List<Order> orders, List<ReturnOrder> returnOrders, Date startDate, Date endDate)	{
992 varun.gupt 201
		ByteArrayOutputStream baosXLS = new ByteArrayOutputStream();
202
 
4139 chandransh 203
	    Workbook wb = new HSSFWorkbook();	    
992 varun.gupt 204
 
4139 chandransh 205
	    //Create the style for the title row
992 varun.gupt 206
	    Font font = wb.createFont();
207
	    font.setBoldweight(Font.BOLDWEIGHT_BOLD);
4139 chandransh 208
	    CellStyle boldStyle = wb.createCellStyle();
209
	    boldStyle.setFont(font);
992 varun.gupt 210
 
4139 chandransh 211
	    CellStyle rightAlignStyle = wb.createCellStyle();
212
	    rightAlignStyle.setAlignment(CellStyle.ALIGN_RIGHT);
213
 
214
		Sheet orderSheet = wb.createSheet("Orders");
215
		Sheet returnSheet = wb.createSheet("Returns");
216
 
217
	    populateOrderSheet(orders, startDate, endDate, orderSheet, boldStyle, rightAlignStyle);
218
	    populateReturnOrderSheet(returnOrders, startDate, endDate, returnSheet, boldStyle, rightAlignStyle);
219
 
220
		// Write the workbook to the output stream
221
		try {
222
			wb.write(baosXLS);
223
			baosXLS.close();
224
		} catch (IOException e) {
225
			logger.error("Unable to write the hotspot reconciliation report to the byte array", e);
226
		}		
227
		return baosXLS;
228
	}
229
 
230
	private void populateOrderSheet(List<Order> orders, Date startDate, Date endDate, Sheet sheet, CellStyle style, CellStyle rightAlignStyle) {
231
	    short serialNo = 0;
232
 
233
	    // Create the title row and put all the titles in it. Rows are 0 based.
992 varun.gupt 234
	    Row titleRow = sheet.createRow(serialNo ++);
235
	    Cell titleCell = titleRow.createCell(0);
4139 chandransh 236
	    titleCell.setCellValue("Order Reconciliation Report (" + DATE_FORMAT.format(startDate) + " - " + DATE_FORMAT.format(endDate) + ")");
992 varun.gupt 237
	    titleCell.setCellStyle(style);
238
 
239
	    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
240
 
241
	    sheet.createRow(serialNo ++);
242
 
243
	    Row headerRow = sheet.createRow(serialNo ++);
4139 chandransh 244
	    headerRow.createCell(OrderReportColumn.ORDER_ID.getValue()).setCellValue("Order Id");
245
	    headerRow.createCell(OrderReportColumn.BILLING_NUMBER.getValue()).setCellValue("Billing Number");
246
	    headerRow.createCell(OrderReportColumn.BILLING_DATE.getValue()).setCellValue("Billing Date");
247
	    headerRow.createCell(OrderReportColumn.CUSTOMER_NAME.getValue()).setCellValue("Customer Name");
248
	    headerRow.createCell(OrderReportColumn.BRAND.getValue()).setCellValue("Brand");
249
	    headerRow.createCell(OrderReportColumn.MODEL_NAME.getValue()).setCellValue("Model Name");
250
	    headerRow.createCell(OrderReportColumn.MODEL_NUMBER.getValue()).setCellValue("Model Number");
251
	    headerRow.createCell(OrderReportColumn.COLOR.getValue()).setCellValue("Color");
252
	    headerRow.createCell(OrderReportColumn.XFER_PRICE.getValue()).setCellValue("Transfer Price");
253
	    headerRow.createCell(OrderReportColumn.SELLING_PRICE.getValue()).setCellValue("Selling Price");
4600 varun.gupt 254
	    headerRow.createCell(OrderReportColumn.DELIVERY_DATE.getValue()).setCellValue("Delivery Date");
255
	    headerRow.createCell(OrderReportColumn.STATUS.getValue()).setCellValue("Current Status");
992 varun.gupt 256
 
2014 rajveer 257
	    sheet.createRow(serialNo ++);
992 varun.gupt 258
	    double totalTransferPrice = 0.0;
2011 rajveer 259
	    double totalSellingPrice = 0.0;
992 varun.gupt 260
 
4139 chandransh 261
	    for(Order order : orders)	{
2014 rajveer 262
	    	Row contentRow = sheet.createRow(serialNo++);
992 varun.gupt 263
 
264
		    LineItem lineItem = order.getLineitems().get(0);
265
		    double transferPrice = lineItem.getTransfer_price();
266
		    totalTransferPrice += transferPrice;
267
 
2014 rajveer 268
            double sellingPrice = lineItem.getTotal_price();
269
            totalSellingPrice += sellingPrice;
2011 rajveer 270
 
4139 chandransh 271
            contentRow.createCell(OrderReportColumn.ORDER_ID.getValue()).setCellValue(order.getId());
272
		    contentRow.createCell(OrderReportColumn.BILLING_NUMBER.getValue()).setCellValue(order.getInvoice_number());
273
		    contentRow.createCell(OrderReportColumn.BILLING_DATE.getValue()).setCellValue(DATE_FORMAT.format(new Date(order.getBilling_timestamp())));
274
		    contentRow.createCell(OrderReportColumn.CUSTOMER_NAME.getValue()).setCellValue(order.getCustomer_name());
275
		    contentRow.createCell(OrderReportColumn.BRAND.getValue()).setCellValue(getValueForEmptyString(lineItem.getBrand()));
276
		    contentRow.createCell(OrderReportColumn.MODEL_NAME.getValue()).setCellValue(getValueForEmptyString(lineItem.getModel_name()));
277
		    contentRow.createCell(OrderReportColumn.MODEL_NUMBER.getValue()).setCellValue(getValueForEmptyString(lineItem.getModel_number()));
278
		    contentRow.createCell(OrderReportColumn.COLOR.getValue()).setCellValue(getValueForEmptyString(lineItem.getColor()));
279
		    contentRow.createCell(OrderReportColumn.XFER_PRICE.getValue()).setCellValue(transferPrice);
280
		    contentRow.createCell(OrderReportColumn.SELLING_PRICE.getValue()).setCellValue(sellingPrice);
4600 varun.gupt 281
 
282
		    if(order.getDelivery_timestamp() > 0)	{
283
		    	contentRow.createCell(OrderReportColumn.DELIVERY_DATE.getValue()).setCellValue(DATE_FORMAT.format(new Date(order.getDelivery_timestamp())));
284
		    } else	{
285
		    	contentRow.createCell(OrderReportColumn.DELIVERY_DATE.getValue()).setCellValue("-");
286
		    }
287
		    contentRow.createCell(OrderReportColumn.STATUS.getValue()).setCellValue(order.getStatus().name());
992 varun.gupt 288
	    }
289
	    sheet.createRow(serialNo ++);
290
    	Row contentRow = sheet.createRow(serialNo);
291
    	contentRow.createCell(0).setCellValue("Total Transfer Price");
4139 chandransh 292
    	contentRow.createCell(OrderReportColumn.XFER_PRICE.getValue()).setCellValue(totalTransferPrice);
293
    	contentRow.createCell(OrderReportColumn.SELLING_PRICE.getValue()).setCellValue(totalSellingPrice);
992 varun.gupt 294
    	sheet.addMergedRegion(new CellRangeAddress(serialNo, serialNo, 0, 5));
4139 chandransh 295
	}
296
 
297
	private void populateReturnOrderSheet(List<ReturnOrder> returnOrders, Date startDate, Date endDate, Sheet sheet, CellStyle titleStyle, CellStyle rightAlignStyle) {
298
	    short serialNo = 0;
299
 
300
	    // Create the title row and put all the titles in it. Rows are 0 based.
301
	    Row titleRow = sheet.createRow(serialNo ++);
302
	    Cell titleCell = titleRow.createCell(0);
303
	    titleCell.setCellValue("Return Orders Reconciliation Report (" + DATE_FORMAT.format(startDate) + " - " + DATE_FORMAT.format(endDate) + ")");
304
	    titleCell.setCellStyle(titleStyle);
305
	    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
306
 
307
	    // Create the header row
308
	    sheet.createRow(serialNo ++);	    
309
	    Row headerRow = sheet.createRow(serialNo ++);
310
	    headerRow.createCell(ReturnOrderReportColumn.ORDER_ID.getValue()).setCellValue("Order Id");
311
	    headerRow.createCell(ReturnOrderReportColumn.WAREHOUSE_ID.getValue()).setCellValue("Warehouse Id");
312
	    headerRow.createCell(ReturnOrderReportColumn.INVOICE_NUMBER.getValue()).setCellValue("Invoice Number");
313
	    headerRow.createCell(ReturnOrderReportColumn.PRODUCT_GROUP.getValue()).setCellValue("Product Group");
314
	    headerRow.createCell(ReturnOrderReportColumn.BRAND.getValue()).setCellValue("Brand");
315
	    headerRow.createCell(ReturnOrderReportColumn.MODEL_NUMBER.getValue()).setCellValue("Model Number");
316
	    headerRow.createCell(ReturnOrderReportColumn.COLOR.getValue()).setCellValue("Color");
317
	    headerRow.createCell(ReturnOrderReportColumn.CREATED_ON.getValue()).setCellValue("Created On");
318
	    headerRow.createCell(ReturnOrderReportColumn.XFER_PRICE.getValue()).setCellValue("Transfer Price");
319
 
320
 
321
	    // Create an empty row
322
	    sheet.createRow(serialNo ++);
323
 
324
	    double totalTransferPrice = 0.0;
325
	    for(ReturnOrder order : returnOrders)	{
326
	    	Row contentRow = sheet.createRow(serialNo++);
327
		    double transferPrice = order.getTransferPrice();
328
		    totalTransferPrice += transferPrice;
329
 
330
    	    contentRow.createCell(ReturnOrderReportColumn.ORDER_ID.getValue()).setCellValue(order.getOrderId());
331
    	    contentRow.createCell(ReturnOrderReportColumn.WAREHOUSE_ID.getValue()).setCellValue(order.getWarehouseId());
332
    	    contentRow.createCell(ReturnOrderReportColumn.INVOICE_NUMBER.getValue()).setCellValue(order.getInvoiceNumber());
333
    	    contentRow.createCell(ReturnOrderReportColumn.PRODUCT_GROUP.getValue()).setCellValue(order.getProductGroup());
334
    	    contentRow.createCell(ReturnOrderReportColumn.BRAND.getValue()).setCellValue(order.getBrand());
335
    	    contentRow.createCell(ReturnOrderReportColumn.MODEL_NUMBER.getValue()).setCellValue(order.getModelNumber());
336
    	    contentRow.createCell(ReturnOrderReportColumn.COLOR.getValue()).setCellValue(order.getColor());
337
    	    contentRow.createCell(ReturnOrderReportColumn.CREATED_ON.getValue()).setCellValue(DATE_FORMAT.format(new Date(order.getCreatedAt())));
338
    	    contentRow.createCell(ReturnOrderReportColumn.XFER_PRICE.getValue()).setCellValue(transferPrice);
339
	    }
340
	    sheet.createRow(serialNo ++);
341
    	Row contentRow = sheet.createRow(serialNo);
342
    	Cell totalCell = contentRow.createCell(0);
343
    	totalCell.setCellValue("Total Transfer Price");
344
    	totalCell.setCellStyle(rightAlignStyle);
992 varun.gupt 345
 
4139 chandransh 346
    	contentRow.createCell(ReturnOrderReportColumn.XFER_PRICE.getValue()).setCellValue(totalTransferPrice);
347
    	sheet.addMergedRegion(new CellRangeAddress(serialNo, serialNo, 0, ReturnOrderReportColumn.CREATED_ON.getValue()));
992 varun.gupt 348
	}
349
 
350
	public String getId(){
351
		return id;
352
	}
353
 
354
	public void setId(String id){
355
		this.id = id;
356
	}
357
 
358
	@Override
359
	public void setServletRequest(HttpServletRequest request) {
360
		this.request = request;
2492 ankur.sing 361
		this.session = request.getSession();    
992 varun.gupt 362
	}
363
 
364
	@Override
365
	public void setServletResponse(HttpServletResponse response) {
366
		this.response  = response;
367
	}
368
 
369
	private String getValueForEmptyString(String s){
370
		if(s==null || s.equals(""))
371
			return "-";
372
		else
373
			return s; 
374
	}
2492 ankur.sing 375
	@Override
376
    public void setServletContext(ServletContext context) {
377
        this.context = context;
378
    }
379
 
380
    public String getServletContextPath() {
381
        return context.getContextPath();
382
    }
2011 rajveer 383
}