Subversion Repositories SmartDukaan

Rev

Rev 5730 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.support.controllers;

import in.shop2020.logistics.PickupStore;
import in.shop2020.model.v1.order.LineItem;
import in.shop2020.model.v1.order.Order;
import in.shop2020.model.v1.order.TransactionService.Client;
import in.shop2020.support.utils.ReportsUtils;
import in.shop2020.thrift.clients.LogisticsClient;
import in.shop2020.thrift.clients.TransactionClient;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
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.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
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;


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

    private static Logger logger = LoggerFactory.getLogger(StoreCollectionController.class);
    
    private HttpServletRequest request;
    private HttpSession session;
    private HttpServletResponse response;
    private ServletContext context;
    
    private String error = "";
    
    private Client client;
    
    private List<PickupStore> stores;
    
    public StoreCollectionController() throws TException{
        client = (new TransactionClient()).getClient();
        stores = (new LogisticsClient()).getClient().getAllPickupStores();
    }
    public String index() {
        if(!ReportsUtils.canAccessReport((Long)session.getAttribute(ReportsUtils.ROLE), request.getServletPath())) {
            return "authfail";
        }
        return "index";
    }

    // Handles the POST request (Form Submission)
    public String create() throws TException {
        String storeIdString = request.getParameter("storeId");
        String startDateStr = request.getParameter("startDate");
        String endDateStr = request.getParameter("endDate");
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        Date startDate = null, endDate = null;
        long storeId = 0;
        try {
                storeId = Long.parseLong(storeIdString);
            startDate = df.parse(startDateStr);
            endDate = df.parse(endDateStr);
            Calendar cal = Calendar.getInstance();
            cal.setTime(endDate);
            cal.add(Calendar.DATE, 1);
            endDate.setTime(cal.getTimeInMillis());
        } catch (ParseException pe) {
            error = "Please enter start and end dates in format MM/dd/yyyy";
        } 
        
        ByteArrayOutputStream baos = generateCollectionReport(startDate, endDate, storeId);

        if (baos == null) {
            error = "No output for given date range";
        } else {
            error = "Generating report...";
        }
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "inline; filename=collection-report.xls");
        ServletOutputStream sos;
        try {
            sos = response.getOutputStream();
            baos.writeTo(sos);
            sos.flush();
            error = "Report generated";
        } catch (IOException e) {
            error = "Failed to write to response.";
            logger.error("Unable to stream the colection report", e);
        }
        return "index";
    }

    
    private ByteArrayOutputStream generateCollectionReport(Date startDate,      Date endDate, long storeId) throws TException {
        List<Order> orders = client.getOrdersCollectionAtStore(storeId, startDate.getTime(), endDate.getTime(), true);
        ByteArrayOutputStream baosXLS = new ByteArrayOutputStream();

        Workbook wb = new HSSFWorkbook();

        DateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy");
        Font font = wb.createFont();
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
        CellStyle style = wb.createCellStyle();
        style.setFont(font);

        DataFormat format = wb.createDataFormat();
        CellStyle styleAmount = wb.createCellStyle();
        styleAmount.setDataFormat(format.getFormat("#,##0.00"));

        Sheet collectionSheet = wb.createSheet("Collection");
        short collectionSerialNo = 0;

        Row headerRow = collectionSheet.createRow(collectionSerialNo++);
        headerRow.createCell(0).setCellValue("S.No");
        headerRow.createCell(1).setCellValue("Store Id");
        headerRow.createCell(2).setCellValue("Order Id");
        headerRow.createCell(3).setCellValue("Product");
        headerRow.createCell(4).setCellValue("Order Type");
        headerRow.createCell(5).setCellValue("Collection Date");
        headerRow.createCell(6).setCellValue("Order Amount");
        headerRow.createCell(7).setCellValue("Collected Amount");
        //headerRow.createCell(7).setCellValue("Store Margin");
        
        for(Order order: orders){
                Row contentRow = collectionSheet.createRow(collectionSerialNo++);
                LineItem line = order.getLineitems().get(0);
                String productName = line.getBrand() + " " + line.getModel_name() + " " + line.getModel_number() + " " + line.getColor();
                productName = productName.replaceAll("null", "").replaceAll("  ", " ");
                contentRow.createCell(0).setCellValue(collectionSerialNo-1);
                contentRow.createCell(1).setCellValue(getHotspotId(order.getPickupStoreId()));
                contentRow.createCell(2).setCellValue(order.getId());
                contentRow.createCell(3).setCellValue(productName);
                contentRow.createCell(4).setCellValue(order.isCod() ? "COD" : "Prepaid");
                contentRow.createCell(5).setCellValue(formatter.format(order.getDelivery_timestamp()));
                contentRow.createCell(6).setCellValue(order.getTotal_amount()-order.getGvAmount());
                contentRow.createCell(7).setCellValue(order.isCod() ? order.getTotal_amount() : 0.0);
                //contentRow.createCell(7).setCellValue(order.isCod() ? .01 * order.getTotal_amount() : .005 * order.getTotal_amount());
        }
        
        try {
            wb.write(baosXLS);
            baosXLS.close();
        } catch (IOException e) {
            logger.error("Error while streaming payment details report", e);
        }
                return baosXLS;
        }

    private String getHotspotId(long storeId){
        for(PickupStore store: stores){
                if(store.getId() == storeId){
                        return store.getHotspotId();
                }
        }
        return "";
    }
    
    public String getErrorMsg() {
        return error;
    }

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

    @Override
    public void setServletResponse(HttpServletResponse res) {
        this.response = res;
    }
    
    @Override
    public void setServletContext(ServletContext context) {
        this.context = context;
    }

    public String getServletContextPath() {
        return context.getContextPath();
    }
    
    public List<PickupStore> getAllStores(){
        return stores;
    }
}