package com.mozu.mozuandroidinstoreassistant.app.order;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import com.mozu.api.contracts.commerceruntime.fulfillment.FulfillmentAction;
import com.mozu.api.contracts.commerceruntime.fulfillment.Package;
import com.mozu.api.contracts.commerceruntime.fulfillment.PackageItem;
import com.mozu.api.contracts.commerceruntime.fulfillment.Pickup;
import com.mozu.api.contracts.commerceruntime.fulfillment.PickupItem;
import com.mozu.api.contracts.commerceruntime.fulfillment.Shipment;
import com.mozu.api.contracts.commerceruntime.orders.Order;
import com.mozu.api.contracts.commerceruntime.orders.OrderItem;
import com.mozu.mozuandroidinstoreassistant.app.OrderDetailActivity;
import com.mozu.mozuandroidinstoreassistant.app.R;
import com.mozu.mozuandroidinstoreassistant.app.data.IData;
import com.mozu.mozuandroidinstoreassistant.app.data.order.BottomRowItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentColumnHeader;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentDataItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentDividerRowItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentFulfilledDataItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentMoveToDataItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentPackageDataItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FulfillmentPickupItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.FullfillmentCategoryHeaderDataItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.PickupFulfillmentTitleDataItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.ShipmentFulfillmentTitleDataItem;
import com.mozu.mozuandroidinstoreassistant.app.data.order.TopRowItem;
import com.mozu.mozuandroidinstoreassistant.app.dialog.ErrorMessageAlertDialog;
import com.mozu.mozuandroidinstoreassistant.app.layout.order.FulfillmentMoveToRow.MoveToListener;
import com.mozu.mozuandroidinstoreassistant.app.layout.order.FulfillmentPickupItemRow.MarkPickupAsFulfilledListener;
import com.mozu.mozuandroidinstoreassistant.app.models.FulfillmentItem;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachine;
import com.mozu.mozuandroidinstoreassistant.app.models.authentication.UserAuthenticationStateMachineProducer;
import com.mozu.mozuandroidinstoreassistant.app.order.adapters.OrderDetailFullfillmentAdapter;
import com.mozu.mozuandroidinstoreassistant.app.order.loaders.FulfillmentActionObservablesManager;
import com.mozu.mozuandroidinstoreassistant.app.order.loaders.PickupObservablesManager;
import com.mozu.mozuandroidinstoreassistant.app.product.ProductDetailOverviewDialogFragment;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import rx.Subscriber;
import rx.android.observables.AndroidObservable;
public class OrderDetailFulfillmentFragment extends Fragment implements MoveToListener, MarkPickupAsFulfilledListener {
private static final String PRODUCT_DIALOG_TAG = "prod_detail_fragment";
private static final String PACKAGE_DIALOG_TAG = "package_detail_fragment";
private static final String PICKUP_DIALOG_TAG = "pickup_detail_fragment";
private List<OrderItem> mShipItems;
private List<OrderItem> mPickupItems;
private Order mOrder;
private ListView mFullfillmentListview;
private TextView mFulfillmentStatus;
private OrderDetailFullfillmentAdapter mOrderDetailFullfillmentAdapter;
private AdapterView.OnItemClickListener mListClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
OrderDetailFullfillmentAdapter.RowType rowType = mOrderDetailFullfillmentAdapter.getRowType(position);
if (rowType == OrderDetailFullfillmentAdapter.RowType.PACKAGE_ROW) {
FulfillmentPackageDataItem dataItem = (FulfillmentPackageDataItem) mOrderDetailFullfillmentAdapter.getItem(position);
FragmentManager manager = getFragmentManager();
PackageInfoDialogFragment packageInfoDialogFragment = (PackageInfoDialogFragment) manager.findFragmentByTag(PACKAGE_DIALOG_TAG);
UserAuthenticationStateMachine userState = UserAuthenticationStateMachineProducer.getInstance(getActivity());
if (packageInfoDialogFragment == null) {
packageInfoDialogFragment = new PackageInfoDialogFragment();
packageInfoDialogFragment.setFulfillmentItem(dataItem.getFulfillmentItem());
packageInfoDialogFragment.setTenantAndSiteId(userState.getTenantId(), userState.getSiteId());
}
packageInfoDialogFragment.show(manager, PACKAGE_DIALOG_TAG);
} else if (rowType == OrderDetailFullfillmentAdapter.RowType.ITEM_ROW) {
FulfillmentDataItem item = (FulfillmentDataItem) mOrderDetailFullfillmentAdapter.getItem(position);
FragmentManager manager = getFragmentManager();
ProductDetailOverviewDialogFragment productOverviewFragment = (ProductDetailOverviewDialogFragment) manager.findFragmentByTag(PRODUCT_DIALOG_TAG);
UserAuthenticationStateMachine userState = UserAuthenticationStateMachineProducer.getInstance(getActivity());
if (productOverviewFragment == null) {
productOverviewFragment = new ProductDetailOverviewDialogFragment();
productOverviewFragment.setProduct(item.getOrderItem().getProduct());
productOverviewFragment.setTenantId(userState.getTenantId());
productOverviewFragment.setSiteId(userState.getSiteId());
productOverviewFragment.setSiteDomain(userState.getSiteDomain());
}
productOverviewFragment.show(manager, PRODUCT_DIALOG_TAG);
} else if (rowType == OrderDetailFullfillmentAdapter.RowType.PICKUP_ITEM_ROW) {
FulfillmentPickupItem item = (FulfillmentPickupItem) mOrderDetailFullfillmentAdapter.getItem(position);
FragmentManager manager = getFragmentManager();
PickupInfoDialogFragment pickupInfoDialogFragment = (PickupInfoDialogFragment) manager.findFragmentByTag(PICKUP_DIALOG_TAG);
UserAuthenticationStateMachine userState = UserAuthenticationStateMachineProducer.getInstance(getActivity());
if (pickupInfoDialogFragment == null) {
pickupInfoDialogFragment = new PickupInfoDialogFragment();
pickupInfoDialogFragment.setPickup(item.getPickup());
pickupInfoDialogFragment.setTenantAndSiteId(userState.getTenantId(), userState.getSiteId());
}
pickupInfoDialogFragment.show(manager, PICKUP_DIALOG_TAG);
} else if (rowType == OrderDetailFullfillmentAdapter.RowType.FULFILLED_ROW) {
FulfillmentFulfilledDataItem item = (FulfillmentFulfilledDataItem) mOrderDetailFullfillmentAdapter.getItem(position);
FragmentManager manager = getFragmentManager();
PickupInfoDialogFragment pickupInfoDialogFragment = (PickupInfoDialogFragment) manager.findFragmentByTag(PICKUP_DIALOG_TAG);
UserAuthenticationStateMachine userState = UserAuthenticationStateMachineProducer.getInstance(getActivity());
if (pickupInfoDialogFragment == null) {
pickupInfoDialogFragment = new PickupInfoDialogFragment();
pickupInfoDialogFragment.setPickup(item.getPickup());
pickupInfoDialogFragment.setTenantAndSiteId(userState.getTenantId(), userState.getSiteId());
}
pickupInfoDialogFragment.show(manager, PICKUP_DIALOG_TAG);
}
}
};
public OrderDetailFulfillmentFragment() {
// Required empty public constructor
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.order_detail_fulfillment_layout, null);
mShipItems = new ArrayList<>();
mPickupItems = new ArrayList<>();
mFullfillmentListview = (ListView) view.findViewById(R.id.fullfillment_list);
mFulfillmentStatus = (TextView) view.findViewById(R.id.order_fulfillment_status);
String status = StringUtils.join(StringUtils.splitByCharacterTypeCamelCase(mOrder.getFulfillmentStatus()), " ");
mFulfillmentStatus.setText("Status: " + status);
if (mOrder != null) {
categorizeOrdersByFulfillmentMethod(mOrder);
List<IData> data = new ArrayList<>();
data.addAll(filterShipment(mShipItems));
data.addAll(filterPickUp(mPickupItems));
mOrderDetailFullfillmentAdapter = new OrderDetailFullfillmentAdapter(getActivity(), data, this, this);
mFullfillmentListview.setAdapter(mOrderDetailFullfillmentAdapter);
mFullfillmentListview.setOnItemClickListener(mListClickListener);
}
return view;
}
private void categorizeOrdersByFulfillmentMethod(Order order) {
if (order == null || order.getItems() == null || order.getItems().size() < 1)
return;
for (OrderItem item : order.getItems()) {
if (OrderStrings.SHIP.equalsIgnoreCase(item.getFulfillmentMethod())) {
mShipItems.add(item);
} else if (OrderStrings.PICKUP.equalsIgnoreCase(item.getFulfillmentMethod())) {
mPickupItems.add(item);
}
}
}
private List<OrderItem> removeOrderItem(List<OrderItem> orderItems, String productCode) {
Iterator<OrderItem> i = orderItems.iterator();
while (i.hasNext()) {
OrderItem item = i.next();
if (productCode.toLowerCase().startsWith(item.getProduct().getProductCode().toLowerCase())) {
i.remove();
}
}
return orderItems;
}
public void setOrder(Order order) {
mOrder = order;
}
/**
* filter all pickup items.
*
* @param pickupItems list of
* @return
*/
private List<IData> filterPickUp(List<OrderItem> pickupItems) {
List<IData> finalDataList = new ArrayList<>();
List<OrderItem> itemsNotPickedUp = new ArrayList<>(pickupItems);
List<FulfillmentFulfilledDataItem> fulFilledItems = new ArrayList<>();
List<FulfillmentPickupItem> unFulFilledItems = new ArrayList<>();
int totalPickupCount = getTotalItemCountFromOrderQuantity(pickupItems);
int totalFulfilledCount = 0;
if (pickupItems.size() > 0) {
int pickUpCount = 0;
//filter pickup items
if (mOrder.getPickups() != null && mOrder.getPickups().size() > 0) {
for (Pickup pickup : mOrder.getPickups()) {
int fulfilledCount = 0;
pickUpCount++;
for (PickupItem pickupItem : pickup.getItems()) {
fulfilledCount += pickupItem.getQuantity();
itemsNotPickedUp = removeOrderItem(itemsNotPickedUp, pickupItem.getProductCode());
}
if (pickup.getStatus().equalsIgnoreCase(OrderStrings.NOTFULLFILLED)) {
FulfillmentPickupItem item = new FulfillmentPickupItem(pickup, pickUpCount);
unFulFilledItems.add(item);
} else if (pickup.getStatus().equalsIgnoreCase(OrderStrings.FULFILLED)) {
FulfillmentFulfilledDataItem item = new FulfillmentFulfilledDataItem(pickup, pickUpCount);
fulFilledItems.add(item);
totalFulfilledCount += fulfilledCount;
}
}
}
PickupFulfillmentTitleDataItem fulfillmentTitleDataItem = new PickupFulfillmentTitleDataItem();
fulfillmentTitleDataItem.setTitle(getActivity().getResources().getString(R.string.instore_header));
fulfillmentTitleDataItem.setFullfilledCount(totalFulfilledCount);
fulfillmentTitleDataItem.setUnfullfilledCount(totalPickupCount - totalFulfilledCount);
fulfillmentTitleDataItem.setTotalCount(totalPickupCount);
finalDataList.add(fulfillmentTitleDataItem);
finalDataList.add(new TopRowItem());
//add not pickedUp items
if (itemsNotPickedUp.size() > 0) {
finalDataList.add(new FulfillmentColumnHeader());
finalDataList.add(new FulfillmentDividerRowItem());
for (OrderItem item : itemsNotPickedUp) {
FulfillmentDataItem dataItem = new FulfillmentDataItem(item);
finalDataList.add(dataItem);
}
finalDataList.add(new FulfillmentMoveToDataItem(itemsNotPickedUp));
}
//add unfulfilled and fulfilled dividers and data to final list.
if (unFulFilledItems.size() > 0) {
if (itemsNotPickedUp.size() > 0) {
finalDataList.add(new FulfillmentDividerRowItem());
}
finalDataList.add(new FullfillmentCategoryHeaderDataItem("Pending Items"));
for (FulfillmentPickupItem unFulfilledItem : unFulFilledItems) {
finalDataList.add(unFulfilledItem);
}
}
if (fulFilledItems.size() > 0) {
if (unFulFilledItems.size() > 0) {
finalDataList.add(new FulfillmentDividerRowItem());
}
finalDataList.add(new FullfillmentCategoryHeaderDataItem("PickedUp Items"));
for (FulfillmentFulfilledDataItem fulfilledItem : fulFilledItems) {
finalDataList.add(fulfilledItem);
}
}
finalDataList.add(new BottomRowItem());
}
return finalDataList;
}
private int getTotalItemCountFromOrderQuantity(List<OrderItem> items) {
int totalItemCount = 0;
for (OrderItem orderItem : items) {
totalItemCount += orderItem.getQuantity();
}
return totalItemCount;
}
/**
* Filter items fulfilled with the method by fulfilled, pending, and not packaged.
* @param shipItems Items already filtered by fulfillment method
* @return filtered list of IData items for
*/
private List<IData> filterShipment(List<OrderItem> shipItems) {
int totalItemCount = getTotalItemCountFromOrderQuantity(shipItems);
int totalFulfilledCount = 0;
List<IData> finalDataList = new ArrayList<>();
List<FulfillmentPackageDataItem> pendingItems = new ArrayList<>();
List<FulfillmentPackageDataItem> fulfilledItems = new ArrayList<>();
List<OrderItem> orderItemsNotPackaged = new ArrayList<>(shipItems);
if (shipItems.size() > 0) {
int packageCount = 0;
for (Package orderPackage : mOrder.getPackages()) {
int packageItemCount = 0;
for (PackageItem item : orderPackage.getItems()) {
orderItemsNotPackaged = removeOrderItem(orderItemsNotPackaged, item.getProductCode());
packageItemCount += item.getQuantity();
}
packageCount++;
FulfillmentItem fulfillmentItem = new FulfillmentItem();
fulfillmentItem.setPackaged(true);
fulfillmentItem.setOrderPackage(orderPackage);
String status = orderPackage.getStatus();
if (status.equalsIgnoreCase(OrderStrings.NOTFULLFILLED)) {
fulfillmentItem.setFullfilled(false);
fulfillmentItem.setPackageNumber(getActivity().getString(R.string.package_number_string) + String.valueOf(packageCount));
fulfillmentItem.setFulfillmentContact(mOrder.getFulfillmentInfo().getFulfillmentContact());
pendingItems.add(new FulfillmentPackageDataItem(fulfillmentItem));
} else if (status.equalsIgnoreCase(OrderStrings.FULFILLED)) {
fulfillmentItem.setFullfilled(true);
totalFulfilledCount += packageItemCount;
for (Shipment shipment : mOrder.getShipments()) {
if (shipment.getId().equalsIgnoreCase(orderPackage.getShipmentId())) {
fulfillmentItem.setShipment(shipment);
break;
}
}
fulfillmentItem.setPackageNumber(getActivity().getString(R.string.package_number_string) + String.valueOf(packageCount));
fulfillmentItem.setFulfillmentContact(mOrder.getFulfillmentInfo().getFulfillmentContact());
fulfilledItems.add(new FulfillmentPackageDataItem(fulfillmentItem));
}
}
ShipmentFulfillmentTitleDataItem fulfillmentTitleDataItem = new ShipmentFulfillmentTitleDataItem();
fulfillmentTitleDataItem.setTitle(getString(R.string.direct_ship_header));
fulfillmentTitleDataItem.setFullfilledCount(totalFulfilledCount);
fulfillmentTitleDataItem.setUnShippedCount(totalItemCount - totalFulfilledCount);
fulfillmentTitleDataItem.setTotalCount(totalItemCount);
finalDataList.add(fulfillmentTitleDataItem);
finalDataList.add(new TopRowItem());
if (orderItemsNotPackaged.size() > 0) {
finalDataList.add(new FulfillmentColumnHeader());
finalDataList.add(new FulfillmentDividerRowItem());
finalDataList.add(new FullfillmentCategoryHeaderDataItem("Pending Items"));
}
for (OrderItem orderItem : orderItemsNotPackaged) {
finalDataList.add(new FulfillmentDataItem(orderItem));
}
if (pendingItems.size() > 0) {
if (orderItemsNotPackaged.size() > 0) {
finalDataList.add(new FulfillmentDividerRowItem());
}
finalDataList.add(new FullfillmentCategoryHeaderDataItem("Created Items"));
}
finalDataList.addAll(pendingItems);
if (fulfilledItems.size() > 0) {
if (pendingItems.size() > 0) {
finalDataList.add(new FulfillmentDividerRowItem());
}
finalDataList.add(new FullfillmentCategoryHeaderDataItem("Shipped Items"));
}
finalDataList.addAll(fulfilledItems);
finalDataList.add(new BottomRowItem());
}
return finalDataList;
}
@Override
public void onMoveToClicked(IData data) {
if (data instanceof FulfillmentMoveToDataItem) {
OrderFulfillmentMoveToPickupDialogFragment dialogFragment = new OrderFulfillmentMoveToPickupDialogFragment();
dialogFragment.setData((FulfillmentMoveToDataItem) data, mOrder);
dialogFragment.show(getFragmentManager(), "move to");
}
}
@Override
public void markPickUpAsFulfilled(Pickup pickup) {
FulfillmentAction action = new FulfillmentAction();
List<String> pickups = new ArrayList<>();
pickups.add(pickup.getId());
action.setPickupIds(pickups);
action.setActionName("PickUp");
AndroidObservable.bindFragment(this, FulfillmentActionObservablesManager.getInstance(
mOrder.getTenantId(), mOrder.getSiteId())
.performFulfillmentAction(action, mOrder.getId()))
.subscribe(getUpdatePickupSubscriber());
}
@Override
public void cancelPickup(Pickup pickup) {
AndroidObservable.bindFragment(this, PickupObservablesManager.getInstance(
mOrder.getTenantId(), mOrder.getSiteId())
.deletePickup(pickup.getId(), mOrder.getId()))
.subscribe(getCancelPickupSubscriber());
}
private Subscriber<Order> getUpdatePickupSubscriber() {
return new Subscriber<Order>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
ErrorMessageAlertDialog
.getStandardErrorMessageAlertDialog(getActivity(), getResources().getString(R.string.standard_error))
.show();
}
@Override
public void onNext(Order order) {
((OrderDetailActivity) getActivity()).onRefresh();
}
};
}
private Subscriber<Pickup> getCancelPickupSubscriber() {
return new Subscriber<Pickup>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
ErrorMessageAlertDialog
.getStandardErrorMessageAlertDialog(getActivity(), getResources().getString(R.string.standard_error))
.show();
}
@Override
public void onNext(Pickup pickup) {
((OrderDetailActivity) getActivity()).onRefresh();
}
};
}
}