/*
* 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.activity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import org.joda.time.DateTime;
import org.openlmis.core.LMISApp;
import org.openlmis.core.R;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.googleAnalytics.ScreenName;
import org.openlmis.core.googleAnalytics.TrackerActions;
import org.openlmis.core.manager.SharedPreferenceMgr;
import org.openlmis.core.model.Period;
import org.openlmis.core.model.RnRForm;
import org.openlmis.core.presenter.RnRFormListPresenter;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.utils.InjectPresenter;
import org.openlmis.core.utils.ToastUtil;
import org.openlmis.core.utils.TrackRnREventUtil;
import org.openlmis.core.view.adapter.RnRFormListAdapter;
import org.openlmis.core.view.fragment.WarningDialogFragment;
import org.openlmis.core.view.holder.RnRFormViewHolder.RnRFormItemClickListener;
import org.openlmis.core.view.viewmodel.RnRFormViewModel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import roboguice.inject.ContentView;
import roboguice.inject.InjectView;
import rx.Subscriber;
import rx.Subscription;
@ContentView(R.layout.activity_rnr_list)
public class RnRFormListActivity extends BaseReportListActivity {
public static final int DEFAULT_FORM_ID_OF_NOT_AUTHORIZED = 0;
long rnrFormId = DEFAULT_FORM_ID_OF_NOT_AUTHORIZED;
@InjectView(R.id.rnr_form_list)
RecyclerView listView;
@InjectView(R.id.tv_archived_old_data)
TextView tvArchivedOldData;
@InjectPresenter(RnRFormListPresenter.class)
RnRFormListPresenter presenter;
private ArrayList<RnRFormViewModel> data;
private String programCode;
private RnRFormListAdapter adapter;
public static Intent getIntentToMe(Context context, String programCode) {
Intent intent = new Intent(context, RnRFormListActivity.class);
intent.putExtra(Constants.PARAM_PROGRAM_CODE, programCode);
return intent;
}
@Override
protected ScreenName getScreenName() {
return ScreenName.RnRFormHistoryScreen;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
programCode = getProgramCode();
setTitle(isMMIA() ? R.string.mmia_list : R.string.requisition_list);
if(!SharedPreferenceMgr.getInstance().hasDeletedOldRnr()){
tvArchivedOldData.setVisibility(View.GONE);
}
presenter.setProgramCode(programCode);
listView.setLayoutManager(new LinearLayoutManager(this));
listView.setHasFixedSize(true);
data = new ArrayList<>();
adapter = new RnRFormListAdapter(this, data, rnRFormItemClickListener);
listView.setAdapter(adapter);
loadForms();
}
private String getProgramCode() {
if (programCode == null) {
programCode = getIntent().getStringExtra(Constants.PARAM_PROGRAM_CODE);
}
return programCode;
}
@Override
protected int getThemeRes() {
return isMMIA() ? R.style.AppTheme_AMBER : R.style.AppTheme_PURPLE;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case Constants.REQUEST_FROM_RNR_LIST_PAGE:
loadForms();
break;
case Constants.REQUEST_SELECT_PERIOD_END:
Date periodEndDate = (Date) data.getSerializableExtra(Constants.PARAM_SELECTED_INVENTORY_DATE);
boolean isMissedPeriod = data.getBooleanExtra(Constants.PARAM_IS_MISSED_PERIOD, false);
createRequisition(periodEndDate, isMissedPeriod);
break;
}
}
protected void loadForms() {
if (!isLoading) {
loading();
Subscription subscription = presenter.loadRnRFormList().subscribe(getRnRFormSubscriber());
subscriptions.add(subscription);
}
}
protected RnRFormItemClickListener rnRFormItemClickListener = new RnRFormItemClickListener() {
@Override
public void deleteForm(final RnRForm form) {
WarningDialogFragment warningDialogFragment = WarningDialogFragment.newInstance(
R.string.msg_del_requisition, R.string.btn_del, R.string.dialog_cancel
);
warningDialogFragment.setDelegate(new WarningDialogFragment.DialogDelegate() {
@Override
public void onPositiveClick() {
deleteRnRForm(form);
}
});
warningDialogFragment.show(getFragmentManager(), "WarningDialogFragment");
}
@Override
public void clickBtnView(RnRFormViewModel model, View view) {
switch (model.getType()) {
case RnRFormViewModel.TYPE_UNCOMPLETE_INVENTORY_IN_CURRENT_PERIOD:
startActivityForResult(PhysicalInventoryActivity.getIntentToMe(RnRFormListActivity.this), Constants.REQUEST_FROM_RNR_LIST_PAGE);
break;
case RnRFormViewModel.TYPE_INVENTORY_DONE:
startActivityForResult(SelectPeriodActivity.getIntentToMe(RnRFormListActivity.this, model.getProgramCode()), Constants.REQUEST_SELECT_PERIOD_END);
TrackRnREventUtil.trackRnRListEvent(TrackerActions.CreateRnR, programCode);
break;
case RnRFormViewModel.TYPE_SYNCED_HISTORICAL:
rnrFormId = model.getId();
goToRequisitionPage(rnrFormId);
break;
case RnRFormViewModel.TYPE_FIRST_MISSED_PERIOD:
startActivityForResult(SelectPeriodActivity.getIntentToMe(RnRFormListActivity.this, model.getProgramCode(), true), Constants.REQUEST_SELECT_PERIOD_END);
break;
default:
rnrFormId = DEFAULT_FORM_ID_OF_NOT_AUTHORIZED;
goToRequisitionPage(rnrFormId);
break;
}
view.setEnabled(true);
}
};
private void goToRequisitionPage(long rnrFormId) {
Intent intent = isMMIA() ? MMIARequisitionActivity.getIntentToMe(this, rnrFormId) : VIARequisitionActivity.getIntentToMe(this, rnrFormId);
startActivityForResult(intent, Constants.REQUEST_FROM_RNR_LIST_PAGE);
}
private boolean isMMIA() {
return Constants.MMIA_PROGRAM_CODE.equals(getProgramCode());
}
private void createRequisition(Date periodEndDate, boolean isMissedPeriod) {
Intent intent = isMMIA() ? MMIARequisitionActivity.getIntentToMe(this, periodEndDate)
: VIARequisitionActivity.getIntentToMe(this, periodEndDate, isMissedPeriod);
startActivityForResult(intent, Constants.REQUEST_FROM_RNR_LIST_PAGE);
}
private void deleteRnRForm(RnRForm form) {
try {
presenter.deleteRnRForm(form);
Subscription subscription = presenter.loadRnRFormList().subscribe(getRnRFormSubscriber());
subscriptions.add(subscription);
} catch (LMISException e) {
ToastUtil.show(getString(R.string.requisition_delete_failed));
e.printStackTrace();
}
}
protected Subscriber<List<RnRFormViewModel>> getRnRFormSubscriber() {
return new Subscriber<List<RnRFormViewModel>>() {
@Override
public void onCompleted() {
loaded();
}
@Override
public void onError(Throwable e) {
loaded();
ToastUtil.show(e.getMessage());
}
@Override
public void onNext(List<RnRFormViewModel> rnRFormViewModels) {
data.clear();
data.addAll(rnRFormViewModels);
adapter.notifyDataSetChanged();
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu_rnr_list, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean isPrepare = super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.action_create_emergency_rnr).setVisible(!isMMIA());
return isPrepare;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_create_emergency_rnr:
checkAndGotoEmergencyPage();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
protected void checkAndGotoEmergencyPage() {
int dayOfMonth = new DateTime(LMISApp.getInstance().getCurrentTimeMillis()).getDayOfMonth();
if (dayOfMonth >= Period.INVENTORY_BEGIN_DAY && dayOfMonth < Period.INVENTORY_END_DAY_NEXT) {
ToastUtil.showForLongTime(R.string.msg_create_emergency_date_invalid);
return;
}
loading();
presenter.hasMissedPeriod().subscribe(new Subscriber<Boolean>() {
@Override
public void onCompleted() {
loaded();
}
@Override
public void onError(Throwable e) {
loaded();
ToastUtil.show(e.getMessage());
}
@Override
public void onNext(Boolean hasMissed) {
if (hasMissed) {
ToastUtil.showForLongTime(R.string.msg_create_emergency_has_missed);
} else {
startActivityForResult(SelectEmergencyProductsActivity.getIntentToMe(RnRFormListActivity.this), Constants.REQUEST_FROM_RNR_LIST_PAGE);
}
}
});
}
}