/*
* This program is part of the OpenLMIS logistics management information
* system platform software.
*
* Copyright © 2015 ThoughtWorks, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. This program is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details. You should
* have received a copy of the GNU Affero General Public License along with
* this program. If not, see http://www.gnu.org/licenses. For additional
* information contact info@OpenLMIS.org
*/
package org.openlmis.core.presenter;
import android.content.Context;
import com.google.inject.Inject;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.manager.SharedPreferenceMgr;
import org.openlmis.core.model.KitProduct;
import org.openlmis.core.model.StockCard;
import org.openlmis.core.model.StockMovementItem;
import org.openlmis.core.model.repository.ProductRepository;
import org.openlmis.core.model.repository.StockMovementRepository;
import org.openlmis.core.model.repository.StockRepository;
import org.openlmis.core.utils.ToastUtil;
import org.openlmis.core.view.BaseView;
import org.openlmis.core.view.viewmodel.StockMovementViewModel;
import org.roboguice.shaded.goole.common.base.Function;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import static org.roboguice.shaded.goole.common.collect.FluentIterable.from;
public class StockMovementsPresenter extends Presenter {
@Getter
final List<StockMovementViewModel> stockMovementModelList = new ArrayList<>();
@Inject
StockRepository stockRepository;
@Getter
StockCard stockCard;
StockMovementView view;
@Inject
Context context;
@Inject
SharedPreferenceMgr sharedPreferenceMgr;
@Inject
private ProductRepository productRepository;
@Inject
private StockMovementRepository stockMovementRepository;
public StockMovementsPresenter() {
}
@Override
public void attachView(BaseView v) {
this.view = (StockMovementView) v;
}
public void setStockCard(long stockCardId) throws LMISException {
this.stockCard = stockRepository.queryStockCardById(stockCardId);
updateMenus();
view.updateExpiryDateViewGroup();
}
public void loadStockMovementViewModels() {
view.loading();
Subscription subscription = loadStockMovementViewModelsObserver().subscribe(loadStockMovementViewModelSubscriber());
subscriptions.add(subscription);
}
private Observer<List<StockMovementViewModel>> loadStockMovementViewModelSubscriber() {
return new Observer<List<StockMovementViewModel>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
ToastUtil.show("Database query error :" + throwable.getMessage());
}
@Override
public void onNext(List<StockMovementViewModel> stockMovementViewModels) {
stockMovementModelList.clear();
stockMovementModelList.addAll(stockMovementViewModels);
view.refreshStockMovement();
view.loaded();
}
};
}
protected Observable<List<StockMovementViewModel>> loadStockMovementViewModelsObserver() {
return Observable.create(new Observable.OnSubscribe<List<StockMovementViewModel>>() {
@Override
public void call(final Subscriber<? super List<StockMovementViewModel>> subscriber) {
try {
List<StockMovementViewModel> list = from(stockMovementRepository.listLastFiveStockMovements(stockCard.getId())).transform(new Function<StockMovementItem, StockMovementViewModel>() {
@Override
public StockMovementViewModel apply(StockMovementItem stockMovementItem) {
return new StockMovementViewModel(stockMovementItem);
}
}).toList();
subscriber.onNext(list);
subscriber.onCompleted();
} catch (LMISException e) {
subscriber.onError(e);
}
}
}).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
}
private void updateMenus() {
boolean isArchivable = !stockCard.getProduct().isKit() && stockCard.getStockOnHand() == 0;
view.updateArchiveMenus(isArchivable);
try {
String code = stockCard.getProduct().getCode();
List<KitProduct> kitProducts = productRepository.queryKitProductByKitCode(code);
boolean isUnpackable = stockCard.getProduct().isKit() && kitProducts.size() > 0 && stockCard.getStockOnHand() != 0;
view.updateUnpackKitMenu(isUnpackable);
} catch (LMISException e) {
e.reportToFabric();
}
}
public void archiveStockCard() {
stockCard.getProduct().setArchived(true);
stockRepository.updateProductOfStockCard(stockCard.getProduct());
}
public interface StockMovementView extends BaseView {
void refreshStockMovement();
void updateArchiveMenus(boolean isArchivable);
void updateUnpackKitMenu(boolean isUnpackable);
void updateExpiryDateViewGroup();
}
}