001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.shopping.action;
016    
017    import com.liferay.portal.kernel.servlet.SessionErrors;
018    import com.liferay.portal.kernel.util.Constants;
019    import com.liferay.portal.kernel.util.ParamUtil;
020    import com.liferay.portal.kernel.util.Validator;
021    import com.liferay.portal.security.auth.PrincipalException;
022    import com.liferay.portal.service.ServiceContext;
023    import com.liferay.portal.service.ServiceContextFactory;
024    import com.liferay.portal.theme.ThemeDisplay;
025    import com.liferay.portal.util.WebKeys;
026    import com.liferay.portlet.ActionResponseImpl;
027    import com.liferay.portlet.shopping.BillingCityException;
028    import com.liferay.portlet.shopping.BillingCountryException;
029    import com.liferay.portlet.shopping.BillingEmailAddressException;
030    import com.liferay.portlet.shopping.BillingFirstNameException;
031    import com.liferay.portlet.shopping.BillingLastNameException;
032    import com.liferay.portlet.shopping.BillingPhoneException;
033    import com.liferay.portlet.shopping.BillingStateException;
034    import com.liferay.portlet.shopping.BillingStreetException;
035    import com.liferay.portlet.shopping.BillingZipException;
036    import com.liferay.portlet.shopping.CCExpirationException;
037    import com.liferay.portlet.shopping.CCNameException;
038    import com.liferay.portlet.shopping.CCNumberException;
039    import com.liferay.portlet.shopping.CCTypeException;
040    import com.liferay.portlet.shopping.ShippingCityException;
041    import com.liferay.portlet.shopping.ShippingCountryException;
042    import com.liferay.portlet.shopping.ShippingEmailAddressException;
043    import com.liferay.portlet.shopping.ShippingFirstNameException;
044    import com.liferay.portlet.shopping.ShippingLastNameException;
045    import com.liferay.portlet.shopping.ShippingPhoneException;
046    import com.liferay.portlet.shopping.ShippingStateException;
047    import com.liferay.portlet.shopping.ShippingStreetException;
048    import com.liferay.portlet.shopping.ShippingZipException;
049    import com.liferay.portlet.shopping.model.ShoppingCart;
050    import com.liferay.portlet.shopping.model.ShoppingOrder;
051    import com.liferay.portlet.shopping.service.ShoppingOrderLocalServiceUtil;
052    import com.liferay.portlet.shopping.util.ShoppingPreferences;
053    import com.liferay.portlet.shopping.util.ShoppingUtil;
054    
055    import javax.portlet.ActionRequest;
056    import javax.portlet.ActionResponse;
057    import javax.portlet.PortletConfig;
058    
059    import org.apache.struts.action.ActionForm;
060    import org.apache.struts.action.ActionMapping;
061    
062    /**
063     * @author Brian Wing Shun Chan
064     */
065    public class CheckoutAction extends CartAction {
066    
067            @Override
068            public void processAction(
069                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
070                            ActionRequest actionRequest, ActionResponse actionResponse)
071                    throws Exception {
072    
073                    if (redirectToLogin(actionRequest, actionResponse)) {
074                            return;
075                    }
076    
077                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
078    
079                    getLatestOrder(actionRequest);
080    
081                    if (cmd.equals(Constants.SAVE)) {
082                            updateCart(actionRequest, actionResponse);
083                            updateLatestOrder(actionRequest);
084                            saveLatestOrder(actionRequest);
085                            forwardCheckout(actionRequest, actionResponse);
086                    }
087                    else if (cmd.equals(Constants.UPDATE)) {
088                            try {
089                                    updateLatestOrder(actionRequest);
090    
091                                    setForward(actionRequest, "portlet.shopping.checkout_second");
092                            }
093                            catch (Exception e) {
094                                    if (e instanceof BillingCityException ||
095                                            e instanceof BillingCountryException ||
096                                            e instanceof BillingEmailAddressException ||
097                                            e instanceof BillingFirstNameException ||
098                                            e instanceof BillingLastNameException ||
099                                            e instanceof BillingPhoneException ||
100                                            e instanceof BillingStateException ||
101                                            e instanceof BillingStreetException ||
102                                            e instanceof BillingZipException ||
103                                            e instanceof CCExpirationException ||
104                                            e instanceof CCNameException ||
105                                            e instanceof CCNumberException ||
106                                            e instanceof CCTypeException ||
107                                            e instanceof ShippingCityException ||
108                                            e instanceof ShippingCountryException ||
109                                            e instanceof ShippingEmailAddressException ||
110                                            e instanceof ShippingFirstNameException ||
111                                            e instanceof ShippingLastNameException ||
112                                            e instanceof ShippingPhoneException ||
113                                            e instanceof ShippingStateException ||
114                                            e instanceof ShippingStreetException ||
115                                            e instanceof ShippingZipException) {
116    
117                                            SessionErrors.add(actionRequest, e.getClass().getName());
118    
119                                            setForward(
120                                                    actionRequest, "portlet.shopping.checkout_first");
121                                    }
122                                    else if (e instanceof PrincipalException) {
123                                            setForward(actionRequest, "portlet.shopping.error");
124                                    }
125                                    else {
126                                            throw e;
127                                    }
128                            }
129                    }
130                    else if (cmd.equals(Constants.VIEW)) {
131                            setForward(actionRequest, "portlet.shopping.checkout_third");
132                    }
133                    else {
134                            setForward(actionRequest, "portlet.shopping.checkout_first");
135                    }
136            }
137    
138            protected void forwardCheckout(
139                            ActionRequest actionRequest, ActionResponse actionResponse)
140                    throws Exception {
141    
142                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
143                            WebKeys.THEME_DISPLAY);
144    
145                    ShoppingCart cart = ShoppingUtil.getCart(actionRequest);
146    
147                    ShoppingOrder order = (ShoppingOrder)actionRequest.getAttribute(
148                            WebKeys.SHOPPING_ORDER);
149    
150                    ShoppingPreferences preferences = ShoppingPreferences.getInstance(
151                            themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId());
152    
153                    String returnURL = ShoppingUtil.getPayPalReturnURL(
154                            ((ActionResponseImpl)actionResponse).createActionURL(), order);
155                    String notifyURL = ShoppingUtil.getPayPalNotifyURL(themeDisplay);
156    
157                    if (preferences.usePayPal()) {
158                            double total = ShoppingUtil.calculateTotal(
159                                    cart.getItems(), order.getBillingState(), cart.getCoupon(),
160                                    cart.getAltShipping(), cart.isInsure());
161    
162                            String redirectURL = ShoppingUtil.getPayPalRedirectURL(
163                                    preferences, order, total, returnURL, notifyURL);
164    
165                            actionResponse.sendRedirect(redirectURL);
166                    }
167                    else {
168                            ServiceContext serviceContext = ServiceContextFactory.getInstance(
169                                    actionRequest);
170    
171                            ShoppingOrderLocalServiceUtil.sendEmail(
172                                    order, "confirmation", serviceContext);
173    
174                            actionResponse.sendRedirect(returnURL);
175                    }
176            }
177    
178            protected void getLatestOrder(ActionRequest actionRequest)
179                    throws Exception {
180    
181                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
182                            WebKeys.THEME_DISPLAY);
183    
184                    ShoppingOrder order = ShoppingOrderLocalServiceUtil.getLatestOrder(
185                            themeDisplay.getUserId(), themeDisplay.getScopeGroupId());
186    
187                    actionRequest.setAttribute(WebKeys.SHOPPING_ORDER, order);
188            }
189    
190            @Override
191            protected boolean isCheckMethodOnProcessAction() {
192                    return _CHECK_METHOD_ON_PROCESS_ACTION;
193            }
194    
195            protected void saveLatestOrder(ActionRequest actionRequest)
196                    throws Exception {
197    
198                    ShoppingCart cart = ShoppingUtil.getCart(actionRequest);
199    
200                    ShoppingOrder order = ShoppingOrderLocalServiceUtil.saveLatestOrder(
201                            cart);
202    
203                    actionRequest.setAttribute(WebKeys.SHOPPING_ORDER, order);
204            }
205    
206            protected void updateLatestOrder(ActionRequest actionRequest)
207                    throws Exception {
208    
209                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
210                            WebKeys.THEME_DISPLAY);
211    
212                    String billingFirstName = ParamUtil.getString(
213                            actionRequest, "billingFirstName");
214                    String billingLastName = ParamUtil.getString(
215                            actionRequest, "billingLastName");
216                    String billingEmailAddress = ParamUtil.getString(
217                            actionRequest, "billingEmailAddress");
218                    String billingCompany = ParamUtil.getString(
219                            actionRequest, "billingCompany");
220                    String billingStreet = ParamUtil.getString(
221                            actionRequest, "billingStreet");
222                    String billingCity = ParamUtil.getString(actionRequest, "billingCity");
223    
224                    String billingStateSel = ParamUtil.getString(
225                            actionRequest, "billingStateSel");
226                    String billingState = billingStateSel;
227                    if (Validator.isNull(billingStateSel)) {
228                            billingState = ParamUtil.getString(actionRequest, "billingState");
229                    }
230    
231                    String billingZip = ParamUtil.getString(actionRequest, "billingZip");
232                    String billingCountry = ParamUtil.getString(
233                            actionRequest, "billingCountry");
234                    String billingPhone = ParamUtil.getString(
235                            actionRequest, "billingPhone");
236    
237                    boolean shipToBilling = ParamUtil.getBoolean(
238                            actionRequest, "shipToBilling");
239                    String shippingFirstName = ParamUtil.getString(
240                            actionRequest, "shippingFirstName");
241                    String shippingLastName = ParamUtil.getString(
242                            actionRequest, "shippingLastName");
243                    String shippingEmailAddress = ParamUtil.getString(
244                            actionRequest, "shippingEmailAddress");
245                    String shippingCompany = ParamUtil.getString(
246                            actionRequest, "shippingCompany");
247                    String shippingStreet = ParamUtil.getString(
248                            actionRequest, "shippingStreet");
249                    String shippingCity = ParamUtil.getString(
250                            actionRequest, "shippingCity");
251    
252                    String shippingStateSel = ParamUtil.getString(
253                            actionRequest, "shippingStateSel");
254                    String shippingState = shippingStateSel;
255                    if (Validator.isNull(shippingStateSel)) {
256                            shippingState = ParamUtil.getString(actionRequest, "shippingState");
257                    }
258    
259                    String shippingZip = ParamUtil.getString(actionRequest, "shippingZip");
260                    String shippingCountry = ParamUtil.getString(
261                            actionRequest, "shippingCountry");
262                    String shippingPhone = ParamUtil.getString(
263                            actionRequest, "shippingPhone");
264    
265                    String ccName = ParamUtil.getString(actionRequest, "ccName");
266                    String ccType = ParamUtil.getString(actionRequest, "ccType");
267                    String ccNumber = ParamUtil.getString(actionRequest, "ccNumber");
268                    int ccExpMonth = ParamUtil.getInteger(actionRequest, "ccExpMonth");
269                    int ccExpYear = ParamUtil.getInteger(actionRequest, "ccExpYear");
270                    String ccVerNumber = ParamUtil.getString(actionRequest, "ccVerNumber");
271    
272                    String comments = ParamUtil.getString(actionRequest, "comments");
273    
274                    ShoppingOrder order = ShoppingOrderLocalServiceUtil.updateLatestOrder(
275                            themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
276                            billingFirstName, billingLastName, billingEmailAddress,
277                            billingCompany, billingStreet, billingCity, billingState,
278                            billingZip, billingCountry, billingPhone, shipToBilling,
279                            shippingFirstName, shippingLastName, shippingEmailAddress,
280                            shippingCompany, shippingStreet, shippingCity, shippingState,
281                            shippingZip, shippingCountry, shippingPhone, ccName, ccType,
282                            ccNumber, ccExpMonth, ccExpYear, ccVerNumber, comments);
283    
284                    actionRequest.setAttribute(WebKeys.SHOPPING_ORDER, order);
285            }
286    
287            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
288    
289    }