package org.openlmis.core.presenter; import com.google.inject.Inject; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.exceptions.ViewNotMatchException; import org.openlmis.core.model.RegimeShortCode; import org.openlmis.core.model.Regimen; import org.openlmis.core.model.StockCard; import org.openlmis.core.model.repository.ProductRepository; import org.openlmis.core.model.repository.ProgramRepository; import org.openlmis.core.model.repository.RegimenRepository; import org.openlmis.core.model.repository.StockRepository; import org.openlmis.core.view.BaseView; import org.openlmis.core.view.viewmodel.InventoryViewModel; import org.openlmis.core.view.viewmodel.RegimeProductViewModel; import org.roboguice.shaded.goole.common.base.Function; import org.roboguice.shaded.goole.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; import roboguice.util.Strings; 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 ProductPresenter extends Presenter { @Inject private ProductRepository productRepository; @Inject private ProgramRepository programRepository; @Inject private RegimenRepository regimenRepository; @Inject private StockRepository stockRepository; @Override public void attachView(BaseView v) throws ViewNotMatchException { } public Observable<List<RegimeProductViewModel>> loadRegimeProducts() { return Observable.create(new Observable.OnSubscribe<List<RegimeProductViewModel>>() { @Override public void call(final Subscriber<? super List<RegimeProductViewModel>> subscriber) { try { List<RegimeShortCode> regimeShortCodes = regimenRepository.listRegimeShortCode(); List<RegimeProductViewModel> regimeProductViewModels = new ArrayList<>(); for (RegimeShortCode item : regimeShortCodes) { RegimeProductViewModel regimeProductViewModel = new RegimeProductViewModel(item.getShortCode(), productRepository.getByCode(item.getCode()).getPrimaryName()); regimeProductViewModels.add(regimeProductViewModel); } subscriber.onNext(regimeProductViewModels); subscriber.onCompleted(); } catch (LMISException e) { e.reportToFabric(); subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()); } public Observable<Regimen> saveRegimes(List<RegimeProductViewModel> viewModels, final Regimen.RegimeType regimeType) { final String regimenName = generateRegimeName(viewModels); return Observable.create(new Observable.OnSubscribe<Regimen>() { @Override public void call(Subscriber<? super Regimen> subscriber) { try { Regimen regimen = regimenRepository.getByNameAndCategory(regimenName, regimeType); if (regimen == null) { regimen = new Regimen(); regimen.setType(regimeType); regimen.setName(regimenName); regimen.setCustom(true); regimenRepository.create(regimen); } subscriber.onNext(regimen); subscriber.onCompleted(); } catch (LMISException e) { e.printStackTrace(); subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()); } private String generateRegimeName(List<RegimeProductViewModel> viewModels) { List<String> list = new ArrayList<>(); for (RegimeProductViewModel model : viewModels) { list.add(model.getShortCode()); } return Strings.join("+", list); } public Observable<List<InventoryViewModel>> loadEmergencyProducts() { return Observable.create(new Observable.OnSubscribe<List<InventoryViewModel>>() { @Override public void call(final Subscriber<? super List<InventoryViewModel>> subscriber) { try { ImmutableList<InventoryViewModel> inventoryViewModels = from(stockRepository.listEmergencyStockCards()).transform(new Function<StockCard, InventoryViewModel>() { @Override public InventoryViewModel apply(StockCard stockCard) { return InventoryViewModel.buildEmergencyModel(stockCard); } }).toList(); subscriber.onNext(inventoryViewModels); subscriber.onCompleted(); } catch (LMISException e) { e.reportToFabric(); subscriber.onError(e); } } }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()); } }