com.salesmanager.checkout.flow.ComitOrderAction.java Source code

Java tutorial

Introduction

Here is the source code for com.salesmanager.checkout.flow.ComitOrderAction.java

Source

/*
 * Licensed to csti consulting 
 * You may obtain a copy of the License at
 *
 * http://www.csticonsulting.com
 * Copyright (c) 2006-Aug 25, 2010 Consultation CS-TI inc. 
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package com.salesmanager.checkout.flow;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.Cookie;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.salesmanager.checkout.CheckoutBaseAction;
import com.salesmanager.core.constants.CatalogConstants;
import com.salesmanager.core.constants.ConfigurationConstants;
import com.salesmanager.core.entity.catalog.Product;
import com.salesmanager.core.entity.customer.Customer;
import com.salesmanager.core.entity.merchant.MerchantConfiguration;
import com.salesmanager.core.entity.merchant.MerchantStore;
import com.salesmanager.core.entity.orders.Order;
import com.salesmanager.core.entity.orders.OrderProduct;
import com.salesmanager.core.entity.orders.OrderProductDownload;
import com.salesmanager.core.entity.orders.OrderStatusHistory;
import com.salesmanager.core.entity.orders.OrderTotal;
import com.salesmanager.core.entity.orders.OrderTotalSummary;
import com.salesmanager.core.entity.payment.PaymentMethod;
import com.salesmanager.core.entity.shipping.Shipping;
import com.salesmanager.core.entity.shipping.ShippingInformation;
import com.salesmanager.core.service.ServiceFactory;
import com.salesmanager.core.service.catalog.CatalogService;
import com.salesmanager.core.service.merchant.ConfigurationRequest;
import com.salesmanager.core.service.merchant.ConfigurationResponse;
import com.salesmanager.core.service.merchant.MerchantService;
import com.salesmanager.core.service.order.OrderException;
import com.salesmanager.core.service.order.OrderService;
import com.salesmanager.core.service.payment.TransactionException;
import com.salesmanager.core.service.system.SystemService;
import com.salesmanager.core.service.workflow.ProcessorContext;
import com.salesmanager.core.service.workflow.WorkflowProcessor;
import com.salesmanager.core.util.CurrencyUtil;
import com.salesmanager.core.util.SpringUtil;
import com.salesmanager.core.util.www.SessionUtil;

public class ComitOrderAction extends CheckoutBaseAction {

    private static final long serialVersionUID = -7846147110972657310L;
    private OrderStatusHistory orderHistory = null;
    private Order order = null;
    private boolean orderCommited = false;

    private Logger log = Logger.getLogger(ComitOrderAction.class);

    private String fileMessage;
    private Collection orderProductList;
    private Collection totals;

    private String shippingTotal = null;// for analytics
    private MerchantStore store = null;

    Collection downloadFiles;

    /**
     * Thank you page
     * 
     * @return
     */
    public String displayOrder() {

        try {
            // retreive the order
            Order savedOrder = SessionUtil.getOrder(getServletRequest());

            OrderService oservice = (OrderService) ServiceFactory.getService(ServiceFactory.OrderService);

            store = SessionUtil.getMerchantStore(getServletRequest());

            super.getServletRequest().setAttribute("STORE", store);

            order = oservice.getOrder(savedOrder.getOrderId());

            order.setLocale(super.getLocale());

            super.getServletRequest().setAttribute("ORDER", order);

            CatalogService cservice = (CatalogService) ServiceFactory.getService(ServiceFactory.CatalogService);

            Customer customer = SessionUtil.getCustomer(getServletRequest());
            super.getServletRequest().setAttribute("CUSTOMER", customer);

            if (order == null) {
                log.error("Order id " + savedOrder.getOrderId() + " is null in the database");
                addActionError(getText("message.error.comitorder.error",
                        new String[] { String.valueOf(order.getOrderId()), store.getStoreemailaddress() }));
                return "GENERICEROR";
            }

            Set savedProducts = savedOrder.getOrderProducts();
            Map productsMap = new HashMap();
            List opList = new ArrayList();
            for (Object o : savedProducts) {

                System.out.println(o.getClass().getName());

                OrderProduct op = (OrderProduct) o;

                Product p = cservice.getProduct(op.getProductId());

                if (p != null) {
                    op.setProductImage(p.getProductImage());
                }

                productsMap.put(op.getOrderProductId(), op);
                opList.add(op);

            }

            Set historySet = order.getOrderHistory();

            if (historySet != null) {
                Iterator it = historySet.iterator();
                while (it.hasNext()) {
                    orderHistory = (OrderStatusHistory) it.next();
                    SessionUtil.setOrderStatusHistory(orderHistory, getServletRequest());
                    super.getServletRequest().setAttribute("HISTORY", orderHistory.getComments());
                }
            }

            getServletRequest().setAttribute("ADDRESSTYPE", "BILLING");

            ShippingInformation shippingInformation = SessionUtil.getShippingInformation(getServletRequest());

            if (shippingInformation != null) {
                getServletRequest().setAttribute("ADDRESSTYPE", "BOTH");
            }

            if (this.getFileMessage() == null) {

                // downloadable files
                downloadFiles = oservice.getOrderProductDownloads(this.getOrder().getOrderId());
                if (downloadFiles != null && downloadFiles.size() > 0) {
                    Iterator dfIterator = downloadFiles.iterator();
                    while (dfIterator.hasNext()) {
                        OrderProductDownload opd = (OrderProductDownload) dfIterator.next();
                        OrderProduct op = (OrderProduct) productsMap.get(opd.getOrderProductId());
                        if (op != null) {
                            opd.setProductName(op.getProductName());
                        } else {
                            opd.setProductName(opd.getOrderProductFilename());
                        }
                    }
                }
            }

            this.setOrderProductList(opList);

            //List orderProductList = new ArrayList(savedOrder.getOrderProducts());

            //this.setOrderProductList(orderProductList);

            Set orderTotalSet = order.getOrderTotal();

            // transform totals to a list
            List totalsList = new ArrayList();
            if (orderTotalSet != null && orderTotalSet.size() > 0) {
                Iterator totalsIterator = orderTotalSet.iterator();
                while (totalsIterator.hasNext()) {
                    OrderTotal total = (OrderTotal) totalsIterator.next();
                    totalsList.add(total);
                    if (total.getModule().equals("ot_shipping")) {
                        shippingTotal = CurrencyUtil.displayFormatedAmountNoCurrency(total.getValue(),
                                order.getCurrency());
                    }
                }
            }

            this.setTotals(totalsList);

            // cleanup cart session objects except Order, MerchantStore and
            // Customer
            SessionUtil.resetCart(getServletRequest());
            SessionUtil.setComited(getServletRequest());

        } catch (Exception e) {
            log.error(e);
        }

        this.setOrderCommited(true);

        return SUCCESS;

    }

    /**
     * Process Payment Save Order entity
     * 
     * @return
     */
    public String comitOrder() {

        // Get all entities

        Order order = SessionUtil.getOrder(getServletRequest());
        MerchantStore store = SessionUtil.getMerchantStore(getServletRequest());

        PaymentMethod payment = SessionUtil.getPaymentMethod(getServletRequest());

        ShippingInformation shippingInformation = SessionUtil.getShippingInformation(getServletRequest());
        Customer customer = SessionUtil.getCustomer(getServletRequest());

        if (super.getServletRequest().getSession().getAttribute("TRANSACTIONCOMITED") != null) {
            addActionError(getText("error.transaction.duplicate",
                    new String[] { String.valueOf(order.getOrderId()), store.getStoreemailaddress() }));
            return "GENERICERROR";
        }

        OrderService oservice = (OrderService) ServiceFactory.getService(ServiceFactory.OrderService);

        try {

            SystemService sservice = (SystemService) ServiceFactory.getService(ServiceFactory.SystemService);
            long nextOrderId = sservice.getNextOrderIdSequence();
            order.setOrderId(nextOrderId);

            OrderTotalSummary summary = SessionUtil.getOrderTotalSummary(getServletRequest());

            Shipping shipping = null;
            if (shippingInformation != null) {
                shipping = new Shipping();
                shipping.setHandlingCost(shippingInformation.getHandlingCost());
                shipping.setShippingCost(shippingInformation.getShippingOptionSelected().getOptionPrice());
                shipping.setShippingModule(shippingInformation.getShippingOptionSelected().getModule());
                shipping.setShippingDescription(shippingInformation.getShippingOptionSelected().getDescription());
            }

            Map orderProducts = SessionUtil.getOrderProducts(getServletRequest());

            Set s = new HashSet();

            for (Object o : orderProducts.values()) {

                OrderProduct op = (OrderProduct) o;
                s.add(op);
            }

            order.setOrderProducts(s);

            // ajust order object
            order.setCustomerEmailAddress(customer.getCustomerEmailAddress());

            String comments = null;
            if (this.getOrderHistory() != null) {
                comments = this.getOrderHistory().getComments();
            }

            // Order, PaymentMethod,
            ProcessorContext context = new ProcessorContext();

            Collection files = oservice.getOrderProductDownloads(order.getOrderId());
            if (files != null && files.size() > 0) {
                context.addObject("files", files);

            }

            context.addObject("Order", order);
            context.addObject("Customer", customer);
            context.addObject("MerchantStore", store);
            context.addObject("PaymentMethod", payment);
            context.addObject("Shipping", shipping);
            context.addObject("Locale", super.getLocale());
            context.addObject("OrderTotalSummary", summary);
            context.addObject("comments", comments);
            context.addObject("products", orderProducts.values());

            WorkflowProcessor wp = (WorkflowProcessor) SpringUtil.getBean("orderWorkflow");
            wp.doWorkflow(context);

            // set an indicator in HTTPSession to prevent duplicates
            super.getServletRequest().getSession().setAttribute("TRANSACTIONCOMITED", "true");

            if (!StringUtils.isBlank(comments)) {
                SessionUtil.setOrderStatusHistory(this.getOrderHistory(), getServletRequest());
            }

        } catch (Exception e) {
            if (e instanceof TransactionException) {
                super.addErrorMessage("error.payment.paymenterror");
                return "PAYMENTERROR";
            }

            if (e instanceof OrderException) {
                try {
                    oservice.sendOrderProblemEmail(order.getMerchantId(), order, customer, store);
                } catch (Exception ee) {
                    log.error(ee);
                }
            }

            addActionError(getText("message.error.comitorder.error",
                    new String[] { String.valueOf(order.getOrderId()), store.getStoreemailaddress() }));
            log.error(e);
            return "GENERICERROR";
        }
        //cleanup

        //delete shopping cart cookie
        Cookie c = new Cookie(CatalogConstants.CART_COOKIE_NAME, "");
        c.setMaxAge(0);
        super.getServletResponse().addCookie(c);

        return SUCCESS;

    }

    public OrderStatusHistory getOrderHistory() {
        return orderHistory;
    }

    public void setOrderHistory(OrderStatusHistory orderHistory) {
        this.orderHistory = orderHistory;
    }

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }

    public Collection getDownloadFiles() {
        return downloadFiles;
    }

    public void setDownloadFiles(Collection downloadFiles) {
        this.downloadFiles = downloadFiles;
    }

    public String getFileMessage() {
        return fileMessage;
    }

    public void setFileMessage(String fileMessage) {
        this.fileMessage = fileMessage;
    }

    public Collection getOrderProductList() {
        return orderProductList;
    }

    public void setOrderProductList(Collection orderProductList) {
        this.orderProductList = orderProductList;
    }

    public Collection getTotals() {
        return totals;
    }

    public void setTotals(Collection totals) {
        this.totals = totals;
    }

    public boolean isOrderCommited() {
        return orderCommited;
    }

    public void setOrderCommited(boolean orderCommited) {
        this.orderCommited = orderCommited;
    }

    public String getShippingTotal() {
        return shippingTotal;
    }

    public void setShippingTotal(String shippingTotal) {
        this.shippingTotal = shippingTotal;
    }

    public MerchantStore getStore() {
        return store;
    }

    public void setStore(MerchantStore store) {
        this.store = store;
    }

}