001
002package com.commercetools.api.models.order;
003
004import static com.commercetools.api.models.common.MoneyUtil.zeroAmount;
005
006import java.time.ZonedDateTime;
007import java.util.List;
008import java.util.Optional;
009
010import javax.money.MonetaryAmount;
011import javax.validation.Valid;
012import javax.validation.constraints.NotNull;
013
014import com.commercetools.api.models.cart.*;
015import com.commercetools.api.models.cart_discount.CartDiscountReference;
016import com.commercetools.api.models.common.*;
017import com.commercetools.api.models.customer_group.CustomerGroupReference;
018import com.commercetools.api.models.store.StoreKeyReference;
019import com.commercetools.api.models.type.CustomFields;
020
021/**
022 * Interface to collect the common stuff between carts and orders.
023 * @param <T> the type of this {@link OrderLike}, order or cart
024 */
025public interface OrderLike<T extends OrderLike<T>> {
026    @NotNull
027    public String getId();
028
029    @NotNull
030    public Long getVersion();
031
032    @NotNull
033    public ZonedDateTime getCreatedAt();
034
035    @NotNull
036    public ZonedDateTime getLastModifiedAt();
037
038    @Valid
039    public LastModifiedBy getLastModifiedBy();
040
041    @Valid
042    public CreatedBy getCreatedBy();
043
044    public String getCustomerId();
045
046    public String getCustomerEmail();
047
048    public String getAnonymousId();
049
050    @Valid
051    public StoreKeyReference getStore();
052
053    @NotNull
054    @Valid
055    public List<LineItem> getLineItems();
056
057    @NotNull
058    @Valid
059    public List<CustomLineItem> getCustomLineItems();
060
061    @NotNull
062    @Valid
063    public TypedMoney getTotalPrice();
064
065    @Valid
066    public TaxedPrice getTaxedPrice();
067
068    @Valid
069    public Address getShippingAddress();
070
071    @Valid
072    public Address getBillingAddress();
073
074    public InventoryMode getInventoryMode();
075
076    @NotNull
077    public TaxMode getTaxMode();
078
079    @NotNull
080    public RoundingMode getTaxRoundingMode();
081
082    @NotNull
083    public TaxCalculationMode getTaxCalculationMode();
084
085    @Valid
086    public CustomerGroupReference getCustomerGroup();
087
088    public String getCountry();
089
090    @Valid
091    public ShippingInfo getShippingInfo();
092
093    @Valid
094    public List<DiscountCodeInfo> getDiscountCodes();
095
096    @Valid
097    public CustomFields getCustom();
098
099    @Valid
100    public PaymentInfo getPaymentInfo();
101
102    public String getLocale();
103
104    @NotNull
105    @Valid
106    public List<CartDiscountReference> getRefusedGifts();
107
108    @NotNull
109    public CartOrigin getOrigin();
110
111    @Valid
112    public ShippingRateInput getShippingRateInput();
113
114    @Valid
115    public List<Address> getItemShippingAddresses();
116
117    @Valid
118    public CustomFields getShippingCustomFields();
119
120    default public MonetaryAmount calculateSubTotalPrice() {
121        final MonetaryAmount lineItemTotal = this.getLineItems()
122                .stream()
123                .map(LineItem::getTotalPrice)
124                .map(MonetaryAmountConvertable::toMonetaryAmount)
125                .reduce(zeroAmount(Optional.ofNullable(this.getTotalPrice()).map(Money::getCurrencyCode).orElse(null)),
126                    MonetaryAmount::add);
127        final MonetaryAmount customLineItemTotal = this.getCustomLineItems()
128                .stream()
129                .map(CustomLineItem::getTotalPrice)
130                .map(MonetaryAmountConvertable::toMonetaryAmount)
131                .reduce(zeroAmount(Optional.ofNullable(this.getTotalPrice()).map(Money::getCurrencyCode).orElse(null)),
132                    MonetaryAmount::add);
133        return lineItemTotal.add(customLineItemTotal);
134    }
135}