diff options
author | Torsten Grote <t@grobox.de> | 2020-02-12 10:33:17 -0300 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2020-02-14 12:03:14 -0300 |
commit | 2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2 (patch) | |
tree | 4708b14e14e5bbe257e0bda40120d3bb6f931c21 | |
parent | 0ea377bdfa3205d4c611e0dcc472125fe2de07cb (diff) | |
download | merchant-terminal-android-2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2.tar.gz merchant-terminal-android-2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2.tar.bz2 merchant-terminal-android-2cbfec1bdcc5ada8fb20094eb3a9d071316a13e2.zip |
Use product categories for order summary
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) |