Compare commits
4 Commits
948aba0a8a
...
2937a747c8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2937a747c8 | ||
|
|
d32b233d9e | ||
|
|
f3ee2aef4c | ||
|
|
7ebc3a50d6 |
@ -4,8 +4,10 @@ import android.content.Context
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.Network
|
||||
import android.net.NetworkCapabilities
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.compose.animation.core.LinearEasing
|
||||
import androidx.compose.animation.core.animateFloatAsState
|
||||
import androidx.compose.animation.core.tween
|
||||
@ -100,6 +102,7 @@ import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlin.time.Duration.Companion.milliseconds
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
@Composable
|
||||
fun DashboardScreen2(
|
||||
onNavigateAmount: (String) -> Unit = {},
|
||||
@ -473,8 +476,8 @@ fun DashboardScreen2(
|
||||
|
||||
@Composable
|
||||
private fun AdvertisingArea(
|
||||
modifier: Modifier = Modifier,
|
||||
carouselUrls: List<String> = emptyList(),
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
val imageModels: List<Any> = carouselUrls.ifEmpty {
|
||||
listOf(R.drawable.sunmi1, R.drawable.sunmi2, R.drawable.sunmi3)
|
||||
@ -529,7 +532,7 @@ private fun SummaryCard(
|
||||
var now by remember { mutableLongStateOf(System.currentTimeMillis()) }
|
||||
LaunchedEffect(Unit) {
|
||||
while (true) {
|
||||
delay(30_000)
|
||||
delay(30_000.milliseconds)
|
||||
now = System.currentTimeMillis()
|
||||
}
|
||||
}
|
||||
@ -690,15 +693,15 @@ private fun buildMenuItems(
|
||||
tint = Color.LegacyRed
|
||||
)
|
||||
}) { onNavigateAmount("Sale") },
|
||||
DashboardMenuItem(
|
||||
"MMQR",
|
||||
{
|
||||
Image(
|
||||
painter = painterResource(R.drawable.ic_mmqr_logo),
|
||||
contentDescription = null,
|
||||
modifier = Modifier.height(48.dp)
|
||||
)
|
||||
}) { },
|
||||
// DashboardMenuItem(
|
||||
// "MMQR",
|
||||
// {
|
||||
// Image(
|
||||
// painter = painterResource(R.drawable.ic_mmqr_logo),
|
||||
// contentDescription = null,
|
||||
// modifier = Modifier.height(48.dp)
|
||||
// )
|
||||
// }) { },
|
||||
DashboardMenuItem(
|
||||
"History",
|
||||
{
|
||||
@ -987,10 +990,10 @@ private fun TrnxRow(record: TrnxRecord) {
|
||||
|
||||
Column(modifier = Modifier.weight(1f)) {
|
||||
Text(
|
||||
text = if (record.isVoided) "${record.typeLabel} (Voided)" else record.typeLabel,
|
||||
text =record.typeLabel,
|
||||
fontSize = 13.sp,
|
||||
fontWeight = FontWeight.SemiBold,
|
||||
color = if (record.isVoided) Color.Gray else Color.Black
|
||||
color = Color.Black
|
||||
)
|
||||
Text(
|
||||
text = record.maskedCard,
|
||||
@ -1063,6 +1066,7 @@ private val previewTransactions = listOf(
|
||||
),
|
||||
)
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
@P3Preview
|
||||
@P2Preview
|
||||
@Composable
|
||||
@ -1081,6 +1085,7 @@ fun PreviewItem() {
|
||||
}
|
||||
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
@Composable
|
||||
private fun rememberIsOnline() = run {
|
||||
val context = LocalContext.current
|
||||
@ -1155,4 +1160,4 @@ fun Item(
|
||||
trailingIcon?.invoke()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,14 +29,14 @@ class DashboardViewModel @Inject constructor(
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
repository.getAllTrans().asFlow().collect { payDetails ->
|
||||
_uiState.update {
|
||||
it.copy(
|
||||
recentTransactions = payDetails.take(10).map { pd -> pd.toRecord() }
|
||||
)
|
||||
repository.getLastTenTransactions().asFlow().collect { payDetails ->
|
||||
_uiState.update {
|
||||
it.copy(
|
||||
recentTransactions = payDetails.map { pd -> pd.toRecord() }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
refreshLastSyncTime()
|
||||
loadCarouselUrls()
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import androidx.activity.ComponentActivity
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import androidx.navigation.NavHostController
|
||||
import androidx.navigation.NavType
|
||||
@ -15,6 +16,7 @@ import com.mob.utsmyanmar.model.ProcessCode
|
||||
import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingScreen
|
||||
import com.mob.utsmyanmar.ui.cardwaiting.CardWaitingViewModel
|
||||
import com.mob.utsmyanmar.ui.dashboard.DashboardScreen2
|
||||
import com.mob.utsmyanmar.ui.dashboard.DashboardViewModel
|
||||
import com.mob.utsmyanmar.ui.dashboard.SeeMoreScreen
|
||||
import com.mob.utsmyanmar.ui.device_info.DeviceInfoViewModel
|
||||
import com.mob.utsmyanmar.ui.functions.FunctionsScreen
|
||||
@ -78,19 +80,51 @@ fun AppNavGraph(
|
||||
composable(Routes.Dashboard.route) {
|
||||
val sharedViewModel: SharedViewModel = hiltViewModel(activity)
|
||||
val transProcessViewModel: TransProcessViewModel = hiltViewModel(activity)
|
||||
val dashboardViewModel: DashboardViewModel = hiltViewModel(activity)
|
||||
val dashboardUiState = dashboardViewModel.uiState.collectAsStateWithLifecycle().value
|
||||
|
||||
transProcessViewModel.resetTransactionStatus()
|
||||
DashboardScreen2(
|
||||
dashboardUiState = dashboardUiState,
|
||||
onNavigateAmount = { action ->
|
||||
if(action == "Sale"){
|
||||
sharedViewModel.transactionsType.value = TransactionsType.SALE;
|
||||
sharedViewModel.processCode.value = ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT;
|
||||
}
|
||||
when (action) {
|
||||
"Sale" -> {
|
||||
sharedViewModel.transactionsType.value = TransactionsType.SALE
|
||||
sharedViewModel.processCode.value = ProcessCode.SALE_PURCHASE + ProcessCode.SMART + ProcessCode.TO_ACCOUNT
|
||||
navController.navigate(Routes.Amount.createRoute(action)) {
|
||||
launchSingleTop = true
|
||||
}
|
||||
}
|
||||
|
||||
navController.navigate(Routes.Amount.createRoute(action)) {
|
||||
launchSingleTop = true
|
||||
else -> {
|
||||
navController.navigate(Routes.Amount.createRoute(action)) {
|
||||
launchSingleTop = true
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onNavigateAction = { action ->
|
||||
when (action) {
|
||||
"Void" -> {
|
||||
sharedViewModel.transactionsType.value = TransactionsType.VOID
|
||||
navController.navigate(Routes.VoidTrace.route) {
|
||||
launchSingleTop = true
|
||||
}
|
||||
}
|
||||
|
||||
"Pre-Auth Complete Void" -> {
|
||||
sharedViewModel.transactionsType.value = TransactionsType.PRE_AUTH_COMPLETE_VOID
|
||||
navController.navigate(Routes.VoidTrace.route) {
|
||||
launchSingleTop = true
|
||||
}
|
||||
}
|
||||
|
||||
else -> {
|
||||
navController.navigate(Routes.Amount.createRoute(action)) {
|
||||
launchSingleTop = true
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onNavigateSignOn = {
|
||||
navController.navigate(Routes.SignOn.route) {
|
||||
|
||||
@ -1,13 +1,41 @@
|
||||
package com.mob.utsmyanmar.ui.refund_rrn
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import com.mob.utsmyanmar.ui.components.NumericEntryScreen
|
||||
import com.mob.utsmyanmar.ui.components.appbar.AppBar
|
||||
import com.mob.utsmyanmar.ui.theme.Color
|
||||
import com.mob.utsmyanmar.ui.theme.MOBPOSTheme
|
||||
import com.mob.utsmyanmar.viewmodel.SharedViewModel
|
||||
import com.mob.utsmyanmar.viewmodel.TransProcessViewModel
|
||||
import com.utsmyanmar.paylibs.model.PayDetail
|
||||
@ -38,18 +66,13 @@ fun InputRrnRoute(
|
||||
|
||||
val payDetailState by rrnViewModel.payDetailState.collectAsStateWithLifecycle()
|
||||
|
||||
|
||||
fun processPreAuthComp(payDetail: PayDetail) {
|
||||
val newPay = transProcessViewModel.payDetail
|
||||
|
||||
|
||||
|
||||
newPay?.setReferNo(payDetail.referNo)
|
||||
newPay?.setApprovalCode(payDetail.getApprovalCode())
|
||||
newPay?.setTradeTime(payDetail.getTradeTime())
|
||||
newPay?.setTradeDate(payDetail.getTradeDate())
|
||||
|
||||
|
||||
val tradeData = TradeData()
|
||||
tradeData.payDetail = newPay
|
||||
transProcessViewModel.setOldTransPayDetail(payDetail)
|
||||
@ -57,15 +80,12 @@ fun InputRrnRoute(
|
||||
|
||||
rrnViewModel.resetState()
|
||||
onNavigateProcessing()
|
||||
|
||||
}
|
||||
|
||||
fun processPreAuthVoid(payDetail: PayDetail) {
|
||||
val newPay = transProcessViewModel.payDetail
|
||||
|
||||
newPay?.setReferNo(payDetail.referNo)
|
||||
|
||||
|
||||
val tradeData = TradeData()
|
||||
tradeData.payDetail = newPay
|
||||
transProcessViewModel.setOldTransPayDetail(payDetail)
|
||||
@ -75,92 +95,274 @@ fun InputRrnRoute(
|
||||
onNavigateProcessing()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
LaunchedEffect(payDetailState) {
|
||||
LogUtil.d("RRN","paydetail state: $payDetailState")
|
||||
LogUtil.d("RRN", "paydetail state: $payDetailState")
|
||||
when (val state = payDetailState) {
|
||||
|
||||
is RRNViewModel.PayDetailState.Success -> {
|
||||
|
||||
|
||||
sharedViewModel.payDetail.value = state.data
|
||||
sharedViewModel.rrNNo.value = state.data.referNo
|
||||
|
||||
if(sharedViewModel.transactionsType.value == TransactionsType.PRE_AUTH_COMPLETE) {
|
||||
if (sharedViewModel.transactionsType.value == TransactionsType.PRE_AUTH_COMPLETE) {
|
||||
processPreAuthComp(state.data)
|
||||
} else if(sharedViewModel.transactionsType.value == TransactionsType.PRE_AUTH_VOID) {
|
||||
} else if (sharedViewModel.transactionsType.value == TransactionsType.PRE_AUTH_VOID) {
|
||||
processPreAuthVoid(state.data)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
is RRNViewModel.PayDetailState.Error -> {
|
||||
errorMessage = state.message
|
||||
rrnViewModel.resetState()
|
||||
// show dialog
|
||||
// navigate to home
|
||||
}
|
||||
|
||||
else -> Unit
|
||||
}
|
||||
}
|
||||
|
||||
NumericEntryScreen(
|
||||
title = "Input RRN",
|
||||
prompt = "Enter RRN",
|
||||
displayValue = rrn.ifEmpty { "0" },
|
||||
supportingText = errorMessage ?: "Enter the retrieval reference number to continue",
|
||||
confirmText = "Next",
|
||||
onBackClick = onBack,
|
||||
onCancelClick = onBack,
|
||||
onConfirmClick = {
|
||||
InputRrnContent(
|
||||
rrn = rrn,
|
||||
errorMessage = errorMessage,
|
||||
onRrnChange = { value ->
|
||||
rrn = if (value == "Del") {
|
||||
rrn.dropLast(1)
|
||||
} else {
|
||||
appendRrnValue(rrn, value)
|
||||
}
|
||||
errorMessage = null
|
||||
},
|
||||
onBack = onBack,
|
||||
onNext = {
|
||||
val trimmedRrn = rrn.trim()
|
||||
|
||||
if (POSUtil.getInstance().checkNumberField(trimmedRrn)) {
|
||||
errorMessage = "Invalid RRN"
|
||||
return@NumericEntryScreen
|
||||
return@InputRrnContent
|
||||
}
|
||||
|
||||
sharedViewModel.rrNNo.value = trimmedRrn
|
||||
|
||||
|
||||
if(sharedViewModel.transactionsType.value == TransactionsType.REFUND ) {
|
||||
if (sharedViewModel.transactionsType.value == TransactionsType.REFUND) {
|
||||
val newPay = transProcessViewModel.payDetail
|
||||
|
||||
newPay?.setReferNo(trimmedRrn)
|
||||
val tradeData = TradeData()
|
||||
tradeData.payDetail = newPay
|
||||
transProcessViewModel.setTradeData(tradeData)
|
||||
rrnViewModel.resetState()
|
||||
onNavigateProcessing()
|
||||
} else{
|
||||
} else {
|
||||
rrnViewModel.searchPayDetail(
|
||||
trimmedRrn,
|
||||
sharedViewModel.payDetail.value?.cardNo?:""
|
||||
sharedViewModel.payDetail.value?.cardNo ?: ""
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
||||
},
|
||||
onKeyClick = { value ->
|
||||
rrn = appendRrnValue(rrn, value)
|
||||
errorMessage = null
|
||||
},
|
||||
onDeleteClick = {
|
||||
rrn = rrn.dropLast(1)
|
||||
errorMessage = null
|
||||
},
|
||||
confirmEnabled = rrn.isNotEmpty(),
|
||||
canDelete = rrn.isNotEmpty(),
|
||||
keys = listOf(
|
||||
listOf("1", "2", "3"),
|
||||
listOf("4", "5", "6"),
|
||||
listOf("7", "8", "9"),
|
||||
listOf("", "0", "00")
|
||||
)
|
||||
onDelete = {
|
||||
if (rrn.isNotEmpty()) {
|
||||
rrn = rrn.dropLast(1)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun InputRrnContent(
|
||||
rrn: String,
|
||||
errorMessage: String?,
|
||||
onRrnChange: (String) -> Unit,
|
||||
onBack: () -> Unit,
|
||||
onNext: () -> Unit,
|
||||
onDelete: () -> Unit,
|
||||
) {
|
||||
Scaffold(
|
||||
containerColor = Color.IvoryBeige,
|
||||
topBar = {
|
||||
AppBar(
|
||||
title = "Input RRN",
|
||||
icon = Icons.AutoMirrored.Filled.ArrowBack,
|
||||
onIconClick = onBack
|
||||
)
|
||||
}
|
||||
) { paddingValues ->
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(paddingValues)
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(horizontal = 16.dp),
|
||||
verticalArrangement = Arrangement.SpaceBetween
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
Text(
|
||||
text = "Enter RRN",
|
||||
color = Color.Gray,
|
||||
fontSize = 11.sp,
|
||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
|
||||
Text(
|
||||
text = rrn.ifEmpty { "0" },
|
||||
color = Color.LegacyRed,
|
||||
fontSize = 32.sp,
|
||||
fontWeight = FontWeight.Bold,
|
||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(12.dp))
|
||||
|
||||
Text(
|
||||
text = errorMessage ?: "Enter the retrieval reference number to continue",
|
||||
color = if (errorMessage == null) Color.Gray else Color.Error,
|
||||
fontSize = 11.sp,
|
||||
modifier = Modifier.align(Alignment.CenterHorizontally)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(modifier = Modifier.height(24.dp))
|
||||
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
RrnKeypad(
|
||||
onKeyClick = onRrnChange,
|
||||
canDelete = rrn.isNotEmpty()
|
||||
)
|
||||
|
||||
Spacer(modifier = Modifier.height(24.dp))
|
||||
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(bottom = 18.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||
) {
|
||||
Button(
|
||||
onClick = onBack,
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.height(56.dp),
|
||||
shape = RoundedCornerShape(8.dp),
|
||||
colors = ButtonDefaults.buttonColors(
|
||||
containerColor = Color.White,
|
||||
contentColor = Color.LegacyRed
|
||||
)
|
||||
) {
|
||||
Text("Cancel")
|
||||
}
|
||||
|
||||
Button(
|
||||
onClick = onNext,
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.height(56.dp),
|
||||
enabled = rrn.isNotBlank(),
|
||||
shape = RoundedCornerShape(8.dp),
|
||||
colors = ButtonDefaults.buttonColors(
|
||||
containerColor = Color.LegacyRed,
|
||||
contentColor = Color.White,
|
||||
disabledContainerColor = Color.LegacyRed.copy(alpha = 0.5f),
|
||||
disabledContentColor = Color.White
|
||||
)
|
||||
) {
|
||||
Text("Next")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Card(
|
||||
// modifier = Modifier
|
||||
// .align(Alignment.TopEnd)
|
||||
// .padding(top = 110.dp, end = 16.dp)
|
||||
// .clickable(enabled = rrn.isNotEmpty()) {
|
||||
// onDelete()
|
||||
// },
|
||||
// shape = RoundedCornerShape(18.dp),
|
||||
// colors = CardDefaults.cardColors(containerColor = Color.White),
|
||||
// elevation = CardDefaults.cardElevation(defaultElevation = 6.dp)
|
||||
// ) {
|
||||
// androidx.compose.material3.Icon(
|
||||
// imageVector = Icons.Rounded.Backspace,
|
||||
// contentDescription = "Delete",
|
||||
// tint = if (rrn.isNotEmpty()) Color.LegacyRed else Color.Gray,
|
||||
// modifier = Modifier.padding(horizontal = 14.dp, vertical = 12.dp)
|
||||
// )
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun RrnKeypad(
|
||||
onKeyClick: (String) -> Unit,
|
||||
canDelete: Boolean
|
||||
) {
|
||||
val keys = listOf(
|
||||
listOf("1", "2", "3"),
|
||||
listOf("4", "5", "6"),
|
||||
listOf("7", "8", "9"),
|
||||
listOf("Del", "0", "00")
|
||||
)
|
||||
|
||||
Column(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
verticalArrangement = Arrangement.spacedBy(6.dp)
|
||||
) {
|
||||
keys.forEach { row ->
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
horizontalArrangement = Arrangement.spacedBy(6.dp)
|
||||
) {
|
||||
row.forEach { key ->
|
||||
RrnKeypadButton(
|
||||
text = key,
|
||||
modifier = Modifier.weight(1f),
|
||||
enabled = key.isNotBlank() && (key != "Del" || canDelete),
|
||||
onClick = { onKeyClick(key) }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun RrnKeypadButton(
|
||||
text: String,
|
||||
modifier: Modifier = Modifier,
|
||||
enabled: Boolean = true,
|
||||
onClick: () -> Unit
|
||||
) {
|
||||
Box(
|
||||
modifier = modifier
|
||||
.height(66.dp)
|
||||
.shadow(
|
||||
elevation = 2.dp,
|
||||
shape = RoundedCornerShape(8.dp),
|
||||
clip = false
|
||||
)
|
||||
.background(
|
||||
color = Color.White,
|
||||
shape = RoundedCornerShape(8.dp)
|
||||
)
|
||||
.clickable(enabled = enabled) { onClick() },
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Text(
|
||||
text = text,
|
||||
color = if (enabled) Color.LegacyRed else Color.Gray,
|
||||
fontSize = 24.sp,
|
||||
fontWeight = FontWeight.Normal,
|
||||
textAlign = TextAlign.Center
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun appendRrnValue(current: String, value: String): String {
|
||||
if (value.isBlank()) {
|
||||
return current
|
||||
@ -173,3 +375,33 @@ private fun appendRrnValue(current: String, value: String): String {
|
||||
|
||||
return current + value.take(remainingDigits)
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
private fun InputRrnPreview() {
|
||||
MOBPOSTheme {
|
||||
InputRrnContent(
|
||||
rrn = "123456789012",
|
||||
errorMessage = null,
|
||||
onRrnChange = {},
|
||||
onBack = {},
|
||||
onNext = {},
|
||||
onDelete = {}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Preview(showBackground = true)
|
||||
@Composable
|
||||
private fun InputRrnErrorPreview() {
|
||||
MOBPOSTheme {
|
||||
InputRrnContent(
|
||||
rrn = "123",
|
||||
errorMessage = "Invalid RRN",
|
||||
onRrnChange = {},
|
||||
onBack = {},
|
||||
onNext = {},
|
||||
onDelete = {}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -145,6 +145,9 @@ public interface PayDetailDao {
|
||||
@Query("SELECT * FROM paydetail ORDER BY PID DESC LIMIT 3")
|
||||
LiveData<List<PayDetail>> getLastThreeTransactions();
|
||||
|
||||
@Query("SELECT * FROM paydetail ORDER BY PID DESC LIMIT 10")
|
||||
LiveData<List<PayDetail>> getLastTenTransactions();
|
||||
|
||||
@Query("SELECT * FROM paydetail ORDER BY PID DESC LIMIT 1")
|
||||
LiveData<PayDetail> getLastTransaction();
|
||||
|
||||
|
||||
@ -113,6 +113,10 @@ public class Repository {
|
||||
|
||||
public LiveData<List<PayDetail>> getLastThreeTransactions(){ return payDetailDao.getLastThreeTransactions();}
|
||||
|
||||
|
||||
|
||||
public LiveData<List<PayDetail>> getLastTenTransactions() { return payDetailDao.getLastTenTransactions(); }
|
||||
|
||||
public LiveData<List<PayDetail>> getVoidableTransactions(int transType){
|
||||
return payDetailDao.getVoidableTransactions(transType);
|
||||
}
|
||||
|
||||
@ -219,7 +219,9 @@ public abstract class BaseXPrint {
|
||||
|
||||
String schemeName = "";
|
||||
schemeName = payDetail.getAccountType() == null ? "" : payDetail.getAccountType();
|
||||
sunmiPrinterService.setFontSize(18, innerResultCallback);
|
||||
sunmiPrinterService.setFontSize(20, innerResultCallback);
|
||||
sunmiPrinterService.setAlignment(0, innerResultCallback);
|
||||
sunmiPrinterService.setFontName("libre_basker_ville.ttf", innerResultCallback);
|
||||
String secondLineName = PrintUtils.getInstance().processNameSpaceSecondLine(PrintUtils.getInstance().getCardHolderName(payDetail.getCardHolderName()));
|
||||
String firstLineName = PrintUtils.getInstance().processNameSpaceFirstLine(PrintUtils.getInstance().getCardHolderName(payDetail.getCardHolderName()), secondLineName);
|
||||
|
||||
@ -227,32 +229,45 @@ public abstract class BaseXPrint {
|
||||
if(payDetail.getAccountType().contains("Ctls")) {
|
||||
cardType = payDetail.getAccountType().replace(" Ctls","");
|
||||
}
|
||||
sunmiPrinterService.printColumnsString(new String[]{"CARD NUM :", PrintUtils.getInstance().cardNumMasking(payDetail.getCardNo())}, new int[]{2, 2}, new int[]{0, 1}, innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"CARD NUM :", PrintUtils.getInstance().cardNumMasking(payDetail.getCardNo())}, new int[]{2, 2}, new int[]{0, 1}, innerResultCallback);
|
||||
sunmiPrinterService.printText("CARD NUMBER : "+ PrintUtils.getInstance().cardNumMasking(payDetail.getCardNo()) + "\n", innerResultCallback);
|
||||
|
||||
if(!firstLineName.isEmpty()) {
|
||||
sunmiPrinterService.printColumnsString(new String[]{"CARD HOLDER NAME:", firstLineName}, new int[]{2, 2}, new int[]{0, 1}, innerResultCallback);
|
||||
sunmiPrinterService.printText("CARD HOLDER NAME: " + firstLineName + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"CARD HOLDER NAME:", firstLineName}, new int[]{2, 2}, new int[]{0, 1}, innerResultCallback);
|
||||
}
|
||||
if(!secondLineName.isEmpty()) {
|
||||
sunmiPrinterService.printColumnsString(new String[]{secondLineName, ""}, new int[]{2, 2}, new int[]{0, 1}, innerResultCallback);
|
||||
sunmiPrinterService.printText(" " + secondLineName + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{secondLineName, ""}, new int[]{2, 2}, new int[]{0, 1}, innerResultCallback);
|
||||
}
|
||||
sunmiPrinterService.printColumnsString(new String[]{"ENTRY MODE:" + PrintUtils.getInstance().getEntryType(payDetail.getCardType()), "EXPIRY DATE:" + PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate())}, new int[]{2, 2}, new int[]{0, 2}, innerResultCallback);
|
||||
sunmiPrinterService.printText("ENTRY MODE : " + PrintUtils.getInstance().getEntryType(payDetail.getCardType()) + "\n", innerResultCallback);
|
||||
sunmiPrinterService.printText("EXPIRY DATE : " + PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate()) + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"ENTRY MODE:" + PrintUtils.getInstance().getEntryType(payDetail.getCardType()), "EXPIRY DATE:" + PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate())}, new int[]{2, 2}, new int[]{0, 2}, innerResultCallback);
|
||||
if (payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT) || payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_APPROVED)) {
|
||||
sunmiPrinterService.printColumnsString(new String[]{"CARD TYPE:" + cardType, "APPRCODE:" + payDetail.getApprovalCode()}, new int[]{2, 2}, new int[]{0, 2}, innerResultCallback);
|
||||
sunmiPrinterService.printText("CARD TYPE : " + cardType + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printText("APPROVAL CODE : " + cardType + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"CARD TYPE:" + cardType, "APPRCODE:" + payDetail.getApprovalCode()}, new int[]{2, 2}, new int[]{0, 2}, innerResultCallback);
|
||||
} else {
|
||||
sunmiPrinterService.printColumnsString(new String[]{"CARD TYPE:" + cardType, ""}, new int[]{2, 2}, new int[]{0, 2}, innerResultCallback);
|
||||
sunmiPrinterService.printText("CARD TYPE : " + cardType + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"CARD TYPE:" + cardType, ""}, new int[]{2, 2}, new int[]{0, 2}, innerResultCallback);
|
||||
}
|
||||
|
||||
if(payDetail.getAID() == null || payDetail.getAID().isEmpty()){
|
||||
sunmiPrinterService.printColumnsString(new String[]{"AID", ":" + MPU_AID}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
sunmiPrinterService.printText("AID : " + MPU_AID + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"AID", ":" + MPU_AID}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
} else {
|
||||
sunmiPrinterService.printColumnsString(new String[]{"AID", ":" + payDetail.getAID()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
sunmiPrinterService.printText("AID : " + payDetail.getAID() + "\n" , innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"AID", ":" + payDetail.getAID()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
}
|
||||
|
||||
if (payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT) || payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_APPROVED)) {
|
||||
sunmiPrinterService.printColumnsString(new String[]{"TXN ID", ":" + payDetail.getReferNo()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
// sunmiPrinterService.printText("TXN ID : " + payDetail.getAID() + "\n" , innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"TXN ID", ":" + payDetail.getReferNo()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
}
|
||||
sunmiPrinterService.printColumnsString(new String[]{"REF NUM", ":" + payDetail.getReferNo()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
sunmiPrinterService.printColumnsString(new String[]{"TRACE No", ":" + payDetail.getVoucherNo()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
sunmiPrinterService.printText("REF NUM : " + payDetail.getReferNo() + "\n", innerResultCallback);
|
||||
sunmiPrinterService.printText("TRACE NO : " + payDetail.getVoucherNo() + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"REF NUM", ":" + payDetail.getReferNo()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"TRACE No", ":" + payDetail.getVoucherNo()}, new int[]{1, 2}, new int[]{0, 0}, innerResultCallback);
|
||||
|
||||
if (payDetail.getTradeAnswerCode().equals("00") || payDetail.getTradeAnswerCode().equals("000")) {
|
||||
if (payDetail.getTransactionType() == TransactionType.CASH_ADVANCE) {
|
||||
@ -800,7 +815,6 @@ public abstract class BaseXPrint {
|
||||
String merchantName = "";
|
||||
String merchantAddress = "";
|
||||
String merchantPhoneNo = "";
|
||||
String terminalName = "";
|
||||
List<String> wrappedAddressText = new ArrayList<>();
|
||||
|
||||
merchantName = SystemParamsOperation.getInstance().getMerchantName();
|
||||
@ -825,14 +839,11 @@ public abstract class BaseXPrint {
|
||||
merchantPhoneNo = "";
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
|
||||
sunmiPrinterService.sendRAWData(boldOn(), innerResultCallback);
|
||||
sunmiPrinterService.setFontName(typeface_name, innerResultCallback);
|
||||
sunmiPrinterService.setFontSize(22, innerResultCallback);
|
||||
sunmiPrinterService.printText(receiptHeader + "\n", innerResultCallback);
|
||||
// sunmiPrinterService.printTextWithFont(merchantName + "\n", "", 24, null);
|
||||
sunmiPrinterService.sendRAWData(boldOff(), innerResultCallback);
|
||||
sunmiPrinterService.setFontSize(textSize, innerResultCallback);
|
||||
for (String addressLine : wrappedAddressText) {
|
||||
@ -876,12 +887,8 @@ public abstract class BaseXPrint {
|
||||
protected void printTransHeader(PayDetail payDetail) {
|
||||
String invoiceNo = payDetail.getInvoiceNo().isEmpty()?SystemParamsOperation.getInstance().getCurrentInvoiceNum() : payDetail.getInvoiceNo();
|
||||
String transType = payDetail.getTransType();
|
||||
String batchNum = "";
|
||||
String traceNum = payDetail.getVoucherNo();
|
||||
// String traceNum = SystemParamsOperation.getInstance().getCurrentSerialNum();
|
||||
|
||||
|
||||
batchNum = payDetail.getBatchNo();
|
||||
String batchNum = payDetail.getBatchNo();
|
||||
|
||||
try {
|
||||
sunmiPrinterService.setFontSize(20, innerResultCallback);
|
||||
@ -894,26 +901,13 @@ public abstract class BaseXPrint {
|
||||
} else if (payDetail.getTransType().equals(SUMMARY)) {
|
||||
sunmiPrinterService.printColumnsString(new String[]{"HOST :" + HOST_NAME_MPU, ""}, new int[]{2, 1}, new int[]{0, 2}, innerResultCallback);
|
||||
}
|
||||
|
||||
/* 17 Sept 2024 Yoma requested to changed slip design for QR*/
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"MID :" + payDetail.getMerchantNo(), ""}, new int[]{3, 1}, new int[]{0, 2}, innerResultCallback);
|
||||
// sunmiPrinterService.printColumnsString(new String[]{"TID :" + payDetail.getTerminalNo(), ""}, new int[]{3, 1}, new int[]{0, 2}, innerResultCallback);
|
||||
|
||||
sunmiPrinterService.printText("MID :"+payDetail.getMerchantNo()+"\n",innerResultCallback);
|
||||
sunmiPrinterService.printText("TID :"+payDetail.getTerminalNo()+"\n",innerResultCallback);
|
||||
|
||||
sunmiPrinterService.printText("MID :"+payDetail.getMerchantNo()+"\n",innerResultCallback);
|
||||
sunmiPrinterService.printText("TID :"+payDetail.getTerminalNo()+"\n",innerResultCallback);
|
||||
sunmiPrinterService.lineWrap(2, innerResultCallback);
|
||||
|
||||
sunmiPrinterService.sendRAWData(boldOn(), innerResultCallback);
|
||||
sunmiPrinterService.setAlignment(1, innerResultCallback);
|
||||
sunmiPrinterService.setFontSize(22, innerResultCallback);
|
||||
// if(payDetail.transactionType == TransactionsType.WAVEPAY_REFUND.value) {
|
||||
// sunmiPrinterService.printText("WAVEPAY (REFUND)" + "" + "\n", null);
|
||||
// } else {
|
||||
// sunmiPrinterService.printText(transType.replace("_", " ") + "" + "\n", null);
|
||||
// }
|
||||
sunmiPrinterService.printText(transType.replace("_", " ") + "" + "\n", null);
|
||||
|
||||
sunmiPrinterService.sendRAWData(boldOff(), innerResultCallback);
|
||||
sunmiPrinterService.setFontSize(textSize, innerResultCallback);
|
||||
if (!(payDetail.getQrTransStatus() != 1 && (payDetail.getTransactionType() == TransactionsType.WAVEPAY_REFUND.value || payDetail.getTransactionType() == TransactionsType.WAVEPAY.value))) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user