Compare commits
No commits in common. "83af9149112a03c7c1a466d69ddafdb3ccbdcc8f" and "c96d68ff2f9b3a0e51643530b2b822a706730883" have entirely different histories.
83af914911
...
c96d68ff2f
@ -14,8 +14,8 @@ android {
|
||||
applicationId "com.utsmm.kbz"
|
||||
minSdk 24
|
||||
targetSdk 33
|
||||
versionCode 6
|
||||
versionName "1.05"
|
||||
versionCode 4
|
||||
versionName "1.03"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
|
||||
@ -312,7 +312,7 @@ public class QRTransactionFragment extends DataBindingFragment implements DataBi
|
||||
if(response.getResponse().getWalletIdentifier() != null) {
|
||||
payDetail.setCustomerMobile(response.getResponse().getWalletIdentifier());
|
||||
} else {
|
||||
payDetail.setCustomerMobile("KBZPay");
|
||||
payDetail.setCustomerMobile("KBZ PAY");
|
||||
}
|
||||
|
||||
if(response.getResponse().getMmqrRef() != null) {
|
||||
|
||||
@ -385,7 +385,7 @@ public class TransactionSummaryFragment extends DataBindingFragment {
|
||||
private void printReceipt(PayDetail payDetail) {
|
||||
try {
|
||||
LogUtil.d(TAG, "Starting receipt print");
|
||||
PrintXReceipt.getInstance().printSmileSummaryReport(payDetail, sharedViewModel.hostType.getValue(), new PrintXStatus() {
|
||||
PrintXReceipt.getInstance().printSmileSummaryReport(payDetail, new PrintXStatus() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
LogUtil.d(TAG, "Receipt printed successfully");
|
||||
|
||||
@ -297,8 +297,11 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
|
||||
}
|
||||
|
||||
private void navigateToResult() {
|
||||
|
||||
routeId = R.id.action_QRSettlementTransactionFragment_to_transactionResultFragment;
|
||||
safeNavigateToRouteId();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void processData() {
|
||||
@ -330,8 +333,7 @@ public class QRSettlementTransactionFragment extends DataBindingFragment impleme
|
||||
}
|
||||
}
|
||||
private void updateData() {
|
||||
// EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue());
|
||||
EReceiptRequest request = EReceiptUtil.getInstance().generateQRSettlement(sharedViewModel.payDetail.getValue());
|
||||
EReceiptRequest request = EReceiptUtil.getInstance().generateMPUReceipt(sharedViewModel.payDetail.getValue());
|
||||
sharedViewModel.pushReceipt(request);
|
||||
}
|
||||
|
||||
|
||||
@ -92,8 +92,8 @@ public class SelectSettlementFragment extends DataBindingFragment implements Dat
|
||||
|
||||
public void onQRSettlement() {
|
||||
|
||||
if (TMSUtil.getInstance().checkQRParams().isStatus() == ValidityStatus.FAILURE) {
|
||||
showDeclineDialog(getResourceString(R.string.txt_please_download_config)+"\n"+TMSUtil.getInstance().checkQRParams().getMessage());
|
||||
if (TMSUtil.getInstance().checkParams().isStatus() == ValidityStatus.FAILURE) {
|
||||
showDeclineDialog(getResourceString(R.string.txt_please_download_config)+"\n"+TMSUtil.getInstance().checkParams().getMessage());
|
||||
} else if (!Connectivity.isConnectedWifi(getContext()) && !Connectivity.isConnectedMobile(getContext())) {
|
||||
showSingleInfoDialog(getResourceString(R.string.txt_please_enable_internet));
|
||||
} else {
|
||||
|
||||
@ -17,6 +17,9 @@ public class DownloadUtil {
|
||||
|
||||
private static final String TAG = DownloadUtil.class.getSimpleName();
|
||||
|
||||
// ==============================
|
||||
// CALLBACK INTERFACE
|
||||
// ==============================
|
||||
public interface DownloadCallback {
|
||||
void onDownloadSuccess(String path);
|
||||
}
|
||||
@ -26,21 +29,21 @@ public class DownloadUtil {
|
||||
// ==============================
|
||||
public static void downloadCertificateRx(String url,
|
||||
String dynamicFilename,
|
||||
String timestamp,
|
||||
String signature,
|
||||
DownloadCallback callback) {
|
||||
|
||||
Observable.fromCallable(() ->
|
||||
downloadCert(url, dynamicFilename, timestamp, signature)
|
||||
)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
Observable.fromCallable(() -> downloadCert(url, dynamicFilename))
|
||||
.subscribeOn(Schedulers.io()) // download on background thread
|
||||
.observeOn(AndroidSchedulers.mainThread()) // callback on main thread
|
||||
.subscribe(path -> {
|
||||
if (callback != null) {
|
||||
callback.onDownloadSuccess(path);
|
||||
if (path != null) {
|
||||
LogUtil.d(TAG, "Certificate saved at: " + path);
|
||||
if (callback != null) callback.onDownloadSuccess(path);
|
||||
} else {
|
||||
LogUtil.e(TAG, "Certificate download failed.");
|
||||
if (callback != null) callback.onDownloadSuccess(null);
|
||||
}
|
||||
}, error -> {
|
||||
LogUtil.e(TAG, "Download error : " + error);
|
||||
error.printStackTrace();
|
||||
if (callback != null) callback.onDownloadSuccess(null);
|
||||
});
|
||||
}
|
||||
@ -48,71 +51,62 @@ public class DownloadUtil {
|
||||
// ==============================
|
||||
// ACTUAL DOWNLOAD LOGIC
|
||||
// ==============================
|
||||
private static String downloadCert(String url,
|
||||
String dynamicFilename,
|
||||
String timestamp,
|
||||
String signature) {
|
||||
LogUtil.d(TAG, "cert timestamp => " + timestamp);
|
||||
LogUtil.d(TAG, "cert signature => " + signature);
|
||||
public static String downloadCert(String url, String dynamicFilename) {
|
||||
try {
|
||||
OkHttpClient client = new OkHttpClient();
|
||||
Request request = new Request.Builder().url(url).build();
|
||||
|
||||
OkHttpClient client = new OkHttpClient.Builder()
|
||||
.connectTimeout(30, java.util.concurrent.TimeUnit.SECONDS)
|
||||
.readTimeout(30, java.util.concurrent.TimeUnit.SECONDS)
|
||||
.build();
|
||||
Response response = client.newCall(request).execute();
|
||||
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.addHeader("x-timestamp", timestamp)
|
||||
.addHeader("x-api-key", signature)
|
||||
.build();
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
|
||||
if (!response.isSuccessful() || response.body() == null) {
|
||||
if (!response.isSuccessful()) {
|
||||
LogUtil.e(TAG, "Download failed: " + response.code());
|
||||
return null;
|
||||
}
|
||||
|
||||
// Detect extension (MIME or URL fallback)
|
||||
String contentType = response.header("Content-Type", "");
|
||||
String ext = getExtensionFromContentType(contentType);
|
||||
|
||||
if (ext.isEmpty()) ext = getExtensionFromUrl(url);
|
||||
if (ext.isEmpty()) ext = ".bin";
|
||||
if (ext.isEmpty()) ext = ".bin"; // final fallback
|
||||
|
||||
// build dynamic filename
|
||||
String filename = dynamicFilename + ext;
|
||||
byte[] data = response.body().bytes();
|
||||
|
||||
return saveFile(filename, data);
|
||||
byte[] data = response.body().bytes();
|
||||
String savedPath = saveFile(filename, data);
|
||||
|
||||
return savedPath;
|
||||
|
||||
} catch (Exception e) {
|
||||
LogUtil.e(TAG, "Download exception : " + e);
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// ==============================
|
||||
// SAVE FILE
|
||||
// SAVE FILE TO INTERNAL STORAGE
|
||||
// ==============================
|
||||
private static String saveFile(String filename, byte[] data) {
|
||||
try {
|
||||
File dir = MyApplication.getInstance().getFilesDir();
|
||||
File file = new File(dir, filename);
|
||||
|
||||
try (FileOutputStream fos = new FileOutputStream(file)) {
|
||||
fos.write(data);
|
||||
fos.flush();
|
||||
}
|
||||
FileOutputStream fos = new FileOutputStream(file);
|
||||
fos.write(data);
|
||||
fos.flush();
|
||||
fos.close();
|
||||
|
||||
return file.getAbsolutePath();
|
||||
|
||||
} catch (Exception e) {
|
||||
LogUtil.e(TAG, "File save failed : " + e);
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// ==============================
|
||||
// MIME → EXTENSION
|
||||
// MIME TYPE → EXTENSION
|
||||
// ==============================
|
||||
private static String getExtensionFromContentType(String contentType) {
|
||||
if (contentType == null) return "";
|
||||
@ -126,12 +120,15 @@ public class DownloadUtil {
|
||||
case "application/octet-stream":
|
||||
return ".pem";
|
||||
case "application/x-pkcs12":
|
||||
return ".p12";
|
||||
return ".pkcs12";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// ==============================
|
||||
// URL EXTENSION PARSER
|
||||
// ==============================
|
||||
private static String getExtensionFromUrl(String url) {
|
||||
if (url == null) return "";
|
||||
int lastDot = url.lastIndexOf('.');
|
||||
@ -139,4 +136,3 @@ public class DownloadUtil {
|
||||
return url.substring(lastDot);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -228,81 +228,6 @@ public class EReceiptUtil {
|
||||
return request;
|
||||
}
|
||||
|
||||
public EReceiptRequest generateQRSettlement(PayDetail payDetail) {
|
||||
|
||||
double realAmount = payDetail.getAmount() / 100.0;
|
||||
DecimalFormat df = new DecimalFormat("0.00");
|
||||
String amount = df.format(realAmount);
|
||||
|
||||
String currentTimeStamp = new java.text.SimpleDateFormat("MMddHHmmss", java.util.Locale.getDefault())
|
||||
.format(new java.util.Date());
|
||||
|
||||
String terminalId = SystemParamsOperation.getInstance().getTerminalIdForEreceipt();
|
||||
|
||||
EReceiptRequest request = new EReceiptRequest();
|
||||
request.setDE3(convertTransactionType(payDetail.getTransactionType()));
|
||||
request.setDE7(currentTimeStamp);
|
||||
request.setDE11(payDetail.getVoucherNo());
|
||||
String hostId = SystemParamsOperation.getInstance().getSecHostId();
|
||||
request.setHostId(hostId);
|
||||
request.setTerminalId(terminalId);//terminalId is not tid
|
||||
request.setShortCode(qrMerchantId);
|
||||
|
||||
if(payDetail.getTransactionType() == TransactionsType.SETTLEMENT.value) {
|
||||
SettleData settleData = payDetail.getSettleDataObj();
|
||||
|
||||
long totalAmt = settleData.getSaleAmount() + settleData.getRefundAmount() + settleData.getPreAuthCompAmount() + settleData.getCashAdvanceAmount();
|
||||
double realTotalAmount = totalAmt / 100.0;
|
||||
String totalAmount = df.format(realTotalAmount);
|
||||
request.setDE4(totalAmount);
|
||||
|
||||
|
||||
request.setDE63_01(settleData.getSaleCount()+"");
|
||||
request.setDE63_02(settleData.getSaleAmount()+"");
|
||||
request.setDE63_03(settleData.getRefundCount()+"");
|
||||
request.setDE63_04(settleData.getRefundAmount()+"");
|
||||
request.setDE63_05(settleData.getPreAuthCompCount()+"");
|
||||
request.setDE63_06(settleData.getPreAuthCompAmount()+"");
|
||||
request.setDE63_07(settleData.getCashAdvanceCount()+"");
|
||||
request.setDE63_08(settleData.getCashAdvanceAmount()+"");
|
||||
invoiceNo = SystemParamsOperation.getInstance().getIncrementInvoiceNum();
|
||||
request.setBatchNumber(batchNumber);
|
||||
request.setInvoiceNumber(invoiceNo);
|
||||
request.setDescription("success");
|
||||
request.setDE39("A");
|
||||
request.setDE37("0000");
|
||||
request.setDE49("MMK");
|
||||
} else {
|
||||
request.setDE2(POSUtil.getInstance().getCardNumMasking(payDetail.getCardNo()));
|
||||
|
||||
request.setDE4(amount);
|
||||
|
||||
|
||||
request.setDE37(payDetail.getReferNo());
|
||||
request.setDE38(payDetail.getApprovalCode());
|
||||
// will check it later for currency code
|
||||
request.setDE49("MMK");
|
||||
request.setInvoiceNumber(payDetail.getInvoiceNo());
|
||||
request.setCardLabel("MPU");
|
||||
|
||||
if(payDetail.getTradeAnswerCode().equals("000") || payDetail.getTradeAnswerCode().equals("00") ) {
|
||||
|
||||
request.setDescription("success");
|
||||
request.setDE39("A");
|
||||
} else {
|
||||
request.setDescription(BaseErrorCode.getErrorMessage(payDetail.getTradeAnswerCode()));
|
||||
request.setDE39("E");
|
||||
}
|
||||
}
|
||||
request.setDE41(terminalId);
|
||||
request.setDE42(merchantId);
|
||||
|
||||
request.setSerial(serialNum);
|
||||
request.setAppId(packageName);
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
public String convertTransactionType(int transactionType) {
|
||||
if(transactionType == TransactionsType.SALE.value) {
|
||||
return "S";
|
||||
|
||||
@ -11,7 +11,6 @@ import com.utsmyanmar.baselib.network.model.sirius.SiriusMerchant;
|
||||
import com.utsmyanmar.baselib.network.model.sirius.SiriusProperty;
|
||||
import com.utsmyanmar.baselib.network.model.sirius.SiriusResponse;
|
||||
import com.utsmyanmar.baselib.network.model.sirius.SiriusTerminal;
|
||||
import com.utsmyanmar.baselib.util.EReceiptHelper;
|
||||
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
|
||||
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsSettings;
|
||||
import com.utsmyanmar.paylibs.utils.enums.CurrencyType;
|
||||
@ -35,9 +34,6 @@ public class TMSSetupsImpl implements TMSSetups{
|
||||
private static final String JCB = "JCB";
|
||||
private static final String VISA = "VISA";
|
||||
private static final String MASTERCARD = "MASTERCARD";
|
||||
private static final String E_RECEIPT_SECRET = com.utsmyanmar.baselib.BuildConfig.ERECEIPT_SECRET;
|
||||
String timestamp = String.valueOf(System.currentTimeMillis());
|
||||
String signature = generateSignature(E_RECEIPT_SECRET, timestamp);
|
||||
|
||||
|
||||
private CurrencyType currencyTextToCurrencyType(String currencyTxt) {
|
||||
@ -634,9 +630,7 @@ public class TMSSetupsImpl implements TMSSetups{
|
||||
// String url = tmsAddress+"/file/download?filePath="+data;
|
||||
String url = tmsAddress+"/api/v1/file/download?filePath="+data; //for local
|
||||
|
||||
|
||||
|
||||
DownloadUtil.downloadCertificateRx(url, "certificate_file", timestamp, signature, path -> {
|
||||
DownloadUtil.downloadCertificateRx(url, "certificate_file", path -> {
|
||||
if(path != null){
|
||||
SystemParamsOperation.getInstance().setCertFilePath(path);
|
||||
LogUtil.d(TAG, "Cert file path saved in SystemParams => " + path);
|
||||
@ -657,7 +651,7 @@ public class TMSSetupsImpl implements TMSSetups{
|
||||
}
|
||||
// String url = tmsAddress+"/file/download?filePath="+data;
|
||||
String url = tmsAddress+"/api/v1/file/download?filePath="+data; //for local
|
||||
DownloadUtil.downloadCertificateRx(url, "certificate_client" , timestamp, signature, path -> {
|
||||
DownloadUtil.downloadCertificateRx(url, "certificate_client", path -> {
|
||||
if(path != null){
|
||||
SystemParamsOperation.getInstance().setCertClientFilePath(path);
|
||||
LogUtil.d(TAG, "Cert client file path saved in SystemParams => " + path);
|
||||
@ -674,12 +668,6 @@ public class TMSSetupsImpl implements TMSSetups{
|
||||
SystemParamsOperation.getInstance().setCarouselUrls(convertToString(imgUrls));
|
||||
}
|
||||
|
||||
private static String generateSignature(String apiSecret, String timestamp) {
|
||||
String bodyString = "";
|
||||
String dataToHash = bodyString + apiSecret + timestamp;
|
||||
return EReceiptHelper.sha256(dataToHash);
|
||||
}
|
||||
|
||||
|
||||
private String convertToString(ArrayList<String> list) {
|
||||
|
||||
|
||||
@ -442,8 +442,6 @@ public class KPayRefund {
|
||||
}
|
||||
}
|
||||
|
||||
public static class CertificateDownloadRequest{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -225,16 +225,6 @@ public class PrintUtils {
|
||||
double amounts = Double.parseDouble(scaled.toString());
|
||||
return formatter.format(amounts);
|
||||
}
|
||||
public String getSeparatorNumberFormat(long amount, boolean isDecimal) {
|
||||
if (amount == 0) return isDecimal ? "0.00" : "0";
|
||||
|
||||
DecimalFormat formatter = new DecimalFormat(isDecimal ? "#,###.00" : "#,###");
|
||||
int x = 2;
|
||||
BigDecimal unscaled = new BigDecimal(amount);
|
||||
BigDecimal scaled = unscaled.scaleByPowerOfTen(-x);
|
||||
double amounts = Double.parseDouble(scaled.toString());
|
||||
return formatter.format(amounts);
|
||||
}
|
||||
|
||||
public String getSeparatorOnlyNumberFormat(long amount) {
|
||||
if (amount == 0) return "0";
|
||||
|
||||
@ -90,7 +90,7 @@ public abstract class BaseXPrint {
|
||||
protected int fontNormal = 21;
|
||||
protected int fontLarge = 22;
|
||||
|
||||
// protected FontEntity fontNormal = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_12X24);
|
||||
// protected FontEntity fontNormal = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_12X24);
|
||||
protected FontEntity fontBold = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_BOLD_16X24);
|
||||
protected FontEntity fontBig = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_12X24, false, true);
|
||||
|
||||
@ -494,7 +494,6 @@ public abstract class BaseXPrint {
|
||||
|
||||
String MMK = "MMK";
|
||||
SettleData settleData = payDetail.getSettleDataObj();
|
||||
boolean isQrDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable();
|
||||
|
||||
int totalCount = settleData.getSaleCount() + settleData.getWavePayCount() + settleData.getVoidSaleCount() + settleData.getCashAdvanceCount() + settleData.getRefundCount() + settleData.getPreAuthCompCount() + settleData.getPreAuthCompVoidCount() + settleData.getWaveRefundCount();
|
||||
long totalAmount = (settleData.getCashAdvanceAmount() + settleData.getSaleAmount() + settleData.getWavePayAmount() + settleData.getPreAuthCompAmount()) - (settleData.getVoidSaleAmount() + settleData.getRefundAmount() + settleData.getPreAuthCompVoidAmount() + settleData.getWaveRefundAmount());
|
||||
@ -510,10 +509,9 @@ public abstract class BaseXPrint {
|
||||
} else {
|
||||
printer.appendPrnStr("CARD NAME:" + payDetail.getAccountType(), fontNormal, AlignEnum.LEFT,false);
|
||||
}
|
||||
// printer.appendPrnStr(" " + "COUNT " + " " + " TOTAL", fontNormal, AlignEnum.LEFT,false);
|
||||
printer.appendPrnStr("COUNT", "TOTAL", fontNormal, false);
|
||||
printer.appendPrnStr(" " + "COUNT " + " " + " TOTAL", fontNormal, AlignEnum.LEFT,false);
|
||||
// printer.printColumnsString(new String[]{"", "COUNT", "TOTAL"}, new int[]{2,1, 1}, new int[]{ 2,1, 2}, innerResultCallback);
|
||||
// emptyLine(1);
|
||||
emptyLine(1);
|
||||
if (settleData.getSaleCount() > 0)
|
||||
printColumnString("SALES", settleData.getSaleCount(), settleData.getSaleAmount(), false);
|
||||
// printer.appendPrnStr("SALES "+ countStringFormat(settleData.getSaleCount())+MMK+" "+ PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getSaleAmount()), fontNormal, AlignEnum.LEFT,false);
|
||||
@ -531,22 +529,17 @@ public abstract class BaseXPrint {
|
||||
printColumnString("PREAUTH COMP", settleData.getPreAuthCompCount(), settleData.getPreAuthCompAmount(), false);
|
||||
if (settleData.getPreAuthCompVoidCount() > 0)
|
||||
printColumnString("VOID PREAUTH COMPLETE", settleData.getPreAuthCompVoidCount(), settleData.getPreAuthCompVoidAmount(), true);
|
||||
if (settleData.getWavePayCount() > 0){
|
||||
// printColumnString("QR PAY", settleData.getWavePayCount(), settleData.getWavePayAmount(), false);
|
||||
printer.appendPrnStr( "QR PAY " + countStringFormat(settleData.getWavePayCount()) + " " + "MMK" , PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getWavePayAmount(), isQrDecimalEnabled) , fontNormal, false);
|
||||
}
|
||||
if (settleData.getWaveRefundCount() > 0) {
|
||||
// printColumnString("QR REFUND", settleData.getWaveRefundCount(), settleData.getWaveRefundAmount(), true);
|
||||
printer.appendPrnStr( "QR REFUND " + countStringFormat(settleData.getWaveRefundCount()) + " " + "MMK" , PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getWaveRefundAmount(), isQrDecimalEnabled) , fontNormal, false);
|
||||
}
|
||||
if (settleData.getWavePayCount() > 0)
|
||||
printColumnString("QR PAY", settleData.getWavePayCount(), settleData.getWavePayAmount(), false);
|
||||
if (settleData.getWaveRefundCount() > 0)
|
||||
printColumnString("QR REFUND", settleData.getWaveRefundCount(), settleData.getWaveRefundAmount(), true);
|
||||
dashBreak();
|
||||
// printColumnString("TOTAL", totalCount, totalAmount, false);
|
||||
printer.appendPrnStr( "TOTAL " + countStringFormat(totalCount) + " " + "MMK", PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isQrDecimalEnabled) , fontNormal, false);
|
||||
printColumnString("TOTAL", totalCount, totalAmount, false);
|
||||
|
||||
|
||||
printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
|
||||
printer.appendPrnStr("GRAND TOTAL", fontNormal, AlignEnum.LEFT,false);
|
||||
// printer.appendPrnStr(" " + "COUNT " + " " + " TOTAL", fontNormal, AlignEnum.LEFT,false);
|
||||
printer.appendPrnStr("COUNT", "TOTAL", fontNormal, false);
|
||||
printer.appendPrnStr(" " + "COUNT " + " " + " TOTAL", fontNormal, AlignEnum.LEFT,false);
|
||||
// printer.printColumnsString(new String[]{"", "COUNT", "TOTAL"}, new int[]{2,1, 1}, new int[]{ 2,1, 2}, innerResultCallback);
|
||||
// emptyLine(1);
|
||||
if (settleData.getSaleCount() > 0)
|
||||
@ -566,21 +559,15 @@ public abstract class BaseXPrint {
|
||||
printColumnString("PREAUTH COMP", settleData.getPreAuthCompCount(), settleData.getPreAuthCompAmount(), false);
|
||||
if (settleData.getPreAuthCompVoidCount() > 0)
|
||||
printColumnString("VOID PREAUTH COMPLETE", settleData.getPreAuthCompVoidCount(), settleData.getPreAuthCompVoidAmount(), true);
|
||||
if (settleData.getWavePayCount() > 0) {
|
||||
// printColumnString("QR PAY", settleData.getWavePayCount(), settleData.getWavePayAmount(), false);
|
||||
printer.appendPrnStr( "QR PAY " + countStringFormat(settleData.getWavePayCount()) + " " + "MMK" , PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getWavePayAmount(), isQrDecimalEnabled) , fontNormal, false);
|
||||
}
|
||||
if (settleData.getWaveRefundCount() > 0){
|
||||
// printColumnString("QR REFUND", settleData.getWaveRefundCount(), settleData.getWaveRefundAmount(), true);
|
||||
printer.appendPrnStr( "QR REFUND " + countStringFormat(settleData.getWaveRefundCount()) + " " + "MMK" , PrintUtils.getInstance().getSeparatorNumberFormat(settleData.getWaveRefundAmount(), isQrDecimalEnabled) , fontNormal, false);
|
||||
}
|
||||
if (settleData.getWavePayCount() > 0)
|
||||
printColumnString("QR PAY", settleData.getWavePayCount(), settleData.getWavePayAmount(), false);
|
||||
if (settleData.getWaveRefundCount() > 0)
|
||||
printColumnString("QR REFUND", settleData.getWaveRefundCount(), settleData.getWaveRefundAmount(), true);
|
||||
dashBreak();
|
||||
// printColumnString("TOTAL", totalCount, totalAmount, false);
|
||||
printer.appendPrnStr( "TOTAL " + countStringFormat(totalCount) + " " + "MMK", PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isQrDecimalEnabled) , fontNormal, false);
|
||||
printColumnString("TOTAL", totalCount, totalAmount, false);
|
||||
|
||||
|
||||
// printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
|
||||
// printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
|
||||
printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
|
||||
printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
|
||||
|
||||
|
||||
}
|
||||
@ -662,15 +649,13 @@ public abstract class BaseXPrint {
|
||||
if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) {
|
||||
print2ColumnsString("CARD NAME", "CARD NUMBER");
|
||||
print2ColumnsString("EXP DATE", "TRACE NO");
|
||||
print2ColumnsString("TRANSACTION", "");
|
||||
print2ColumnsString("AMOUNT", "");
|
||||
print2ColumnsString("TRANSACTION", "AMOUNT");
|
||||
print2ColumnsString("REF NUM", "");
|
||||
} else if (hostType == HostType.QR) {
|
||||
print2ColumnsString("PAYMENT NAME", "");
|
||||
print2ColumnsString("EXP DATE", "");
|
||||
print2ColumnsString("TRANSACTION", "TRACE NO");
|
||||
print2ColumnsString("TRXN ID", "");
|
||||
print2ColumnsString("AMOUNT", "");
|
||||
print2ColumnsString("TRXN ID", "AMOUNT");
|
||||
}
|
||||
|
||||
|
||||
@ -681,27 +666,25 @@ public abstract class BaseXPrint {
|
||||
for (PayDetail pay : lists) {
|
||||
|
||||
boolean isNeedMinusSign = pay.getTransactionType() == TransactionsType.VOID.value || pay.getTransactionType() == TransactionsType.REFUND.value || pay.getTransactionType() == TransactionsType.MMQR_REFUND.value;
|
||||
boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable();
|
||||
|
||||
if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) {
|
||||
print2ColumnsString(pay.getAccountType(), PrintUtils.getInstance().maskCardNumberPciDss(pay.getCardNo()));
|
||||
print2ColumnsString("**/**", pay.getVoucherNo());
|
||||
print2ColumnsString(pay.getTransType().replace("_", " "), isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled));
|
||||
print2ColumnsString(pay.getTransType().replace("_", " "), isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()));
|
||||
print2ColumnsString(pay.getReferNo(), "");
|
||||
|
||||
} else if (hostType == HostType.QR) {
|
||||
if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
|
||||
print2ColumnsString("QR PAYMENT", "");
|
||||
} else {
|
||||
print2ColumnsString(pay.getCustomerMobile(), "");
|
||||
print2ColumnsString(pay.getCustomerMobile().toUpperCase(), "");
|
||||
}
|
||||
print2ColumnsString("**/**", "");
|
||||
print2ColumnsString(pay.getTransType().replace("_", " "), pay.getVoucherNo());
|
||||
if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
|
||||
print2ColumnsString(pay.getReferNo() + "(RRN)", "");
|
||||
print2ColumnsString(isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled), "");
|
||||
print2ColumnsString(pay.getReferNo() + "(RRN)", isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()));
|
||||
} else {
|
||||
print2ColumnsString(pay.getQrTransId(), "");
|
||||
print2ColumnsString(isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount(), isDecimalEnabled) , "");
|
||||
print2ColumnsString(pay.getQrTransId(), isNeedMinusSign ? "-" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()) : "" + PrintUtils.getInstance().getSeparatorNumberFormat(pay.getAmount()));
|
||||
}
|
||||
|
||||
}
|
||||
@ -716,20 +699,21 @@ public abstract class BaseXPrint {
|
||||
}
|
||||
|
||||
if (hostType == HostType.MPU || hostType == HostType.VISA_MASTER) {
|
||||
boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable();
|
||||
print2ColumnsString("MPU", "");
|
||||
print2ColumnsString("CARD TYPE", "");
|
||||
print3ColumnsString("", "COUNT", "AMT");
|
||||
emptyLine(1);
|
||||
print3ColumnsString("MPU", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled));
|
||||
print3ColumnsString("MPU", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount));
|
||||
} else if (hostType == HostType.QR) {
|
||||
boolean isDecimalEnabled = SystemParamsOperation.getInstance().isQrDecimalEnable();
|
||||
print2ColumnsString("PAYMENT", "");
|
||||
print3ColumnsString("TYPE", "COUNT", "AMT");
|
||||
emptyLine(1);
|
||||
print3ColumnsString("QR PAY", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount, isDecimalEnabled));
|
||||
print3ColumnsString("QR PAY", countStringFormat(lists.size()), "MMK " + PrintUtils.getInstance().getSeparatorNumberFormat(totalAmount));
|
||||
}
|
||||
|
||||
emptyLine(2);
|
||||
|
||||
|
||||
}
|
||||
|
||||
protected void printQRSettlementTransDetail(List<PayDetail> lists) {
|
||||
@ -739,15 +723,10 @@ public abstract class BaseXPrint {
|
||||
long refundTotal = 0;
|
||||
|
||||
for (PayDetail pay : lists) {
|
||||
// printer.appendPrnStr("DATE :" + POSUtil.getInstance().formatDisplayDate(payDetail.getTransDate()), fontNormal, AlignEnum.LEFT, false);
|
||||
// printer.appendPrnStr("TIME :" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT, false);
|
||||
|
||||
printString("Trans Id: " + pay.getQrTransId());
|
||||
printString("Status : " + pay.getTC());
|
||||
// printString("Date : " + PrintUtils.getInstance().formatTimestamp(Long.parseLong(pay.getTradeDateAndTime())));
|
||||
printString("Date : " + POSUtil.getInstance().formatDisplayDate(pay.getTradeDate()));
|
||||
printString("Time : " + pay.getTransTime());
|
||||
|
||||
printString("Date : " + PrintUtils.getInstance().formatTimestamp(Long.parseLong(pay.getTradeDateAndTime())));
|
||||
printString("Amount : " + "MMK " + PrintUtils.getInstance().getSeparatorOnlyNumberFormat(pay.getAmount()));
|
||||
|
||||
if (pay.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
|
||||
@ -827,7 +806,9 @@ public abstract class BaseXPrint {
|
||||
|
||||
emptyLine(0);
|
||||
// printer.appendPrnStr("I AGREE TO PAY THE ABOVE TOTAL AMOUNT", fontSmall, AlignEnum.CENTER,false);
|
||||
if (!isQR) {
|
||||
if (isQR) {
|
||||
// printer.appendPrnStr("ACCORDING TO THE ISSUER AGREEMENT", fontSmall, AlignEnum.CENTER,false);
|
||||
} else {
|
||||
printer.appendPrnStr("I AGREE TO PAY THE ABOVE TOTAL AMOUNT", fontSmall, AlignEnum.CENTER,false);
|
||||
printer.appendPrnStr("ACCORDING TO THE CARD ISSUER AGREEMENT", fontSmall, AlignEnum.CENTER,false);
|
||||
}
|
||||
@ -837,7 +818,7 @@ public abstract class BaseXPrint {
|
||||
} else {
|
||||
printer.appendPrnStr("***** CUSTOMER COPY *****", fontSmall, AlignEnum.CENTER,false);
|
||||
}
|
||||
// printer.appendPrnStr(finalVersion, fontSmall, AlignEnum.CENTER,false);
|
||||
printer.appendPrnStr(finalVersion, fontSmall, AlignEnum.CENTER,false);
|
||||
printer.appendPrnStr(receiptFooter, fontSmall, AlignEnum.CENTER,false);
|
||||
|
||||
|
||||
@ -904,11 +885,11 @@ public abstract class BaseXPrint {
|
||||
if(TextUtils.equals(terminalName, "") || terminalName == null){
|
||||
terminalName = "Terminal Name";
|
||||
}
|
||||
emptyLine(1);
|
||||
// printer.appendPrnStr(receiptHeader, fontNormal, AlignEnum.CENTER,false);
|
||||
printer.appendPrnStr(terminalName, fontNormal, AlignEnum.CENTER, false);
|
||||
|
||||
printer.appendPrnStr(receiptHeader, fontNormal, AlignEnum.CENTER,false);
|
||||
printer.appendPrnStr(merchantAddress, fontNormal, AlignEnum.CENTER,false);
|
||||
printer.appendPrnStr(merchantAddress2, fontNormal, AlignEnum.CENTER,false);
|
||||
printer.appendPrnStr(terminalName, fontNormal, AlignEnum.LEFT, false);
|
||||
// printer.appendPrnStr(merchantPhoneNo, fontNormal, AlignEnum.CENTER,false);
|
||||
// emptyLine(1);
|
||||
// dashBreak();
|
||||
@ -1001,47 +982,6 @@ public abstract class BaseXPrint {
|
||||
|
||||
}
|
||||
|
||||
protected void printTransHeader(PayDetail payDetail, HostType hostType) {
|
||||
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();
|
||||
String shortCode = SystemParamsOperation.getInstance().getShortCode();
|
||||
|
||||
|
||||
batchNum = payDetail.getBatchNo();
|
||||
|
||||
|
||||
// printer.appendPrnStr("DATE :" + payDetail.getTransDate() + " TIME:" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT,false);
|
||||
printer.appendPrnStr("DATE :" + POSUtil.getInstance().formatDisplayDate(payDetail.getTransDate()), fontNormal, AlignEnum.LEFT, false);
|
||||
printer.appendPrnStr("TIME :" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT, false);
|
||||
if (payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1) {
|
||||
printer.appendPrnStr("TRACE NO:" + traceNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false);
|
||||
} else if (!payDetail.getTransType().equals(SETTLEMENT) && !payDetail.getTransType().equals(SUMMARY) && payDetail.getTransactionType() != TransactionsType.MMQR_REFUND.value && payDetail.getTransactionType() != TransactionsType.MMQR.value) {
|
||||
printer.appendPrnStr("BTH NO :" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false);
|
||||
} else if (payDetail.getTransType().equals(SUMMARY)) {
|
||||
printer.appendPrnStr("HOST :" + HOST_NAME_MPU + "", fontNormal, AlignEnum.LEFT,false);
|
||||
}
|
||||
/* 17 Sept 2024 Yoma requested to changed slip design for QR*/
|
||||
// printer.printColumnsString(new String[]{"MID :" + payDetail.getMerchantNo(), ""}, new int[]{3, 1}, new int[]{0, 2}, innerResultCallback);
|
||||
// printer.printColumnsString(new String[]{"TID :" + payDetail.getTerminalNo(), ""}, new int[]{3, 1}, new int[]{0, 2}, innerResultCallback);
|
||||
if (hostType == HostType.QR){
|
||||
printer.appendPrnStr("SHORT CODE:" + shortCode, fontNormal, AlignEnum.LEFT,false);
|
||||
}else{
|
||||
printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false);
|
||||
printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false);
|
||||
}
|
||||
|
||||
emptyLine(1);
|
||||
printer.appendPrnStr(transType.replace("_", " "),fontNormal, AlignEnum.CENTER,true);
|
||||
|
||||
if (!(payDetail.getQrTransStatus() != 1 && (payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value || payDetail.getTransactionType() == TransactionsType.MMQR.value))) {
|
||||
printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected InnerResultCallback innerResultCallback = new InnerResultCallback() {
|
||||
@Override
|
||||
public void onRunResult(boolean isSuccess) throws RemoteException {
|
||||
|
||||
@ -17,8 +17,6 @@ public interface PrintX {
|
||||
|
||||
void printSmileSummaryReport(PayDetail payDetail,PrintXStatus printXStatus);
|
||||
|
||||
void printSmileSummaryReport(PayDetail payDetail, HostType hostType, PrintXStatus printXStatus);
|
||||
|
||||
void printSmileSettlementReport(PayDetail payDetail,PrintXStatus printXStatus);
|
||||
|
||||
void printQRSettlementReport(PayDetail payDetail,List<PayDetail> list,PrintXStatus printXStatus);
|
||||
|
||||
@ -231,7 +231,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
|
||||
setHeight(0x12);
|
||||
printLogo();
|
||||
printMerchantHeader();
|
||||
printTransHeader(payDetail, hostType);
|
||||
printTransHeader(payDetail);
|
||||
printTransDetailReport(lists,hostType);
|
||||
|
||||
// emptyLine(1);
|
||||
@ -311,7 +311,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
|
||||
|
||||
// payDetail.getCustomerMobile() // as channel type
|
||||
if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1 ) {
|
||||
print2ColumnsStringNoSpace("PAYMENT TYPE ",": "+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile()));
|
||||
print2ColumnsStringNoSpace("PAYMENT TYPE ",": "+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile().toUpperCase()));
|
||||
print2ColumnsStringNoSpace("TRXN REF ",": "+ payDetail.getReferNo());
|
||||
if(payDetail.getQrReferNo() != null && !payDetail.getQrReferNo().isEmpty()) {
|
||||
print2ColumnsStringNoSpace("MMQR REF ",": "+ payDetail.getQrReferNo());
|
||||
@ -325,7 +325,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
|
||||
print2ColumnsStringNoSpace("STATUS ",":"+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus()));
|
||||
|
||||
} else if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == -1) {
|
||||
print2ColumnsStringNoSpace("PAYMENT TYPE ",":"+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile()));
|
||||
print2ColumnsStringNoSpace("PAYMENT TYPE ",":"+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile().toUpperCase()));
|
||||
print2ColumnsStringNoSpace("TRXN REF ",":"+ payDetail.getReferNo());
|
||||
print2ColumnsStringNoSpace("TXN TIME ",":"+ (payDetail.getOriginalTransDate() == null || payDetail.getOriginalTransDate().isEmpty() ? POSUtil.getInstance().getCurrentDateTimeForQR(): payDetail.getOriginalTransDate()));
|
||||
}
|
||||
@ -339,10 +339,8 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
|
||||
if (payDetail.getQrTransStatus() == 1) {
|
||||
|
||||
boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value;
|
||||
boolean isQrDecimalEnable = SystemParamsOperation.getInstance().isQrDecimalEnable();
|
||||
|
||||
lineBreak();
|
||||
print2ColumnsStringBoldCenter("TOTAL MMK", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable): PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount(), isQrDecimalEnable),fontLarge, AlignEnum.LEFT);
|
||||
print2ColumnsStringBoldCenter("TOTAL MMK", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()): PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()),fontLarge, AlignEnum.LEFT);
|
||||
lineBreak();
|
||||
|
||||
// if(payDetail.getTransactionType() == TransactionsType.MMQR.value) {
|
||||
@ -415,32 +413,15 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
|
||||
printTransDetailSummary(payDetail);
|
||||
// printTransFooterSummary();
|
||||
|
||||
// emptyLine(2);
|
||||
emptyLine(2);
|
||||
startPrintNex();
|
||||
} catch (RemoteException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printSmileSummaryReport(PayDetail payDetail, HostType hostType, PrintXStatus printXStatus) {
|
||||
this.callbackStatus = printXStatus;
|
||||
try {
|
||||
// LogUtil.d(TAG, payDetail.getSettleDataObj().toString());
|
||||
|
||||
setHeight(0x12);
|
||||
printLogo();
|
||||
printMerchantHeader();
|
||||
printTransHeader(payDetail, hostType);
|
||||
printTransDetailSummary(payDetail);
|
||||
// printTransFooterSummary();
|
||||
|
||||
// emptyLine(2);
|
||||
startPrintNex();
|
||||
} catch (RemoteException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printTerminalConfig(PrintXStatus printXStatus) {
|
||||
|
||||
@ -55,10 +55,6 @@ public class PrintXReceipt {
|
||||
printX.printDetailReport(payDetail,lists,hostType,printXStatus);
|
||||
}
|
||||
|
||||
public void printSmileSummaryReport(PayDetail payDetail, HostType hostType, PrintXStatus printXStatus) {
|
||||
printX.printSmileSummaryReport(payDetail, hostType, printXStatus);
|
||||
}
|
||||
|
||||
public void printTerminalHostConfig(PrintXStatus printXStatus){
|
||||
printX.printTerminalConfig(printXStatus);
|
||||
}
|
||||
|
||||
@ -281,7 +281,7 @@ public class POSUtil {
|
||||
if(payDetail != null) {
|
||||
|
||||
if(payDetail.getTransactionType() == TransactionsType.MMQR.value) {
|
||||
return payDetail.getCustomerMobile();
|
||||
return payDetail.getCustomerMobile().toUpperCase();
|
||||
} else if(payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value) {
|
||||
return "QR PAYMENT";
|
||||
} else {
|
||||
@ -555,7 +555,7 @@ public class POSUtil {
|
||||
|
||||
public String formatDisplayDate(String input){
|
||||
|
||||
SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MM/yy", Locale.getDefault());
|
||||
SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
|
||||
SimpleDateFormat outputFormat = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault());
|
||||
|
||||
try {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user