/* * 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; } }