001    /**
002     * Copyright (c) 2000-2013 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());
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    
228                    if (Validator.isNull(billingStateSel)) {
229                            billingState = ParamUtil.getString(actionRequest, "billingState");
230                    }
231    
232                    String billingZip = ParamUtil.getString(actionRequest, "billingZip");
233                    String billingCountry = ParamUtil.getString(
234                            actionRequest, "billingCountry");
235                    String billingPhone = ParamUtil.getString(
236                            actionRequest, "billingPhone");
237    
238                    boolean shipToBilling = ParamUtil.getBoolean(
239                            actionRequest, "shipToBilling");
240                    String shippingFirstName = ParamUtil.getString(
241                            actionRequest, "shippingFirstName");
242                    String shippingLastName = ParamUtil.getString(
243                            actionRequest, "shippingLastName");
244                    String shippingEmailAddress = ParamUtil.getString(
245                            actionRequest, "shippingEmailAddress");
246                    String shippingCompany = ParamUtil.getString(
247                            actionRequest, "shippingCompany");
248                    String shippingStreet = ParamUtil.getString(
249                            actionRequest, "shippingStreet");
250                    String shippingCity = ParamUtil.getString(
251                            actionRequest, "shippingCity");
252    
253                    String shippingStateSel = ParamUtil.getString(
254                            actionRequest, "shippingStateSel");
255                    String shippingState = shippingStateSel;
256    
257                    if (Validator.isNull(shippingStateSel)) {
258                            shippingState = ParamUtil.getString(actionRequest, "shippingState");
259                    }
260    
261                    String shippingZip = ParamUtil.getString(actionRequest, "shippingZip");
262                    String shippingCountry = ParamUtil.getString(
263                            actionRequest, "shippingCountry");
264                    String shippingPhone = ParamUtil.getString(
265                            actionRequest, "shippingPhone");
266    
267                    String ccName = ParamUtil.getString(actionRequest, "ccName");
268                    String ccType = ParamUtil.getString(actionRequest, "ccType");
269                    String ccNumber = ParamUtil.getString(actionRequest, "ccNumber");
270                    int ccExpMonth = ParamUtil.getInteger(actionRequest, "ccExpMonth");
271                    int ccExpYear = ParamUtil.getInteger(actionRequest, "ccExpYear");
272                    String ccVerNumber = ParamUtil.getString(actionRequest, "ccVerNumber");
273    
274                    String comments = ParamUtil.getString(actionRequest, "comments");
275    
276                    ShoppingOrder order = ShoppingOrderLocalServiceUtil.updateLatestOrder(
277                            themeDisplay.getUserId(), themeDisplay.getScopeGroupId(),
278                            billingFirstName, billingLastName, billingEmailAddress,
279                            billingCompany, billingStreet, billingCity, billingState,
280                            billingZip, billingCountry, billingPhone, shipToBilling,
281                            shippingFirstName, shippingLastName, shippingEmailAddress,
282                            shippingCompany, shippingStreet, shippingCity, shippingState,
283                            shippingZip, shippingCountry, shippingPhone, ccName, ccType,
284                            ccNumber, ccExpMonth, ccExpYear, ccVerNumber, comments);
285    
286                    actionRequest.setAttribute(WebKeys.SHOPPING_ORDER, order);
287            }
288    
289            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
290    
291    }