diff options
author | Torsten Grote <t@grobox.de> | 2020-02-14 10:49:32 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2020-02-14 12:03:15 -0300 |
commit | 4734bd6e19efc7cc37d138c8c63850cb36a596ba (patch) | |
tree | 08a601f7d8c5ca84ffb31a0ae944b9035d910825 /app | |
parent | 2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2 (diff) | |
download | merchant-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')
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) { |