summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2020-02-14 10:49:32 -0300
committerTorsten Grote <t@grobox.de>2020-02-14 12:03:15 -0300
commit4734bd6e19efc7cc37d138c8c63850cb36a596ba (patch)
tree08a601f7d8c5ca84ffb31a0ae944b9035d910825 /app
parent2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2 (diff)
downloadmerchant-terminal-android-4734bd6e19efc7cc37d138c8c63850cb36a596ba.tar.gz
merchant-terminal-android-4734bd6e19efc7cc37d138c8c63850cb36a596ba.tar.bz2
merchant-terminal-android-4734bd6e19efc7cc37d138c8c63850cb36a596ba.zip
Introduce different product classes for re-use in other taler apps
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/Definitions.kt47
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/OrderManager.kt14
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt2
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt10
-rw-r--r--app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt14
5 files changed, 52 insertions, 35 deletions
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 ee17655..57666d7 100644
--- a/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
@@ -1,6 +1,5 @@
package net.taler.merchantpos.order
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import net.taler.merchantpos.Amount
@@ -11,21 +10,45 @@ data class Category(
var selected: Boolean = false
}
-@JsonIgnoreProperties("priceAsDouble")
-data class Product(
+interface Product {
+ val id: String
+ val description: String
+ val price: String
+ val location: String?
+}
+
+data class ConfigProduct(
@JsonProperty("product_id")
- val id: String,
- val description: String,
- val price: String,
- val categories: List<Int>,
+ override val id: String,
+ override val description: String,
+ override val price: String,
@JsonProperty("delivery_location")
- val location: String
-) {
+ override val location: String?,
+ val categories: List<Int>
+) : Product {
val priceAsDouble by lazy { Amount.fromString(price).amount.toDouble() }
}
+data class ContractProduct(
+ @JsonProperty("product_id")
+ override val id: String,
+ override val description: String,
+ override val price: String,
+ @JsonProperty("delivery_location")
+ override val location: String?,
+ val quantity: Int
+) : Product {
+ constructor(product: ConfigProduct, quantity: Int) : this(
+ product.id,
+ product.description,
+ product.price,
+ product.location,
+ quantity
+ )
+}
+
data class Order(val availableCategories: Map<Int, Category>) {
- val products = HashMap<Product, Int>()
+ val products = HashMap<ConfigProduct, Int>()
val summary: String
get() {
val categories = HashMap<Category, Int>()
@@ -51,10 +74,10 @@ data class Order(val availableCategories: Map<Int, Category>) {
val totalAsString: String
get() = String.format("%.2f", total)
- operator fun plus(product: Product): Order {
+ operator fun plus(product: ConfigProduct): Order {
products[product] = (products[product] ?: 0) + 1
return this
}
}
-typealias OrderLine = Pair<Product, Int>
+typealias OrderLine = Pair<ConfigProduct, 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 55a3be6..124e73a 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -22,7 +22,7 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
val TAG = OrderManager::class.java.simpleName
}
- private val productsByCategory = HashMap<Category, ArrayList<Product>>()
+ private val productsByCategory = HashMap<Category, ArrayList<ConfigProduct>>()
private val mOrder = MutableLiveData<Order>()
private val newOrder // an empty order containing only available categories
@@ -30,8 +30,8 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
internal val order: LiveData<Order> = mOrder
internal val orderTotal: LiveData<Double> = map(mOrder) { it.total }
- private val mProducts = MutableLiveData<List<Product>>()
- internal val products: LiveData<List<Product>> = mProducts
+ private val mProducts = MutableLiveData<List<ConfigProduct>>()
+ internal val products: LiveData<List<ConfigProduct>> = mProducts
private val mCategories = MutableLiveData<List<Category>>()
internal val categories: LiveData<List<Category>> = mCategories
@@ -55,8 +55,8 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
// parse products (live data gets updated in setCurrentCategory())
val productsStr = json.getJSONArray("products").toString()
- val productsType = object : TypeReference<List<Product>>() {}
- val products: List<Product> = mapper.readValue(productsStr, productsType)
+ val productsType = object : TypeReference<List<ConfigProduct>>() {}
+ val products: List<ConfigProduct> = mapper.readValue(productsStr, productsType)
// group products by categories
productsByCategory.clear()
@@ -75,7 +75,7 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
if (productsByCategory.containsKey(category)) {
productsByCategory[category]?.add(product)
} else {
- productsByCategory[category] = ArrayList<Product>().apply { add(product) }
+ productsByCategory[category] = ArrayList<ConfigProduct>().apply { add(product) }
}
}
}
@@ -98,7 +98,7 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
}
@UiThread
- internal fun addProduct(product: Product) {
+ internal fun addProduct(product: ConfigProduct) {
val order = mOrder.value ?: newOrder
mOrder.value = order + product
mRestartState.value = ENABLED
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 9948599..6a0aa2b 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderStateFragment.kt
@@ -65,7 +65,7 @@ private class OrderAdapter : RecyclerView.Adapter<OrderViewHolder>() {
holder.bind(orderLines[position])
}
- fun setItems(items: HashMap<Product, Int>) {
+ fun setItems(items: HashMap<ConfigProduct, Int>) {
orderLines.clear()
items.forEach { t -> orderLines.add(t.toPair()) }
notifyDataSetChanged()
diff --git a/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt b/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt
index 0fef4bd..d680fff 100644
--- a/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/ProductsFragment.kt
@@ -18,7 +18,7 @@ import net.taler.merchantpos.R
import net.taler.merchantpos.order.ProductAdapter.ProductViewHolder
interface ProductSelectionListener {
- fun onProductSelected(product: Product)
+ fun onProductSelected(product: ConfigProduct)
}
class ProductsFragment : Fragment(), ProductSelectionListener {
@@ -51,7 +51,7 @@ class ProductsFragment : Fragment(), ProductSelectionListener {
})
}
- override fun onProductSelected(product: Product) {
+ override fun onProductSelected(product: ConfigProduct) {
orderManager.addProduct(product)
}
@@ -61,7 +61,7 @@ private class ProductAdapter(
private val listener: ProductSelectionListener
) : Adapter<ProductViewHolder>() {
- private val products = ArrayList<Product>()
+ private val products = ArrayList<ConfigProduct>()
override fun getItemCount() = products.size
@@ -75,7 +75,7 @@ private class ProductAdapter(
holder.bind(products[position])
}
- fun setItems(items: List<Product>) {
+ fun setItems(items: List<ConfigProduct>) {
products.clear()
products.addAll(items)
notifyDataSetChanged()
@@ -85,7 +85,7 @@ private class ProductAdapter(
private val name: TextView = v.findViewById(R.id.name)
private val price: TextView = v.findViewById(R.id.price)
- fun bind(product: Product) {
+ fun bind(product: ConfigProduct) {
name.text = product.description
price.text = product.priceAsDouble.toString()
v.setOnClickListener { listener.onProductSelected(product) }
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 258149e..30b417d 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
@@ -12,9 +12,9 @@ import com.android.volley.Response.ErrorListener
import com.android.volley.Response.Listener
import com.android.volley.VolleyError
import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.databind.node.ObjectNode
import net.taler.merchantpos.config.ConfigManager
import net.taler.merchantpos.config.MerchantRequest
+import net.taler.merchantpos.order.ContractProduct
import net.taler.merchantpos.order.Order
import org.json.JSONArray
import org.json.JSONObject
@@ -79,15 +79,9 @@ class PaymentManager(
}
private fun Order.getProductsJson(): JSONArray {
- val json = JSONArray()
- products.forEach { (product, quantity) ->
- val node = mapper.valueToTree<ObjectNode>(product).apply {
- remove("categories")
- put("quantity", quantity)
- }
- json.put(JSONObject(mapper.writeValueAsString(node)))
- }
- return json
+ val contractProducts = products.map { ContractProduct(it.key, it.value) }
+ val productsStr = mapper.writeValueAsString(contractProducts)
+ return JSONArray(productsStr)
}
private fun onOrderCreated(orderResponse: JSONObject) {