summaryrefslogtreecommitdiff
path: root/merchant-terminal/src/main/java/net/taler/merchantpos/order
diff options
context:
space:
mode:
Diffstat (limited to 'merchant-terminal/src/main/java/net/taler/merchantpos/order')
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/CategoriesFragment.kt4
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt78
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt10
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/Order.kt8
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderFragment.kt32
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt6
-rw-r--r--merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt10
7 files changed, 116 insertions, 32 deletions
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/CategoriesFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/CategoriesFragment.kt
index 69e74ce..8c8b1d5 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/CategoriesFragment.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/CategoriesFragment.kt
@@ -55,10 +55,10 @@ class CategoriesFragment : Fragment(), CategorySelectionListener {
layoutManager = LinearLayoutManager(requireContext())
}
- orderManager.categories.observe(viewLifecycleOwner, { categories ->
+ orderManager.categories.observe(viewLifecycleOwner) { categories ->
adapter.setItems(categories)
ui.progressBar.visibility = INVISIBLE
- })
+ }
}
override fun onCategorySelected(category: Category) {
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt
new file mode 100644
index 0000000..45aaf06
--- /dev/null
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/CustomDialogFragment.kt
@@ -0,0 +1,78 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2023 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.merchantpos.order
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Toast
+import android.widget.Toast.LENGTH_LONG
+import androidx.fragment.app.DialogFragment
+import androidx.fragment.app.activityViewModels
+import net.taler.common.Amount
+import net.taler.common.AmountParserException
+import net.taler.merchantpos.MainViewModel
+import net.taler.merchantpos.R
+import net.taler.merchantpos.config.ConfigProduct
+import net.taler.merchantpos.databinding.FragmentCustomDialogBinding
+
+class CustomDialogFragment : DialogFragment() {
+
+ companion object {
+ const val TAG = "CustomDialogFragment"
+ }
+
+ private val viewModel: MainViewModel by activityViewModels()
+
+ private lateinit var ui: FragmentCustomDialogBinding
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?,
+ ): View {
+ ui = FragmentCustomDialogBinding.inflate(inflater, container, false)
+ return ui.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ val currency = viewModel.configManager.currency ?: error("No currency")
+ ui.currencyView.text = currency
+ ui.addButton.setOnClickListener {
+ val currentOrderId =
+ viewModel.orderManager.currentOrderId.value ?: return@setOnClickListener
+ val amount = try {
+ Amount.fromString(currency, ui.amountLayout.editText!!.text.toString())
+ } catch (e: AmountParserException) {
+ Toast.makeText(requireContext(), R.string.refund_error_invalid_amount, LENGTH_LONG)
+ .show()
+ return@setOnClickListener
+ }
+ val product = ConfigProduct(
+ description = ui.productNameLayout.editText!!.text.toString(),
+ price = amount,
+ categories = listOf(Int.MIN_VALUE),
+ )
+ viewModel.orderManager.addProduct(currentOrderId, product)
+ dismiss()
+ }
+ ui.cancelButton.setOnClickListener {
+ dismiss()
+ }
+ }
+}
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt
index 10aabd4..c11b5c7 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/LiveOrder.kt
@@ -19,9 +19,9 @@ package net.taler.merchantpos.order
import androidx.annotation.UiThread
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.Transformations
+import androidx.lifecycle.map
+import net.taler.common.Amount
import net.taler.common.CombinedLiveData
-import net.taler.lib.common.Amount
import net.taler.merchantpos.config.Category
import net.taler.merchantpos.config.ConfigProduct
import net.taler.merchantpos.order.RestartState.DISABLED
@@ -31,7 +31,7 @@ import net.taler.merchantpos.order.RestartState.UNDO
internal enum class RestartState { ENABLED, DISABLED, UNDO }
internal interface LiveOrder {
- val order: LiveData<Order>
+ val order: LiveData<Order?>
val orderTotal: LiveData<Amount>
val restartState: LiveData<RestartState>
val modifyOrderAllowed: LiveData<Boolean>
@@ -50,9 +50,9 @@ internal class MutableLiveOrder(
) : LiveOrder {
private val availableCategories: Map<Int, Category>
get() = productsByCategory.keys.map { it.id to it }.toMap()
- override val order: MutableLiveData<Order> =
+ override val order: MutableLiveData<Order?> =
MutableLiveData(Order(id, currency, availableCategories))
- override val orderTotal: LiveData<Amount> = Transformations.map(order) { it.total }
+ override val orderTotal: LiveData<Amount> = order.map { it?.total ?: Amount.zero(currency) }
override val restartState = MutableLiveData(DISABLED)
private val selectedOrderLine = MutableLiveData<ConfigProduct?>()
override val selectedProductKey: String?
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/Order.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/Order.kt
index 0bea20c..a22ab0a 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/Order.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/Order.kt
@@ -16,10 +16,10 @@
package net.taler.merchantpos.order
+import net.taler.common.Amount
import net.taler.common.ContractTerms
+import net.taler.common.Timestamp
import net.taler.common.now
-import net.taler.lib.common.Amount
-import net.taler.lib.common.Timestamp
import net.taler.merchantpos.config.Category
import net.taler.merchantpos.config.ConfigProduct
import java.net.URLEncoder
@@ -73,7 +73,7 @@ data class Order(val id: Int, val currency: String, val availableCategories: Map
val categories = HashMap<Category, Int>()
products.forEach { product ->
val categoryId = product.categories[0]
- val category = availableCategories.getValue(categoryId)
+ val category = availableCategories[categoryId] ?: return@forEach // custom products
val oldQuantity = categories[category] ?: 0
categories[category] = oldQuantity + product.quantity
}
@@ -117,7 +117,7 @@ data class Order(val id: Int, val currency: String, val availableCategories: Map
}
fun toContractTerms(): ContractTerms {
- val deadline = Timestamp(now() + HOURS.toMillis(1))
+ val deadline = Timestamp.fromMillis(now() + HOURS.toMillis(1))
return ContractTerms(
summary = summary,
summaryI18n = summaryI18n,
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
index 1335b65..cdd2b67 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderFragment.kt
@@ -44,15 +44,15 @@ class OrderFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
+ savedInstanceState: Bundle?,
+ ): View {
ui = FragmentOrderBinding.inflate(inflater, container, false)
return ui.root
}
- override fun onActivityCreated(savedInstanceState: Bundle?) {
- super.onActivityCreated(savedInstanceState)
- orderManager.currentOrderId.observe(viewLifecycleOwner, { orderId ->
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ orderManager.currentOrderId.observe(viewLifecycleOwner) { orderId ->
val liveOrder = orderManager.getOrder(orderId)
onOrderSwitched(orderId, liveOrder)
// add a new OrderStateFragment for each order
@@ -60,7 +60,10 @@ class OrderFragment : Fragment() {
childFragmentManager.beginTransaction()
.replace(R.id.fragment1, OrderStateFragment())
.commit()
- })
+ }
+ ui.customButton.setOnClickListener {
+ CustomDialogFragment().show(childFragmentManager, CustomDialogFragment.TAG)
+ }
}
override fun onStart() {
@@ -74,12 +77,13 @@ class OrderFragment : Fragment() {
private fun onOrderSwitched(orderId: Int, liveOrder: LiveOrder) {
// order title
- liveOrder.order.observe(viewLifecycleOwner, { order ->
+ liveOrder.order.observe(viewLifecycleOwner) { order ->
+ if (order == null) return@observe
activity?.title = getString(R.string.order_label_title, order.title)
- })
+ }
// restart button
ui.restartButton.setOnClickListener { liveOrder.restartOrUndo() }
- liveOrder.restartState.observe(viewLifecycleOwner, { state ->
+ liveOrder.restartState.observe(viewLifecycleOwner) { state ->
beginDelayedTransition(view as ViewGroup)
if (state == UNDO) {
ui.restartButton.setText(R.string.order_undo)
@@ -90,19 +94,19 @@ class OrderFragment : Fragment() {
ui.restartButton.isEnabled = state == ENABLED
ui.completeButton.isEnabled = state == ENABLED
}
- })
+ }
// -1 and +1 buttons
- liveOrder.modifyOrderAllowed.observe(viewLifecycleOwner, { allowed ->
+ liveOrder.modifyOrderAllowed.observe(viewLifecycleOwner) { allowed ->
ui.minusButton.isEnabled = allowed
ui.plusButton.isEnabled = allowed
- })
+ }
ui.minusButton.setOnClickListener { liveOrder.decreaseSelectedOrderLine() }
ui.plusButton.setOnClickListener { liveOrder.increaseSelectedOrderLine() }
// previous and next button
ui.prevButton.isEnabled = orderManager.hasPreviousOrder(orderId)
- orderManager.hasNextOrder(orderId).observe(viewLifecycleOwner, { hasNextOrder ->
+ orderManager.hasNextOrder(orderId).observe(viewLifecycleOwner) { hasNextOrder ->
ui.nextButton.isEnabled = hasNextOrder
- })
+ }
ui.prevButton.setOnClickListener { orderManager.previousOrder() }
ui.nextButton.setOnClickListener { orderManager.nextOrder() }
// complete button
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt
index 6c5ecdf..2efdf4c 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -21,7 +21,7 @@ import android.util.Log
import androidx.annotation.UiThread
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.Transformations.map
+import androidx.lifecycle.map
import net.taler.merchantpos.R
import net.taler.merchantpos.config.Category
import net.taler.merchantpos.config.ConfigProduct
@@ -32,7 +32,7 @@ import net.taler.merchantpos.order.RestartState.ENABLED
class OrderManager(private val context: Context) : ConfigurationReceiver {
companion object {
- val TAG = OrderManager::class.java.simpleName
+ val TAG: String = OrderManager::class.java.simpleName
}
private lateinit var currency: String
@@ -150,7 +150,7 @@ class OrderManager(private val context: Context) : ConfigurationReceiver {
return currentOrderId != orders.keys.first()
}
- fun hasNextOrder(currentOrderId: Int) = map(order(currentOrderId).restartState) { state ->
+ fun hasNextOrder(currentOrderId: Int) = order(currentOrderId).restartState.map { state ->
state == ENABLED || currentOrderId != orders.keys.last()
}
diff --git a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
index 93c4f97..c4a5228 100644
--- a/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
+++ b/merchant-terminal/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
@@ -26,6 +26,7 @@ import androidx.recyclerview.selection.SelectionPredicates
import androidx.recyclerview.selection.SelectionTracker
import androidx.recyclerview.selection.StorageStrategy
import androidx.recyclerview.widget.LinearLayoutManager
+import net.taler.common.Amount
import net.taler.common.fadeIn
import net.taler.common.fadeOut
import net.taler.merchantpos.MainViewModel
@@ -82,10 +83,11 @@ class OrderStateFragment : Fragment() {
liveOrder.selectOrderLine(item)
}
})
- liveOrder.order.observe(viewLifecycleOwner, { order ->
+ liveOrder.order.observe(viewLifecycleOwner) { order ->
+ if (order == null) return@observe
onOrderChanged(order, tracker)
- })
- liveOrder.orderTotal.observe(viewLifecycleOwner, { orderTotal ->
+ }
+ liveOrder.orderTotal.observe(viewLifecycleOwner) { orderTotal: Amount ->
if (orderTotal.isZero()) {
ui.totalView.fadeOut()
ui.totalView.text = null
@@ -93,7 +95,7 @@ class OrderStateFragment : Fragment() {
ui.totalView.text = getString(R.string.order_total, orderTotal)
ui.totalView.fadeIn()
}
- })
+ }
}
override fun onSaveInstanceState(outState: Bundle) {