Compare commits

..

No commits in common. "c3faee2eb0966d28352f68a612fc1d3ad9b9ab0c" and "80594be6f965a0826a7c48fa3a5507684a2e4557" have entirely different histories.

14 changed files with 207 additions and 284 deletions

View File

@ -16,13 +16,14 @@ import com.utsmyanmar.ecr.ECRHelper
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
import kotlinx.coroutines.Job
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import sunmi.sunmiui.utils.LogUtil
class CardWaitingViewModel(
private val cardReadViewModel: CardReaderViewModel,

View File

@ -1,8 +1,5 @@
package com.mob.utsmyanmar.ui.dashboard
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AccountBalanceWallet
import androidx.compose.material.icons.filled.CreditCard
@ -10,6 +7,7 @@ import androidx.compose.material.icons.filled.Lock
import androidx.compose.material.icons.filled.LockOpen
import androidx.compose.material.icons.filled.Replay
import androidx.compose.material.icons.filled.SwapHoriz
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@ -17,7 +15,6 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import com.mob.utsmyanmar.R
import com.mob.utsmyanmar.ui.theme.Color
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation
class DashboardMenuItem(
val title: String,
@ -25,209 +22,121 @@ class DashboardMenuItem(
val onClick: () -> Unit
)
val settlementEnabled = false
val voidEnabled = true
val refundEnabled = true
val preAuthEnabled = true
val preAuthVoidEnabled = true
val preAuthCompleteEnabled = true
val preAuthCompleteVoidEnabled = true
val cashAdvEnabled = true
fun buildMenuItems(
onNavigateAmount: (String) -> Unit,
onNavigateSignOn: () -> Unit,
onNavigateSettlement: () -> Unit,
onNavigateHistory: () -> Unit,
onNavigateAction: (String) -> Unit
): List<DashboardMenuItem> = buildList {
val mmqrEnabled = SystemParamsOperation.getInstance().mmqrStatus
add(
DashboardMenuItem(
"Sale",
{
Icon(
painterResource(R.drawable.ic_terminal),
contentDescription = null,
modifier = Modifier.size(40.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAmount("Sale") }
)
if (mmqrEnabled) {
add(
DashboardMenuItem(
"MMQR",
{
Image(
painter = painterResource(R.drawable.ic_mmqr_logo),
contentDescription = null,
modifier = Modifier.height(48.dp)
)
}
) { }
)
}
add(
DashboardMenuItem(
"History",
{
Icon(
painterResource(R.drawable.ic_history),
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateHistory() }
)
add(
DashboardMenuItem(
"Sign On",
{
Icon(
painterResource(R.drawable.ic_sign_on),
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateSignOn() }
)
if (settlementEnabled) {
add(
DashboardMenuItem(
"Settlement",
{
Icon(
painterResource(R.drawable.ic_settlement),
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateSettlement() }
)
}
if (voidEnabled) {
add(
DashboardMenuItem(
"Void",
{
Icon(
Icons.Default.Lock,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAction("Void") }
)
}
if (refundEnabled) {
add(
DashboardMenuItem(
"Refund",
{
Icon(
Icons.Default.Replay,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAction("Refund") }
)
}
if (preAuthEnabled) {
add(
DashboardMenuItem(
"Pre-Auth",
{
Icon(
Icons.Default.Lock,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAmount("Pre-Auth") }
)
}
if (preAuthVoidEnabled) {
add(
DashboardMenuItem(
"Pre-Auth Void",
{
Icon(
Icons.Default.LockOpen,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAction("Pre-Auth Void") }
)
}
if (preAuthCompleteEnabled) {
add(
DashboardMenuItem(
"Pre-Auth Complete",
{
Icon(
Icons.Default.CreditCard,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAction("Pre-Auth Complete") }
)
}
if (preAuthCompleteVoidEnabled) {
add(
DashboardMenuItem(
"Pre-Auth Comp Void",
{
Icon(
Icons.Default.SwapHoriz,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAction("Pre-Auth Complete Void") }
)
}
if (cashAdvEnabled) {
add(
DashboardMenuItem(
"Cash Adv",
{
Icon(
Icons.Default.AccountBalanceWallet,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}
) { onNavigateAmount("Cash Adv") }
)
}
}
): List<DashboardMenuItem> = listOf(
DashboardMenuItem(
"Sale",
{
Icon(
painterResource(R.drawable.ic_terminal),
contentDescription = null,
modifier = Modifier.size(40.dp),
tint = Color.LegacyRed
)
}) { onNavigateAmount("Sale") },
DashboardMenuItem(
"History",
{
Icon(
painterResource(R.drawable.ic_history),
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateHistory() },
DashboardMenuItem(
"Sign On",
{
Icon(
painterResource(R.drawable.ic_sign_on),
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateSignOn() },
DashboardMenuItem(
"Settlement",
{
Icon(
painterResource(R.drawable.ic_settlement),
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateSettlement() },
DashboardMenuItem(
"Void",
{
Icon(
Icons.Default.Lock,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateAction("Void") },
DashboardMenuItem(
"Refund",
{
Icon(
Icons.Default.Replay,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateAction("Refund") },
DashboardMenuItem(
"Pre-Auth",
{
Icon(
Icons.Default.Lock,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateAmount("Pre-Auth") },
DashboardMenuItem(
"Pre-Auth Void",
{
Icon(
Icons.Default.LockOpen,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateAction("Pre-Auth Void") },
DashboardMenuItem(
"Pre-Auth Complete",
{
Icon(
Icons.Default.CreditCard,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateAction("Pre-Auth Complete") },
DashboardMenuItem(
"Pre-Auth Comp Void",
{
Icon(
Icons.Default.SwapHoriz,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateAction("Pre-Auth Complete Void") },
DashboardMenuItem(
"Cash Adv",
{
Icon(
Icons.Default.AccountBalanceWallet,
contentDescription = null,
modifier = Modifier.size(32.dp),
tint = Color.LegacyRed
)
}) { onNavigateAmount("Cash Adv") },
)

View File

@ -23,9 +23,6 @@ import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Notifications
import androidx.compose.material.icons.filled.Sync
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@ -50,7 +47,6 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.mob.utsmyanmar.R
import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.device_info.DeviceInfoUiState
@ -180,29 +176,6 @@ fun DashboardScreen2(
)
}
if (dashboardUiState.isSyncing) {
Dialog(onDismissRequest = {}) {
Card(
shape = RoundedCornerShape(16.dp),
colors = CardDefaults.cardColors(containerColor = Color.White),
elevation = CardDefaults.cardElevation(8.dp)
) {
Column(
modifier = Modifier.padding(32.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
CircularProgressIndicator(color = Color.LegacyRed)
Spacer(Modifier.height(16.dp))
Text(
text = dashboardUiState.syncStatusText,
style = MaterialTheme.typography.bodyMedium,
color = Color.Black
)
}
}
}
}
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {

View File

@ -17,7 +17,5 @@ data class DashboardUiState(
val totalSaleCount: Int = 0,
val totalSaleAmount: Long = 0L,
val settlementStatusText: String = "Pending",
val settlementDateTimeText: String = "--/-- --:--",
val isSyncing: Boolean = false,
val syncStatusText: String = "Connecting to TMS server..."
val settlementDateTimeText: String = "--/-- --:--"
)

View File

@ -72,18 +72,6 @@ class DashboardViewModel @Inject constructor(
.takeIf { it > 0L }
_uiState.update { it.copy(lastSyncTime = time) }
}
fun startSync() {
_uiState.update { it.copy(isSyncing = true, syncStatusText = "Connecting to TMS server...") }
}
fun finishSync(message: String) {
_uiState.update { it.copy(syncStatusText = message) }
viewModelScope.launch {
kotlinx.coroutines.delay(1500)
_uiState.update { it.copy(isSyncing = false) }
}
}
}
private fun PayDetail.toRecord(): TrnxRecord {

View File

@ -125,15 +125,6 @@ fun AppNavGraph(
LaunchedEffect(tmsSetupViewModel) {
tmsSetupViewModel.onSyncCompleted.collect {
dashboardViewModel.refreshLastSyncTime()
dashboardViewModel.finishSync("Sync completed")
}
}
LaunchedEffect(tmsSetupUiState.isLoading, tmsSetupUiState.isError) {
if (dashboardUiState.isSyncing && !tmsSetupUiState.isLoading) {
if (tmsSetupUiState.isError) {
dashboardViewModel.finishSync(tmsSetupUiState.statusText.ifBlank { "Download failed!" })
}
}
}
@ -153,7 +144,6 @@ fun AppNavGraph(
dashboardUiState = dashboardUiState,
deviceInfo = deviceInfoUiState,
onClickLastSync = {
dashboardViewModel.startSync()
tmsSetupViewModel.downloadConfigs()
},
onNavigateRecentTransaction = { record ->

View File

@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.mob.utsmyanmar.model.CardTransactionType
import com.mob.utsmyanmar.ui.pinpad.PinPadViewModel
import com.mob.utsmyanmar.utils.MockCardData
import com.mob.utsmyanmar.utils.MockData
import com.mob.utsmyanmar.utils.TransactionUtil
import com.mob.utsmyanmar.viewmodel.CardReaderViewModel

View File

@ -6,6 +6,7 @@ import com.mob.utsmyanmar.model.ecr.ECRResultStatus
import com.mob.utsmyanmar.utils.CoreUtils
import com.mob.utsmyanmar.viewmodel.SharedViewModel
import com.utsmyanmar.baselib.emv.EmvParamOperation
import com.utsmyanmar.baselib.network.model.sirius.SiriusRequest
import com.utsmyanmar.ecr.ECRHelper
import com.utsmyanmar.ecr.ECRProcess
import com.utsmyanmar.ecr.data.model.TransactionsResp

View File

@ -131,7 +131,7 @@ class TMSSetupsImpl : TMSSetups {
}
//Properties
for (prop in siriusProperty) {
for (prop in siriusProperty.orEmpty()) {
val name = prop.name
val data = prop.property
@ -221,7 +221,6 @@ class TMSSetupsImpl : TMSSetups {
"speedup_contactless_enable" -> ops.setSpeedUpContactless(parseBoolean(data))
"manual_entry_pin_enable" -> ops.isManualEntryPinEnable = parseBoolean(data)
"cmhl_enabled" -> ops.setCMHLEnable(parseBoolean(data))
"mmqr_enable" -> ops.setMmqrStatus(parseBoolean(data))
}
}
ops.carouselUrls = imgUrls.joinToString(",")

View File

@ -4,7 +4,6 @@ import android.os.Handler
import android.os.Looper
import android.os.Message
import android.text.TextUtils
import com.mob.utsmyanmar.model.TransResultStatus
import com.utsmyanmar.baselib.emv.EmvParamOperation
import com.utsmyanmar.baselib.repo.Repository
import com.utsmyanmar.baselib.util.enums.EmvResultStatus
@ -25,6 +24,7 @@ import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType
import dagger.hilt.android.lifecycle.HiltViewModel
import sunmi.sunmiui.utils.LogUtil
import javax.inject.Inject
import com.mob.utsmyanmar.model.TransResultStatus
@HiltViewModel
class EmvTransactionProcessViewModel @Inject constructor(

View File

@ -25,6 +25,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
@HiltViewModel
class TransProcessViewModel @Inject constructor(

View File

@ -1,12 +1,17 @@
package com.utsmyanmar.ecr
import androidx.annotation.Keep
import com.google.gson.Gson
import com.utsmyanmar.ecr.data.ResultOf
import com.utsmyanmar.ecr.data.TransType
import com.utsmyanmar.ecr.data.mapper.RequestTransMapper
import com.utsmyanmar.ecr.data.mapper.ResponseTransMapper
import com.utsmyanmar.ecr.data.model.RequestTrans
import com.utsmyanmar.ecr.data.model.ResponseTrans
import com.utsmyanmar.ecr.data.model.Transactions
import com.utsmyanmar.ecr.data.model.TransactionsResp
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation
import java.lang.Exception
//@Keep
object ECRProcess {

View File

@ -1,16 +1,16 @@
package com.utsmyanmar.paylibs.utils.core_utils;
import static com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings.TRANSACTION_MANAGER_KEY;
import android.text.TextUtils;
import com.utsmyanmar.paylibs.utils.enums.CurrencyType;
import java.util.ArrayList;
import java.util.Locale;
import sunmi.sunmiui.utils.LogUtil;
import static com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings.TRANSACTION_MANAGER_KEY;
import com.utsmyanmar.paylibs.utils.enums.CurrencyType;
public class SystemParamsOperation {
public static final String TAG = "SystemParamsOperation";
@ -33,6 +33,54 @@ public class SystemParamsOperation {
return instance;
}
/* public void init(String serialNumStart,
String batchNumStart,
int purchaseOrderStyle,
int correctFrequency,
int transactionNumber,
boolean printNegative,
int nonConnection,
boolean stateSecret,
boolean shieldAuthorizationCard,
int nonConnectionChoice,
boolean eCashVisaExemption) {
SystemParamsSettings bean = getSystemParamsSettings();
bean.setSerialNum(serialNumStart);
bean.setBatchNumStart(batchNumStart);
bean.setPurchaseOrderStyle(purchaseOrderStyle);
bean.setCorrectFrequency(correctFrequency);
bean.setTransactionNumber(transactionNumber);
bean.setPrintNegative(printNegative);
bean.setNonConnection(nonConnection);
bean.setStateSecret(stateSecret);
bean.setShieldAuthorizationCard(shieldAuthorizationCard);
bean.setNonConnectionChoice(nonConnectionChoice);
bean.setCashVisaExemption(eCashVisaExemption);
saveSystemParamsSettings(bean);
}*/
/*public boolean isDownloadParamsOnce() {
SystemParamsSettings params = getSystemParamsSettings();
return params.isDownloadParamsOnce();
}
public void saveDownloadParamsOnce(boolean downloadParamsOnce) {
SystemParamsSettings params = getSystemParamsSettings();
params.setDownloadParamsOnce(downloadParamsOnce);
saveSystemParamsSettings(params);
}
public boolean isNeedDownLoadICParams() {
SystemParamsSettings params = getSystemParamsSettings();
return params.isNeedDownLoadICParams();
}
public void saveNeedDownLoadICParams(boolean needDownLoadICParams) {
SystemParamsSettings params = getSystemParamsSettings();
params.setNeedDownLoadICParams(needDownLoadICParams);
saveSystemParamsSettings(params);
}*/
public boolean isInjectOnce(){
SystemParamsSettings params = getSystemParamsSettings();
return params.isInjectOnce();
@ -43,6 +91,13 @@ public class SystemParamsOperation {
params.setInjectOnce(injectOnce);
saveSystemParamsSettings(params);
}
/**
* Set serial number
*
* @param serialNumber Starting serial number
*/
public void saveSerialNumber(String serialNumber) {
if (TextUtils.isEmpty(serialNumber)) {
return;
@ -51,6 +106,12 @@ public class SystemParamsOperation {
params.setSerialNum(serialNumber);
saveSystemParamsSettings(params);
}
/**
* Set invoice number
*
* @param invoiceNumber Starting invoice number
*/
public void saveInvoiceNumber(String invoiceNumber) {
if (TextUtils.isEmpty(invoiceNumber)) {
return;
@ -59,6 +120,13 @@ public class SystemParamsOperation {
params.setInvoiceNum(invoiceNumber);
saveSystemParamsSettings(params);
}
/**
* Set batch number
*
* @param batchNumber Starting batch number
*/
public void saveBatchNumber(String batchNumber) {
if (TextUtils.isEmpty(batchNumber)) {
return;
@ -68,6 +136,11 @@ public class SystemParamsOperation {
saveSystemParamsSettings(params);
}
/**
* Serial number increment
*/
private void incrementSerialNum() {
SystemParamsSettings params = getSystemParamsSettings();
String currentSerialNum = params.getCurrentSerialNum();
@ -99,6 +172,10 @@ public class SystemParamsOperation {
params.setSerialNum(transNumFormat);
saveSystemParamsSettings(params);
}
/**
* Invoice number increment
*/
private void incrementInvoiceNum() {
SystemParamsSettings params = getSystemParamsSettings();
String currentInvoiceNum = params.getCurrentInvoiceNum();
@ -875,17 +952,6 @@ public class SystemParamsOperation {
saveSystemParamsSettings(params);
}
public void setMmqrStatus(boolean status) {
SystemParamsSettings params = getSystemParamsSettings();
params.setMmqrEnabled(status);
saveSystemParamsSettings(params);
}
public boolean getMmqrStatus(){
SystemParamsSettings params = getSystemParamsSettings();
return params.getMmqrEnabled();
}
public boolean isCMHLEnabled(){
SystemParamsSettings params = getSystemParamsSettings();
return params.isCmhlEnabled();

View File

@ -233,7 +233,6 @@ public class SystemParamsSettings implements Serializable {
private byte[] pik_value;
private byte[] pik_kcv;
private boolean mmqrEnabled;
protected String getSecHostName() {
return secHostName;
@ -903,14 +902,6 @@ public class SystemParamsSettings implements Serializable {
this.emvEnabled = emvEnabled;
}
public void setMmqrEnabled(boolean status) {
this.mmqrEnabled = status;
}
public boolean getMmqrEnabled(){
return mmqrEnabled;
}
/* // 流水号起始
private String serialNum = Configs.getInstance().SERIAL_NUM();
// 批次号起始