/*
* 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 com.google.inject.Inject;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.exceptions.ViewNotMatchException;
import org.openlmis.core.model.BaseInfoItem;
import org.openlmis.core.model.Regimen;
import org.openlmis.core.model.RegimenItem;
import org.openlmis.core.model.RnRForm;
import org.openlmis.core.model.repository.MMIARepository;
import org.openlmis.core.model.repository.RegimenItemRepository;
import org.openlmis.core.model.repository.RnrFormRepository;
import org.openlmis.core.view.BaseView;
import java.util.Date;
import java.util.List;
import roboguice.RoboGuice;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class MMIARequisitionPresenter extends BaseRequisitionPresenter {
MMIARequisitionView view;
private MMIARepository mmiaRepository;
@Inject
private RegimenItemRepository regimenItemRepository;
@Override
protected RnrFormRepository initRnrFormRepository() {
mmiaRepository = RoboGuice.getInjector(LMISApp.getContext()).getInstance(MMIARepository.class);
return mmiaRepository;
}
@Override
public void attachView(BaseView baseView) throws ViewNotMatchException {
if (baseView instanceof MMIARequisitionView) {
this.view = (MMIARequisitionView) baseView;
} else {
throw new ViewNotMatchException(MMIARequisitionView.class.getName());
}
super.attachView(baseView);
}
@Override
public void loadData(final long formId, Date periodEndDate) {
this.periodEndDate = periodEndDate;
view.loading();
Subscription subscription = getRnrFormObservable(formId).subscribe(loadDataOnNextAction, loadDataOnErrorAction);
subscriptions.add(subscription);
}
@Override
public void updateUIAfterSubmit() {
view.setProcessButtonName(context.getResources().getString(R.string.btn_complete));
}
@Override
protected Observable<RnRForm> getRnrFormObservable(final long formId) {
return Observable.create(new Observable.OnSubscribe<RnRForm>() {
@Override
public void call(Subscriber<? super RnRForm> subscriber) {
try {
rnRForm = getRnrForm(formId);
subscriber.onNext(rnRForm);
subscriber.onCompleted();
} catch (LMISException e) {
e.reportToFabric();
subscriber.onError(e);
}
}
}).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
}
@Override
protected int getCompleteErrorMessage() {
return R.string.hint_mmia_complete_failed;
}
@Override
public void updateFormUI() {
if (rnRForm != null) {
view.refreshRequisitionForm(rnRForm);
view.setProcessButtonName(rnRForm.isDraft() ? context.getResources().getString(R.string.btn_submit) : context.getResources().getString(R.string.btn_complete));
}
}
public boolean validateForm() {
return validateTotalsMatch(rnRForm) || rnRForm.getComments().length() >= 5;
}
public void setViewModels(List<RegimenItem> regimenItemList, List<BaseInfoItem> baseInfoItemList, String comments) {
rnRForm.setRegimenItemListWrapper(regimenItemList);
rnRForm.setBaseInfoItemListWrapper(baseInfoItemList);
rnRForm.setComments(comments);
}
private boolean validateTotalsMatch(RnRForm form) {
return RnRForm.calculateTotalRegimenAmount(form.getRegimenItemListWrapper()) == mmiaRepository.getTotalPatients(form);
}
public void setComments(String comments) {
rnRForm.setComments(comments);
}
public Observable<Void> addCustomRegimenItem(final Regimen regimen) {
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
try {
if (!isRegimeItemExists(regimen)) {
RegimenItem regimenItem = createRegimenItem(regimen);
regimenItemRepository.create(regimenItem);
rnRForm.getRegimenItemListWrapper().add(regimenItem);
}
} catch (LMISException e) {
e.reportToFabric();
subscriber.onError(e);
}
subscriber.onCompleted();
}
}).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
}
public boolean isRegimeItemExists(Regimen regimen) {
for (RegimenItem item : rnRForm.getRegimenItemListWrapper()) {
if (regimen.getId() == item.getRegimen().getId()) {
return true;
}
}
return false;
}
private RegimenItem createRegimenItem(Regimen regimen) throws LMISException {
RegimenItem regimenItem = new RegimenItem();
regimenItem.setRegimen(regimen);
regimenItem.setForm(rnRForm);
return regimenItem;
}
public Observable<Void> deleteRegimeItem(final RegimenItem item) {
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
try {
rnRForm.getRegimenItemListWrapper().remove(item);
regimenItemRepository.deleteRegimeItem(item);
} catch (LMISException e) {
e.reportToFabric();
subscriber.onError(e);
}
subscriber.onCompleted();
}
}).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
}
public Observable<Void> getSaveFormObservable(final List<RegimenItem> regimenItems, final List<BaseInfoItem> baseInfoItems, final String comment) {
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
try {
setViewModels(regimenItems, baseInfoItems, comment);
rnrFormRepository.createOrUpdateWithItems(rnRForm);
subscriber.onCompleted();
} catch (LMISException e) {
e.reportToFabric();
subscriber.onError(e);
}
}
}).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
}
public interface MMIARequisitionView extends BaseRequisitionView {
void showValidationAlert();
void setProcessButtonName(String buttonName);
}
}