package org.openlmis.core.presenter; import android.support.annotation.Nullable; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.manager.MovementReasonManager; import org.openlmis.core.model.Product; import org.openlmis.core.model.StockCard; import org.openlmis.core.model.StockMovementItem; import org.openlmis.core.view.viewmodel.InventoryViewModel; import org.roboguice.shaded.goole.common.base.Function; import java.util.List; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import static org.roboguice.shaded.goole.common.collect.FluentIterable.from; public class InitialInventoryPresenter extends InventoryPresenter { @Override public Observable<List<InventoryViewModel>> loadInventory() { return Observable.create(new Observable.OnSubscribe<List<InventoryViewModel>>() { @Override public void call(final Subscriber<? super List<InventoryViewModel>> subscriber) { try { List<Product> inventoryProducts = productRepository.listProductsArchivedOrNotInStockCard(); inventoryViewModelList.addAll(from(inventoryProducts) .transform(new Function<Product, InventoryViewModel>() { @Override public InventoryViewModel apply(Product product) { return convertProductToStockCardViewModel(product); } }).toList()); subscriber.onNext(inventoryViewModelList); subscriber.onCompleted(); } catch (LMISException e) { e.reportToFabric(); subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()); } @Nullable private InventoryViewModel convertProductToStockCardViewModel(Product product) { try { InventoryViewModel viewModel; if (product.isArchived()) { viewModel = new InventoryViewModel(stockRepository.queryStockCardByProductId(product.getId())); viewModel.setMovementType(MovementReasonManager.MovementType.PHYSICAL_INVENTORY); } else { viewModel = new InventoryViewModel(product); viewModel.setMovementType(MovementReasonManager.MovementType.PHYSICAL_INVENTORY); } viewModel.setChecked(false); return viewModel; } catch (LMISException e) { e.reportToFabric(); } return null; } public Observable<Object> initStockCardObservable() { return Observable.create(new Observable.OnSubscribe<Object>() { @Override public void call(Subscriber<? super Object> subscriber) { initOrArchiveBackStockCards(); subscriber.onNext(null); subscriber.onCompleted(); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); } void initOrArchiveBackStockCards() { for (InventoryViewModel inventoryViewModel : inventoryViewModelList) { if (inventoryViewModel.isChecked()) { initOrArchiveBackStockCard(inventoryViewModel); } } } private void initOrArchiveBackStockCard(InventoryViewModel inventoryViewModel) { try { if (inventoryViewModel.getProduct().isArchived()) { StockCard stockCard = inventoryViewModel.getStockCard(); stockCard.getProduct().setArchived(false); stockRepository.updateStockCardWithProduct(stockCard); return; } createStockCardAndInventoryMovementWithLot(inventoryViewModel); } catch (LMISException e) { e.reportToFabric(); } } private void createStockCardAndInventoryMovementWithLot(InventoryViewModel model) throws LMISException { StockCard stockCard = new StockCard(); stockCard.setProduct(model.getProduct()); StockMovementItem movementItem = new StockMovementItem(stockCard, model); stockCard.setStockOnHand(movementItem.getStockOnHand()); stockRepository.addStockMovementAndUpdateStockCard(movementItem); } }