Subversion Repositories SmartDukaan

Rev

Rev 20779 | Rev 20786 | 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.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
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.util.ServletContextAware;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@InterceptorRefs({ @InterceptorRef("defaultStack"), @InterceptorRef("login") })
@Results({ @Result(name = "authfail", type = "redirectAction", params = {
                "actionName", "reports" }),
        @Result(        
            name = "report", 
            type = "stream", 
            params = { 
                "contentType", "${type}", 
                "inputName", "${stream}", 
                "bufferSize", "1024", 
                "contentDisposition", "attachment;filename=\"${filename}\""
            }
        )
})
public class StatisticsController implements ServletRequestAware,
                ServletContextAware {

        private static Logger logger = LoggerFactory
                        .getLogger(StatisticsController.class);
        
        
    public String getFilename() {
                return filename;
        }

        public void setFilename(String filename) {
                this.filename = filename;
        }

        public InputStream getStream() {
                return stream;
        }

        public void setStream(InputStream stream) {
                this.stream = stream;
        }

        private InputStream stream;
        private String filename;
        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<Double> orderAmountRange;
        private List<Order> validOrders;

        private String my;

        private UserClient usc;
        private in.shop2020.model.v1.user.UserContextService.Client uclient;

        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 {
                        usc = new UserClient();
                        uclient = usc.getClient();

                        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(200, 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);
                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());
                        row.createCell(++i).setCellValue(new Date(o.getCreated_timestamp()));
                        
                        ++i;
                        row.createCell(++i).setCellValue(new Date(o.getVerification_timestamp()));
                        ++i;
                        
                        row.createCell(++i).setCellValue(o.getInvoice_number());
                        row.createCell(++i).setCellValue(o.getBilled_by());
                        ++i;
                        row.createCell(++i).setCellValue(new Date(o.getBilling_timestamp()));
                        row.createCell(++i).setCellValue(o.getAirwaybill_no());
                        row.createCell(++i).setCellValue(o.getLogistics_provider_id());
                        ++i;
                        row.createCell(++i).setCellValue(new Date(o.getDelivery_timestamp()));
                        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.getStatusDescription());
                        row.createCell(++i).setCellValue(o.getCustomer_city());
                        
                }
                stream = is;
                filename=this.getMy() + "-order.xlsx";
                
                return "report";
        }

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

        public String getMy() {
                return my;
        }
}