summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2020-02-12 10:33:17 -0300
committerTorsten Grote <t@grobox.de>2020-02-14 12:03:14 -0300
commit2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2 (patch)
tree4708b14e14e5bbe257e0bda40120d3bb6f931c21
parent0ea377bdfa3205d4c611e0dcc472125fe2de07cb (diff)
downloadmerchant-terminal-android-2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2.tar.gz
merchant-terminal-android-2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2.tar.bz2
merchant-terminal-android-2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2.zip
Use product categories for order summary
-rw-r--r--app/build.gradle4
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/Definitions.kt33
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/OrderManager.kt25
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt2
-rw-r--r--app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt10
-rw-r--r--app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt3
6 files changed, 45 insertions, 32 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 3a6c23b..4eea459 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -37,13 +37,13 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
- implementation 'androidx.core:core-ktx:1.1.0'
+ implementation 'androidx.core:core-ktx:1.2.0'
implementation 'com.google.android.material:material:1.1.0-rc02'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "androidx.recyclerview:recyclerview:1.1.0"
// Navigation
- def nav_version = "2.2.0"
+ def nav_version = "2.2.1"
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
diff --git a/app/src/main/java/net/taler/merchantpos/order/Definitions.kt b/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
index 569993c..ee17655 100644
--- a/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
@@ -24,6 +24,37 @@ data class Product(
val priceAsDouble by lazy { Amount.fromString(price).amount.toDouble() }
}
-typealias Order = HashMap<Product, Int>
+data class Order(val availableCategories: Map<Int, Category>) {
+ val products = HashMap<Product, Int>()
+ val summary: String
+ get() {
+ val categories = HashMap<Category, Int>()
+ products.forEach { (product, quantity) ->
+ val categoryId = product.categories[0]
+ val category = availableCategories.getValue(categoryId)
+ val oldQuantity = categories[category] ?: 0
+ categories[category] = oldQuantity + quantity
+ }
+ return categories.map { (category, quantity) ->
+ "$quantity x ${category.name}"
+ }.joinToString()
+ }
+ val total: Double
+ get() {
+ var total = 0.0
+ products.forEach { (product, quantity) ->
+ val price = product.priceAsDouble
+ total += price * quantity
+ }
+ return total
+ }
+ val totalAsString: String
+ get() = String.format("%.2f", total)
+
+ operator fun plus(product: Product): Order {
+ products[product] = (products[product] ?: 0) + 1
+ return this
+ }
+}
typealias OrderLine = Pair<Product, Int>
diff --git a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
index 42a2060..55a3be6 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -25,8 +25,10 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
private val productsByCategory = HashMap<Category, ArrayList<Product>>()
private val mOrder = MutableLiveData<Order>()
+ private val newOrder // an empty order containing only available categories
+ get() = Order(productsByCategory.keys.map { it.id to it }.toMap())
internal val order: LiveData<Order> = mOrder
- internal val orderTotal: LiveData<Double> = map(mOrder) { it.getTotal() }
+ internal val orderTotal: LiveData<Double> = map(mOrder) { it.total }
private val mProducts = MutableLiveData<List<Product>>()
internal val products: LiveData<List<Product>> = mProducts
@@ -97,10 +99,8 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
@UiThread
internal fun addProduct(product: Product) {
- val map = mOrder.value ?: HashMap()
- val quantity = map[product] ?: 0
- map[product] = quantity + 1
- mOrder.value = map
+ val order = mOrder.value ?: newOrder
+ mOrder.value = order + product
mRestartState.value = ENABLED
}
@@ -112,22 +112,9 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
undoOrder = null
} else {
undoOrder = mOrder.value
- mOrder.value = HashMap()
+ mOrder.value = newOrder
mRestartState.value = UNDO
}
}
}
-
-fun Order.getTotal(): Double {
- var total = 0.0
- forEach {
- val price = it.key.priceAsDouble
- total += price * it.value
- }
- return total
-}
-
-fun Order.getTotalAsString(): String {
- return String.format("%.2f", getTotal())
-}
diff --git a/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt b/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
index b473b5d..9948599 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
@@ -36,7 +36,7 @@ class OrderStateFragment : Fragment() {
}
orderManager.order.observe(viewLifecycleOwner, Observer { order ->
- adapter.setItems(order)
+ adapter.setItems(order.products)
})
orderManager.orderTotal.observe(viewLifecycleOwner, Observer { orderTotal ->
if (orderTotal == 0.0) {
diff --git a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
index 99780b0..258149e 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
@@ -16,7 +16,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode
import net.taler.merchantpos.config.ConfigManager
import net.taler.merchantpos.config.MerchantRequest
import net.taler.merchantpos.order.Order
-import net.taler.merchantpos.order.getTotalAsString
import org.json.JSONArray
import org.json.JSONObject
import java.net.URLEncoder
@@ -53,11 +52,8 @@ class PaymentManager(
val merchantConfig = configManager.merchantConfig!!
val currency = merchantConfig.currency!!
- val orderTotal = order.getTotalAsString()
- val amount = "$currency:$orderTotal"
- val summary = order.map {
- "${it.value} x ${it.key.description}"
- }.joinToString()
+ val amount = "$currency:${order.totalAsString}"
+ val summary = order.summary
mPayment.value = Payment(order, summary, currency)
@@ -84,7 +80,7 @@ class PaymentManager(
private fun Order.getProductsJson(): JSONArray {
val json = JSONArray()
- forEach { product, quantity ->
+ products.forEach { (product, quantity) ->
val node = mapper.valueToTree<ObjectNode>(product).apply {
remove("categories")
put("quantity", quantity)
diff --git a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
index 138bff3..a7195ec 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/ProcessPaymentFragment.kt
@@ -14,7 +14,6 @@ import kotlinx.android.synthetic.main.fragment_process_payment.*
import net.taler.merchantpos.MainViewModel
import net.taler.merchantpos.QrCodeManager.makeQrCode
import net.taler.merchantpos.R
-import net.taler.merchantpos.order.getTotalAsString
class ProcessPaymentFragment : Fragment() {
@@ -47,7 +46,7 @@ class ProcessPaymentFragment : Fragment() {
model.orderManager.restartOrUndo()
return
}
- text_view_amount.text = "${payment.order.getTotalAsString()} ${payment.currency}"
+ text_view_amount.text = "${payment.order.totalAsString} ${payment.currency}"
text_view_order_reference.text = "Order Reference: ${payment.orderId}"
payment.talerPayUri?.let {
val qrcodeBitmap = makeQrCode(it)