Subversion Repositories SmartDukaan

Rev

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

package in.shop2020.support.controllers;

import in.shop2020.model.v1.order.Order;
import in.shop2020.model.v1.order.TransactionServiceException;
import in.shop2020.model.v1.user.Coupon;
import in.shop2020.model.v1.user.CouponCategory;
import in.shop2020.model.v1.user.PromotionException;
import in.shop2020.support.utils.ReportsUtils;
import in.shop2020.thrift.clients.PromotionClient;
import in.shop2020.thrift.clients.TransactionClient;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import org.apache.commons.lang.StringUtils;
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.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@InterceptorRefs({
    @InterceptorRef("defaultStack"),
    @InterceptorRef("login")
})

@Results({
    @Result(name="authfail", type="redirectAction", params = {"actionName" , "reports"}),
        @Result(name="redirect", type="redirectAction", location = "coupon-gvs",  params={"statusCode", "301"})
})
public class CouponGvsController implements ServletRequestAware, ServletContextAware {

    private static Logger logger = LoggerFactory.getLogger(CouponGvsController.class);
    
    private HttpServletRequest request;
    private HttpServletResponse response;
    private HttpSession session;
    private ServletContext context;
    
    private PromotionClient psc;
    private in.shop2020.model.v1.user.PromotionService.Client pClient;
    
    private TransactionClient tsc;
    private in.shop2020.model.v1.order.TransactionService.Client tClient;
    
    private final DateFormat formatter = new SimpleDateFormat("EEE, dd-MMM-yyyy hh:mm a");
    


    private String discountType;
    private Long discount;
    private String couponType;
        private String coupon;
    private long type;
    private String userEmail;
    
    private Long userLimit;
    private Long globalLimit;
    private Long maxDiscount;
    private Long minDiscountableVal;
    private Long startHour;
    private Long startMinute;
    private Long endHour;
    private Long endMinute;

    private String couponCode;

    private int isCod;
    private long couponcategory;
    private Long orderId;
        
    public CouponGvsController(){
            try {
            psc = new PromotionClient();
            pClient = psc.getClient();
            tsc = new TransactionClient();
            tClient = tsc.getClient();
        } catch (Exception e) {
            logger.error("Error connecting to promotion/transaction service", e);
        }
        }
                
        
        public String index() {
        if(!ReportsUtils.canAccessReport((Long)session.getAttribute(ReportsUtils.ROLE), request.getServletPath())) {
            return "authfail";
        }
        return "authsuccess";
        
        }
        
        public String create(){
                if(!ReportsUtils.canAccessReport((Long)session.getAttribute(ReportsUtils.ROLE), request.getServletPath())) {
                        return "authfail";
                }
                //Coupon would be valid till 2 months of creation.
                Calendar cal = Calendar.getInstance();
                cal.add(Calendar.DATE, 60);
                Date endOn = cal.getTime();
                
                String arguments = "{";

                if(!(StringUtils.isEmpty(userEmail) || discount == null || discount <= 0) ) {
                        if(checkConditionsForRefund()){
                                try {
                                    
                                    arguments = arguments + "\"endOn\":" + String.valueOf(endOn.getTime());
                                    
                                    if(userEmail.equals("*")) {
                                        arguments = arguments + ", \"emails\":\"*\"";
                                    } else {
                                        String[] emails = userEmail.split(",");
                                        arguments = arguments + ", \"emails\":[";
                                        int i = 0;
                                        for (String email : emails) {
                                            if(i == 0) {
                                                arguments = arguments + "\"" + email.trim() + "\"";
                                                i = 1;
                                            } else {
                                                arguments = arguments + ",\"" + email.trim() + "\"";
                                            }
                                        }
                                        arguments = arguments + "]";
                                    }
                                    
                                    arguments = arguments + ", \"couponType\":\"" + couponType + "\"";
                                    
                                    arguments = arguments + ", \"discountType\":\"" + discountType + "\"";
                                    
                                    arguments = arguments + ", \"discount\":" + discount.toString();
                                    
                                    if(orderId != null) {
                                        arguments = arguments + ", \"orderId\":" + orderId.toString();
                                    }
                                    
                                    if(userLimit == null || userLimit < 1) {
                                        arguments = arguments + ", \"usage_limit_for_user\":1";
                                    } else {
                                        arguments = arguments + ", \"usage_limit_for_user\":" + userLimit.toString();
                                    }
                                    
                                    if(globalLimit == null || globalLimit < 1) {
                                        //Do not add this option
                            ;
                        } else {
                            arguments = arguments + ", \"globalLimit\":" + globalLimit.toString();
                        }
                                    
                                    if(maxDiscount == null || maxDiscount < 1) {
                            //Do not add this option
                                        ;
                        } else {
                            arguments = arguments + ", \"maxDiscount\":" + maxDiscount.toString();
                        }
                                    
                                    if(minDiscountableVal == null || minDiscountableVal < 1) {
                            //Do not add this option
                            ;
                        } else {
                            arguments = arguments + ", \"minDiscountableVal\":" + minDiscountableVal.toString();
                        }
                                    
                                    if(startHour == null || startHour < 1 || startHour > 23 || startHour > endHour) {
                            //Do not add this option
                            ;
                        } else {
                            arguments = arguments + ", \"startHour\":" + startHour.toString();
                        }
                                    
                                    if(startMinute == null || startMinute < 1 || startMinute < 59) {
                            //Do not add this option
                            ;
                        } else {
                            arguments = arguments + ", \"startMinute\":" + startMinute.toString();
                        }
                                    
                                    if(endHour == null || endHour < 1 || endHour > 23) {
                            //Do not add this option
                            ;
                        } else {
                            arguments = arguments + ", \"endHour\":" + endHour.toString();
                        }
                                    
                                    if(endMinute == null || endMinute < 1 || endMinute < 59) {
                            //Do not add this option
                            ;
                        } else {
                            arguments = arguments + ", \"startMinute\":" + startMinute.toString();
                        }
                                    
                                    if(isCod == 1) {
                                        arguments = arguments + ", \"isCod\":True}";
                                    } else {
                                        arguments = arguments + ", \"isCod\":False}";
                                    }
                                    
                                    if(couponCode == null) {
                                        couponCode = "";
                                    }
                                    
                                    String prefix="";
                                    switch((int)couponcategory){
                                    case 0 : prefix = "CUS";
                                                 break;
                                    case 1 : prefix = "MKT";
                                                 break;
                                    case 2 : prefix = "RFD";
                                                 break;
                                default : break;
                                    }
                                    
                                    coupon = pClient.createCoupon(type, couponcategory, couponCode, arguments, false, prefix);
                                        
                                } catch (Exception e){
                                        logger.info("Exception Caught"+e);
                                    System.out.println("Exception Caught"+e);
                                        return "authsuccess";
                                }
                        }
                }
                return "authsuccess";   
        }


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

        public boolean checkConditionsForRefund(){
                Order order =null;
                if(orderId!=null){
                        try {
                                order = tClient.getOrder(orderId);
                        } catch (Exception e1) {
                                logger.error("Error getting order object for orderId: "+orderId, e1);
                        }
                        if(order!=null && discount<=order.getTotal_amount()){
                                return true;
                        }
                        logger.info("Coupon Can't be created due to Coupon Amount Greater Than Order Total Amount");
                }
                else if(couponcategory==CouponCategory.CUSTOMER_SATISFACTION.getValue() || couponcategory==CouponCategory.MARKETING.getValue()){
                        return true;
                }
                return false;
        }

        @Override
        public void setServletRequest(HttpServletRequest req) {
               this.request = req;
                this.session = req.getSession();
        }
        
        //Crea
        public String getCoupon() {
                return coupon;
        }
        
        
        public void setCoupon(String coupon) {
                this.coupon = coupon;
        }
        
        
        public long getType() {
                return type;
        }
        
        
        public void setType(long type) {
                this.type = type;
        }
        
        public String getUserEmail() {
                return userEmail;
        }
        
        public void setUserEmail(String userEmail) {
                this.userEmail = userEmail;
        }
        
        public List<Coupon> getCoupons() {
                try {
                        return pClient.getActiveCodes(27l);
                } catch (PromotionException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (TException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return null;
        }
        
        public List<String> getArguments(Coupon coupon){
                List<String> result = new ArrayList<String>();
                try {
                        JSONObject obj = new JSONObject(coupon.getArguments());
                        result.add(obj.getString("emails"));
                        try {
                        if(obj.getString("discountType").equals("absolute")) {
                            result.add(obj.getString("discount"));
                        } else {
                            result.add(obj.getString("discount") + " %");
                        }
                } catch (JSONException e){
                    result.add(obj.getString("discount"));
                }
                
                try {
                        result.add(obj.getString("couponType"));
                } catch (JSONException e){
                    result.add("Physical");
                }
                
                } catch (JSONException e) {
                        result.add("ERROR");
                        result.add("ERROR");
                        result.add("ERROR");
                }
                return result;
        }
                
        public void setId(String id) {
                this.coupon = id;
        }
        
        public String destroy(){
                if(!ReportsUtils.canAccessReport((Long)session.getAttribute(ReportsUtils.ROLE), request.getServletPath().split("/")[1])) {
                        return "athfail";
                }
                try {
                        pClient.deleteCoupon(coupon);
                } catch (PromotionException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (TException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return "redirect"; 
        }
        public String show(){
                return destroy(); 
        }
        

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


    public String getDiscountType() {
        return discountType;
    }


    public void setDiscountType(String discountType) {
        this.discountType = discountType;
    }


    public Long getDiscount() {
        return discount;
    }


    public void setDiscount(Long discount) {
        this.discount = discount;
    }


    public String getCouponType() {
        return couponType;
    }


    public void setCouponType(String couponType) {
        this.couponType = couponType;
    }


    public Long getUserLimit() {
        return userLimit;
    }


    public void setUserLimit(Long userLimit) {
        this.userLimit = userLimit;
    }


    public Long getGlobalLimit() {
        return globalLimit;
    }


    public void setGlobalLimit(Long globalLimit) {
        this.globalLimit = globalLimit;
    }


    public Long getMaxDiscount() {
        return maxDiscount;
    }


    public void setMaxDiscount(Long maxDiscount) {
        this.maxDiscount = maxDiscount;
    }


    public Long getMinDiscountableVal() {
        return minDiscountableVal;
    }


    public void setMinDiscountableVal(Long minDiscountableVal) {
        this.minDiscountableVal = minDiscountableVal;
    }


    public Long getStartHour() {
        return startHour;
    }


    public void setStartHour(Long startHour) {
        this.startHour = startHour;
    }


    public Long getStartMinute() {
        return startMinute;
    }


    public void setStartMinute(Long startMinute) {
        this.startMinute = startMinute;
    }


    public Long getEndHour() {
        return endHour;
    }


    public void setEndHour(Long endHour) {
        this.endHour = endHour;
    }


    public Long getEndMinute() {
        return endMinute;
    }


    public void setEndMinute(Long endMinute) {
        this.endMinute = endMinute;
    }


    public String getCouponCode() {
        return couponCode;
    }


    public void setCouponCode(String couponCode) {
        this.couponCode = couponCode;
    }


    public int getIsCod() {
        return isCod;
    }


    public void setIsCod(int isCod) {
        this.isCod = isCod;
    }


        public long getCouponcategory() {
                return couponcategory;
        }


        public void setCouponcategory(long couponcategory) {
                this.couponcategory = couponcategory;
        }


        public Long getOrderId() {
                return orderId;
        }


        public void setOrderId(Long orderId) {
                this.orderId = orderId;
        }
}