Subversion Repositories SmartDukaan

Rev

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

package in.shop2020.support.controllers;

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 in.shop2020.logistics.LogisticsServiceException;
import in.shop2020.logistics.Provider;
import in.shop2020.support.services.CourierReconciliationGenerator;
import in.shop2020.support.utils.ReportsUtils;
import in.shop2020.thrift.clients.LogisticsClient;

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.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 CourierReconciliationController implements ServletRequestAware, ServletResponseAware, ServletContextAware{

    private static Logger logger = LoggerFactory.getLogger(CourierReconciliationController.class);
    
    private HttpServletRequest request;
    private HttpSession session;
    private HttpServletResponse response;
    private ServletContext context;
    
    private String errorMsg = "";
    
    public String index() {
        if(!ReportsUtils.canAccessReport((Long)session.getAttribute(ReportsUtils.ROLE), request.getServletPath())) {
            return "authfail";
        }
        return "index";
    }
    
    public String create() {
        // Formatting Form input parameters
        String startDateStr = request.getParameter("startDate");
        String endDateStr = request.getParameter("endDate");
        String providerIdStr = request.getParameter("providerId");
        String payModeStr = request.getParameter("payMode");
        int providerId = 1;
        boolean payMode = false;
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
        Date startDate = null, endDate = null;
        try {
            startDate = df.parse(startDateStr);
            endDate = df.parse(endDateStr);
            Calendar cal = Calendar.getInstance();
            cal.setTime(endDate);
            cal.add(Calendar.DATE, 1);
            endDate.setTime(cal.getTimeInMillis());
            providerId = Integer.parseInt(providerIdStr);
            payMode = Boolean.parseBoolean(payModeStr);
        } catch (ParseException pe) {
            errorMsg = "Please enter start and end dates in format MM/dd/yyyy";
            return "index";
        } catch (NumberFormatException nfe) {
            errorMsg = "Please select a provider and a payment mode";
            return "index";
        }
        
        Provider provider = null;
        try {
            LogisticsClient lsc = new LogisticsClient();
            in.shop2020.logistics.LogisticsService.Client logisticsClient = lsc.getClient();
            provider = logisticsClient.getProvider(providerId);
        } catch (TException e) {
            logger.error("Error getting information from one of the Thrift Services: ", e);
            return "index";
        } catch (LogisticsServiceException e) {
            logger.error("Error getting provider info from the logistics service: ", e);
            return "index";
        }
        
        CourierReconciliationGenerator crGenerator = new CourierReconciliationGenerator();
        ByteArrayOutputStream baos = crGenerator.generateCourierReconciliationReport(startDate, endDate, providerId, payMode);

        if (baos == null) {
            errorMsg = "No output for given date range";
            return "index";
        }

        // Preparing XLS file for output
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "inline; filename=" + provider.getName() + (payMode ? "-cod" : "-prepaid") + "-courier-reconciliation-" + startDateStr + "-" + endDateStr + ".xls");
        
        ServletOutputStream sos;
        try {
            sos = response.getOutputStream();
            baos.writeTo(sos);
            sos.flush();
        } catch (IOException e) {
            errorMsg = "Failed to write to response.";
            logger.error("Unable to stream the payment details report", e);
        }
        
        return "index";
    }
    
    
    public String getErrorMsg() {
        return errorMsg;
    }

    @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();
    }
}