Subversion Repositories SmartDukaan

Rev

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

package in.shop2020.serving.controllers;

import in.shop2020.datalogger.EventType;
import in.shop2020.model.v1.order.Order;
import in.shop2020.model.v1.user.ShoppingCartException;
import in.shop2020.serving.services.EbsPaymentService;
import in.shop2020.serving.services.HdfcPaymentService;
import in.shop2020.serving.services.IPaymentService;
import in.shop2020.thrift.clients.TransactionServiceClient;
import in.shop2020.thrift.clients.UserContextServiceClient;
import in.shop2020.utils.DataLogger;

import java.util.List;

import org.apache.log4j.Logger;
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.thrift.TException;

@SuppressWarnings("serial")
@InterceptorRefs({
    @InterceptorRef("myDefault"),
    @InterceptorRef("login")
})

@Results({
    @Result(name="shipping-redirect", type="redirectAction", 
                params = {"actionName" , "shipping"}),
        @Result(name="ebs-pay-redirect", type="redirect", location="/ebs-pay/${paymentId}")
})
public class OrderController extends BaseController {
        
        public long getPaymentId() {
                return paymentId;
        }
        
        private static Logger log = Logger.getLogger(Class.class);
        private String id;
        private long txnId = 0;
        
        private long paymentId;
        
        private String redirectURL;
        
        public OrderController(){
                super();
        }
        
    // GET /order/ orderid
    public String show() {
        log.info("id=" + id);
        htmlSnippets.put("MYACCOUNT_HEADER", pageLoader.getMyaccountHeaderHtml());
        htmlSnippets.put("ORDER_DETAILS", pageLoader.getOrderDetailsHtml(Long.parseLong(id), userinfo.getUserId()));
        return "show";
    }

    // POST /order/
    public String create(){
        String addressIdString = this.request.getParameter("addressid");
        if(addressIdString == null){
                addActionError("Please specify shipping address to continue.");
                return "shipping-redirect";
        }
        
        String paymentOption = request.getParameter("payment_option");
        log.info("Payment Option Selected: " + paymentOption);
        if(paymentOption == null || paymentOption.equals("")){
                addActionError("Please select a payment method to continue.");
                return "shipping-redirect";
        }
        
        
        long addressId = Long.parseLong(addressIdString);
        long currentCartId = userinfo.getCartId();
        try{
                if(!createOrders(addressId, currentCartId)){
                        addActionError("We are experiencing some problems. Please try later.");
                        return "shipping-redirect";
                }
        }catch (Exception e) {
                addActionError("We are experiencing some problems. Please try later.");
                log.error("Exception in createOrders function. Something went wrong.", e);
                return "shipping-redirect";
                }
        
                if (paymentOption.equals(IPaymentService.HDFC_MASTERCARD) || paymentOption.equals(IPaymentService.HDFC_VISA) || paymentOption.equals(IPaymentService.HDFC_VISA_ELECTRON)) {
                        // User has selected Visa or MasterCard CC
                        IPaymentService hdfcPaymentService = new HdfcPaymentService();
                        paymentId = hdfcPaymentService.createPayment(userinfo.getCartId(), userinfo.getUserId(), txnId, paymentOption);
                        if (paymentId == IPaymentService.PAYMENT_NOT_CREATED) {
                                log.error("Unable to process payment through HDFC. Falling through to EBS.");
                        } else {
                                this.redirectURL = ((HdfcPaymentService)hdfcPaymentService).getRedirectUrl();
                                log.info(this.redirectURL);
                                return "success";
                        }
                }

                if(paymentOption.equals(IPaymentService.HDFC_VISA))
                        paymentOption = IPaymentService.EBS_VISA;
                else if(paymentOption.equals(IPaymentService.HDFC_MASTERCARD))
                        paymentOption = IPaymentService.EBS_MASTERCARD;
                else if(paymentOption.equals(IPaymentService.HDFC_VISA_ELECTRON))
                        paymentOption = null;                   //Since we don't know the bank's name in this case, we'll let the user select the bank on the EBS page.
                
                IPaymentService ebsPaymentService = new EbsPaymentService();
                paymentId = ebsPaymentService.createPayment(userinfo.getCartId(), userinfo.getUserId(), txnId, paymentOption);
                if(paymentId == IPaymentService.PAYMENT_NOT_CREATED){
                        addActionError("We are experiencing some problems. Please try later.");
                        return "shipping-redirect";
                }else{
                        log.info("Successfully created payment for EBS to process. Redirecting to /ebs-pay/" + paymentId);
                        return "ebs-pay-redirect";
                }
    }
    
        public String getId(){
                return id;
        }
        
        public void setId(String id){
                this.id = id;
        }
        
        public String getMyaccountHeaderSnippet(){
                return htmlSnippets.get("MYACCOUNT_HEADER");
        }
        
        public String getOrderDetailsSnippet(){
                return htmlSnippets.get("ORDER_DETAILS");
        }
        
        public long getTxn(){
                return this.txnId;
        }

        /**
         * 
         * @param addressId
         * @param currentCartId
         * @return
         */
        private boolean createOrders(long addressId, long currentCartId){
                UserContextServiceClient userServiceClient = null;
                try {
                        userServiceClient = new UserContextServiceClient();
                } catch (Exception e) {
                        log.error("Unable to talk to the user context service.", e);
                        return false;
                }
                
                in.shop2020.model.v1.user.UserContextService.Client userClient = userServiceClient.getClient();
                try {
                        userClient.addAddressToCart(currentCartId, addressId);
                } catch (ShoppingCartException e1) {
                        log.error("Not able to set address in the cart.", e1);
                        return false;
                } catch (TException e1) {
                        log.error("Thrift exception while setting address in cart.", e1);
                        return false;
                }
                
                
                try {
                        String errorMsg = userClient.validateCart(currentCartId); 
                        if(!errorMsg.isEmpty()){
                                addActionError(errorMsg);
                                return false;
                        }
                } catch (ShoppingCartException e1) {
                        log.error("Error while validating shopping cart.", e1);
                        return false;
                } catch (TException e) {
                        log.error("Thrift exception while validating cart.", e);
                        return false;
                }
                
                
                try {
                        txnId = userClient.createOrders(currentCartId);
                } catch (ShoppingCartException e1) {
                        log.error("Error while creating orders from cart.", e1);
                        return false;
                } catch (TException e) {
                        log.error("Thrift exception while creating orders from cart.", e);
                        return false;
                }
                
                TransactionServiceClient transactionServiceClient = null;
        try {
            transactionServiceClient = new TransactionServiceClient();
            List<Order> orders = transactionServiceClient.getClient().getOrdersForTransaction(txnId, userinfo.getUserId());
            for (Order order : orders) {
                DataLogger.logData(EventType.ORDER_CREATION, session.getId(),
                        userinfo.getUserId(), userinfo.getEmail(), Long.toString(order.getId()));
            }
        } catch (Exception e1) {
                log.warn("Unable to log orders through the datalogger", e1);
        }
                
                return true;
        }
        
        public String getRedirectURL(){
                return this.redirectURL;
        }
}