package cart; import common.contexts.UserContext; import common.utils.PriceFormatter; import io.sphere.sdk.cartdiscounts.DiscountedLineItemPrice; import io.sphere.sdk.carts.Cart; import io.sphere.sdk.models.Base; import io.sphere.sdk.utils.MoneyImpl; import javax.money.MonetaryAmount; import java.util.List; import java.util.Optional; import static java.util.stream.Collectors.toList; public class CartItems extends Base { private List<CartItem> list; private String subtotal; private String orderDiscount; private String delivery; private String tax; private String orderTotal; public CartItems() { } public static CartItems of(final Cart cart, final UserContext userContext) { final CartItems cartItems = new CartItems(); final List<CartItem> cartItemList = cart.getLineItems() .stream() .map(lineItem -> CartItem.of(lineItem, userContext)) .collect(toList()); cartItems.setList(cartItemList); final PriceFormatter priceFormatter = PriceFormatter.of(userContext.locale()); final String subtotal = priceFormatter.format(calculateSubTotal(cart)); cartItems.setSubtotal(subtotal); final String zeroMoneyAmount = priceFormatter.format(MoneyImpl.ofCents(0, cart.getTotalPrice().getCurrency())); cartItems.setOrderDiscount(zeroMoneyAmount); final String delivery = Optional.ofNullable(cart.getShippingInfo()) .map(cartShippingInfo -> priceFormatter.format(cartShippingInfo.getPrice())) .orElse(zeroMoneyAmount); cartItems.setDelivery(delivery); final String tax = Optional.ofNullable(cart.getTaxedPrice()) .map(taxedPrice -> taxedPrice.getTotalGross().subtract(taxedPrice.getTotalNet())) .map(amount -> priceFormatter.format(amount)) .orElse(zeroMoneyAmount); cartItems.setTax(tax); final String orderTotal = Optional.ofNullable(cart.getTaxedPrice()) .map(taxedPrice -> priceFormatter.format(taxedPrice.getTotalGross())) .orElseGet(() -> priceFormatter.format(cart.getTotalPrice())); cartItems.setOrderTotal(orderTotal); return cartItems; } private static MonetaryAmount calculateSubTotal(final Cart cart) { final MonetaryAmount zeroAmount = MoneyImpl.ofCents(0, cart.getTotalPrice().getCurrency()); return cart.getLineItems() .stream() .map(lineItem -> { final MonetaryAmount amount = Optional.ofNullable(lineItem.getDiscountedPrice()) .map(DiscountedLineItemPrice::getMoney) .orElseGet(() -> lineItem.getPrice().getValue()); final Long quantity = lineItem.getQuantity(); return amount.multiply(quantity); }) .reduce(zeroAmount, (left, right) -> left.add(right)); } public List<CartItem> getList() { return list; } public void setList(final List<CartItem> list) { this.list = list; } public String getSubtotal() { return subtotal; } public void setSubtotal(final String subtotal) { this.subtotal = subtotal; } public String getOrderDiscount() { return orderDiscount; } public void setOrderDiscount(final String orderDiscount) { this.orderDiscount = orderDiscount; } public String getDelivery() { return delivery; } public void setDelivery(final String delivery) { this.delivery = delivery; } public String getTax() { return tax; } public void setTax(final String tax) { this.tax = tax; } public String getOrderTotal() { return orderTotal; } public void setOrderTotal(final String orderTotal) { this.orderTotal = orderTotal; } }