/*
* 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.view.fragment;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.google.inject.Inject;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
import org.openlmis.core.manager.SharedPreferenceMgr;
import org.openlmis.core.model.RnRForm;
import org.openlmis.core.model.RnrFormItem;
import org.openlmis.core.model.StockCard;
import org.openlmis.core.presenter.BaseReportPresenter;
import org.openlmis.core.presenter.VIARequisitionPresenter;
import org.openlmis.core.presenter.VIARequisitionView;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.utils.ToastUtil;
import org.openlmis.core.view.activity.AddDrugsToVIAActivity;
import org.openlmis.core.view.viewmodel.RequisitionFormItemViewModel;
import org.openlmis.core.view.widget.SingleClickButtonListener;
import org.openlmis.core.view.widget.ViaKitView;
import org.openlmis.core.view.widget.ViaReportConsultationNumberView;
import org.openlmis.core.view.widget.ViaRequisitionBodyView;
import org.roboguice.shaded.goole.common.base.Function;
import org.roboguice.shaded.goole.common.collect.FluentIterable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import roboguice.RoboGuice;
import roboguice.inject.InjectView;
import rx.Subscriber;
import rx.Subscription;
import rx.functions.Action1;
import static org.openlmis.core.utils.Constants.REQUEST_ADD_DRUGS_TO_VIA;
public class VIARequisitionFragment extends BaseReportFragment implements VIARequisitionView {
@InjectView(R.id.view_consultation)
ViaReportConsultationNumberView consultationView;
@InjectView(R.id.vg_kit)
ViaKitView kitView;
@InjectView(R.id.view_via_body)
ViaRequisitionBodyView bodyView;
@InjectView(R.id.vg_container)
ViewGroup vgContainer;
@Inject
VIARequisitionPresenter presenter;
private long formId;
private Date periodEndDate;
private boolean isMissedPeriod;
private ArrayList<StockCard> emergencyStockCards;
private Menu menu;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
formId = getActivity().getIntent().getLongExtra(Constants.PARAM_FORM_ID, 0);
periodEndDate = ((Date) getActivity().getIntent().getSerializableExtra(Constants.PARAM_SELECTED_INVENTORY_DATE));
isMissedPeriod = getActivity().getIntent().getBooleanExtra(Constants.PARAM_IS_MISSED_PERIOD, false);
emergencyStockCards = (ArrayList<StockCard>) getActivity().getIntent().getSerializableExtra(Constants.PARAM_SELECTED_EMERGENCY);
}
@Override
protected BaseReportPresenter injectPresenter() {
presenter = RoboGuice.getInjector(getActivity()).getInstance(VIARequisitionPresenter.class);
return presenter;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_via_requisition, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (SharedPreferenceMgr.getInstance().shouldSyncLastYearStockData()) {
ToastUtil.showInCenter(R.string.msg_stock_movement_is_not_ready);
finish();
return;
}
initUI();
if (isSavedInstanceState && presenter.getRnRForm() != null) {
presenter.updateFormUI();
} else {
loadData();
}
bodyView.autoScrollLeftToRight();
}
public void hideOrShowAddProductMenuInVIAPage() {
menu.findItem(R.id.action_add_new_drugs_to_via).setVisible(presenter.isFormProductEditable());
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_via_requisition, menu);
this.menu = menu;
hideOrShowAddProductMenuInVIAPage();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_add_new_drugs_to_via) {
ArrayList<String> productCodes = new ArrayList<>(FluentIterable.from(presenter.getRequisitionFormItemViewModels()).transform(new Function<RequisitionFormItemViewModel, String>() {
@Override
public String apply(RequisitionFormItemViewModel requisitionFormItemViewModel) {
return requisitionFormItemViewModel.getFmn();
}
}).toList());
startActivityForResult(AddDrugsToVIAActivity.getIntentToMe(getActivity(), presenter.getRnRForm().getPeriodBegin(), productCodes), REQUEST_ADD_DRUGS_TO_VIA);
return true;
}
return super.onOptionsItemSelected(item);
}
private void loadData() {
if (isFromSelectEmergencyPage()) {
presenter.loadEmergencyData(emergencyStockCards, new Date(LMISApp.getInstance().getCurrentTimeMillis()));
} else {
presenter.loadData(formId, periodEndDate);
}
}
private boolean isFromSelectEmergencyPage() {
return emergencyStockCards != null;
}
@Override
public void refreshRequisitionForm(RnRForm rnRForm) {
bodyView.refresh(rnRForm);
if (rnRForm.isEmergency()) {
refreshEmergencyRnr(rnRForm);
} else {
refreshNormalRnr(rnRForm);
}
setEditable();
hideOrShowAddProductMenuInVIAPage();
}
private void refreshNormalRnr(RnRForm rnRForm) {
consultationView.refreshNormalRnrConsultationView(presenter);
actionPanelView.setNegativeButtonVisibility(View.VISIBLE);
setTitleWithPeriod(rnRForm);
setKitValues();
}
private void refreshEmergencyRnr(RnRForm rnRForm) {
if (!rnRForm.isAuthorized()) {
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtil.showForLongTime(R.string.msg_emergency_requisition_cant_edit);
}
};
consultationView.setEditClickListener(onClickListener);
kitView.setEditClickListener(onClickListener);
}
kitView.setEmergencyKitValues();
consultationView.setEmergencyRnrHeader();
getActivity().setTitle(getString(R.string.label_emergency_requisition_title,
DateUtil.formatDateWithoutYear(new Date(LMISApp.getInstance().getCurrentTimeMillis()))));
actionPanelView.setNegativeButtonVisibility(View.GONE);
}
public void setTitleWithPeriod(RnRForm rnRForm) {
if (rnRForm != null) {
getActivity().setTitle(getString(R.string.label_requisition_title,
DateUtil.formatDateWithoutYear(rnRForm.getPeriodBegin()),
DateUtil.formatDateWithoutYear(rnRForm.getPeriodEnd())));
} else {
getActivity().setTitle(getString(R.string.title_requisition));
}
}
@Override
public void highLightApprovedAmount() {
bodyView.highLightApprovedAmount();
}
@Override
public void highLightRequestAmount() {
bodyView.highLightRequestAmount();
}
public void setEditable() {
if (presenter.getRnRForm().isAuthorized()) {
vgContainer.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
actionPanelView.setVisibility(View.GONE);
} else {
vgContainer.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
actionPanelView.setVisibility(View.VISIBLE);
}
if (LMISApp.getInstance().getFeatureToggleFor(R.bool.feature_training)) {
bodyView.setEditable(false);
} else {
bodyView.setEditable(isMissedPeriod || presenter.getRnRForm().isMissed());
}
}
private void setKitValues() {
kitView.setValue(presenter.getViaKitsViewModel());
}
@Override
public void showListInputError(int index) {
bodyView.showListInputError(index);
}
private void initUI() {
bodyView.initUI(presenter);
consultationView.initUI();
bindListeners();
}
private void bindListeners() {
actionPanelView.setListener(getOnCompleteClickListener(), getOnSaveClickListener());
bodyView.setHideImmOnTouchListener();
}
@NonNull
private SingleClickButtonListener getOnCompleteClickListener() {
return new SingleClickButtonListener() {
@Override
public void onSingleClick(View v) {
if (presenter.processRequisition(consultationView.getValue())) {
showSignDialog();
}
}
};
}
@NonNull
private SingleClickButtonListener getOnSaveClickListener() {
return new SingleClickButtonListener() {
@Override
public void onSingleClick(View v) {
loading();
Subscription subscription = presenter.getSaveFormObservable(consultationView.getValue()).subscribe(getOnSavedSubscriber());
subscriptions.add(subscription);
}
};
}
@NonNull
public Subscriber<RnRForm> getOnSavedSubscriber() {
return new Subscriber<RnRForm>() {
@Override
public void onCompleted() {
loaded();
finish();
}
@Override
public void onError(Throwable e) {
loaded();
ToastUtil.show(getString(R.string.hint_save_requisition_failed));
}
@Override
public void onNext(RnRForm rnRForm) {
}
};
}
@Override
public void setProcessButtonName(String buttonName) {
actionPanelView.setPositiveButtonText(buttonName);
}
@Override
public boolean validateConsultationNumber() {
return consultationView.validate();
}
@NonNull
@Override
public String getSignatureDialogTitle() {
return presenter.isDraftOrDraftMissed() ? getResources().getString(R.string.msg_via_submit_signature) : getResources().getString(R.string.msg_approve_signature_via);
}
@Override
protected Action1<? super Void> getOnSignedAction() {
return new Action1<Void>() {
@Override
public void call(Void aVoid) {
if (presenter.getRnRForm().isSubmitted()) {
presenter.submitRequisition();
showMessageNotifyDialog();
} else {
presenter.createStockCardsOrUnarchiveAndAddToFormForAdditionalRnrItems();
presenter.authoriseRequisition();
}
}
};
}
@Override
protected String getNotifyDialogMsg() {
return getString(R.string.msg_requisition_signature_message_notify_via);
}
@Override
public void completeSuccess() {
ToastUtil.showForLongTime(R.string.msg_requisition_submit_tip);
finish();
}
@Override
protected void finish() {
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constants.REQUEST_ADD_DRUGS_TO_VIA && resultCode == Activity.RESULT_OK) {
Date periodBegin = (Date) data.getSerializableExtra(Constants.PARAM_PERIOD_BEGIN);
List<RnrFormItem> drugInVIAs = (ArrayList<RnrFormItem>) data.getExtras().get(Constants.PARAM_ADDED_DRUGS_TO_VIA);
presenter.populateAdditionalDrugsViewModels(drugInVIAs, periodBegin);
bodyView.refreshProductNameList();
}
}
}