From f26ba5d014f008b9a4087f552562a95b4cd6c548 Mon Sep 17 00:00:00 2001 From: 62160052 <62160052@go.buu.ac.th> Date: Sun, 2 Oct 2022 23:10:59 +0700 Subject: [PATCH] Implement sell item --- .../com/example/inventory/AddItemFragment.kt | 36 +++++++++++++- .../example/inventory/InventoryViewModel.kt | 48 +++++++++++++++++++ .../example/inventory/ItemDetailFragment.kt | 13 +++++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/example/inventory/AddItemFragment.kt b/app/src/main/java/com/example/inventory/AddItemFragment.kt index e28a61c..32efc07 100644 --- a/app/src/main/java/com/example/inventory/AddItemFragment.kt +++ b/app/src/main/java/com/example/inventory/AddItemFragment.kt @@ -21,6 +21,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager +import android.widget.TextView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController @@ -50,8 +51,16 @@ class AddItemFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.saveAction.setOnClickListener { - addNewItem() + val id = navigationArgs.itemId + if (id > 0) { + viewModel.retrieveItem(id).observe(this.viewLifecycleOwner) { selectedItem -> + item = selectedItem + bind(item) + } + } else { + binding.saveAction.setOnClickListener { + addNewItem() + } } } @@ -64,6 +73,29 @@ class AddItemFragment : Fragment() { return binding.root } + private fun updateItem() { + if (isEntryValid()) { + viewModel.updateItem( + this.navigationArgs.itemId, + this.binding.itemName.text.toString(), + this.binding.itemPrice.text.toString(), + this.binding.itemCount.text.toString() + ) + val action = AddItemFragmentDirections.actionAddItemFragmentToItemListFragment() + findNavController().navigate(action) + } + } + + private fun bind(item: Item) { + val price = "%.2f".format(item.itemPrice) + binding.apply { + itemName.setText(item.itemName, TextView.BufferType.SPANNABLE) + itemPrice.setText(price, TextView.BufferType.SPANNABLE) + itemCount.setText(item.quantityInStock.toString(), TextView.BufferType.SPANNABLE) + saveAction.setOnClickListener { updateItem() } + } + } + private fun isEntryValid(): Boolean { return viewModel.isEntryValid( binding.itemName.text.toString(), diff --git a/app/src/main/java/com/example/inventory/InventoryViewModel.kt b/app/src/main/java/com/example/inventory/InventoryViewModel.kt index f5aa0d2..1ab4bd3 100644 --- a/app/src/main/java/com/example/inventory/InventoryViewModel.kt +++ b/app/src/main/java/com/example/inventory/InventoryViewModel.kt @@ -54,6 +54,54 @@ class InventoryViewModel(private val itemDao: ItemDao) : ViewModel() { fun retrieveItem(id: Int): LiveData<Item> { return itemDao.getItem(id).asLiveData() } + + private fun updateItem(item: Item) { + viewModelScope.launch { + itemDao.update(item) + } + } + + fun sellItem(item: Item) { + if (item.quantityInStock > 0) { + // Decrease the quantity by 1 + val newItem = item.copy(quantityInStock = item.quantityInStock - 1) + updateItem(newItem) + } + } + + fun isStockAvailable(item: Item): Boolean { + return (item.quantityInStock > 0) + } + + fun deleteItem(item: Item) { + viewModelScope.launch { + itemDao.delete(item) + } + } + + private fun getUpdatedItemEntry( + itemId: Int, + itemName: String, + itemPrice: String, + itemCount: String + ): Item { + return Item( + id = itemId, + itemName = itemName, + itemPrice = itemPrice.toDouble(), + quantityInStock = itemCount.toInt() + ) + } + + fun updateItem( + itemId: Int, + itemName: String, + itemPrice: String, + itemCount: String + ) { + val updatedItem = getUpdatedItemEntry(itemId, itemName, itemPrice, itemCount) + updateItem(updatedItem) + } } /** diff --git a/app/src/main/java/com/example/inventory/ItemDetailFragment.kt b/app/src/main/java/com/example/inventory/ItemDetailFragment.kt index f5c6bbb..308eccf 100644 --- a/app/src/main/java/com/example/inventory/ItemDetailFragment.kt +++ b/app/src/main/java/com/example/inventory/ItemDetailFragment.kt @@ -72,9 +72,21 @@ class ItemDetailFragment : Fragment() { itemName.text = item.itemName itemPrice.text = item.getFormattedPrice() itemCount.text = item.quantityInStock.toString() + sellItem.isEnabled = viewModel.isStockAvailable(item) + sellItem.setOnClickListener { viewModel.sellItem(item) } + deleteItem.setOnClickListener { showConfirmationDialog() } + editItem.setOnClickListener { editItem() } } } + private fun editItem() { + val action = ItemDetailFragmentDirections.actionItemDetailFragmentToAddItemFragment( + getString(R.string.edit_fragment_title), + item.id + ) + this.findNavController().navigate(action) + } + private fun showConfirmationDialog() { MaterialAlertDialogBuilder(requireContext()) .setTitle(getString(android.R.string.dialog_alert_title)) @@ -91,6 +103,7 @@ class ItemDetailFragment : Fragment() { * Deletes the current item and navigates to the list fragment. */ private fun deleteItem() { + viewModel.deleteItem(item) findNavController().navigateUp() } -- GitLab