summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorTorsten Grote <t@grobox.de>2020-03-02 17:23:15 -0300
committerTorsten Grote <t@grobox.de>2020-03-02 17:23:15 -0300
commitcac721adaf3726f01536fed6eed218a8b76925f2 (patch)
treeb155a4eafdcc83641033d1f204cbc756037271a9 /app
parent05c2d35a1e490bd3c9cb1d8f2de5f3c98d9cdc27 (diff)
downloadmerchant-terminal-android-cac721adaf3726f01536fed6eed218a8b76925f2.tar.gz
merchant-terminal-android-cac721adaf3726f01536fed6eed218a8b76925f2.tar.bz2
merchant-terminal-android-cac721adaf3726f01536fed6eed218a8b76925f2.zip
Use new i18n JSOn format
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/Definitions.kt93
-rw-r--r--app/src/main/java/net/taler/merchantpos/order/OrderManager.kt8
-rw-r--r--app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt8
3 files changed, 71 insertions, 38 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 065f2d2..1e6e37b 100644
--- a/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/Definitions.kt
@@ -2,6 +2,8 @@ package net.taler.merchantpos.order
import androidx.core.os.LocaleListCompat
import com.fasterxml.jackson.annotation.JsonIgnore
+import com.fasterxml.jackson.annotation.JsonInclude
+import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL
import com.fasterxml.jackson.annotation.JsonProperty
import net.taler.merchantpos.Amount
import java.util.*
@@ -11,30 +13,31 @@ import kotlin.collections.HashMap
data class Category(
val id: Int,
- val name: Map<String, String>
+ val name: String,
+ @JsonProperty("name_i18n")
+ val nameI18n: Map<String, String>?
) {
- val defaultName: String? get() = name["_"]
var selected: Boolean = false
- val localizedName: String get() = getLocalizedString(name, defaultName!!)
+ val localizedName: String get() = getLocalizedString(nameI18n, name)
}
abstract class Product {
abstract val id: String
- abstract val description: Map<String, String>
+ abstract val description: String
+ abstract val descriptionI18n: Map<String, String>?
abstract val price: String
abstract val location: String?
@get:JsonIgnore
- val defaultDescription: String?
- get() = description["_"]
- @get:JsonIgnore
val localizedDescription: String
- get() = getLocalizedString(description, defaultDescription!!)
+ get() = getLocalizedString(descriptionI18n, description)
}
data class ConfigProduct(
@JsonProperty("product_id")
override val id: String,
- override val description: Map<String, String>,
+ override val description: String,
+ @JsonProperty("description_i18n")
+ override val descriptionI18n: Map<String, String>?,
override val price: String,
@JsonProperty("delivery_location")
override val location: String?,
@@ -61,8 +64,10 @@ data class ConfigProduct(
data class ContractProduct(
@JsonProperty("product_id")
override val id: String,
- @get:JsonIgnore
- override val description: Map<String, String>,
+ override val description: String,
+ @JsonInclude(NON_NULL)
+ @JsonProperty("description_i18n")
+ override val descriptionI18n: Map<String, String>?,
override val price: String,
@JsonProperty("delivery_location")
override val location: String?,
@@ -71,20 +76,16 @@ data class ContractProduct(
constructor(product: ConfigProduct) : this(
product.id,
product.description,
+ product.descriptionI18n,
product.price,
product.location,
product.quantity
)
-
- // TODO remove once backend supports i18n
- @get:JsonProperty("description")
- val tmpDescription: String
- get() = localizedDescription
}
-private fun getLocalizedString(map: Map<String, String>, default: String): String {
+private fun getLocalizedString(map: Map<String, String>?, default: String): String {
// just return the default, if it is the only element
- if (map.size == 1) return default
+ if (map == null) return default
// create a priority list of language ranges from system locales
val locales = LocaleListCompat.getDefault()
val priorityList = ArrayList<LanguageRange>(locales.size())
@@ -109,19 +110,10 @@ private fun getLocalizedString(map: Map<String, String>, default: String): Strin
data class Order(val id: Int, val availableCategories: Map<Int, Category>) {
val products = ArrayList<ConfigProduct>()
val title: String = id.toString()
- val summary: String // TODO also support i18n map here?
- get() {
- val categories = HashMap<Category, Int>()
- products.forEach { product ->
- val categoryId = product.categories[0]
- val category = availableCategories.getValue(categoryId)
- val oldQuantity = categories[category] ?: 0
- categories[category] = oldQuantity + product.quantity
- }
- return categories.map { (category, quantity) ->
+ val summary: String
+ get() = getCategoryQuantities().map { (category: Category, quantity: Int) ->
"$quantity x ${category.localizedName}"
- }.joinToString()
- }
+ }.joinToString()
val total: Double
get() {
var total = 0.0
@@ -156,4 +148,45 @@ data class Order(val id: Int, val availableCategories: Map<Int, Category>) {
}
return this
}
+
+ private fun getCategoryQuantities(): HashMap<Category, Int> {
+ val categories = HashMap<Category, Int>()
+ products.forEach { product ->
+ val categoryId = product.categories[0]
+ val category = availableCategories.getValue(categoryId)
+ val oldQuantity = categories[category] ?: 0
+ categories[category] = oldQuantity + product.quantity
+ }
+ return categories
+ }
+
+ /**
+ * Returns a map of i18n summaries for each locale present in *all* given [Category]s
+ * or null if there's no locale that fulfills this criteria.
+ */
+ val summaryI18n: Map<String, String>?
+ get() {
+ val categoryQuantities = getCategoryQuantities()
+ // get all available locales
+ val availableLocales = categoryQuantities.mapNotNull { (category, _) ->
+ val nameI18n = category.nameI18n
+ // if one category doesn't have locales, we can return null here already
+ nameI18n?.keys ?: return null
+ }.flatten().toHashSet()
+ // remove all locales not supported by all categories
+ categoryQuantities.forEach { (category, _) ->
+ // category.nameI18n should be non-null now
+ availableLocales.retainAll(category.nameI18n!!.keys)
+ if (availableLocales.isEmpty()) return null
+ }
+ return availableLocales.map { locale ->
+ Pair(
+ locale, categoryQuantities.map { (category, quantity) ->
+ // category.nameI18n should be non-null now
+ "$quantity x ${category.nameI18n!![locale]}"
+ }.joinToString()
+ )
+ }.toMap()
+ }
+
}
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 7fdefbb..21738bb 100644
--- a/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/order/OrderManager.kt
@@ -54,10 +54,6 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
productsByCategory.clear()
val seenIds = ArrayList<String>()
products.forEach { product ->
- if (product.defaultDescription == null) {
- Log.e(TAG, "Product $product has no default description \"_\"")
- return false
- }
val productCurrency = fromString(product.price).currency
if (productCurrency != currency) {
Log.e(TAG, "Product $product has currency $productCurrency, $currency expected")
@@ -77,10 +73,6 @@ class OrderManager(private val mapper: ObjectMapper) : ConfigurationReceiver {
if (productsByCategory.containsKey(category)) {
productsByCategory[category]?.add(product)
} else {
- if (category.defaultName == null) {
- Log.e(TAG, "Category $category has no default description \"_\"")
- return false
- }
productsByCategory[category] = ArrayList<ConfigProduct>().apply { add(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 8167f86..c5ea6ec 100644
--- a/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
+++ b/app/src/main/java/net/taler/merchantpos/payment/PaymentManager.kt
@@ -32,6 +32,10 @@ class PaymentManager(
private val mapper: ObjectMapper
) {
+ companion object {
+ val TAG = PaymentManager::class.java.simpleName
+ }
+
private val mPayment = MutableLiveData<Payment>()
val payment: LiveData<Payment> = mPayment
@@ -54,6 +58,7 @@ class PaymentManager(
val currency = merchantConfig.currency!!
val amount = "$currency:${order.totalAsString}"
val summary = order.summary
+ val summaryI18n = order.summaryI18n
mPayment.value = Payment(order, summary, currency)
@@ -64,6 +69,7 @@ class PaymentManager(
put("order", JSONObject().apply {
put("amount", amount)
put("summary", summary)
+ if (summaryI18n != null) put("summary_i18n", order.summaryI18n)
// fulfillment_url needs to be unique per order
put("fulfillment_url", fulfillmentUrl)
put("instance", "default")
@@ -71,6 +77,8 @@ class PaymentManager(
})
}
+ Log.d(TAG, body.toString(4))
+
val req = MerchantRequest(POST, merchantConfig, "order", null, body,
Listener { onOrderCreated(it) },
ErrorListener { onNetworkError(it) }