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