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}