diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardViewModel.kt b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardViewModel.kt index fe9a6d8..c093dee 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardViewModel.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/dashboard/DashboardViewModel.kt @@ -89,7 +89,8 @@ class DashboardViewModel @Inject constructor( private fun PayDetail.toRecord(): TrnxRecord { val baseType = transType?.takeIf { it.isNotBlank() }?.let { formatTypeLabel(it) } ?: "Transaction" val type = if (isCanceled) "Void" else baseType - val amountText = "MMK ${formatAmount(amount)}" + val displayAmount = displayAmount() + val amountText = "MMK ${formatAmount(displayAmount)}" val card = CardNo?.takeIf { it.length >= 4 }?.let { "**** ${it.takeLast(4)}" } ?: "----" val dt = buildDateTime(TradeDate, TradeTime) val approved = tradeAnswerCode == "00" || approvalCode?.isNotBlank() == true @@ -107,7 +108,31 @@ private fun PayDetail.toRecord(): TrnxRecord { fun formatAmount(amount: Long): String { val scaled = BigDecimal(amount).movePointLeft(2) - return DecimalFormat("#,###.00").format(scaled) + return DecimalFormat("#,##0.00").format(scaled) +} + +private fun PayDetail.displayAmount(): Long { + if (amount != 0L) return amount + if (transactionType != TransactionsType.SETTLEMENT.value) return 0L + + settleDataObj?.let { data -> + return data.saleAmount + + data.preAuthCompAmount + + data.cashAdvanceAmount - + data.refundAmount + } + + val parts = settleList.orEmpty().split("-") + if (parts.size >= 4) { + fun partAmount(raw: String): Long = raw.substringAfter(":", "0").toLongOrNull() ?: 0L + val sale = partAmount(parts[0]) + val cashAdvance = partAmount(parts[1]) + val refund = partAmount(parts[2]) + val preAuth = partAmount(parts[3]) + return sale + cashAdvance + preAuth - refund + } + + return 0L } private fun List.totalSaleCount(): Int = count { it.isSaleTransaction() } diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementScreen.kt b/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementScreen.kt index 7ea6c47..a9ff0d7 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementScreen.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementScreen.kt @@ -74,7 +74,10 @@ fun SettlementScreen( Spacer(modifier = Modifier.height(12.dp)) SummaryRow("Record Count", records.size.toString()) - SummaryRow("Total Amount", POSUtil.getInstance().formatAmount(totalAmount)) + SummaryRow( + "Total Amount", + POSUtil.getInstance().getDecimalAmountSeparatorFormat(totalAmount) + ) } } @@ -167,7 +170,7 @@ private fun SettlementRecordRow(record: PayDetail) { style = MaterialTheme.typography.titleSmall ) Text( - text = POSUtil.getInstance().formatAmount(record.amount), + text = POSUtil.getInstance().getDecimalAmountSeparatorFormat(record.amount), color = Color.Black, style = MaterialTheme.typography.titleSmall ) @@ -181,7 +184,7 @@ private fun SettlementRecordRow(record: PayDetail) { style = MaterialTheme.typography.bodySmall ) Text( - text = "Card ${record.cardNo.ifBlank { "-" }}", + text = "Card ${maskCardNumber(record.cardNo)}", color = Color.Gray, style = MaterialTheme.typography.bodySmall ) @@ -190,3 +193,11 @@ private fun SettlementRecordRow(record: PayDetail) { HorizontalDivider(color = Color.Gray.copy(alpha = 0.25f)) } } + +private fun maskCardNumber(cardNo: String?): String { + val pan = cardNo.orEmpty().filter { it.isDigit() } + if (pan.isBlank()) return "-" + if (pan.length <= 8) return pan + val stars = "*".repeat(pan.length - 8) + return pan.take(4) + stars + pan.takeLast(4) +} diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt b/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt index 236edc3..fefd4ab 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/settlement/SettlementViewModel.kt @@ -137,48 +137,62 @@ class SettlementViewModel @Inject constructor( } fun setSettlementData(list: List) { - val newState = list.fold(_uiState.value) { state, payDetail -> + var saleCount = 0 + var saleAmount = 0L + var preCount = 0 + var preAmount = 0L + var refundCount = 0 + var refundAmount = 0L + var caCount = 0 + var caAmount = 0L + + list.forEach { payDetail -> val transType = payDetail.transactionType val transName = payDetail.transType when { (transType == TransactionType.SALE || transName.equals("SALE", ignoreCase = true)) - && !payDetail.isCanceled -> - state.copy( - saleCount = state.saleCount + 1, - saleAmount = state.saleAmount + payDetail.amount - ) + && !payDetail.isCanceled -> { + saleCount += 1 + saleAmount += payDetail.amount + } (transType == TransactionType.PRE_SALE_COMPLETE || transName.equals("PREAUTH COMPLETION", ignoreCase = true) || transName.equals("PRE_AUTH_COMPLETE", ignoreCase = true)) - && !payDetail.isCanceled -> - state.copy( - preCount = state.preCount + 1, - preAmount = state.preAmount + payDetail.amount - ) + && !payDetail.isCanceled -> { + preCount += 1 + preAmount += payDetail.amount + } transType == TransactionType.REFUND - || transName.equals("REFUND", ignoreCase = true) -> - state.copy( - refundCount = state.refundCount + 1, - refundAmount = state.refundAmount + payDetail.amount - ) + || transName.equals("REFUND", ignoreCase = true) -> { + refundCount += 1 + refundAmount += payDetail.amount + } transType == TransactionType.CASH_ADVANCE || transName.equals("CASH_OUT", ignoreCase = true) - || transName.equals("CASH_ADVANCE", ignoreCase = true) -> - state.copy( - caCount = state.caCount + 1, - caAmount = state.caAmount + payDetail.amount - ) - - else -> state + || transName.equals("CASH_ADVANCE", ignoreCase = true) -> { + caCount += 1 + caAmount += payDetail.amount + } } } - LogUtil.d(TAG,"sale count ${newState.saleCount} and sale amount ${newState.saleAmount}") - _uiState.update { newState } + LogUtil.d(TAG, "sale count $saleCount and sale amount $saleAmount") + _uiState.update { + it.copy( + saleCount = saleCount, + saleAmount = saleAmount, + preCount = preCount, + preAmount = preAmount, + refundCount = refundCount, + refundAmount = refundAmount, + caCount = caCount, + caAmount = caAmount + ) + } } fun setSettlementSummary( @@ -264,24 +278,24 @@ class SettlementViewModel @Inject constructor( LogUtil.d(TAG,"Sale count :$sale2Count and Sale amount :$sale2Amount") val totalSaleCount = String.format(Locale.getDefault(), "%03d", sale2Count) - val totalSaleAmount = String.format(Locale.getDefault(), "%010d00", sale2Amount) + val totalSaleAmount = String.format(Locale.getDefault(), "%012d", sale2Amount) val totalRefundCount = String.format(Locale.getDefault(), "%03d", state.refundCount) val totalRefundAmount = String.format( Locale.getDefault(), - "%010d00", + "%012d", if (state.refundAmount == 0L) 0 else state.refundAmount ) val totalDebitSaleCount = String.format(Locale.getDefault(), "%03d", state.caCount) val totalDebitSaleAmount = String.format( Locale.getDefault(), - "%010d00", + "%012d", if (state.caAmount == 0L) 0 else state.caAmount ) val totalERefundCount = String.format(Locale.getDefault(), "%03d", 0) - val totalERefundAmount = String.format(Locale.getDefault(), "%010d00", 0) + val totalERefundAmount = String.format(Locale.getDefault(), "%012d", 0) val tradeData = Params.newTrade(true) val currentPayDetail = tradeData.payDetail @@ -321,10 +335,11 @@ class SettlementViewModel @Inject constructor( currentPayDetail.settleDataObj = settleData - if (hostName == HostName.BPC) { - val totalAmount = - state.saleAmount + state.preAmount + state.refundAmount + state.caAmount + val totalAmount = + state.saleAmount + state.preAmount + state.caAmount - state.refundAmount + currentPayDetail.amount = totalAmount + if (hostName == HostName.BPC) { val settlementData = if (state.refundAmount != 0L) { val creditTotal = state.saleAmount + state.preAmount + state.caAmount val subTotal = creditTotal - state.refundAmount @@ -339,7 +354,6 @@ class SettlementViewModel @Inject constructor( } currentPayDetail.settleData = settlementData - currentPayDetail.amount = totalAmount } else { LogUtil.d(TAG,"sale count :$totalSaleCount") diff --git a/app/src/test/java/com/mob/utsmyanmar/ExampleUnitTest.kt b/app/src/test/java/com/mob/utsmyanmar/ExampleUnitTest.kt index cd81654..1c5f34e 100644 --- a/app/src/test/java/com/mob/utsmyanmar/ExampleUnitTest.kt +++ b/app/src/test/java/com/mob/utsmyanmar/ExampleUnitTest.kt @@ -3,6 +3,7 @@ package com.mob.utsmyanmar import org.junit.Test import org.junit.Assert.* +import java.util.Locale /** * Example local unit test, which will execute on the development machine (host). @@ -14,4 +15,14 @@ class ExampleUnitTest { fun addition_isCorrect() { assertEquals(4, 2 + 2) } + + @Test +// 002 000057400000 000 000000000000 000 000000000000 000 000000000000 +// 013 000206000000 000 000000000000 000 000000000000 000 000000000000 +// 001 000006000000 000 000000000000 000 000000000000 000 000000000000 + fun `test settlement data `() { + val res = String.format(Locale.getDefault(), "%010d00", 600) + print("Result : $res") + } + } \ No newline at end of file