Subversion Repositories SmartDukaan

Rev

Rev 20870 | Rev 25950 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.support.controllers;

import in.shop2020.model.v1.order.LineItem;
import in.shop2020.model.v1.order.Order;
import in.shop2020.model.v1.order.OrderStatus;
import in.shop2020.model.v1.order.TransactionServiceException;
import in.shop2020.support.utils.ReportsUtils;
import in.shop2020.thrift.clients.PaymentClient;
import in.shop2020.thrift.clients.TransactionClient;
import in.shop2020.thrift.clients.UserClient;

import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.axis.utils.ByteArrayOutputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opensymphony.xwork2.ActionSupport;

@InterceptorRefs({ @InterceptorRef("defaultStack"), @InterceptorRef("login") })
@Results({ @Result(name = "authfail", type = "redirectAction", params = {
                "actionName", "reports" })
})
public class StatisticsController implements ServletRequestAware, ServletResponseAware,
                ServletContextAware {

        private static Logger logger = LoggerFactory
                        .getLogger(StatisticsController.class);
        

        private HttpServletResponse response;
        private String type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        public String getType() {
                return type;
        }

        private HttpServletRequest request;
        private HttpSession session;
        private ServletContext context;

        private long noOfRegisterUsers;
        private long noOfOrders;
        private long noOfCustomers;
        private int quantity;
        private double maxOrderAmount;
        private double minOrderAmount;
        private double maxPaymentAmount;
        private double minPaymentAmount;
        private List<Double> paymentAmountRange;
        private List<Order> validOrders;

        private String my;

        private TransactionClient tsc;
        private in.shop2020.model.v1.order.TransactionService.Client tClient;

        private PaymentClient psc;
        private in.shop2020.payments.PaymentService.Client pClient;

        private final DateFormat formatter = new SimpleDateFormat(
                        "EEE, dd-MMM-yyyy hh:mm a");

        public StatisticsController() {
                try {

                        tsc = new TransactionClient();
                        tClient = tsc.getClient();

                        psc = new PaymentClient();
                        pClient = psc.getClient();
                } catch (Exception e) {
                        logger.error(
                                        "Error connecting to one of the user, order or payment service",
                                        e);
                }
        }

        public String index() {
                if (!ReportsUtils.canAccessReport(
                                (Long) session.getAttribute(ReportsUtils.ROLE),
                                request.getServletPath())) {
                        return "authfail";
                }
                getStats();
                return "authsuccess";

                /*
                 * if(getSessionUserName()==null) { return "authfail"; } else {
                 * if(!canAccessReport()) { return "exception"; } getStats(); return
                 * "authsuccess"; }
                 */
        }

        private void getStats() {
                // try {
                // noOfRegisterUsers = uclient.getUserCount(UserType.USER);
                // } catch(Exception e){
                // logger.error("Error while getting the no. of registered users", e);
                // }

                try {
                        // noOfOrders = tClient.getValidOrderCount();
                        // noOfCustomers =
                        // tClient.getNoOfCustomersWithSuccessfulTransaction();
                        // orderAmountRange = tClient.getValidOrdersAmountRange();
                        // minOrderAmount = orderAmountRange.get(0);
                        // maxOrderAmount = orderAmountRange.get(1);
                        //
                        validOrders = tClient.getValidOrders(50, false);
                } catch (Exception e) {
                        logger.error("Error while getting order statistics", e);
                }

                try {
                        paymentAmountRange = pClient.getSuccessfulPaymentsAmountRange();
                        minPaymentAmount = paymentAmountRange.get(0);
                        maxPaymentAmount = paymentAmountRange.get(1);
                } catch (Exception e) {
                        logger.error("Error while getting payment statistics", e);
                }
        }

        public long getNoOfRegisterUsers() {
                return noOfRegisterUsers;
        }

        public long getNoOfOrders() {
                return noOfOrders;
        }

        public long getNoOfCustomers() {
                return noOfCustomers;
        }

        public double getMaxOrderAmount() {
                return maxOrderAmount;
        }

        public double getMinOrderAmount() {
                return minOrderAmount;
        }

        public double getMaxPaymentAmount() {
                return maxPaymentAmount;
        }

        public double getMinPaymentAmount() {
                return minPaymentAmount;
        }

        public List<Order> getValidOrders() {
                return validOrders;
        }

        public LineItem getItem(Order order) throws TransactionServiceException,
                        TException {
                LineItem lItem = order.getLineitems().get(0);
                return lItem;
        }

        public String getOrderStatusString(OrderStatus status) {
                return status.getDescription();
        }

        public String getDateTime(long milliseconds) {
                Calendar cal = Calendar.getInstance();
                cal.setTimeInMillis(milliseconds);
                return formatter.format(cal.getTime());
        }

        @Override
        public void setServletRequest(HttpServletRequest req) {
                this.request = req;
                this.session = req.getSession();
        }

        @Override
        public void setServletContext(ServletContext context) {
                this.context = context;
        }

        public String getServletContextPath() {
                return context.getContextPath();
        }

        public void setQuantity(int quantity) {
                this.quantity = quantity;
        }

        public int getQuantity() {
                return quantity;
        }

        public String download() throws Exception {
                InputStream is = getClass().getClassLoader().getResourceAsStream("orderformat.xlsx");
                XSSFWorkbook workBook = new XSSFWorkbook(is);
                XSSFDataFormat df1 = workBook.createDataFormat();
                CellStyle cs = workBook.createCellStyle();
                cs.setDataFormat(df1.getFormat("dd-mm-yy HH:mm"));
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                Sheet sheet = workBook.getSheetAt(0);
                workBook.setSheetName(0, this.getMy());
                DateFormat df = new SimpleDateFormat("MMM, yyyy");
                Date fromDate = df.parse(this.getMy());

                Calendar toDateCal = Calendar.getInstance();
                toDateCal.add(Calendar.MONTH, 1);
                List<Order> orders = tClient.getAllOrders(new ArrayList<OrderStatus>(), fromDate.getTime(), toDateCal.getTime().getTime(), 0);
                int rowNum=2;
                for(Order o : orders){
                        Row row = sheet.createRow(rowNum);
                        int i=0;
                        row.createCell(i++).setCellValue(o.getId());
                        Cell created  = row.createCell(i++);
                        created.setCellValue(new Date(o.getCreated_timestamp()));
                        created.setCellStyle(cs);
                        
                        i++;
                        if(o.getVerification_timestamp()>0){
                                Cell verified  = row.createCell(i++);
                                verified.setCellValue(new Date(o.getVerification_timestamp()));
                                verified.setCellStyle(cs);
                        } else {
                                i++;
                        }
                        i++;
                        
                        row.createCell(i++).setCellValue(o.getInvoice_number());
                        row.createCell(i++).setCellValue(o.getBilled_by());
                        i++;
                        if(o.getBilling_timestamp()>0){
                                Cell billed  = row.createCell(i++);
                                billed.setCellValue(new Date(o.getBilling_timestamp()));
                                billed.setCellStyle(cs);
                        } else {
                                i++;
                        }
                        if(o.getShipping_timestamp()>0) {
                                Cell shipped  = row.createCell(i++);
                                shipped.setCellValue(new Date(o.getShipping_timestamp()));
                                shipped.setCellStyle(cs);
                        } else {
                                i++;
                        }
                        row.createCell(i++).setCellValue(o.getAirwaybill_no());
                        row.createCell(i++).setCellValue(o.getLogistics_provider_id());
                        i++;
                        if(o.getDelivery_timestamp()>0){
                                Cell delivered  = row.createCell(i++);
                                delivered.setCellValue(new Date(o.getDelivery_timestamp()));
                                delivered.setCellStyle(cs);
                        } else {
                                i++;
                        }
                        row.createCell(i++).setCellValue(o.getLineitems().get(0).getQuantity());
                        row.createCell(i++).setCellValue(o.getTotal_amount() + o.getShippingCost());
                        if(o.getStatus().equals(OrderStatus.DELIVERY_SUCCESS)) {
                                row.createCell(i++).setCellValue(o.getTotal_amount() + o.getShippingCost());
                        }else {
                                i++;
                        }
                        if(o.isCod()) {
                                row.createCell(i++).setCellValue("COD");
                        } else {
                                row.createCell(i++).setCellValue("PREPAID");
                        }
                        row.createCell(i++).setCellValue(o.getStatus().getDescription());
                        row.createCell(i++).setCellValue(o.getCustomer_id());
                        row.createCell(i++).setCellValue(o.getCustomer_name());
                        row.createCell(i++).setCellValue(o.getCustomer_city());
                        row.createCell(i++).setCellValue(o.getCustomer_pincode());
                        row.createCell(i++).setCellValue(o.getCustomer_state());
                        row.createCell(i++).setCellValue(o.getLineitems().get(0).getItem_id());
                        LineItem lineItem = o.getLineitems().get(0);
                        row.createCell(i++).setCellValue((lineItem.getBrand() +  " " + getValidName(lineItem.getModel_name()) +" " + getValidName(lineItem.getModel_number()).replaceAll("  ", " ")));
                        row.createCell(i++).setCellValue(lineItem.getColor());
                        row.createCell(i++).setCellValue(o.getLogisticsTransactionId());
                        rowNum++;
                }
                ServletOutputStream os = response.getOutputStream();
                workBook.write(bos);
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
                String filename=this.getMy() + "-order.xlsx";
                response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");
                bos.writeTo(os);
                os.flush();

                
                return ActionSupport.NONE;
        }

        public void setMy(String my) {
                this.my = my;
        }

        public String getMy() {
                return my;
        }

        @Override
        public void setServletResponse(HttpServletResponse arg0) {
                this.response = arg0;
                
        }
        
        private String getValidName(String name){
        return name!=null?name:"";
    }
}