1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portlet.shopping.action;
16  
17  import com.liferay.portal.kernel.servlet.SessionErrors;
18  import com.liferay.portal.kernel.util.Constants;
19  import com.liferay.portal.kernel.util.ParamUtil;
20  import com.liferay.portal.kernel.util.Validator;
21  import com.liferay.portal.security.auth.PrincipalException;
22  import com.liferay.portal.theme.ThemeDisplay;
23  import com.liferay.portal.util.WebKeys;
24  import com.liferay.portlet.ActionResponseImpl;
25  import com.liferay.portlet.shopping.BillingCityException;
26  import com.liferay.portlet.shopping.BillingCountryException;
27  import com.liferay.portlet.shopping.BillingEmailAddressException;
28  import com.liferay.portlet.shopping.BillingFirstNameException;
29  import com.liferay.portlet.shopping.BillingLastNameException;
30  import com.liferay.portlet.shopping.BillingPhoneException;
31  import com.liferay.portlet.shopping.BillingStateException;
32  import com.liferay.portlet.shopping.BillingStreetException;
33  import com.liferay.portlet.shopping.BillingZipException;
34  import com.liferay.portlet.shopping.CCExpirationException;
35  import com.liferay.portlet.shopping.CCNameException;
36  import com.liferay.portlet.shopping.CCNumberException;
37  import com.liferay.portlet.shopping.CCTypeException;
38  import com.liferay.portlet.shopping.ShippingCityException;
39  import com.liferay.portlet.shopping.ShippingCountryException;
40  import com.liferay.portlet.shopping.ShippingEmailAddressException;
41  import com.liferay.portlet.shopping.ShippingFirstNameException;
42  import com.liferay.portlet.shopping.ShippingLastNameException;
43  import com.liferay.portlet.shopping.ShippingPhoneException;
44  import com.liferay.portlet.shopping.ShippingStateException;
45  import com.liferay.portlet.shopping.ShippingStreetException;
46  import com.liferay.portlet.shopping.ShippingZipException;
47  import com.liferay.portlet.shopping.model.ShoppingCart;
48  import com.liferay.portlet.shopping.model.ShoppingOrder;
49  import com.liferay.portlet.shopping.service.ShoppingOrderLocalServiceUtil;
50  import com.liferay.portlet.shopping.util.ShoppingPreferences;
51  import com.liferay.portlet.shopping.util.ShoppingUtil;
52  
53  import javax.portlet.ActionRequest;
54  import javax.portlet.ActionResponse;
55  import javax.portlet.PortletConfig;
56  
57  import org.apache.struts.action.ActionForm;
58  import org.apache.struts.action.ActionMapping;
59  
60  /**
61   * <a href="CheckoutAction.java.html"><b><i>View Source</i></b></a>
62   *
63   * @author Brian Wing Shun Chan
64   */
65  public class CheckoutAction extends CartAction {
66  
67      public void processAction(
68              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
69              ActionRequest actionRequest, ActionResponse actionResponse)
70          throws Exception {
71  
72          if (redirectToLogin(actionRequest, actionResponse)) {
73              return;
74          }
75  
76          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
77  
78          getLatestOrder(actionRequest);
79  
80          if (cmd.equals(Constants.SAVE)) {
81              updateCart(actionRequest, actionResponse);
82              updateLatestOrder(actionRequest);
83              saveLatestOrder(actionRequest);
84              forwardCheckout(actionRequest, actionResponse);
85          }
86          else if (cmd.equals(Constants.UPDATE)) {
87              try {
88                  updateLatestOrder(actionRequest);
89  
90                  setForward(actionRequest, "portlet.shopping.checkout_second");
91              }
92              catch (Exception e) {
93                  if (e instanceof BillingCityException ||
94                      e instanceof BillingCountryException ||
95                      e instanceof BillingEmailAddressException ||
96                      e instanceof BillingFirstNameException ||
97                      e instanceof BillingLastNameException ||
98                      e instanceof BillingPhoneException ||
99                      e instanceof BillingStateException ||
100                     e instanceof BillingStreetException ||
101                     e instanceof BillingZipException ||
102                     e instanceof CCExpirationException ||
103                     e instanceof CCNameException ||
104                     e instanceof CCNumberException ||
105                     e instanceof CCTypeException ||
106                     e instanceof ShippingCityException ||
107                     e instanceof ShippingCountryException ||
108                     e instanceof ShippingEmailAddressException ||
109                     e instanceof ShippingFirstNameException ||
110                     e instanceof ShippingLastNameException ||
111                     e instanceof ShippingPhoneException ||
112                     e instanceof ShippingStateException ||
113                     e instanceof ShippingStreetException ||
114                     e instanceof ShippingZipException) {
115 
116                     SessionErrors.add(actionRequest, e.getClass().getName());
117 
118                     setForward(
119                         actionRequest, "portlet.shopping.checkout_first");
120                 }
121                 else if (e instanceof PrincipalException) {
122                     setForward(actionRequest, "portlet.shopping.error");
123                 }
124                 else {
125                     throw e;
126                 }
127             }
128         }
129         else if (cmd.equals(Constants.VIEW)) {
130             setForward(actionRequest, "portlet.shopping.checkout_third");
131         }
132         else {
133             setForward(actionRequest, "portlet.shopping.checkout_first");
134         }
135     }
136 
137     protected void forwardCheckout(
138             ActionRequest actionRequest, ActionResponse actionResponse)
139         throws Exception {
140 
141         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
142             WebKeys.THEME_DISPLAY);
143 
144         ShoppingCart cart = ShoppingUtil.getCart(actionRequest);
145 
146         ShoppingOrder order = (ShoppingOrder)actionRequest.getAttribute(
147             WebKeys.SHOPPING_ORDER);
148 
149         ShoppingPreferences preferences = ShoppingPreferences.getInstance(
150             themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId());
151 
152         String returnURL = ShoppingUtil.getPayPalReturnURL(
153             ((ActionResponseImpl)actionResponse).createActionURL(), order);
154         String notifyURL = ShoppingUtil.getPayPalNotifyURL(themeDisplay);
155 
156         if (preferences.usePayPal()) {
157             double total = ShoppingUtil.calculateTotal(
158                 cart.getItems(), order.getBillingState(), cart.getCoupon(),
159                 cart.getAltShipping(), cart.isInsure());
160 
161             String redirectURL = ShoppingUtil.getPayPalRedirectURL(
162                 preferences, order, total, returnURL, notifyURL);
163 
164             actionResponse.sendRedirect(redirectURL);
165         }
166         else {
167             ShoppingOrderLocalServiceUtil.sendEmail(order, "confirmation");
168 
169             actionResponse.sendRedirect(returnURL);
170         }
171     }
172 
173     protected void getLatestOrder(ActionRequest actionRequest)
174         throws Exception {
175 
176         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
177             WebKeys.THEME_DISPLAY);
178 
179         ShoppingOrder order = ShoppingOrderLocalServiceUtil.getLatestOrder(
180             themeDisplay.getUserId(), themeDisplay.getScopeGroupId());
181 
182         actionRequest.setAttribute(WebKeys.SHOPPING_ORDER, order);
183     }
184 
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 }