/* * 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.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import com.google.inject.Inject; import org.openlmis.core.R; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.googleAnalytics.ScreenName; import org.openlmis.core.manager.MovementReasonManager; import org.openlmis.core.model.Product; import org.openlmis.core.presenter.StockMovementsPresenter; import org.openlmis.core.utils.Constants; import org.openlmis.core.utils.InjectPresenter; import org.openlmis.core.utils.ToastUtil; import org.openlmis.core.view.adapter.StockMovementAdapter; import org.openlmis.core.view.fragment.SimpleSelectDialogFragment; import org.openlmis.core.view.viewmodel.InventoryViewModel; import org.openlmis.core.view.widget.LotInfoGroup; import org.openlmis.core.view.widget.SingleClickButtonListener; import org.roboguice.shaded.goole.common.base.Function; import org.roboguice.shaded.goole.common.collect.FluentIterable; import java.util.List; import roboguice.inject.ContentView; import roboguice.inject.InjectView; @ContentView(R.layout.activity_stock_movements) public class StockMovementsWithLotActivity extends BaseActivity implements StockMovementsPresenter.StockMovementView { @InjectView(R.id.list_stock_movement) ListView stockMovementList; @InjectView(R.id.stock_movement_banner) View banner; @InjectView(R.id.btn_new_movement) View btnNewMovement; @InjectView(R.id.tv_cmm) TextView tvCmm; @InjectView(R.id.label_stock_card_info) TextView tvLabelStockCardInfo; @InjectView(R.id.vg_lot_info_container) LotInfoGroup lotInfoGroup; @InjectView(R.id.stock_unpack_container) View unpackContainer; @InjectView(R.id.btn_unpack) Button btnUnpack; @InjectPresenter(StockMovementsPresenter.class) StockMovementsPresenter presenter; @Inject LayoutInflater layoutInflater; private long stockId; private String stockName; private StockMovementAdapter stockMovementAdapter; private boolean isStockCardArchivable; private boolean isActivated; private boolean isKit; List<MovementReasonManager.MovementType> movementTypes; SimpleSelectDialogFragment newMovementDialog; @Override protected ScreenName getScreenName() { return ScreenName.StockCardMovementScreen; } @Override protected void onCreate(Bundle savedInstanceState) { stockId = getIntent().getLongExtra(Constants.PARAM_STOCK_CARD_ID, 0); stockName = getIntent().getStringExtra(Constants.PARAM_STOCK_NAME); isActivated = getIntent().getBooleanExtra(Constants.PARAM_IS_ACTIVATED, true); isKit = getIntent().getBooleanExtra(Constants.PARAM_IS_KIT, false); movementTypes = MovementReasonManager.getInstance().getMovementTypes(); super.onCreate(savedInstanceState); loadStockCard(); initUI(); if (savedInstanceState == null) { presenter.loadStockMovementViewModels(); } } private void loadStockCard() { try { presenter.setStockCard(stockId); } catch (LMISException e) { ToastUtil.show(R.string.msg_db_error); finish(); } } @Override protected int getThemeRes() { return isKit ? R.style.AppTheme_TEAL : super.getThemeRes(); } private void initUI() { setTitle(stockName); showBanner(); initRecyclerView(); SingleClickButtonListener singleClickButtonListener = getSingleClickButtonListener(); btnUnpack.setOnClickListener(singleClickButtonListener); btnNewMovement.setOnClickListener(singleClickButtonListener); if (isKit) { tvLabelStockCardInfo.setText(getString(R.string.label_validate_period)); } else { tvLabelStockCardInfo.setText(getString(R.string.label_lot_info)); tvCmm.setText((presenter.getStockCard().getCMM() < 0) ? "" : String.valueOf(presenter.getStockCard().getCMM()).replaceAll("\\.?0*$", "")); } updateExpiryDateViewGroup(); } private void initRecyclerView() { View headerView = layoutInflater.inflate(R.layout.item_stock_movement_header, stockMovementList, false); stockMovementList.addHeaderView(headerView); stockMovementAdapter = new StockMovementAdapter(presenter.getStockMovementModelList(), presenter.getStockCard()); stockMovementList.setAdapter(stockMovementAdapter); } private void showBanner() { if (isActivated) { banner.setVisibility(View.GONE); } else { banner.setVisibility(View.VISIBLE); } } @Override public void updateArchiveMenus(boolean isArchivable) { isStockCardArchivable = isArchivable; invalidateOptionsMenu(); } @Override public void updateUnpackKitMenu(boolean unpackable) { unpackContainer.setVisibility(unpackable ? View.VISIBLE : View.GONE); } @Override public void updateExpiryDateViewGroup() { if (!isKit) { lotInfoGroup.setVisibility(presenter.getStockCard().getStockOnHand() == 0 ? View.INVISIBLE : View.VISIBLE); lotInfoGroup.initLotInfoGroup(presenter.getStockCard().getNonEmptyLotOnHandList()); } } @Override public void onBackPressed() { setResult(Activity.RESULT_OK); finish(); } @Override public void refreshStockMovement() { stockMovementAdapter.notifyDataSetChanged(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean isPrepared = super.onPrepareOptionsMenu(menu); menu.findItem(R.id.action_archive).setVisible(isStockCardArchivable); return isPrepared; } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_stock_movement, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_history: startActivity(StockMovementHistoryActivity.getIntentToMe(this, stockId, stockName, false, isKit)); return true; case R.id.action_archive: presenter.archiveStockCard(); ToastUtil.show(getString(R.string.msg_drug_archived)); onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } private void unpackKit() { Product product = presenter.getStockCard().getProduct(); startActivityForResult(SelectUnpackKitNumActivity.getIntentToMe(this, product.getPrimaryName(), product.getCode(), presenter.getStockCard().getStockOnHand()), Constants.REQUEST_UNPACK_KIT); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && (requestCode == Constants.REQUEST_UNPACK_KIT || requestCode == Constants.REQUEST_NEW_MOVEMENT_PAGE)) { loadStockCard(); presenter.loadStockMovementViewModels(); } } public static Intent getIntentToMe(Context context, InventoryViewModel inventoryViewModel, boolean isKit) { Intent intent = new Intent(context, StockMovementsWithLotActivity.class); intent.putExtra(Constants.PARAM_STOCK_CARD_ID, inventoryViewModel.getStockCardId()); intent.putExtra(Constants.PARAM_STOCK_NAME, inventoryViewModel.getProduct().getFormattedProductName()); intent.putExtra(Constants.PARAM_IS_ACTIVATED, inventoryViewModel.getProduct().isActive()); intent.putExtra(Constants.PARAM_IS_KIT, isKit); return intent; } public SingleClickButtonListener getSingleClickButtonListener() { final Context context = this; return new SingleClickButtonListener() { @Override public void onSingleClick(View v) { switch (v.getId()) { case R.id.btn_unpack: unpackKit(); break; case R.id.btn_new_movement: String[] selections = FluentIterable.from(movementTypes).transform(new Function<MovementReasonManager.MovementType, String>() { @Override public String apply(MovementReasonManager.MovementType movementType) { return movementType.getDescription(); } }).toArray(String.class); newMovementDialog = new SimpleSelectDialogFragment(new MovementTypeOnClickListener(), selections); newMovementDialog.show(getFragmentManager(), ""); break; } } }; } class MovementTypeOnClickListener implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if ((movementTypes.get(position).equals(MovementReasonManager.MovementType.ISSUE) || movementTypes.get(position).equals(MovementReasonManager.MovementType.NEGATIVE_ADJUST)) && presenter.getStockCard().getStockOnHand() == 0) { ToastUtil.show(R.string.msg_no_lot_for_issue); } else { startActivityForResult(NewStockMovementActivity.getIntentToMe(StockMovementsWithLotActivity.this, stockName, movementTypes.get(position), stockId, isKit), Constants.REQUEST_NEW_MOVEMENT_PAGE); } newMovementDialog.dismiss(); } } }