@Transactional(readOnly = true) public Order build( Cart cart, Receiver receiver, PaymentMethod paymentMethod, ShippingMethod shippingMethod, CouponCode couponCode, boolean isInvoice, String invoiceTitle, boolean useBalance, String memo) { Assert.notNull(cart); Assert.notNull(cart.getMember()); Assert.notEmpty(cart.getCartItems()); Order order = new Order(); order.setShippingStatus(ShippingStatus.unshipped); order.setFee(new BigDecimal(0)); order.setPromotionDiscount(cart.getDiscount()); order.setCouponDiscount(new BigDecimal(0)); order.setOffsetAmount(new BigDecimal(0)); order.setPoint(cart.getEffectivePoint()); order.setMemo(memo); order.setMember(cart.getMember()); if (receiver != null) { order.setConsignee(receiver.getConsignee()); order.setAreaName(receiver.getAreaName()); order.setAddress(receiver.getAddress()); order.setZipCode(receiver.getZipCode()); order.setPhone(receiver.getPhone()); order.setArea(receiver.getArea()); } if (!cart.getPromotions().isEmpty()) { StringBuffer promotionName = new StringBuffer(); for (Promotion promotion : cart.getPromotions()) { if (promotion != null && promotion.getName() != null) { promotionName.append(" " + promotion.getName()); } } if (promotionName.length() > 0) { promotionName.deleteCharAt(0); } order.setPromotion(promotionName.toString()); } order.setPaymentMethod(paymentMethod); if (shippingMethod != null && paymentMethod != null && paymentMethod.getShippingMethods().contains(shippingMethod)) { BigDecimal freight = shippingMethod.calculateFreight(cart.getWeight()); for (Promotion promotion : cart.getPromotions()) { if (promotion.getIsFreeShipping()) { freight = new BigDecimal(0); break; } } order.setFreight(freight); order.setShippingMethod(shippingMethod); } else { order.setFreight(new BigDecimal(0)); } if (couponCode != null && cart.isCouponAllowed()) { couponCodeDao.lock(couponCode, LockModeType.PESSIMISTIC_WRITE); if (!couponCode.getIsUsed() && couponCode.getCoupon() != null && cart.isValid(couponCode.getCoupon())) { BigDecimal couponDiscount = cart.getEffectivePrice() .subtract( couponCode .getCoupon() .calculatePrice(cart.getQuantity(), cart.getEffectivePrice())); couponDiscount = couponDiscount.compareTo(new BigDecimal(0)) > 0 ? couponDiscount : new BigDecimal(0); order.setCouponDiscount(couponDiscount); order.setCouponCode(couponCode); } } List<OrderItem> orderItems = order.getOrderItems(); for (CartItem cartItem : cart.getCartItems()) { if (cartItem != null && cartItem.getProduct() != null) { Product product = cartItem.getProduct(); OrderItem orderItem = new OrderItem(); orderItem.setSn(product.getSn()); orderItem.setName(product.getName()); orderItem.setFullName(product.getFullName()); orderItem.setPrice(cartItem.getPrice()); orderItem.setWeight(product.getWeight()); orderItem.setThumbnail(product.getThumbnail()); orderItem.setIsGift(false); orderItem.setQuantity(cartItem.getQuantity()); orderItem.setShippedQuantity(0); orderItem.setReturnQuantity(0); orderItem.setProduct(product); orderItem.setOrder(order); orderItems.add(orderItem); } } for (GiftItem giftItem : cart.getGiftItems()) { if (giftItem != null && giftItem.getGift() != null) { Product gift = giftItem.getGift(); OrderItem orderItem = new OrderItem(); orderItem.setSn(gift.getSn()); orderItem.setName(gift.getName()); orderItem.setFullName(gift.getFullName()); orderItem.setPrice(new BigDecimal(0)); orderItem.setWeight(gift.getWeight()); orderItem.setThumbnail(gift.getThumbnail()); orderItem.setIsGift(true); orderItem.setQuantity(giftItem.getQuantity()); orderItem.setShippedQuantity(0); orderItem.setReturnQuantity(0); orderItem.setProduct(gift); orderItem.setOrder(order); orderItems.add(orderItem); } } Setting setting = SettingUtils.get(); if (setting.getIsInvoiceEnabled() && isInvoice && StringUtils.isNotEmpty(invoiceTitle)) { order.setIsInvoice(true); order.setInvoiceTitle(invoiceTitle); order.setTax(order.calculateTax()); } else { order.setIsInvoice(false); order.setTax(new BigDecimal(0)); } if (useBalance) { Member member = cart.getMember(); if (member.getBalance().compareTo(order.getAmount()) >= 0) { order.setAmountPaid(order.getAmount()); } else { order.setAmountPaid(member.getBalance()); } } else { order.setAmountPaid(new BigDecimal(0)); } if (order.getAmountPayable().compareTo(new BigDecimal(0)) == 0) { order.setOrderStatus(OrderStatus.confirmed); order.setPaymentStatus(PaymentStatus.paid); } else if (order.getAmountPayable().compareTo(new BigDecimal(0)) > 0 && order.getAmountPaid().compareTo(new BigDecimal(0)) > 0) { order.setOrderStatus(OrderStatus.confirmed); order.setPaymentStatus(PaymentStatus.partialPayment); } else { order.setOrderStatus(OrderStatus.unconfirmed); order.setPaymentStatus(PaymentStatus.unpaid); } if (paymentMethod != null && paymentMethod.getTimeout() != null && order.getPaymentStatus() == PaymentStatus.unpaid) { order.setExpire(DateUtils.addMinutes(new Date(), paymentMethod.getTimeout())); } return order; }