1   /**
2    * Copyright (c) 2000-2007 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.shopping.service.impl;
24  
25  import com.liferay.counter.service.CounterLocalServiceUtil;
26  import com.liferay.mail.service.MailServiceUtil;
27  import com.liferay.portal.PortalException;
28  import com.liferay.portal.SystemException;
29  import com.liferay.portal.kernel.mail.MailMessage;
30  import com.liferay.portal.kernel.util.GetterUtil;
31  import com.liferay.portal.kernel.util.StringUtil;
32  import com.liferay.portal.kernel.util.Validator;
33  import com.liferay.portal.model.Company;
34  import com.liferay.portal.model.User;
35  import com.liferay.portal.service.persistence.CompanyUtil;
36  import com.liferay.portal.service.persistence.UserUtil;
37  import com.liferay.portal.util.PortalUtil;
38  import com.liferay.portal.util.PortletKeys;
39  import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
40  import com.liferay.portlet.shopping.BillingCityException;
41  import com.liferay.portlet.shopping.BillingCountryException;
42  import com.liferay.portlet.shopping.BillingEmailAddressException;
43  import com.liferay.portlet.shopping.BillingFirstNameException;
44  import com.liferay.portlet.shopping.BillingLastNameException;
45  import com.liferay.portlet.shopping.BillingPhoneException;
46  import com.liferay.portlet.shopping.BillingStateException;
47  import com.liferay.portlet.shopping.BillingStreetException;
48  import com.liferay.portlet.shopping.BillingZipException;
49  import com.liferay.portlet.shopping.CCExpirationException;
50  import com.liferay.portlet.shopping.CCNameException;
51  import com.liferay.portlet.shopping.CCNumberException;
52  import com.liferay.portlet.shopping.CCTypeException;
53  import com.liferay.portlet.shopping.CartMinOrderException;
54  import com.liferay.portlet.shopping.NoSuchOrderException;
55  import com.liferay.portlet.shopping.ShippingCityException;
56  import com.liferay.portlet.shopping.ShippingCountryException;
57  import com.liferay.portlet.shopping.ShippingEmailAddressException;
58  import com.liferay.portlet.shopping.ShippingFirstNameException;
59  import com.liferay.portlet.shopping.ShippingLastNameException;
60  import com.liferay.portlet.shopping.ShippingPhoneException;
61  import com.liferay.portlet.shopping.ShippingStateException;
62  import com.liferay.portlet.shopping.ShippingStreetException;
63  import com.liferay.portlet.shopping.ShippingZipException;
64  import com.liferay.portlet.shopping.model.ShoppingCart;
65  import com.liferay.portlet.shopping.model.ShoppingCartItem;
66  import com.liferay.portlet.shopping.model.ShoppingItem;
67  import com.liferay.portlet.shopping.model.ShoppingItemField;
68  import com.liferay.portlet.shopping.model.ShoppingOrder;
69  import com.liferay.portlet.shopping.model.ShoppingOrderItem;
70  import com.liferay.portlet.shopping.model.impl.ShoppingCartItemImpl;
71  import com.liferay.portlet.shopping.model.impl.ShoppingOrderImpl;
72  import com.liferay.portlet.shopping.service.ShoppingItemFieldLocalServiceUtil;
73  import com.liferay.portlet.shopping.service.ShoppingItemLocalServiceUtil;
74  import com.liferay.portlet.shopping.service.ShoppingOrderItemLocalServiceUtil;
75  import com.liferay.portlet.shopping.service.base.ShoppingOrderLocalServiceBaseImpl;
76  import com.liferay.portlet.shopping.service.persistence.ShoppingItemUtil;
77  import com.liferay.portlet.shopping.service.persistence.ShoppingOrderFinder;
78  import com.liferay.portlet.shopping.service.persistence.ShoppingOrderItemUtil;
79  import com.liferay.portlet.shopping.service.persistence.ShoppingOrderUtil;
80  import com.liferay.portlet.shopping.util.ShoppingPreferences;
81  import com.liferay.portlet.shopping.util.ShoppingUtil;
82  import com.liferay.portlet.shopping.util.comparator.OrderDateComparator;
83  import com.liferay.util.CreditCard;
84  import com.liferay.util.PwdGenerator;
85  import com.liferay.util.cal.CalendarUtil;
86  
87  import java.io.IOException;
88  
89  import java.util.Currency;
90  import java.util.Date;
91  import java.util.Iterator;
92  import java.util.List;
93  import java.util.Map;
94  
95  import javax.mail.internet.InternetAddress;
96  
97  /**
98   * <a href="ShoppingOrderLocalServiceImpl.java.html"><b><i>View Source</i></b>
99   * </a>
100  *
101  * @author Brian Wing Shun Chan
102  *
103  */
104 public class ShoppingOrderLocalServiceImpl
105     extends ShoppingOrderLocalServiceBaseImpl {
106 
107     public void completeOrder(
108             String number, String ppTxnId, String ppPaymentStatus,
109             double ppPaymentGross, String ppReceiverEmail, String ppPayerEmail,
110             boolean updateInventory)
111         throws PortalException, SystemException {
112 
113         // Order
114 
115         ShoppingOrder order = ShoppingOrderUtil.findByNumber(number);
116 
117         order.setModifiedDate(new Date());
118         order.setPpTxnId(ppTxnId);
119         order.setPpPaymentStatus(ppPaymentStatus);
120         order.setPpPaymentGross(ppPaymentGross);
121         order.setPpReceiverEmail(ppReceiverEmail);
122         order.setPpPayerEmail(ppPayerEmail);
123 
124         ShoppingOrderUtil.update(order);
125 
126         // Inventory
127 
128         if (updateInventory &&
129             ppPaymentStatus.equals(ShoppingOrderImpl.STATUS_COMPLETED)) {
130 
131             List orderItems = ShoppingOrderItemLocalServiceUtil.getOrderItems(
132                 order.getOrderId());
133 
134             for (int i = 0; i < orderItems.size(); i++) {
135                 ShoppingOrderItem orderItem =
136                     (ShoppingOrderItem)orderItems.get(i);
137 
138                 ShoppingItem item = ShoppingItemLocalServiceUtil.getItem(
139                     ShoppingUtil.getItemId(orderItem.getItemId()));
140 
141                 if (!item.isFields()) {
142                     int quantity =
143                         item.getStockQuantity() - orderItem.getQuantity();
144 
145                     item.setStockQuantity(quantity);
146                 }
147                 else {
148                     List itemFields =
149                         ShoppingItemFieldLocalServiceUtil.getItemFields(
150                             item.getItemId());
151 
152                     ShoppingItemField[] itemFieldsArray =
153                         (ShoppingItemField[])itemFields.toArray(
154                             new ShoppingItemField[0]);
155 
156                     String[] fieldsArray = ShoppingCartItemImpl.getFieldsArray(
157                         ShoppingUtil.getItemFields(orderItem.getItemId()));
158 
159                     int rowPos = ShoppingUtil.getFieldsQuantitiesPos(
160                         item, itemFieldsArray, fieldsArray);
161 
162                     String[] fieldsQuantities = item.getFieldsQuantitiesArray();
163 
164                     try {
165                         int quantity =
166                             GetterUtil.getInteger(fieldsQuantities[rowPos]) -
167                             orderItem.getQuantity();
168 
169                         fieldsQuantities[rowPos] = Integer.toString(quantity);
170 
171                         item.setFieldsQuantitiesArray(fieldsQuantities);
172                     }
173                     catch (Exception e) {
174                     }
175                 }
176 
177                 ShoppingItemUtil.update(item);
178             }
179         }
180 
181         // Email
182 
183         sendEmail(order, "confirmation");
184     }
185 
186     public void deleteOrder(long orderId)
187         throws PortalException, SystemException {
188 
189         ShoppingOrder order = ShoppingOrderUtil.findByPrimaryKey(orderId);
190 
191         deleteOrder(order);
192     }
193 
194     public void deleteOrder(ShoppingOrder order)
195         throws PortalException, SystemException {
196 
197         // Items
198 
199         ShoppingOrderItemUtil.removeByOrderId(order.getOrderId());
200 
201         // Message boards
202 
203         MBMessageLocalServiceUtil.deleteDiscussionMessages(
204             ShoppingOrder.class.getName(), order.getOrderId());
205 
206         // Order
207 
208         ShoppingOrderUtil.remove(order.getOrderId());
209     }
210 
211     public ShoppingOrder getLatestOrder(long userId, long groupId)
212         throws PortalException, SystemException {
213 
214         List orders = ShoppingOrderUtil.findByG_U_PPPS(
215             groupId, userId, ShoppingOrderImpl.STATUS_LATEST, 0, 1);
216 
217         ShoppingOrder order = null;
218 
219         if (orders.size() == 1) {
220             order = (ShoppingOrder)orders.get(0);
221         }
222         else {
223             User user = UserUtil.findByPrimaryKey(userId);
224             Date now = new Date();
225 
226             String number = getNumber();
227 
228             List pastOrders = ShoppingOrderUtil.findByG_U_PPPS(
229                 groupId, userId, ShoppingOrderImpl.STATUS_CHECKOUT, 0, 1);
230 
231             if (pastOrders.size() > 0) {
232                 ShoppingOrder pastOrder = (ShoppingOrder)pastOrders.get(0);
233 
234                 long orderId = CounterLocalServiceUtil.increment();
235 
236                 order = ShoppingOrderUtil.create(orderId);
237 
238                 order.setBillingCompany(pastOrder.getBillingCompany());
239                 order.setBillingStreet(pastOrder.getBillingStreet());
240                 order.setBillingCity(pastOrder.getBillingCity());
241                 order.setBillingState(pastOrder.getBillingState());
242                 order.setBillingZip(pastOrder.getBillingZip());
243                 order.setBillingCountry(pastOrder.getBillingCountry());
244                 order.setBillingPhone(pastOrder.getBillingPhone());
245                 order.setShipToBilling(pastOrder.isShipToBilling());
246                 order.setShippingCompany(pastOrder.getShippingCompany());
247                 order.setShippingStreet(pastOrder.getShippingStreet());
248                 order.setShippingCity(pastOrder.getShippingCity());
249                 order.setShippingState(pastOrder.getShippingState());
250                 order.setShippingZip(pastOrder.getShippingZip());
251                 order.setShippingCountry(pastOrder.getShippingCountry());
252                 order.setShippingPhone(pastOrder.getShippingPhone());
253             }
254             else {
255                 long orderId = CounterLocalServiceUtil.increment();
256 
257                 order = ShoppingOrderUtil.create(orderId);
258             }
259 
260             order.setGroupId(groupId);
261             order.setCompanyId(user.getCompanyId());
262             order.setUserId(user.getUserId());
263             order.setUserName(user.getFullName());
264             order.setCreateDate(now);
265             order.setModifiedDate(now);
266             order.setNumber(number);
267             order.setBillingFirstName(user.getFirstName());
268             order.setBillingLastName(user.getLastName());
269             order.setBillingEmailAddress(user.getEmailAddress());
270             order.setShippingFirstName(user.getFirstName());
271             order.setShippingLastName(user.getLastName());
272             order.setShippingEmailAddress(user.getEmailAddress());
273             order.setCcName(user.getFullName());
274             order.setPpPaymentStatus(ShoppingOrderImpl.STATUS_LATEST);
275             order.setSendOrderEmail(true);
276             order.setSendShippingEmail(true);
277 
278             ShoppingOrderUtil.update(order);
279         }
280 
281         return order;
282     }
283 
284     public ShoppingOrder getOrder(long orderId)
285         throws PortalException, SystemException {
286 
287         return ShoppingOrderUtil.findByPrimaryKey(orderId);
288     }
289 
290     public ShoppingOrder getOrder(String number)
291         throws PortalException, SystemException {
292 
293         return ShoppingOrderUtil.findByNumber(number);
294     }
295 
296     public ShoppingOrder saveLatestOrder(ShoppingCart cart)
297         throws PortalException, SystemException {
298 
299         Map items = cart.getItems();
300         Date now = new Date();
301 
302         ShoppingPreferences shoppingPrefs = ShoppingPreferences.getInstance(
303             cart.getCompanyId(), cart.getGroupId());
304 
305         if (!ShoppingUtil.meetsMinOrder(shoppingPrefs, items)) {
306             throw new CartMinOrderException();
307         }
308 
309         ShoppingOrder order = getLatestOrder(
310             cart.getUserId(), cart.getGroupId());
311 
312         order.setCreateDate(now);
313         order.setModifiedDate(now);
314         order.setPpPaymentStatus(ShoppingOrderImpl.STATUS_CHECKOUT);
315 
316         ShoppingOrderUtil.update(order);
317 
318         boolean requiresShipping = false;
319 
320         Iterator itr = items.entrySet().iterator();
321 
322         while (itr.hasNext()) {
323             Map.Entry entry = (Map.Entry)itr.next();
324 
325             ShoppingCartItem cartItem = (ShoppingCartItem)entry.getKey();
326             Integer count = (Integer)entry.getValue();
327 
328             ShoppingItem item = cartItem.getItem();
329 
330             if (item.isRequiresShipping()) {
331                 requiresShipping = true;
332             }
333 
334             long orderItemId = CounterLocalServiceUtil.increment();
335 
336             ShoppingOrderItem orderItem =
337                 ShoppingOrderItemUtil.create(orderItemId);
338 
339             orderItem.setOrderId(order.getOrderId());
340             orderItem.setItemId(cartItem.getCartItemId());
341             orderItem.setSku(item.getSku());
342             orderItem.setName(item.getName());
343             orderItem.setDescription(item.getDescription());
344             orderItem.setProperties(item.getProperties());
345             orderItem.setPrice(
346                 ShoppingUtil.calculateActualPrice(item, count.intValue()) /
347                     count.intValue());
348             orderItem.setQuantity(count.intValue());
349 
350             ShoppingOrderItemUtil.update(orderItem);
351         }
352 
353         order.setModifiedDate(new Date());
354         order.setTax(
355             ShoppingUtil.calculateTax(items, order.getBillingState()));
356         order.setShipping(
357             ShoppingUtil.calculateAlternativeShipping(
358                 items, cart.getAltShipping()));
359         order.setAltShipping(
360             shoppingPrefs.getAlternativeShippingName(cart.getAltShipping()));
361         order.setRequiresShipping(requiresShipping);
362         order.setInsure(cart.isInsure());
363         order.setInsurance(ShoppingUtil.calculateInsurance(items));
364         order.setCouponCodes(cart.getCouponCodes());
365         order.setCouponDiscount(
366             ShoppingUtil.calculateCouponDiscount(
367                 items, order.getBillingState(), cart.getCoupon()));
368         order.setSendOrderEmail(true);
369         order.setSendShippingEmail(true);
370 
371         ShoppingOrderUtil.update(order);
372 
373         return order;
374     }
375 
376     public List search(
377             long groupId, long companyId, long userId, String number,
378             String billingFirstName, String billingLastName,
379             String billingEmailAddress, String shippingFirstName,
380             String shippingLastName, String shippingEmailAddress,
381             String ppPaymentStatus, boolean andOperator, int begin, int end)
382         throws PortalException, SystemException {
383 
384         OrderDateComparator obc = new OrderDateComparator(false);
385 
386         return ShoppingOrderFinder.findByG_C_U_N_PPPS(
387             groupId, companyId, userId, number, billingFirstName,
388             billingLastName, billingEmailAddress, shippingFirstName,
389             shippingLastName, shippingEmailAddress, ppPaymentStatus,
390             andOperator, begin, end, obc);
391     }
392 
393     public int searchCount(
394             long groupId, long companyId, long userId, String number,
395             String billingFirstName, String billingLastName,
396             String billingEmailAddress, String shippingFirstName,
397             String shippingLastName, String shippingEmailAddress,
398             String ppPaymentStatus, boolean andOperator)
399         throws PortalException, SystemException {
400 
401         return ShoppingOrderFinder.countByG_C_U_N_PPPS(
402             groupId, companyId, userId, number, billingFirstName,
403             billingLastName, billingEmailAddress, shippingFirstName,
404             shippingLastName, shippingEmailAddress, ppPaymentStatus,
405             andOperator);
406     }
407 
408     public void sendEmail(long orderId, String emailType)
409         throws PortalException, SystemException {
410 
411         ShoppingOrder order = ShoppingOrderUtil.findByPrimaryKey(orderId);
412 
413         sendEmail(order, emailType);
414     }
415 
416     public void sendEmail(ShoppingOrder order, String emailType)
417         throws PortalException, SystemException {
418 
419         try {
420             ShoppingPreferences shoppingPrefs =
421                 ShoppingPreferences.getInstance(
422                     order.getCompanyId(), order.getGroupId());
423 
424             if (emailType.equals("confirmation") &&
425                 shoppingPrefs.getEmailOrderConfirmationEnabled()) {
426             }
427             else if (emailType.equals("shipping") &&
428                      shoppingPrefs.getEmailOrderShippingEnabled()) {
429             }
430             else {
431                 return;
432             }
433 
434             Company company = CompanyUtil.findByPrimaryKey(
435                 order.getCompanyId());
436 
437             User user = UserUtil.findByPrimaryKey(order.getUserId());
438 
439             Currency currency =
440                 Currency.getInstance(shoppingPrefs.getCurrencyId());
441 
442             String billingAddress =
443                 order.getBillingFirstName() + " " + order.getBillingLastName() +
444                     "<br>" +
445                 order.getBillingEmailAddress() + "<br>" +
446                 order.getBillingStreet() + "<br>" +
447                 order.getBillingCity() + "<br>" +
448                 order.getBillingState() + "<br>" +
449                 order.getBillingZip() + "<br>" +
450                 order.getBillingCountry() + "<br>" +
451                 order.getBillingPhone() + "<br>";
452 
453             String shippingAddress =
454                 order.getShippingFirstName() + " " +
455                     order.getShippingLastName() + "<br>" +
456                 order.getShippingEmailAddress() + "<br>" +
457                 order.getShippingStreet() + "<br>" +
458                 order.getShippingCity() + "<br>" +
459                 order.getShippingState() + "<br>" +
460                 order.getShippingZip() + "<br>" +
461                 order.getShippingCountry() + "<br>" +
462                 order.getShippingPhone() + "<br>";
463 
464             double total = ShoppingUtil.calculateTotal(order);
465 
466             String portletName = PortalUtil.getPortletTitle(
467                 PortletKeys.SHOPPING, user);
468 
469             String fromName = shoppingPrefs.getEmailFromName();
470             String fromAddress = shoppingPrefs.getEmailFromAddress();
471 
472             String toName = user.getFullName();
473             String toAddress = user.getEmailAddress();
474 
475             String subject = null;
476             String body = null;
477 
478             if (emailType.equals("confirmation")) {
479                 subject = shoppingPrefs.getEmailOrderConfirmationSubject();
480                 body = shoppingPrefs.getEmailOrderConfirmationBody();
481             }
482             else if (emailType.equals("shipping")) {
483                 subject = shoppingPrefs.getEmailOrderShippingSubject();
484                 body = shoppingPrefs.getEmailOrderShippingBody();
485             }
486 
487             subject = StringUtil.replace(
488                 subject,
489                 new String[] {
490                     "[$FROM_ADDRESS$]",
491                     "[$FROM_NAME$]",
492                     "[$ORDER_BILLING_ADDRESS$]",
493                     "[$ORDER_CURRENCY$]",
494                     "[$ORDER_NUMBER$]",
495                     "[$ORDER_SHIPPING_ADDRESS$]",
496                     "[$ORDER_TOTAL$]",
497                     "[$PORTAL_URL$]",
498                     "[$PORTLET_NAME$]",
499                     "[$TO_ADDRESS$]",
500                     "[$TO_NAME$]"
501                 },
502                 new String[] {
503                     fromAddress,
504                     fromName,
505                     billingAddress,
506                     currency.getSymbol(),
507                     order.getNumber(),
508                     shippingAddress,
509                     String.valueOf(total),
510                     company.getVirtualHost(),
511                     portletName,
512                     toAddress,
513                     toName
514                 });
515 
516             body = StringUtil.replace(
517                 body,
518                 new String[] {
519                     "[$FROM_ADDRESS$]",
520                     "[$FROM_NAME$]",
521                     "[$ORDER_BILLING_ADDRESS$]",
522                     "[$ORDER_CURRENCY$]",
523                     "[$ORDER_NUMBER$]",
524                     "[$ORDER_SHIPPING_ADDRESS$]",
525                     "[$ORDER_TOTAL$]",
526                     "[$PORTAL_URL$]",
527                     "[$PORTLET_NAME$]",
528                     "[$TO_ADDRESS$]",
529                     "[$TO_NAME$]"
530                 },
531                 new String[] {
532                     fromAddress,
533                     fromName,
534                     billingAddress,
535                     currency.getSymbol(),
536                     order.getNumber(),
537                     shippingAddress,
538                     String.valueOf(total),
539                     company.getVirtualHost(),
540                     portletName,
541                     toAddress,
542                     toName
543                 });
544 
545             InternetAddress from = new InternetAddress(fromAddress, fromName);
546 
547             InternetAddress to = new InternetAddress(toAddress, toName);
548 
549             MailMessage message = new MailMessage(
550                 from, to, subject, body, true);
551 
552             MailServiceUtil.sendEmail(message);
553 
554             if (emailType.equals("confirmation") && order.isSendOrderEmail()) {
555                 order.setSendOrderEmail(false);
556 
557                 ShoppingOrderUtil.update(order);
558             }
559             else if (emailType.equals("shipping") &&
560                      order.isSendShippingEmail()) {
561 
562                 order.setSendShippingEmail(false);
563 
564                 ShoppingOrderUtil.update(order);
565             }
566         }
567         catch (IOException ioe) {
568             throw new SystemException(ioe);
569         }
570         catch (PortalException pe) {
571             throw pe;
572         }
573     }
574 
575     public ShoppingOrder updateLatestOrder(
576             long userId, long groupId, String billingFirstName,
577             String billingLastName, String billingEmailAddress,
578             String billingCompany, String billingStreet, String billingCity,
579             String billingState, String billingZip, String billingCountry,
580             String billingPhone, boolean shipToBilling,
581             String shippingFirstName, String shippingLastName,
582             String shippingEmailAddress, String shippingCompany,
583             String shippingStreet, String shippingCity, String shippingState,
584             String shippingZip, String shippingCountry, String shippingPhone,
585             String ccName, String ccType, String ccNumber, int ccExpMonth,
586             int ccExpYear, String ccVerNumber, String comments)
587         throws PortalException, SystemException {
588 
589         ShoppingOrder order = getLatestOrder(userId, groupId);
590 
591         return updateOrder(
592             order.getOrderId(), billingFirstName, billingLastName,
593             billingEmailAddress, billingCompany, billingStreet, billingCity,
594             billingState, billingZip, billingCountry, billingPhone,
595             shipToBilling, shippingFirstName, shippingLastName,
596             shippingEmailAddress, shippingCompany, shippingStreet, shippingCity,
597             shippingState, shippingZip, shippingCountry, shippingPhone,
598             ccName, ccType, ccNumber, ccExpMonth, ccExpYear, ccVerNumber,
599             comments);
600     }
601 
602     public ShoppingOrder updateOrder(
603             long orderId, String billingFirstName, String billingLastName,
604             String billingEmailAddress, String billingCompany,
605             String billingStreet, String billingCity, String billingState,
606             String billingZip, String billingCountry, String billingPhone,
607             boolean shipToBilling, String shippingFirstName,
608             String shippingLastName, String shippingEmailAddress,
609             String shippingCompany, String shippingStreet, String shippingCity,
610             String shippingState, String shippingZip, String shippingCountry,
611             String shippingPhone, String ccName, String ccType, String ccNumber,
612             int ccExpMonth, int ccExpYear, String ccVerNumber, String comments)
613         throws PortalException, SystemException {
614 
615         ShoppingOrder order = ShoppingOrderUtil.findByPrimaryKey(orderId);
616 
617         ShoppingPreferences shoppingPrefs = ShoppingPreferences.getInstance(
618             order.getCompanyId(), order.getGroupId());
619 
620         validate(
621             shoppingPrefs, billingFirstName, billingLastName,
622             billingEmailAddress, billingStreet, billingCity, billingState,
623             billingZip, billingCountry, billingPhone, shipToBilling,
624             shippingFirstName, shippingLastName, shippingEmailAddress,
625             shippingStreet, shippingCity, shippingState, shippingZip,
626             shippingCountry, shippingPhone, ccName, ccType, ccNumber,
627             ccExpMonth, ccExpYear, ccVerNumber);
628 
629         order.setModifiedDate(new Date());
630         order.setBillingFirstName(billingFirstName);
631         order.setBillingLastName(billingLastName);
632         order.setBillingEmailAddress(billingEmailAddress);
633         order.setBillingCompany(billingCompany);
634         order.setBillingStreet(billingStreet);
635         order.setBillingCity(billingCity);
636         order.setBillingState(billingState);
637         order.setBillingZip(billingZip);
638         order.setBillingCountry(billingCountry);
639         order.setBillingPhone(billingPhone);
640         order.setShipToBilling(shipToBilling);
641 
642         if (shipToBilling) {
643             order.setShippingFirstName(billingFirstName);
644             order.setShippingLastName(billingLastName);
645             order.setShippingEmailAddress(billingEmailAddress);
646             order.setShippingCompany(billingCompany);
647             order.setShippingStreet(billingStreet);
648             order.setShippingCity(billingCity);
649             order.setShippingState(billingState);
650             order.setShippingZip(billingZip);
651             order.setShippingCountry(billingCountry);
652             order.setShippingPhone(billingPhone);
653         }
654         else {
655             order.setShippingFirstName(shippingFirstName);
656             order.setShippingLastName(shippingLastName);
657             order.setShippingEmailAddress(shippingEmailAddress);
658             order.setShippingCompany(shippingCompany);
659             order.setShippingStreet(shippingStreet);
660             order.setShippingCity(shippingCity);
661             order.setShippingState(shippingState);
662             order.setShippingZip(shippingZip);
663             order.setShippingCountry(shippingCountry);
664             order.setShippingPhone(shippingPhone);
665         }
666 
667         order.setCcName(ccName);
668         order.setCcType(ccType);
669         order.setCcNumber(ccNumber);
670         order.setCcExpMonth(ccExpMonth);
671         order.setCcExpYear(ccExpYear);
672         order.setCcVerNumber(ccVerNumber);
673         order.setComments(comments);
674 
675         ShoppingOrderUtil.update(order);
676 
677         return order;
678     }
679 
680     public ShoppingOrder updateOrder(
681             long orderId, String ppTxnId, String ppPaymentStatus,
682             double ppPaymentGross, String ppReceiverEmail, String ppPayerEmail)
683         throws PortalException, SystemException {
684 
685         ShoppingOrder order = ShoppingOrderUtil.findByPrimaryKey(orderId);
686 
687         order.setModifiedDate(new Date());
688         order.setPpTxnId(ppTxnId);
689         order.setPpPaymentStatus(ppPaymentStatus);
690         order.setPpPaymentGross(ppPaymentGross);
691         order.setPpReceiverEmail(ppReceiverEmail);
692         order.setPpPayerEmail(ppPayerEmail);
693 
694         ShoppingOrderUtil.update(order);
695 
696         return order;
697     }
698 
699     protected String getNumber() throws SystemException {
700         String number =
701             PwdGenerator.getPassword(PwdGenerator.KEY1 + PwdGenerator.KEY2, 12);
702 
703         try {
704             ShoppingOrderUtil.findByNumber(number);
705 
706             return getNumber();
707         }
708         catch (NoSuchOrderException nsoe) {
709             return number;
710         }
711     }
712 
713     protected void validate(
714             ShoppingPreferences shoppingPrefs, String billingFirstName,
715             String billingLastName, String billingEmailAddress,
716             String billingStreet, String billingCity, String billingState,
717             String billingZip, String billingCountry, String billingPhone,
718             boolean shipToBilling, String shippingFirstName,
719             String shippingLastName, String shippingEmailAddress,
720             String shippingStreet, String shippingCity, String shippingState,
721             String shippingZip, String shippingCountry, String shippingPhone,
722             String ccName, String ccType, String ccNumber, int ccExpMonth,
723             int ccExpYear, String ccVerNumber)
724         throws PortalException {
725 
726         if (Validator.isNull(billingFirstName)) {
727             throw new BillingFirstNameException();
728         }
729         else if (Validator.isNull(billingLastName)) {
730             throw new BillingLastNameException();
731         }
732         else if (!Validator.isEmailAddress(billingEmailAddress)) {
733             throw new BillingEmailAddressException();
734         }
735         else if (Validator.isNull(billingStreet)) {
736             throw new BillingStreetException();
737         }
738         else if (Validator.isNull(billingCity)) {
739             throw new BillingCityException();
740         }
741         else if (Validator.isNull(billingState)) {
742             throw new BillingStateException();
743         }
744         else if (Validator.isNull(billingZip)) {
745             throw new BillingZipException();
746         }
747         else if (Validator.isNull(billingCountry)) {
748             throw new BillingCountryException();
749         }
750         else if (Validator.isNull(billingPhone)) {
751             throw new BillingPhoneException();
752         }
753 
754         if (!shipToBilling) {
755             if (Validator.isNull(shippingFirstName)) {
756                 throw new ShippingFirstNameException();
757             }
758             else if (Validator.isNull(shippingLastName)) {
759                 throw new ShippingLastNameException();
760             }
761             else if (!Validator.isEmailAddress(shippingEmailAddress)) {
762                 throw new ShippingEmailAddressException();
763             }
764             else if (Validator.isNull(shippingStreet)) {
765                 throw new ShippingStreetException();
766             }
767             else if (Validator.isNull(shippingCity)) {
768                 throw new ShippingCityException();
769             }
770             else if (Validator.isNull(shippingState)) {
771                 throw new ShippingStateException();
772             }
773             else if (Validator.isNull(shippingZip)) {
774                 throw new ShippingZipException();
775             }
776             else if (Validator.isNull(shippingCountry)) {
777                 throw new ShippingCountryException();
778             }
779             else if (Validator.isNull(shippingPhone)) {
780                 throw new ShippingPhoneException();
781             }
782         }
783 
784         if ((!shoppingPrefs.usePayPal()) &&
785             (shoppingPrefs.getCcTypes().length > 0)) {
786 
787             if (Validator.isNull(ccName)) {
788                 throw new CCNameException();
789             }
790             else if (Validator.isNull(ccType)) {
791                 throw new CCTypeException();
792             }
793             else if (!CreditCard.isValid(ccNumber, ccType)) {
794                 throw new CCNumberException();
795             }
796             else if (!CalendarUtil.isFuture(ccExpMonth, ccExpYear)) {
797                 throw new CCExpirationException();
798             }
799         }
800     }
801 
802 }