Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
4801 anupam.sin 1
package in.shop2020.support.controllers;
2
 
3
import java.io.ByteArrayOutputStream;
4
import java.io.IOException;
5
import java.text.DateFormat;
6
import java.text.ParseException;
7
import java.text.SimpleDateFormat;
8
import java.util.ArrayList;
9
import java.util.Calendar;
10
import java.util.Date;
11
import java.util.HashMap;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.SortedSet;
15
import java.util.TimeZone;
16
 
17
import javax.servlet.ServletOutputStream;
18
import javax.servlet.http.HttpServletRequest;
19
import javax.servlet.http.HttpServletResponse;
20
import javax.servlet.http.HttpSession;
21
 
22
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
23
import org.apache.poi.ss.usermodel.Cell;
24
import org.apache.poi.ss.usermodel.CellStyle;
25
import org.apache.poi.ss.usermodel.CreationHelper;
26
import org.apache.poi.ss.usermodel.Font;
27
import org.apache.poi.ss.usermodel.Row;
28
import org.apache.poi.ss.usermodel.Sheet;
29
import org.apache.poi.ss.usermodel.Workbook;
30
import org.apache.poi.ss.util.CellRangeAddress;
31
import org.apache.struts2.interceptor.ServletRequestAware;
32
import org.apache.struts2.interceptor.ServletResponseAware;
33
import org.apache.thrift.TException;
34
import org.apache.thrift.transport.TTransportException;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37
 
38
import in.shop2020.logistics.LogisticsServiceException;
39
import in.shop2020.logistics.Provider;
40
import in.shop2020.model.v1.order.Order;
41
import in.shop2020.model.v1.order.OrderStatus;
42
import in.shop2020.model.v1.order.TransactionServiceException;
43
import in.shop2020.support.utils.ReportsUtils;
44
import in.shop2020.thrift.clients.LogisticsClient;
45
import in.shop2020.thrift.clients.TransactionClient;
46
 
47
public class CourierPerformanceController implements ServletRequestAware, ServletResponseAware {
48
 
49
    private List<OrderStatus> rtoStatuses;
50
    private List<Order> orders;
51
 
52
    private static Logger log = LoggerFactory.getLogger(CourierPerformanceController.class);
53
 
54
    private HttpServletResponse response;
55
    private HttpServletRequest request;
56
    private HttpSession session;
57
    private String errorMsg;
58
    private Date startDate;
59
    private Date endDate;
60
    private Map<Long, String> logisticProviderMap;
61
 
62
    public CourierPerformanceController() {
63
        rtoStatuses = new ArrayList<OrderStatus>();
64
        rtoStatuses.add(OrderStatus.RTO_IN_TRANSIT);
65
        rtoStatuses.add(OrderStatus.RTO_RECEIVED_PRESTINE);
66
        rtoStatuses.add(OrderStatus.RTO_RESHIPPED);
67
        rtoStatuses.add(OrderStatus.RTO_REFUNDED);
68
        rtoStatuses.add(OrderStatus.RTO_RECEIVED_DAMAGED);
69
        rtoStatuses.add(OrderStatus.RTO_LOST_IN_TRANSIT);
70
        rtoStatuses.add(OrderStatus.RTO_DAMAGED_RESHIPPED);
71
        rtoStatuses.add(OrderStatus.RTO_DAMAGED_REFUNDED);
72
        rtoStatuses.add(OrderStatus.RTO_LOST_IN_TRANSIT_RESHIPPED);
73
        rtoStatuses.add(OrderStatus.RTO_LOST_IN_TRANSIT_REFUNDED);
74
        rtoStatuses.add(OrderStatus.RTO_INVENTORY_REVERSED);
75
    }
76
 
77
    public String index() {
78
        log.info(request.getServletPath());
79
        if (!ReportsUtils.canAccessReport(
80
                (Long) session.getAttribute(ReportsUtils.ROLE),
81
                request.getServletPath())) 
82
        {
83
            return "authfail";
84
        }
85
        return "index";
86
    }
87
 
88
    public String create() {
89
        try {
90
            logisticProviderMap = new HashMap<Long, String>();
91
            LogisticsClient lc = new LogisticsClient();
92
            List<Provider> providers = lc.getClient().getAllProviders();    
93
            for (Provider provider : providers) {
94
                logisticProviderMap.put(provider.getId(), provider.getName());
95
            }
96
 
97
            String startDateStr = request.getParameter("startDate");
98
            String endDateStr = request.getParameter("endDate");
99
 
100
            DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
101
            df.setTimeZone(TimeZone.getTimeZone("IST"));
102
            try {
103
                startDate = df.parse(startDateStr);
104
                endDate = df.parse(endDateStr);
105
                //Calendar cal = Calendar.getInstance();
106
                //cal.setTime(endDate);
107
                //endDate.setTime(cal.getTimeInMillis());
108
            } catch (ParseException pe) {
109
                errorMsg = "Please enter start and end dates in format MM/dd/yyyy";
110
                return "index";
111
            }
112
 
113
            response.setContentType("application/vnd.ms-excel");
114
 
115
            response.setHeader("Content-disposition", "inline; filename=" + "courier-performance-report" + ".xls");
116
 
117
            ServletOutputStream sos;
118
            try {
119
                ByteArrayOutputStream baos = getSpreadSheetData();
120
                sos = response.getOutputStream();
121
                baos.writeTo(sos);
122
                sos.flush();
123
            } catch (IOException e) {
124
                log.error("Unable to stream the courier performance report", e);
125
                errorMsg = "Failed to write to response.";
126
            }
127
        } catch (TTransportException e) {
128
            // TODO Auto-generated catch block
129
            e.printStackTrace();
130
        } catch (TException e) {
131
            // TODO Auto-generated catch block
132
            e.printStackTrace();
133
        } catch (LogisticsServiceException e) {
134
            // TODO Auto-generated catch block
135
            e.printStackTrace();
136
        }
137
        return "index";
138
    }
139
 
140
    private ByteArrayOutputStream getSpreadSheetData() {
141
        ByteArrayOutputStream baosXLS = new ByteArrayOutputStream();
142
 
143
        Workbook wb = new HSSFWorkbook();
144
 
145
        Font font = wb.createFont();
146
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
147
        CellStyle style = wb.createCellStyle();
148
        style.setFont(font);
149
 
150
        CreationHelper createHelper = wb.getCreationHelper();
151
        CellStyle dateCellStyle = wb.createCellStyle();
152
        dateCellStyle.setDataFormat(createHelper.createDataFormat().getFormat("DD/MM/YYYY"));
153
 
154
        createRtoSheet(wb, style, dateCellStyle);
155
        createDeliveredSheet(wb, style, dateCellStyle);
156
 
157
        // Write the workbook to the output stream
158
        try {
159
            wb.write(baosXLS);
160
            baosXLS.close();
161
        } catch (IOException e) {
162
            log.error("Unable to get the byte array for the affiliate report", e);
163
        }       
164
        return baosXLS;
165
    }
166
 
167
    private void createRtoSheet(Workbook wb, 
168
                                       CellStyle style,
169
                                       CellStyle dateCellStyle) {
170
        // Summary SHEET
171
        Sheet sheet1 = wb.createSheet("RTO");
172
        short affSerialNo = 0;
173
 
174
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
175
 
176
        Row affTitleRow = sheet1.createRow(affSerialNo ++);
177
        Cell affTitleCell = affTitleRow.createCell(0);
178
        affTitleCell.setCellValue("Courier Performance Report : RTO Orders");
179
        affTitleCell.setCellStyle(style);
180
        sheet1.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
181
 
182
        sheet1.createRow(affSerialNo ++);
183
 
184
        Row affDateRangeRow = sheet1.createRow(affSerialNo ++);
185
        Cell affDateRangeCell = affDateRangeRow.createCell(0);
186
        affDateRangeCell.setCellValue("Date Range : " + df.format(startDate) + " - " + df.format(endDate));
187
        affDateRangeCell.setCellStyle(style);
188
        sheet1.addMergedRegion(new CellRangeAddress(3, 3, 0, 6));
189
 
190
        sheet1.createRow(affSerialNo ++);sheet1.createRow(affSerialNo ++);
191
 
192
        Row affHeaderRow = sheet1.createRow(affSerialNo++);
193
        affHeaderRow.createCell(0).setCellValue("Order Id");
194
        affHeaderRow.createCell(1).setCellValue("Payment Type");
195
        affHeaderRow.createCell(2).setCellValue("Pincode");
196
        affHeaderRow.createCell(3).setCellValue("City");
197
        affHeaderRow.createCell(4).setCellValue("Logistics Provider");
198
        affHeaderRow.createCell(5).setCellValue("Shipping Date");
199
        affHeaderRow.createCell(6).setCellValue("Delivery Date");
200
        affHeaderRow.createCell(7).setCellValue("Expected Delivery Date");
201
        affHeaderRow.createCell(8).setCellValue("Delay");
202
        affHeaderRow.createCell(9).setCellValue("Promised Delivery Date");
203
        affHeaderRow.createCell(10).setCellValue("Order Created Date");
204
        affHeaderRow.createCell(11).setCellValue("Promised Shipping Date");
205
 
206
        for (int i=0; i<12 ;i++) {
207
            affHeaderRow.getCell(i).setCellStyle(style);
208
        }
209
 
210
        Calendar deliveryTime = Calendar.getInstance();
211
        Calendar expectedDeliveryTime = Calendar.getInstance();
212
        long millisInDays = 24 * 60 * 60 * 1000;
213
        try {
214
            TransactionClient tc = new TransactionClient();
215
            orders = tc.getClient().getAllOrders(rtoStatuses, startDate.getTime(), endDate.getTime(), 0);
216
        } catch (TransactionServiceException e) {
217
            // TODO Auto-generated catch block
218
            e.printStackTrace();
219
        } catch (TException e) {
220
            // TODO Auto-generated catch block
221
            e.printStackTrace();
222
        }
223
 
224
        for(Order order : orders) {
225
            boolean deliveryTimestampSet = false;
226
            long diffDays = -99;
227
 
228
            if (order.getDelivery_timestamp() != 0) {
229
                deliveryTimestampSet = true;
230
                deliveryTime.setTimeInMillis(order.getDelivery_timestamp());
231
                expectedDeliveryTime.setTimeInMillis(order.getExpected_delivery_time());
232
                long deliveryTimeInMillis = deliveryTime.getTimeInMillis();
233
                long expectedDeliveryTimeInMillis = expectedDeliveryTime.getTimeInMillis();
234
                long diff = deliveryTimeInMillis - expectedDeliveryTimeInMillis;
235
                diffDays = diff / millisInDays;
236
            }
237
            affSerialNo++;
238
            Row commContentRow = sheet1.createRow(affSerialNo);
239
            commContentRow.createCell(0).setCellValue(order.getId());
240
            commContentRow.createCell(1).setCellValue(order.isCod() ? "COD" : "PREPAID");
241
            commContentRow.createCell(2).setCellValue(order.getCustomer_pincode());
242
            commContentRow.createCell(3).setCellValue(order.getCustomer_city());
243
            commContentRow.createCell(4).setCellValue(logisticProviderMap.get(order.getLogistics_provider_id()));
244
            commContentRow.createCell(5).setCellValue(new Date(order.getShipping_timestamp()));
245
            commContentRow.getCell(5).setCellStyle(dateCellStyle);
246
            if (deliveryTimestampSet) {
247
                commContentRow.createCell(6).setCellValue(new Date(order.getDelivery_timestamp()));
248
                commContentRow.getCell(6).setCellStyle(dateCellStyle);
249
            } else {
250
                commContentRow.createCell(6).setCellValue("N/A");
251
            }
252
            commContentRow.createCell(7).setCellValue(new Date(order.getExpected_delivery_time()));
253
            commContentRow.getCell(7).setCellStyle(dateCellStyle);
254
            if (diffDays == -99) {
255
                commContentRow.createCell(8).setCellValue("N/A");
256
            } else {
257
                commContentRow.createCell(8).setCellValue(diffDays);
258
            }
259
            commContentRow.createCell(9).setCellValue(new Date(order.getPromised_delivery_time()));
260
            commContentRow.getCell(9).setCellStyle(dateCellStyle);
261
            commContentRow.createCell(10).setCellValue(new Date(order.getCreated_timestamp()));
262
            commContentRow.getCell(10).setCellStyle(dateCellStyle);
263
            commContentRow.createCell(11).setCellValue(new Date(order.getPromised_shipping_time()));
264
            commContentRow.getCell(11).setCellStyle(dateCellStyle);
265
        }
266
        for (int i = 0; i<12; i++) {
267
            sheet1.autoSizeColumn(i);
268
        }
269
    }
270
 
271
    private void createDeliveredSheet(Workbook wb, 
272
            CellStyle style,
273
            CellStyle dateCellStyle) {
274
        // Summary SHEET
275
        Sheet sheet2 = wb.createSheet("Delivered");
276
        short affSerialNo = 0;
277
 
278
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
279
 
280
        Row affTitleRow = sheet2.createRow(affSerialNo ++);
281
        Cell affTitleCell = affTitleRow.createCell(0);
282
        affTitleCell.setCellValue("Courier Performance Report : Delivered Orders");
283
        affTitleCell.setCellStyle(style);
284
        sheet2.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
285
 
286
        sheet2.createRow(affSerialNo ++);
287
 
288
        Row affDateRangeRow = sheet2.createRow(affSerialNo ++);
289
        Cell affDateRangeCell = affDateRangeRow.createCell(0);
290
        affDateRangeCell.setCellValue("Date Range : " + df.format(startDate) + " - " + df.format(endDate));
291
        affDateRangeCell.setCellStyle(style);
292
        sheet2.addMergedRegion(new CellRangeAddress(3, 3, 0, 6));
293
 
294
        sheet2.createRow(affSerialNo ++);sheet2.createRow(affSerialNo ++);
295
 
296
        Row affHeaderRow = sheet2.createRow(affSerialNo++);
297
        affHeaderRow.createCell(0).setCellValue("Order Id");
298
        affHeaderRow.createCell(1).setCellValue("Payment Type");
299
        affHeaderRow.createCell(2).setCellValue("Pincode");
300
        affHeaderRow.createCell(3).setCellValue("City");
301
        affHeaderRow.createCell(4).setCellValue("Logistics Provider");
302
        affHeaderRow.createCell(5).setCellValue("Shipping Date");
303
        affHeaderRow.createCell(6).setCellValue("Delivery Date");
304
        affHeaderRow.createCell(7).setCellValue("Expected Delivery Date");
305
        affHeaderRow.createCell(8).setCellValue("Delay");
306
        affHeaderRow.createCell(9).setCellValue("Promised Delivery Date");
307
        affHeaderRow.createCell(10).setCellValue("Order Created Date");
308
        affHeaderRow.createCell(11).setCellValue("Promised Shipping Date");
309
 
310
        for (int i=0; i<12 ;i++) {
311
            affHeaderRow.getCell(i).setCellStyle(style);
312
        }
313
 
314
        Calendar deliveryTime = Calendar.getInstance();
315
        Calendar expectedDeliveryTime = Calendar.getInstance();
316
        long millisInDays = 24 * 60 * 60 * 1000;
317
        try {
318
            TransactionClient tc = new TransactionClient();
319
            List<OrderStatus> deliveredStatuses = new ArrayList<OrderStatus>();
320
            deliveredStatuses.add(OrderStatus.DELIVERY_SUCCESS);
321
            orders = tc.getClient().getAllOrders(deliveredStatuses, startDate.getTime(), endDate.getTime(), 0);
322
        } catch (TransactionServiceException e) {
323
            // TODO Auto-generated catch block
324
            e.printStackTrace();
325
        } catch (TException e) {
326
            // TODO Auto-generated catch block
327
            e.printStackTrace();
328
        }
329
 
330
        for(Order order : orders) {
331
            deliveryTime.setTimeInMillis(order.getDelivery_timestamp());
332
            expectedDeliveryTime.setTimeInMillis(order.getExpected_delivery_time());
333
            long deliveryTimeInMillis = deliveryTime.getTimeInMillis();
334
            long expectedDeliveryTimeInMillis = expectedDeliveryTime.getTimeInMillis();
335
            long diff = deliveryTimeInMillis - expectedDeliveryTimeInMillis;
336
            long diffDays = diff / millisInDays;
337
            affSerialNo++;
338
            Row commContentRow = sheet2.createRow(affSerialNo);
339
            commContentRow.createCell(0).setCellValue(order.getId());
340
            commContentRow.createCell(1).setCellValue(order.isCod() ? "COD" : "PREPAID");
341
            commContentRow.createCell(2).setCellValue(order.getCustomer_pincode());
342
            commContentRow.createCell(3).setCellValue(order.getCustomer_city());
343
            commContentRow.createCell(4).setCellValue(logisticProviderMap.get(order.getLogistics_provider_id()));
344
            commContentRow.createCell(5).setCellValue(new Date(order.getShipping_timestamp()));
345
            commContentRow.getCell(5).setCellStyle(dateCellStyle);
346
            commContentRow.createCell(6).setCellValue(new Date(order.getDelivery_timestamp()));
347
            commContentRow.getCell(6).setCellStyle(dateCellStyle);
348
            commContentRow.createCell(7).setCellValue(new Date(order.getExpected_delivery_time()));
349
            commContentRow.getCell(7).setCellStyle(dateCellStyle);
350
            commContentRow.createCell(8).setCellValue(diffDays);
351
            commContentRow.createCell(9).setCellValue(new Date(order.getPromised_delivery_time()));
352
            commContentRow.getCell(9).setCellStyle(dateCellStyle);
353
            commContentRow.createCell(10).setCellValue(new Date(order.getCreated_timestamp()));
354
            commContentRow.getCell(10).setCellStyle(dateCellStyle);
355
            commContentRow.createCell(11).setCellValue(new Date(order.getPromised_shipping_time()));
356
            commContentRow.getCell(11).setCellStyle(dateCellStyle);
357
        }
358
        for (int i = 0; i<12; i++) {
359
            sheet2.autoSizeColumn(i);
360
        }
361
    }
362
 
363
    public List<OrderStatus> getRtoStatuses() {
364
        return rtoStatuses;
365
    }
366
 
367
    public void setRtoStatuses(List<OrderStatus> rtoStatuses) {
368
        this.rtoStatuses = rtoStatuses;
369
    }
370
 
371
    public void setOrders(List<Order> orders) {
372
        this.orders = orders;
373
    }
374
 
375
    public List<Order> getOrders() {
376
        return orders;
377
    }
378
 
379
    @Override
380
    public void setServletResponse(HttpServletResponse res) {
381
        this.response = res;
382
    }
383
 
384
    @Override
385
    public void setServletRequest(HttpServletRequest req) {
386
        this.request = req;
387
        this.session = req.getSession();
388
    }
389
 
390
    public String getErrorMsg() {
391
        return errorMsg;
392
    }
393
 
394
    public void setErrorMsg(String errorMsg) {
395
        this.errorMsg = errorMsg;
396
    }
397
 
398
    public Date getStartDate() {
399
        return startDate;
400
    }
401
 
402
    public void setStartDate(Date startDate) {
403
        this.startDate = startDate;
404
    }
405
 
406
    public Date getEndDate() {
407
        return endDate;
408
    }
409
 
410
    public void setEndDate(Date endDate) {
411
        this.endDate = endDate;
412
    }
413
}