Compare commits

..

No commits in common. "5bb07df9e36fa2ac14af3e8e31eb88b64dfab873" and "f8066d50fbb1aa71dfbed6b65dc13d1f7e8cc953" have entirely different histories.

16 changed files with 214 additions and 231 deletions

View File

@ -8,13 +8,7 @@
* fixed recent transaction only working for top 3
* routed to dashboard after printing receipt
* receipt printing animation re-scale
*
### version 3.4
* disable display always on
* auto-settlement
* show expiry date as "`**`/`**`"
* align the customer name, in paper slip
* settlement fixed in both UI and system
* amount, date, time fixed in Void Preview
* show reversal status in trans records

View File

@ -50,6 +50,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@ -523,3 +524,26 @@ fun Item(
}
}
}
val previewTransactions = listOf(
TrnxRecord(
1L, "Sale", "MMK 10,000", "**** 1234", "06/10 14:32",
isVoided = false, isApproved = true
),
TrnxRecord(
2L, "Void", "MMK 5,500", "**** 5678", "06/10 13:10",
isVoided = true, isApproved = false
),
TrnxRecord(
3L, "Refund", "MMK 2,000", "**** 9012", "06/09 09:45",
isVoided = false, isApproved = true
),
TrnxRecord(
4L, "Sale", "MMK 30,000", "**** 3456", "06/09 08:00",
isVoided = false, isApproved = true
),
TrnxRecord(
5L, "Settlement", "MMK 0", "----", "06/08 18:00",
isVoided = false, isApproved = true
),
)

View File

@ -55,6 +55,8 @@ import com.mob.utsmyanmar.BuildConfig
import com.mob.utsmyanmar.R
import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.device_info.DeviceInfoUiState
import com.mob.utsmyanmar.ui.preview.P2Preview
import com.mob.utsmyanmar.ui.preview.P3Preview
import com.mob.utsmyanmar.ui.theme.Color
import com.utsmyanmar.paylibs.sign_on.EchoTestProcess
import com.utsmyanmar.paylibs.sign_on.SignOnListener
@ -445,3 +447,11 @@ fun DashboardScreen2(
}
}
}
@RequiresApi(Build.VERSION_CODES.N)
@P3Preview
@P2Preview
@Composable
fun PreviewDashboardScreen2() {
DashboardScreen2(dashboardUiState = DashboardUiState(previewTransactions))
}

View File

@ -88,12 +88,7 @@ class DashboardViewModel @Inject constructor(
private fun PayDetail.toRecord(): TrnxRecord {
val baseType = transType?.takeIf { it.isNotBlank() }?.let { formatTypeLabel(it) } ?: "Transaction"
val type = when {
transactionType == TransactionsType.REVERSAL.value && !baseType.equals("Reversal", ignoreCase = true) ->
"$baseType (Reversal)"
isCanceled -> "Void"
else -> baseType
}
val type = if (isCanceled) "Void" else baseType
val displayAmount = displayAmount()
val amountText = "MMK ${formatAmount(displayAmount)}"
val card = CardNo?.takeIf { it.length >= 4 }?.let { "**** ${it.takeLast(4)}" } ?: "----"

View File

@ -49,7 +49,7 @@ internal fun HistoryTransactionCard(
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(
text = displayTransactionTitle(payDetail),
text = payDetail.transType.ifBlank { "UNKNOWN" },
color = Color.LegacyRed,
style = MaterialTheme.typography.titleSmall
)
@ -81,7 +81,7 @@ internal fun HistoryTransactionDetailCard(payDetail: PayDetail) {
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
Text(
text = displayTransactionTitle(payDetail),
text = payDetail.transType.ifBlank { "Transaction" },
color = Color.LegacyRed,
style = MaterialTheme.typography.titleMedium
)
@ -92,7 +92,7 @@ internal fun HistoryTransactionDetailCard(payDetail: PayDetail) {
SummaryLine("Approval", payDetail.approvalCode.orEmpty())
SummaryLine("Date", payDetail.tradeDate)
SummaryLine("Time", payDetail.tradeTime)
SummaryLine("Status", displayTransactionStatus(payDetail))
SummaryLine("Status", payDetail.tradeAnswerCode.orEmpty())
}
}
}

View File

@ -26,22 +26,6 @@ internal fun prepareReprintPayDetail(payDetail: PayDetail): PayDetail {
return payDetail
}
internal fun displayTransactionStatus(payDetail: PayDetail): String {
if (payDetail.transactionType == TransactionsType.REVERSAL.value) {
return if (payDetail.isNeedReversal) "REVERSAL FAILED" else "REVERSAL SUCCESS"
}
return POSUtil.getInstance().getResponse(payDetail.tradeAnswerCode.orEmpty().ifBlank { "-" })
}
internal fun displayTransactionTitle(payDetail: PayDetail): String {
val title = payDetail.transType.ifBlank { "TRANSACTION" }
return if (payDetail.transactionType == TransactionsType.REVERSAL.value) {
"$title (REVERSAL)"
} else {
title
}
}
internal fun isValidForReprint(payDetail: PayDetail): Boolean {
if (payDetail.transactionType == TransactionsType.SETTLEMENT.value) return false
if (payDetail.transactionType == TransactionsType.WAVEPAY.value && payDetail.qrTransStatus != 1) {

View File

@ -38,8 +38,6 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.mob.utsmyanmar.ui.components.appbar.AppBar
import com.mob.utsmyanmar.ui.history_functions.displayTransactionStatus
import com.mob.utsmyanmar.ui.history_functions.displayTransactionTitle
import com.mob.utsmyanmar.ui.theme.Color
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultState
import com.mob.utsmyanmar.ui.transaction_result.TransactionResultViewModel
@ -242,11 +240,11 @@ fun ReceiptPreview(
ReceiptRow("Merchant", state.payDetail?.merchantName.toString() )
ReceiptRow("Terminal ID", state.payDetail?.terminalNo.toString() )
ReceiptRow("Trace No", state.payDetail?.voucherNo.toString() )
ReceiptRow("Transaction", state.payDetail?.let(::displayTransactionTitle).orEmpty())
ReceiptRow("Transaction", state.payDetail?.transType.toString())
ReceiptRow("Amount", POSUtil.getInstance().getDecimalAmountSeparatorFormat(state.payDetail?.amount?:0))
ReceiptRow("Card Type", state.payDetail?.accountType.toString())
ReceiptRow("Card No", state.payDetail?.cardNo.toString())
ReceiptRow("Status", state.payDetail?.let(::displayTransactionStatus).orEmpty())
ReceiptRow("Status", POSUtil.getInstance().getResponse(state.payDetail?.tradeAnswerCode?: "-"))
ReceiptRow("Date", state.payDetail?.transDate.toString() )
ReceiptRow("Time", state.payDetail?.transTime.toString())
ReceiptRow("Ref No", state.payDetail?.referNo.toString())

View File

@ -1,5 +1,6 @@
package com.mob.utsmyanmar.ui.sale_void
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@ -137,8 +138,8 @@ private fun TransactionDetailsCard(transaction: PayDetail) {
DetailRow("Card No", transaction.cardNo)
DetailRow("Reference", transaction.referNo)
DetailRow("Approval", transaction.approvalCode.orEmpty())
DetailRow("Date", transaction.transDate)
DetailRow("Time", transaction.transTime)
DetailRow("Date", transaction.tradeDate)
DetailRow("Time", transaction.tradeTime)
}
}
}

View File

@ -125,9 +125,7 @@ class TransactionResultViewModel @Inject constructor(
when {
isNonApprovedTrade(payDetail) &&
isNonWavepayTransaction(transactionType) -> {
if (SystemParamsOperation.getInstance().isPrintErrorSlip) {
startPrintProcess(sharedViewModel, false)
}
isCardInside()
}

View File

@ -174,7 +174,6 @@ class TMSSetupsImpl : TMSSetups {
"clear_batch_time" -> ops.clearBatchTime = data
"alert_sound_enable" -> ops.isAlertSound = parseBoolean(data)
"auto_print_enable" -> ops.isAutoPrintCustomerCopy = parseBoolean(data)
"print_error_slip" -> ops.setPrintErrorSlip(parseBoolean(data))
"ecr_enable" -> ops.ecrStatus = parseBoolean(data)
"manual_entry_enable" -> ops.setManualEntyrStatus(parseBoolean(data))
"mmqr_interval_waiting_time" -> ops.waveIntervalTime = data

View File

@ -6,6 +6,7 @@ import android.graphics.BitmapFactory;
import android.os.RemoteException;
import android.text.TextUtils;
import com.sunmi.peripheral.printer.InnerPrinterCallback;
import com.sunmi.peripheral.printer.InnerResultCallback;
import com.sunmi.peripheral.printer.SunmiPrinterService;
import com.utsmyanmar.paylibs.Constant;
@ -16,6 +17,7 @@ import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.model.TradeData;
import com.utsmyanmar.paylibs.system.BaseErrorCode;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionType;
import com.utsmyanmar.paylibs.utils.params.Params;
import com.utsmyanmar.paylibs.utils.print_utils.BitmapUtils;
@ -300,8 +302,7 @@ public class PrintReceipt {
if (!secondLineName.equals("")) {
sunmiPrinterService.printColumnsString(new String[]{secondLineName, ""}, new int[]{2, 2}, new int[]{0, 1}, null);
}
// 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}, null);
sunmiPrinterService.printColumnsString(new String[]{"ENTRY MODE:" + PrintUtils.getInstance().getEntryType(payDetail.getCardType()), "EXPIRY DATE:" + "**/**"}, new int[]{2, 2}, new int[]{0, 2}, null);
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}, null);
if (payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT) || payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_APPROVED)) {
sunmiPrinterService.printColumnsString(new String[]{"CARD TYPE:" + payDetail.getAccountType(), "APPRCODE:" + payDetail.getApprovalCode()}, new int[]{2, 2}, new int[]{0, 2}, null);
} else {

View File

@ -233,7 +233,7 @@ public abstract class BaseXPrint {
sunmiPrinterService.printText("CARD NUMBER : "+ PrintUtils.getInstance().cardNumMasking(payDetail.getCardNo()) + "\n", innerResultCallback);
if(!firstLineName.isEmpty()) {
sunmiPrinterService.printText("CARD HOLDER : " + firstLineName + "\n", 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()) {
@ -241,8 +241,7 @@ public abstract class BaseXPrint {
// sunmiPrinterService.printColumnsString(new String[]{secondLineName, ""}, new int[]{2, 2}, new int[]{0, 1}, innerResultCallback);
}
sunmiPrinterService.printText("ENTRY MODE : " + PrintUtils.getInstance().getEntryType(payDetail.getCardType()) + "\n", innerResultCallback);
// sunmiPrinterService.printText("EXPIRY DATE : " + PrintUtils.getInstance().getFormatExpDate(payDetail.getEXPDate()) + "\n", innerResultCallback);
sunmiPrinterService.printText("EXPIRY DATE : " + "**/**" + "\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.printText("CARD TYPE : " + cardType + "\n", innerResultCallback);

View File

@ -57,12 +57,13 @@ public class ReversalAction {
public ReversalAction setData(TradeData tradeData) {
this.tradeData = tradeData;
payDetail = tradeData.getPayDetail();
payDetail.setTransactionType(TransactionsType.REVERSAL.value);
// payDetail.setTransType(REVERSAL);
if (TextUtils.equals(payDetail.getAccountType(), MPU)) {
BITMAP = getBitmapMPU(payDetail);
} else {
BITMAP = getBitmapUPI(payDetail);
}
payDetail.setTransactionType(TransactionsType.REVERSAL.value);
return INSTANCE;
}

View File

@ -42,7 +42,6 @@ public class POSUtil {
}
public long convertAmount(String amount) {
long amountValue = 0;
if (amount != null ) {
@ -171,11 +170,7 @@ public class POSUtil {
}
public String formatAmount(long amount) {
return String.format(
Locale.US,
"%,.2f",
amount / 100.0
);
return String.format("%012d", amount);
}
public String responseCodeConverter(String responseCode) {
@ -471,7 +466,8 @@ public class POSUtil {
} else if(payDetail.getTransactionType() == TransactionsType.CASH_OUT.value) {
long totalAmount = payDetail.getAmount() + payDetail.getAdditionalAmount();
return "Transaction for Amount \n"+getDecimalAmountFormat(totalAmount) +" "+currencySign+" Received.";
} else {
}
else {
return "Transaction for Amount \n"+getDecimalAmountFormat(payDetail.getAmount()) +" "+currencySign+" Received.";
}
} else if(TextUtils.equals(payDetail.getAccountType(),"WALLET")) {
@ -500,7 +496,8 @@ public class POSUtil {
}
}
} else {
}
else {
return checkResultCode(payDetail.getTradeAnswerCode());
}
} catch (Exception e){
@ -718,7 +715,6 @@ public class POSUtil {
}
return date;
}
public boolean checkBooleanCardNo(String cardNo) {
return !cardNo.equals("-");
}

View File

@ -781,11 +781,6 @@ public class SystemParamsOperation {
return params.isAutoPrintCustomerCopy();
}
public boolean isPrintErrorSlip() {
SystemParamsSettings params = getSystemParamsSettings();
return params.isPrintErrorSlip();
}
public boolean getManualEntryStatus() {
SystemParamsSettings params = getSystemParamsSettings();
return params.getManualEntryStatus();
@ -902,12 +897,6 @@ public class SystemParamsOperation {
saveSystemParamsSettings(params);
}
public void setPrintErrorSlip(boolean printErrorSlip) {
SystemParamsSettings params = getSystemParamsSettings();
params.setPrintErrorSlip(printErrorSlip);
saveSystemParamsSettings(params);
}
public void setReceiptHeader(String receiptHeader) {
SystemParamsSettings params = getSystemParamsSettings();
params.setReceiptHeader(receiptHeader);

View File

@ -172,8 +172,6 @@ public class SystemParamsSettings implements Serializable {
private boolean isAutoPrintCustomerCopy = false;
private boolean isPrintErrorSlip = false;
private boolean isRandomPinPad = false;
private boolean auto_update_status = true;
@ -422,10 +420,6 @@ public class SystemParamsSettings implements Serializable {
protected void setAutoPrintCustomerCopy(boolean flag) { this.isAutoPrintCustomerCopy = flag; }
protected boolean isPrintErrorSlip() { return isPrintErrorSlip; }
protected void setPrintErrorSlip(boolean flag) { this.isPrintErrorSlip = flag; }
protected boolean getWavePayInquiryStatus() {
return wave_pay_inquiry_status;
}