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