package com.mozu.mozuandroidinstoreassistant.app.order.loaders; import android.content.Context; import android.text.TextUtils; import com.crashlytics.android.Crashlytics; import com.mozu.api.MozuApiContext; import com.mozu.api.contracts.commerceruntime.orders.Order; import com.mozu.api.contracts.commerceruntime.orders.OrderCollection; import com.mozu.api.resources.commerce.OrderResource; import com.mozu.mozuandroidinstoreassistant.app.loaders.InternetConnectedAsyncTaskLoader; import com.mozu.mozuandroidinstoreassistant.app.models.StringUtils; import java.util.ArrayList; import java.util.List; public class OrdersLoader extends InternetConnectedAsyncTaskLoader<List<Order>> { public static final String FILTER_BY_STATUS = "status eq Accepted"; private static final int ITEMS_PER_PAGE = 50; private static final String ORDER_ID_FILTER_BY = "orderNumber eq "; private static final String FILTER_ABANDONED = "status ne Abandoned"; private static final String FILTER_PENDING = "status ne Pending"; private static final String ORDER_ORDER_NUMBER = "orderNumber"; private static final String ORDER_ORDER_DATE = "submittedDate"; private static final String ORDER_ORDER_EMAIL = "email"; private static final String ORDER_ORDER_STATUS = "status"; private static final String ORDER_ORDER_TOTAL = "total"; private static final String ORDER_ORDER_PAYMENT_STATUS = "paymentStatus"; private static final String SORT_ORDER_ASC = "asc"; private static final String SORT_ORDER_DSC = "desc"; public String mCurrentOrderBy = ""; public String mSearchQueryFilter; private String RESPONSE_FIELDS = "items(id,ordernumber,status,SubmittedDate,paymentStatus,total,status,customerAccountId)"; private List<Order> mOrdersList; private Integer mTenantId; private Integer mSiteId; private int mCurrentPage; private int mTotalPages; private boolean mIsLoading; private String mCurrentSort; private String mFilter = FILTER_ABANDONED + " and " +FILTER_PENDING; public OrdersLoader(Context context, Integer tenantId, Integer siteId) { super(context); mTenantId = tenantId; mSiteId = siteId; mCurrentSort = SORT_ORDER_DSC; mCurrentOrderBy = ORDER_ORDER_DATE; init(); } public boolean isSortAsc() { return SORT_ORDER_ASC.equals(mCurrentSort); } public void init() { cancelLoad(); mCurrentPage = 0; mTotalPages = 0; mIsLoading = false; mSearchQueryFilter = ""; mOrdersList = new ArrayList<Order>(); } @Override protected void onForceLoad() { super.onForceLoad(); } @Override public List<Order> loadInBackground() { mIsLoading = true; super.loadInBackground(); mOrdersList.addAll(loadOrdersFromWeb()); List<Order> tmpOrder = new ArrayList<Order>(); tmpOrder.addAll(mOrdersList); mOrdersList = null; mOrdersList = new ArrayList<Order>(tmpOrder); mIsLoading = false; return mOrdersList; } @Override public void deliverResult(List<Order> data) { if (isReset()) return; if (isStarted()) super.deliverResult(data); } @Override protected void onStartLoading() { if (mOrdersList == null) { mOrdersList = new ArrayList<Order>(); } if (takeContentChanged()) forceLoad(); } @Override protected void onStopLoading() { mIsLoading = false; cancelLoad(); } @Override public void onCanceled(List<Order> data) { mIsLoading = false; super.onCanceled(data); } @Override protected void onReset() { onStopLoading(); mOrdersList = null; init(); super.onReset(); } private List<Order> loadOrdersFromWeb() { List<Order> allOrders = new ArrayList<Order>(); OrderCollection orderCollection; OrderResource orderResource = new OrderResource(new MozuApiContext(mTenantId, mSiteId)); try { if (!TextUtils.isEmpty(mSearchQueryFilter)) { orderCollection = searchOrders(orderResource); } else { orderCollection = orderResource.getOrders(mCurrentPage * ITEMS_PER_PAGE, ITEMS_PER_PAGE, mCurrentOrderBy + " " + mCurrentSort, mFilter, null, null, RESPONSE_FIELDS); } mTotalPages = (int) Math.ceil(orderCollection.getTotalCount() * 1.0f / ITEMS_PER_PAGE * 1.0f); mCurrentPage += 1; allOrders = orderCollection.getItems(); } catch (Exception e) { Crashlytics.logException(e); } return allOrders; } private OrderCollection searchOrders(OrderResource orderResource) throws Exception { OrderCollection orderCollection; if (StringUtils.isNumber(mSearchQueryFilter)) { orderCollection = orderResource.getOrders(mCurrentPage * ITEMS_PER_PAGE, ITEMS_PER_PAGE, null, ORDER_ID_FILTER_BY + mSearchQueryFilter + " and " + FILTER_ABANDONED, null, null, RESPONSE_FIELDS); } else { orderCollection = orderResource.getOrders(mCurrentPage * ITEMS_PER_PAGE, ITEMS_PER_PAGE, null, FILTER_ABANDONED, mSearchQueryFilter, null, RESPONSE_FIELDS); } return orderCollection; } public boolean hasMoreResults() { return mCurrentPage < mTotalPages; } public boolean isLoading() { return mIsLoading; } public void setQueryFilter(String query) { mSearchQueryFilter = query; } public void setFilter(String filter) { if(filter != null && filter.contains("status eq Pending")) { mFilter = FILTER_ABANDONED; } if (filter != null && !filter.isEmpty()) { mFilter = mFilter + " and " + filter; } } public void removeQuery() { mSearchQueryFilter = ""; } public void removeFilter() { mFilter = FILTER_ABANDONED + " and " + FILTER_PENDING; } private void toggleCurrentSortOrder() { if (SORT_ORDER_DSC.equalsIgnoreCase(mCurrentSort)) { mCurrentSort = SORT_ORDER_ASC; } else { mCurrentSort = SORT_ORDER_DSC; } } public void orderByNumber() { mCurrentPage = 0; if (ORDER_ORDER_NUMBER.equalsIgnoreCase(mCurrentOrderBy)) { toggleCurrentSortOrder(); } else { mCurrentOrderBy = ORDER_ORDER_NUMBER; mCurrentSort = SORT_ORDER_DSC; } } //date is the default and there is no way through the api/sdk to //tell the orders to sort by a date //so we are just removing the sort filter and resorting public void orderByDate() { mCurrentPage = 0; if (ORDER_ORDER_DATE.equalsIgnoreCase(mCurrentOrderBy)) { toggleCurrentSortOrder(); } else { mCurrentOrderBy = ORDER_ORDER_DATE; mCurrentSort = SORT_ORDER_DSC; } } public void orderByStatus() { mCurrentPage = 0; if (ORDER_ORDER_STATUS.equalsIgnoreCase(mCurrentOrderBy)) { toggleCurrentSortOrder(); } else { mCurrentOrderBy = ORDER_ORDER_STATUS; mCurrentSort = SORT_ORDER_DSC; } } public void orderByPaymentStatus() { mCurrentPage = 0; if (ORDER_ORDER_PAYMENT_STATUS.equalsIgnoreCase(mCurrentOrderBy)) { toggleCurrentSortOrder(); } else { mCurrentOrderBy = ORDER_ORDER_PAYMENT_STATUS; mCurrentSort = SORT_ORDER_DSC; } } public void orderByTotal() { mCurrentPage = 0; if (ORDER_ORDER_TOTAL.equalsIgnoreCase(mCurrentOrderBy)) { toggleCurrentSortOrder(); } else { mCurrentOrderBy = ORDER_ORDER_TOTAL; mCurrentSort = SORT_ORDER_DSC; } } public void clearOrdering() { mCurrentOrderBy = ""; } }