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.service.impl;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.Validator;
021    import com.liferay.portal.kernel.workflow.WorkflowConstants;
022    import com.liferay.portal.model.User;
023    import com.liferay.portal.service.ServiceContext;
024    import com.liferay.portal.util.PortletKeys;
025    import com.liferay.portal.util.PropsValues;
026    import com.liferay.portal.util.SubscriptionSender;
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.CartMinOrderException;
041    import com.liferay.portlet.shopping.ShippingCityException;
042    import com.liferay.portlet.shopping.ShippingCountryException;
043    import com.liferay.portlet.shopping.ShippingEmailAddressException;
044    import com.liferay.portlet.shopping.ShippingFirstNameException;
045    import com.liferay.portlet.shopping.ShippingLastNameException;
046    import com.liferay.portlet.shopping.ShippingPhoneException;
047    import com.liferay.portlet.shopping.ShippingStateException;
048    import com.liferay.portlet.shopping.ShippingStreetException;
049    import com.liferay.portlet.shopping.ShippingZipException;
050    import com.liferay.portlet.shopping.model.ShoppingCart;
051    import com.liferay.portlet.shopping.model.ShoppingCartItem;
052    import com.liferay.portlet.shopping.model.ShoppingItem;
053    import com.liferay.portlet.shopping.model.ShoppingItemField;
054    import com.liferay.portlet.shopping.model.ShoppingOrder;
055    import com.liferay.portlet.shopping.model.ShoppingOrderConstants;
056    import com.liferay.portlet.shopping.model.ShoppingOrderItem;
057    import com.liferay.portlet.shopping.model.impl.ShoppingCartItemImpl;
058    import com.liferay.portlet.shopping.service.base.ShoppingOrderLocalServiceBaseImpl;
059    import com.liferay.portlet.shopping.util.ShoppingPreferences;
060    import com.liferay.portlet.shopping.util.ShoppingUtil;
061    import com.liferay.portlet.shopping.util.comparator.OrderDateComparator;
062    import com.liferay.util.CreditCard;
063    import com.liferay.util.PwdGenerator;
064    
065    import java.util.Currency;
066    import java.util.Date;
067    import java.util.List;
068    import java.util.Map;
069    
070    /**
071     * @author Brian Wing Shun Chan
072     */
073    public class ShoppingOrderLocalServiceImpl
074            extends ShoppingOrderLocalServiceBaseImpl {
075    
076            @Override
077            public ShoppingOrder addLatestOrder(long userId, long groupId)
078                    throws PortalException, SystemException {
079    
080                    // Order
081    
082                    User user = userPersistence.findByPrimaryKey(userId);
083                    Date now = new Date();
084    
085                    String number = getNumber();
086    
087                    ShoppingOrder order = null;
088    
089                    long orderId = counterLocalService.increment();
090    
091                    List<ShoppingOrder> pastOrders =
092                            shoppingOrderPersistence.findByG_U_PPPS(
093                                    groupId, userId, ShoppingOrderConstants.STATUS_CHECKOUT, 0, 1);
094    
095                    if (pastOrders.size() > 0) {
096                            ShoppingOrder pastOrder = pastOrders.get(0);
097    
098                            order = shoppingOrderPersistence.create(orderId);
099    
100                            order.setBillingCompany(pastOrder.getBillingCompany());
101                            order.setBillingStreet(pastOrder.getBillingStreet());
102                            order.setBillingCity(pastOrder.getBillingCity());
103                            order.setBillingState(pastOrder.getBillingState());
104                            order.setBillingZip(pastOrder.getBillingZip());
105                            order.setBillingCountry(pastOrder.getBillingCountry());
106                            order.setBillingPhone(pastOrder.getBillingPhone());
107                            order.setShipToBilling(pastOrder.isShipToBilling());
108                            order.setShippingCompany(pastOrder.getShippingCompany());
109                            order.setShippingStreet(pastOrder.getShippingStreet());
110                            order.setShippingCity(pastOrder.getShippingCity());
111                            order.setShippingState(pastOrder.getShippingState());
112                            order.setShippingZip(pastOrder.getShippingZip());
113                            order.setShippingCountry(pastOrder.getShippingCountry());
114                            order.setShippingPhone(pastOrder.getShippingPhone());
115                    }
116                    else {
117                            order = shoppingOrderPersistence.create(orderId);
118                    }
119    
120                    order.setGroupId(groupId);
121                    order.setCompanyId(user.getCompanyId());
122                    order.setUserId(user.getUserId());
123                    order.setUserName(user.getFullName());
124                    order.setCreateDate(now);
125                    order.setModifiedDate(now);
126                    order.setNumber(number);
127                    order.setBillingFirstName(user.getFirstName());
128                    order.setBillingLastName(user.getLastName());
129                    order.setBillingEmailAddress(user.getEmailAddress());
130                    order.setShippingFirstName(user.getFirstName());
131                    order.setShippingLastName(user.getLastName());
132                    order.setShippingEmailAddress(user.getEmailAddress());
133                    order.setCcName(user.getFullName());
134                    order.setPpPaymentStatus(ShoppingOrderConstants.STATUS_LATEST);
135                    order.setSendOrderEmail(true);
136                    order.setSendShippingEmail(true);
137    
138                    shoppingOrderPersistence.update(order);
139    
140                    // Message boards
141    
142                    if (PropsValues.SHOPPING_ORDER_COMMENTS_ENABLED) {
143                            mbMessageLocalService.addDiscussionMessage(
144                                    userId, order.getUserName(), groupId,
145                                    ShoppingOrder.class.getName(), orderId,
146                                    WorkflowConstants.ACTION_PUBLISH);
147                    }
148    
149                    return order;
150            }
151    
152            @Override
153            public void completeOrder(
154                            String number, String ppTxnId, String ppPaymentStatus,
155                            double ppPaymentGross, String ppReceiverEmail, String ppPayerEmail,
156                            boolean updateInventory, ServiceContext serviceContext)
157                    throws PortalException, SystemException {
158    
159                    // Order
160    
161                    ShoppingOrder order = shoppingOrderPersistence.findByNumber(number);
162    
163                    order.setModifiedDate(new Date());
164                    order.setPpTxnId(ppTxnId);
165                    order.setPpPaymentStatus(ppPaymentStatus);
166                    order.setPpPaymentGross(ppPaymentGross);
167                    order.setPpReceiverEmail(ppReceiverEmail);
168                    order.setPpPayerEmail(ppPayerEmail);
169    
170                    shoppingOrderPersistence.update(order);
171    
172                    // Inventory
173    
174                    if (updateInventory &&
175                            ppPaymentStatus.equals(ShoppingOrderConstants.STATUS_COMPLETED)) {
176    
177                            List<ShoppingOrderItem> orderItems =
178                                    shoppingOrderItemLocalService.getOrderItems(order.getOrderId());
179    
180                            for (ShoppingOrderItem orderItem : orderItems) {
181                                    ShoppingItem item = shoppingItemLocalService.getItem(
182                                            ShoppingUtil.getItemId(orderItem.getItemId()));
183    
184                                    if (item.isInfiniteStock()) {
185                                            continue;
186                                    }
187    
188                                    if (!item.isFields()) {
189                                            int quantity =
190                                                    item.getStockQuantity() - orderItem.getQuantity();
191    
192                                            item.setStockQuantity(quantity);
193                                    }
194                                    else {
195                                            List<ShoppingItemField> itemFields =
196                                                    shoppingItemFieldLocalService.getItemFields(
197                                                            item.getItemId());
198    
199                                            ShoppingItemField[] itemFieldsArray = itemFields.toArray(
200                                                    new ShoppingItemField[itemFields.size()]);
201    
202                                            String[] fieldsArray = ShoppingCartItemImpl.getFieldsArray(
203                                                    ShoppingUtil.getItemFields(orderItem.getItemId()));
204    
205                                            int rowPos = ShoppingUtil.getFieldsQuantitiesPos(
206                                                    item, itemFieldsArray, fieldsArray);
207    
208                                            String[] fieldsQuantities = item.getFieldsQuantitiesArray();
209    
210                                            try {
211                                                    int quantity =
212                                                            GetterUtil.getInteger(fieldsQuantities[rowPos]) -
213                                                            orderItem.getQuantity();
214    
215                                                    fieldsQuantities[rowPos] = String.valueOf(quantity);
216    
217                                                    item.setFieldsQuantitiesArray(fieldsQuantities);
218                                            }
219                                            catch (Exception e) {
220                                            }
221                                    }
222    
223                                    shoppingItemPersistence.update(item);
224                            }
225                    }
226    
227                    // Email
228    
229                    sendEmail(order, "confirmation", serviceContext);
230            }
231    
232            @Override
233            public void deleteOrder(long orderId)
234                    throws PortalException, SystemException {
235    
236                    ShoppingOrder order = shoppingOrderPersistence.findByPrimaryKey(
237                            orderId);
238    
239                    deleteOrder(order);
240            }
241    
242            @Override
243            public void deleteOrder(ShoppingOrder order)
244                    throws PortalException, SystemException {
245    
246                    // Order
247    
248                    shoppingOrderPersistence.remove(order);
249    
250                    // Subscriptions
251    
252                    subscriptionLocalService.deleteSubscriptions(
253                            order.getCompanyId(), ShoppingOrder.class.getName(),
254                            order.getOrderId());
255    
256                    // Items
257    
258                    shoppingOrderItemPersistence.removeByOrderId(order.getOrderId());
259    
260                    // Message boards
261    
262                    mbMessageLocalService.deleteDiscussionMessages(
263                            ShoppingOrder.class.getName(), order.getOrderId());
264            }
265    
266            @Override
267            public void deleteOrders(long groupId)
268                    throws PortalException, SystemException {
269    
270                    List<ShoppingOrder> orders = shoppingOrderPersistence.findByGroupId(
271                            groupId);
272    
273                    for (ShoppingOrder order : orders) {
274                            deleteOrder(order);
275                    }
276            }
277    
278            @Override
279            public ShoppingOrder getLatestOrder(long userId, long groupId)
280                    throws PortalException, SystemException {
281    
282                    List<ShoppingOrder> orders = shoppingOrderPersistence.findByG_U_PPPS(
283                            groupId, userId, ShoppingOrderConstants.STATUS_LATEST, 0, 1);
284    
285                    ShoppingOrder order = null;
286    
287                    if (orders.size() == 1) {
288                            order = orders.get(0);
289                    }
290                    else {
291                            order = shoppingOrderLocalService.addLatestOrder(userId, groupId);
292                    }
293    
294                    return order;
295            }
296    
297            @Override
298            public ShoppingOrder getOrder(long orderId)
299                    throws PortalException, SystemException {
300    
301                    return shoppingOrderPersistence.findByPrimaryKey(orderId);
302            }
303    
304            @Override
305            public ShoppingOrder getOrder(String number)
306                    throws PortalException, SystemException {
307    
308                    return shoppingOrderPersistence.findByNumber(number);
309            }
310    
311            @Override
312            public ShoppingOrder getPayPalTxnIdOrder(String ppTxnId)
313                    throws PortalException, SystemException {
314    
315                    return shoppingOrderPersistence.findByPPTxnId(ppTxnId);
316            }
317    
318            @Override
319            public ShoppingOrder saveLatestOrder(ShoppingCart cart)
320                    throws PortalException, SystemException {
321    
322                    Map<ShoppingCartItem, Integer> items = cart.getItems();
323                    Date now = new Date();
324    
325                    ShoppingPreferences shoppingPrefs = ShoppingPreferences.getInstance(
326                            cart.getCompanyId(), cart.getGroupId());
327    
328                    if (!ShoppingUtil.meetsMinOrder(shoppingPrefs, items)) {
329                            throw new CartMinOrderException();
330                    }
331    
332                    ShoppingOrder order = getLatestOrder(
333                            cart.getUserId(), cart.getGroupId());
334    
335                    order.setCreateDate(now);
336                    order.setModifiedDate(now);
337                    order.setPpPaymentStatus(ShoppingOrderConstants.STATUS_CHECKOUT);
338    
339                    shoppingOrderPersistence.update(order);
340    
341                    boolean requiresShipping = false;
342    
343                    for (Map.Entry<ShoppingCartItem, Integer> entry : items.entrySet()) {
344                            ShoppingCartItem cartItem = entry.getKey();
345                            Integer count = entry.getValue();
346    
347                            ShoppingItem item = cartItem.getItem();
348    
349                            if (item.isRequiresShipping()) {
350                                    requiresShipping = true;
351                            }
352    
353                            long orderItemId = counterLocalService.increment();
354    
355                            ShoppingOrderItem orderItem = shoppingOrderItemPersistence.create(
356                                    orderItemId);
357    
358                            orderItem.setOrderId(order.getOrderId());
359                            orderItem.setItemId(cartItem.getCartItemId());
360                            orderItem.setSku(item.getSku());
361                            orderItem.setName(item.getName());
362                            orderItem.setDescription(item.getDescription());
363                            orderItem.setProperties(item.getProperties());
364                            orderItem.setPrice(
365                                    ShoppingUtil.calculateActualPrice(item, count.intValue()) /
366                                            count.intValue());
367                            orderItem.setQuantity(count.intValue());
368    
369                            shoppingOrderItemPersistence.update(orderItem);
370                    }
371    
372                    order.setModifiedDate(new Date());
373                    order.setTax(ShoppingUtil.calculateTax(items, order.getBillingState()));
374                    order.setShipping(
375                            ShoppingUtil.calculateAlternativeShipping(
376                                    items, cart.getAltShipping()));
377                    order.setAltShipping(
378                            shoppingPrefs.getAlternativeShippingName(cart.getAltShipping()));
379                    order.setRequiresShipping(requiresShipping);
380                    order.setInsure(cart.isInsure());
381                    order.setInsurance(ShoppingUtil.calculateInsurance(items));
382                    order.setCouponCodes(cart.getCouponCodes());
383                    order.setCouponDiscount(
384                            ShoppingUtil.calculateCouponDiscount(
385                                    items, order.getBillingState(), cart.getCoupon()));
386                    order.setSendOrderEmail(true);
387                    order.setSendShippingEmail(true);
388    
389                    shoppingOrderPersistence.update(order);
390    
391                    return order;
392            }
393    
394            @Override
395            public List<ShoppingOrder> search(
396                            long groupId, long companyId, long userId, String number,
397                            String billingFirstName, String billingLastName,
398                            String billingEmailAddress, String shippingFirstName,
399                            String shippingLastName, String shippingEmailAddress,
400                            String ppPaymentStatus, boolean andOperator, int start, int end)
401                    throws SystemException {
402    
403                    OrderDateComparator obc = new OrderDateComparator(false);
404    
405                    return shoppingOrderFinder.findByG_C_U_N_PPPS(
406                            groupId, companyId, userId, number, billingFirstName,
407                            billingLastName, billingEmailAddress, shippingFirstName,
408                            shippingLastName, shippingEmailAddress, ppPaymentStatus,
409                            andOperator, start, end, obc);
410            }
411    
412            @Override
413            public int searchCount(
414                            long groupId, long companyId, long userId, String number,
415                            String billingFirstName, String billingLastName,
416                            String billingEmailAddress, String shippingFirstName,
417                            String shippingLastName, String shippingEmailAddress,
418                            String ppPaymentStatus, boolean andOperator)
419                    throws SystemException {
420    
421                    return shoppingOrderFinder.countByG_C_U_N_PPPS(
422                            groupId, companyId, userId, number, billingFirstName,
423                            billingLastName, billingEmailAddress, shippingFirstName,
424                            shippingLastName, shippingEmailAddress, ppPaymentStatus,
425                            andOperator);
426            }
427    
428            @Override
429            public void sendEmail(
430                            long orderId, String emailType, ServiceContext serviceContext)
431                    throws PortalException, SystemException {
432    
433                    ShoppingOrder order = shoppingOrderPersistence.findByPrimaryKey(
434                            orderId);
435    
436                    sendEmail(order, emailType, serviceContext);
437            }
438    
439            @Override
440            public void sendEmail(
441                            ShoppingOrder order, String emailType,
442                            ServiceContext serviceContext)
443                    throws PortalException, SystemException {
444    
445                    ShoppingPreferences shoppingPrefs = ShoppingPreferences.getInstance(
446                            order.getCompanyId(), order.getGroupId());
447    
448                    if (emailType.equals("confirmation") &&
449                            shoppingPrefs.getEmailOrderConfirmationEnabled()) {
450                    }
451                    else if (emailType.equals("shipping") &&
452                                     shoppingPrefs.getEmailOrderShippingEnabled()) {
453                    }
454                    else {
455                            return;
456                    }
457    
458                    User user = userPersistence.findByPrimaryKey(order.getUserId());
459    
460                    Currency currency = Currency.getInstance(shoppingPrefs.getCurrencyId());
461    
462                    String billingAddress =
463                            order.getBillingFirstName() + " " + order.getBillingLastName() +
464                                    "<br>" +
465                            order.getBillingEmailAddress() + "<br>" +
466                            order.getBillingStreet() + "<br>" +
467                            order.getBillingCity() + "<br>" +
468                            order.getBillingState() + "<br>" +
469                            order.getBillingZip() + "<br>" +
470                            order.getBillingCountry() + "<br>" +
471                            order.getBillingPhone() + "<br>";
472    
473                    String shippingAddress =
474                            order.getShippingFirstName() + " " + order.getShippingLastName() +
475                                    "<br>" +
476                            order.getShippingEmailAddress() + "<br>" +
477                            order.getShippingStreet() + "<br>" +
478                            order.getShippingCity() + "<br>" +
479                            order.getShippingState() + "<br>" +
480                            order.getShippingZip() + "<br>" +
481                            order.getShippingCountry() + "<br>" +
482                            order.getShippingPhone() + "<br>";
483    
484                    double total = ShoppingUtil.calculateTotal(order);
485    
486                    String fromName = shoppingPrefs.getEmailFromName(order.getCompanyId());
487                    String fromAddress = shoppingPrefs.getEmailFromAddress(
488                            order.getCompanyId());
489    
490                    String toName = user.getFullName();
491                    String toAddress = user.getEmailAddress();
492    
493                    String subject = null;
494                    String body = null;
495    
496                    if (emailType.equals("confirmation")) {
497                            subject = shoppingPrefs.getEmailOrderConfirmationSubject();
498                            body = shoppingPrefs.getEmailOrderConfirmationBody();
499                    }
500                    else if (emailType.equals("shipping")) {
501                            subject = shoppingPrefs.getEmailOrderShippingSubject();
502                            body = shoppingPrefs.getEmailOrderShippingBody();
503                    }
504    
505                    SubscriptionSender subscriptionSender = new SubscriptionSender();
506    
507                    subscriptionSender.setBody(body);
508                    subscriptionSender.setCompanyId(order.getCompanyId());
509                    subscriptionSender.setContextAttributes(
510                            "[$ORDER_BILLING_ADDRESS$]", billingAddress, "[$ORDER_CURRENCY$]",
511                            currency.getSymbol(), "[$ORDER_NUMBER$]", order.getNumber(),
512                            "[$ORDER_SHIPPING_ADDRESS$]", shippingAddress, "[$ORDER_TOTAL$]",
513                            total);
514                    subscriptionSender.setFrom(fromAddress, fromName);
515                    subscriptionSender.setHtmlFormat(true);
516                    subscriptionSender.setMailId("shopping_order", order.getOrderId());
517                    subscriptionSender.setPortletId(PortletKeys.SHOPPING);
518                    subscriptionSender.setScopeGroupId(order.getGroupId());
519                    subscriptionSender.setServiceContext(serviceContext);
520                    subscriptionSender.setSubject(subject);
521                    subscriptionSender.setUserId(order.getUserId());
522    
523                    subscriptionSender.addRuntimeSubscribers(toAddress, toName);
524    
525                    subscriptionSender.flushNotificationsAsync();
526    
527                    if (emailType.equals("confirmation") && order.isSendOrderEmail()) {
528                            order.setSendOrderEmail(false);
529    
530                            shoppingOrderPersistence.update(order);
531                    }
532                    else if (emailType.equals("shipping") && order.isSendShippingEmail()) {
533                            order.setSendShippingEmail(false);
534    
535                            shoppingOrderPersistence.update(order);
536                    }
537            }
538    
539            @Override
540            public ShoppingOrder updateLatestOrder(
541                            long userId, long groupId, String billingFirstName,
542                            String billingLastName, String billingEmailAddress,
543                            String billingCompany, String billingStreet, String billingCity,
544                            String billingState, String billingZip, String billingCountry,
545                            String billingPhone, boolean shipToBilling,
546                            String shippingFirstName, String shippingLastName,
547                            String shippingEmailAddress, String shippingCompany,
548                            String shippingStreet, String shippingCity, String shippingState,
549                            String shippingZip, String shippingCountry, String shippingPhone,
550                            String ccName, String ccType, String ccNumber, int ccExpMonth,
551                            int ccExpYear, String ccVerNumber, String comments)
552                    throws PortalException, SystemException {
553    
554                    ShoppingOrder order = getLatestOrder(userId, groupId);
555    
556                    return updateOrder(
557                            order.getOrderId(), billingFirstName, billingLastName,
558                            billingEmailAddress, billingCompany, billingStreet, billingCity,
559                            billingState, billingZip, billingCountry, billingPhone,
560                            shipToBilling, shippingFirstName, shippingLastName,
561                            shippingEmailAddress, shippingCompany, shippingStreet, shippingCity,
562                            shippingState, shippingZip, shippingCountry, shippingPhone, ccName,
563                            ccType, ccNumber, ccExpMonth, ccExpYear, ccVerNumber, comments);
564            }
565    
566            @Override
567            public ShoppingOrder updateOrder(
568                            long orderId, String ppTxnId, String ppPaymentStatus,
569                            double ppPaymentGross, String ppReceiverEmail, String ppPayerEmail)
570                    throws PortalException, SystemException {
571    
572                    ShoppingOrder order = shoppingOrderPersistence.findByPrimaryKey(
573                            orderId);
574    
575                    order.setModifiedDate(new Date());
576                    order.setPpTxnId(ppTxnId);
577                    order.setPpPaymentStatus(ppPaymentStatus);
578                    order.setPpPaymentGross(ppPaymentGross);
579                    order.setPpReceiverEmail(ppReceiverEmail);
580                    order.setPpPayerEmail(ppPayerEmail);
581    
582                    shoppingOrderPersistence.update(order);
583    
584                    return order;
585            }
586    
587            @Override
588            public ShoppingOrder updateOrder(
589                            long orderId, String billingFirstName, String billingLastName,
590                            String billingEmailAddress, String billingCompany,
591                            String billingStreet, String billingCity, String billingState,
592                            String billingZip, String billingCountry, String billingPhone,
593                            boolean shipToBilling, String shippingFirstName,
594                            String shippingLastName, String shippingEmailAddress,
595                            String shippingCompany, String shippingStreet, String shippingCity,
596                            String shippingState, String shippingZip, String shippingCountry,
597                            String shippingPhone, String ccName, String ccType, String ccNumber,
598                            int ccExpMonth, int ccExpYear, String ccVerNumber, String comments)
599                    throws PortalException, SystemException {
600    
601                    ShoppingOrder order = shoppingOrderPersistence.findByPrimaryKey(
602                            orderId);
603    
604                    ShoppingPreferences shoppingPrefs = ShoppingPreferences.getInstance(
605                            order.getCompanyId(), order.getGroupId());
606    
607                    validate(
608                            shoppingPrefs, billingFirstName, billingLastName,
609                            billingEmailAddress, billingStreet, billingCity, billingState,
610                            billingZip, billingCountry, billingPhone, shipToBilling,
611                            shippingFirstName, shippingLastName, shippingEmailAddress,
612                            shippingStreet, shippingCity, shippingState, shippingZip,
613                            shippingCountry, shippingPhone, ccName, ccType, ccNumber,
614                            ccExpMonth, ccExpYear, ccVerNumber);
615    
616                    order.setModifiedDate(new Date());
617                    order.setBillingFirstName(billingFirstName);
618                    order.setBillingLastName(billingLastName);
619                    order.setBillingEmailAddress(billingEmailAddress);
620                    order.setBillingCompany(billingCompany);
621                    order.setBillingStreet(billingStreet);
622                    order.setBillingCity(billingCity);
623                    order.setBillingState(billingState);
624                    order.setBillingZip(billingZip);
625                    order.setBillingCountry(billingCountry);
626                    order.setBillingPhone(billingPhone);
627                    order.setShipToBilling(shipToBilling);
628    
629                    if (shipToBilling) {
630                            order.setShippingFirstName(billingFirstName);
631                            order.setShippingLastName(billingLastName);
632                            order.setShippingEmailAddress(billingEmailAddress);
633                            order.setShippingCompany(billingCompany);
634                            order.setShippingStreet(billingStreet);
635                            order.setShippingCity(billingCity);
636                            order.setShippingState(billingState);
637                            order.setShippingZip(billingZip);
638                            order.setShippingCountry(billingCountry);
639                            order.setShippingPhone(billingPhone);
640                    }
641                    else {
642                            order.setShippingFirstName(shippingFirstName);
643                            order.setShippingLastName(shippingLastName);
644                            order.setShippingEmailAddress(shippingEmailAddress);
645                            order.setShippingCompany(shippingCompany);
646                            order.setShippingStreet(shippingStreet);
647                            order.setShippingCity(shippingCity);
648                            order.setShippingState(shippingState);
649                            order.setShippingZip(shippingZip);
650                            order.setShippingCountry(shippingCountry);
651                            order.setShippingPhone(shippingPhone);
652                    }
653    
654                    order.setCcName(ccName);
655                    order.setCcType(ccType);
656                    order.setCcNumber(ccNumber);
657                    order.setCcExpMonth(ccExpMonth);
658                    order.setCcExpYear(ccExpYear);
659                    order.setCcVerNumber(ccVerNumber);
660                    order.setComments(comments);
661    
662                    shoppingOrderPersistence.update(order);
663    
664                    return order;
665            }
666    
667            protected String getNumber() throws SystemException {
668                    String number = PwdGenerator.getPassword(
669                            12, PwdGenerator.KEY1, PwdGenerator.KEY2);
670    
671                    ShoppingOrder order = shoppingOrderPersistence.fetchByNumber(number);
672    
673                    if (order != null) {
674                            return order.getNumber();
675                    }
676    
677                    return number;
678            }
679    
680            protected void validate(
681                            ShoppingPreferences shoppingPrefs, String billingFirstName,
682                            String billingLastName, String billingEmailAddress,
683                            String billingStreet, String billingCity, String billingState,
684                            String billingZip, String billingCountry, String billingPhone,
685                            boolean shipToBilling, String shippingFirstName,
686                            String shippingLastName, String shippingEmailAddress,
687                            String shippingStreet, String shippingCity, String shippingState,
688                            String shippingZip, String shippingCountry, String shippingPhone,
689                            String ccName, String ccType, String ccNumber, int ccExpMonth,
690                            int ccExpYear, String ccVerNumber)
691                    throws PortalException {
692    
693                    if (Validator.isNull(billingFirstName)) {
694                            throw new BillingFirstNameException();
695                    }
696                    else if (Validator.isNull(billingLastName)) {
697                            throw new BillingLastNameException();
698                    }
699                    else if (!Validator.isEmailAddress(billingEmailAddress)) {
700                            throw new BillingEmailAddressException();
701                    }
702                    else if (Validator.isNull(billingStreet)) {
703                            throw new BillingStreetException();
704                    }
705                    else if (Validator.isNull(billingCity)) {
706                            throw new BillingCityException();
707                    }
708                    else if (Validator.isNull(billingState)) {
709                            throw new BillingStateException();
710                    }
711                    else if (Validator.isNull(billingZip)) {
712                            throw new BillingZipException();
713                    }
714                    else if (Validator.isNull(billingCountry)) {
715                            throw new BillingCountryException();
716                    }
717                    else if (Validator.isNull(billingPhone)) {
718                            throw new BillingPhoneException();
719                    }
720    
721                    if (!shipToBilling) {
722                            if (Validator.isNull(shippingFirstName)) {
723                                    throw new ShippingFirstNameException();
724                            }
725                            else if (Validator.isNull(shippingLastName)) {
726                                    throw new ShippingLastNameException();
727                            }
728                            else if (!Validator.isEmailAddress(shippingEmailAddress)) {
729                                    throw new ShippingEmailAddressException();
730                            }
731                            else if (Validator.isNull(shippingStreet)) {
732                                    throw new ShippingStreetException();
733                            }
734                            else if (Validator.isNull(shippingCity)) {
735                                    throw new ShippingCityException();
736                            }
737                            else if (Validator.isNull(shippingState)) {
738                                    throw new ShippingStateException();
739                            }
740                            else if (Validator.isNull(shippingZip)) {
741                                    throw new ShippingZipException();
742                            }
743                            else if (Validator.isNull(shippingCountry)) {
744                                    throw new ShippingCountryException();
745                            }
746                            else if (Validator.isNull(shippingPhone)) {
747                                    throw new ShippingPhoneException();
748                            }
749                    }
750    
751                    if (!shoppingPrefs.usePayPal() &&
752                            (shoppingPrefs.getCcTypes().length > 0)) {
753    
754                            if (Validator.isNull(ccName)) {
755                                    throw new CCNameException();
756                            }
757                            else if (Validator.isNull(ccType)) {
758                                    throw new CCTypeException();
759                            }
760                            else if (!CreditCard.isValidNumber(ccNumber, ccType)) {
761                                    throw new CCNumberException();
762                            }
763                            else if (!CreditCard.isValidExpirationDate(ccExpMonth, ccExpYear)) {
764                                    throw new CCExpirationException();
765                            }
766                    }
767            }
768    
769    }