Compare commits

...

2 Commits

Author SHA1 Message Date
MooN
aa1cf12d93 print terminal config print method refactor 2025-12-21 20:40:10 +06:30
MooN
e864630aaf modified the physical receipt 2025-12-21 11:10:37 +06:30
19 changed files with 239 additions and 179 deletions

View File

@ -496,5 +496,18 @@ public class SharedViewModel extends ViewModel {
} }
public void printTerminalHostConfigs(){
PrintXReceipt.getInstance().printTerminalHostConfig(new PrintXStatus() {
@Override
public void onSuccess() {
Log.d("PrintConfig", "Print Terminal Config Success.");
}
@Override
public void onFailure() {
Log.e("PrintConfig", "Print Terminal Config Success.");
}
});
}
} }

View File

@ -34,6 +34,7 @@ import com.utsmm.kbz.BR;
import com.utsmm.kbz.R; import com.utsmm.kbz.R;
import com.utsmm.kbz.config.Constants; import com.utsmm.kbz.config.Constants;
import com.utsmm.kbz.databinding.FragmentHostConfigBinding; import com.utsmm.kbz.databinding.FragmentHostConfigBinding;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel;
import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.fragment.DataBindingFragment;
import com.utsmyanmar.baselib.util.DataBindingConfig; import com.utsmyanmar.baselib.util.DataBindingConfig;
import com.utsmyanmar.baselib.util.DialogCallback; import com.utsmyanmar.baselib.util.DialogCallback;
@ -49,6 +50,8 @@ import java.util.Objects;
public class HostConfigFragment extends DataBindingFragment { public class HostConfigFragment extends DataBindingFragment {
private HostConfigViewModel viewModel; private HostConfigViewModel viewModel;
private SharedViewModel sharedViewModel;
protected Printer printer; protected Printer printer;
int FONT_NORMAL = 20; int FONT_NORMAL = 20;
int FONT_HEADER = 24; int FONT_HEADER = 24;
@ -56,6 +59,7 @@ public class HostConfigFragment extends DataBindingFragment {
@Override @Override
protected void initViewModel() { protected void initViewModel() {
viewModel = new ViewModelProvider(this).get(HostConfigViewModel.class); viewModel = new ViewModelProvider(this).get(HostConfigViewModel.class);
sharedViewModel = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
} }
@Override @Override
@ -100,146 +104,7 @@ public class HostConfigFragment extends DataBindingFragment {
} }
public void onPrint(){ public void onPrint(){
startPrintProcess(); sharedViewModel.printTerminalHostConfigs();
} }
} }
private void startPrintProcess() {
DeviceEngine engine = APIProxy.getDeviceEngine(requireContext());
printer = engine.getPrinter();
int printerStatus = printer.getStatus();
if(printerStatus != SdkResult.Success){
Log.e("Print Config", "Printer Error: " + printerStatus);
return;
}
printer.setGray(GrayLevelEnum.LEVEL_1);
Typeface typeface = ResourcesCompat.getFont(requireContext(), R.font.firacode);
printer.setTypeface(typeface);
SystemParamsOperation sp = SystemParamsOperation.getInstance();
Bitmap bitmap = BitmapFactory.decodeResource(requireContext().getResources(), R.drawable.kbz_receipt_logo);
printLogo(bitmap);
printer.appendPrnStr("TERMINAL CONFIGURATION", FONT_HEADER, AlignEnum.CENTER, true);
printer.appendPrnStr("\n", FONT_NORMAL, AlignEnum.CENTER, false);
printer.appendPrnStr(sp.getMerchantName(), FONT_NORMAL, AlignEnum.CENTER, false);
printer.appendPrnStr(sp.getMerchantAddress(), FONT_NORMAL, AlignEnum.CENTER, false);
printer.appendPrnStr(sp.getMerchantAddress2(), FONT_NORMAL, AlignEnum.CENTER, false);
printer.appendPrnStr("TERMINAL : " + sp.getTerminalName(), FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("\n---------------------------\n", FONT_NORMAL, AlignEnum.LEFT, false);
printer.appendPrnStr("PRIMARY HOST", FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Name : " + sp.getHostName(), FONT_NORMAL, AlignEnum.LEFT, false);
printer.appendPrnStr("TID : " + sp.getTerminalId(), FONT_NORMAL, AlignEnum.LEFT, false);
printer.appendPrnStr("MID : " + sp.getMerchantId(), FONT_NORMAL, AlignEnum.LEFT, false);
String ipAddress = sp.getIpAddress();
String[] ipAndPort = splitIpAndPort(ipAddress);
String ip = ipAndPort[0];
String port = ipAndPort[1];
printer.appendPrnStr("Primary Ip : " + ip, FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Primary Port : " + port, FONT_NORMAL, AlignEnum.LEFT, true);
String secIpAddress = sp.getSecIpAddress();
String[] secIpAndPort = splitIpAndPort(secIpAddress);
String secIp = secIpAndPort[0];
String secPort = secIpAndPort[1];
printer.appendPrnStr("Secondary Ip : " + secIp, FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Secondary Port: " + secPort, FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Currency Code : " + sp.getCurrencyType(), FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("\n---------------------------\n", FONT_NORMAL, AlignEnum.LEFT, false);
if (!TextUtils.isEmpty(sp.getSecHostName())) {
printer.appendPrnStr("SECONDARY HOST", FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Name : " + sp.getSecHostName(), FONT_NORMAL, AlignEnum.LEFT, false);
// printer.appendPrnStr("TID : " + sp.getSecHostTerminalId(), FONT_NORMAL, AlignEnum.LEFT, false);
// printer.appendPrnStr("MID : " + sp.getSecHostMerchantId(), FONT_NORMAL, AlignEnum.LEFT, false);
printer.appendPrnStr("SHORT CODE : " + sp.getShortCode(), FONT_NORMAL, AlignEnum.LEFT, false);
String secHostIpAddress = sp.getSecHostIpAddress();
String[] secHostIpAndPort = splitIpAndPort(secHostIpAddress);
String secHostIp = secHostIpAndPort[0];
String secHostPort = secHostIpAndPort[1];
printer.appendPrnStr("Primary Ip : " + secHostIp, FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Primary Port : " + secHostPort, FONT_NORMAL, AlignEnum.LEFT, true);
String secHostSecIpAddress = sp.getSecHostSecIpAddress();
String[] SecHostSecIpAndPort = splitIpAndPort(secHostSecIpAddress);
String secHostSecIp = SecHostSecIpAndPort[0];
String secHostSecPort = SecHostSecIpAndPort[1];
printer.appendPrnStr("Secondary Ip : " + secHostSecIp, FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Secondary Port: " + secHostSecPort, FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("Currency Code : " + sp.getCurrencyType(), FONT_NORMAL, AlignEnum.LEFT, true);
printer.appendPrnStr("\n---------------------------\n", FONT_NORMAL, AlignEnum.LEFT, false);
}
printer.startPrint(true, ret -> {
Log.d("Print", "Print result = " + ret);
});
}
private String[] splitIpAndPort(String raw) {
if (raw == null || raw.trim().isEmpty()) {
return new String[]{"", ""};
}
raw = raw.trim();
// If starts with http/https
if (raw.startsWith("http://") || raw.startsWith("https://")) {
// Attempt to extract host + port via URL
try {
java.net.URL url = new java.net.URL(raw);
String host = url.getHost(); // hostname or IP
int port = url.getPort(); // -1 if no port
String path = url.getPath(); // /api or /
// If port exists split normally
if (port != -1) {
return new String[]{
host, // e.g. 10.10.10.10
String.valueOf(port) // e.g. 5000
};
}
// No port do NOT split
return new String[]{ raw, "" };
} catch (Exception e) {
// fail-safe: do not split
return new String[]{ raw, "" };
}
}
// Normal "IP:Port" split
int idx = raw.lastIndexOf(":");
if (idx == -1) {
return new String[]{ raw, "" };
}
return new String[]{
raw.substring(0, idx),
raw.substring(idx + 1)
};
}
private void printLogo(Bitmap logoBitmap) {
try {
if (logoBitmap == null || printer == null) return;
Bitmap bmp = logoBitmap;
// Max printable width = 384px
if (bmp.getWidth() > 384) {
int newHeight = (int) (bmp.getHeight() * (384f / bmp.getWidth()));
bmp = Bitmap.createScaledBitmap(bmp, 384, newHeight, true);
}
printer.appendPrnStr("\n", FONT_NORMAL, AlignEnum.CENTER, false);
printer.appendImage(bmp, AlignEnum.CENTER);
printer.appendPrnStr("\n", FONT_NORMAL, AlignEnum.CENTER, false);
} catch (Exception e) {
Log.e("PRINT", "Logo error: " + e.getMessage());
}
}
} }

Binary file not shown.

View File

@ -51,16 +51,7 @@
android:orientation="vertical"> android:orientation="vertical">
<!-- HEADER --> <!-- HEADER -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TERMINAL CONFIGURATION"
android:fontFamily="@font/rubik_regular"
android:textSize="16sp"
android:textStyle="bold"
android:textAlignment="center"
android:paddingBottom="12dp"
tools:text="TERMINAL CONFIGURATION"/>
<!-- Merchant Info --> <!-- Merchant Info -->
<TextView <TextView
@ -104,10 +95,21 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="--------------------------------------------------------------------------" android:text="*************************************************"
android:paddingTop="8dp" android:paddingTop="8dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
tools:text="--------------------------------------------------------------------------"/> tools:text="*********************************************************"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TERMINAL CONFIGURATION"
android:fontFamily="@font/rubik_regular"
android:textSize="16sp"
android:textStyle="bold"
android:textAlignment="center"
android:paddingBottom="12dp"
tools:text="TERMINAL CONFIGURATION"/>
<!-- PRIMARY HOST --> <!-- PRIMARY HOST -->
<TextView <TextView
@ -194,10 +196,10 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="--------------------------------------------------------------------------" android:text="*************************************************"
android:paddingTop="8dp" android:paddingTop="8dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
tools:text="--------------------------------------------------------------------------"/> tools:text="********************************************************"/>
<!-- SECONDARY HOST --> <!-- SECONDARY HOST -->
<LinearLayout <LinearLayout

View File

@ -192,6 +192,7 @@
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center" android:layout_gravity="center"
android:src="@drawable/ic_device_info" android:src="@drawable/ic_device_info"
android:contentDescription="app version"
app:tint="@color/white" /> app:tint="@color/white" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
@ -266,7 +267,7 @@
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_gravity="center" android:layout_gravity="center"
android:src="@drawable/ic_device_info" android:src="@drawable/ic_host"
app:tint="@color/white" /> app:tint="@color/white" />
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>

Binary file not shown.

View File

@ -2,12 +2,14 @@ package com.utsmyanmar.paylibs.print.printx;
import static com.utsmyanmar.paylibs.utils.enums.CurrencyType.MMK; import static com.utsmyanmar.paylibs.utils.enums.CurrencyType.MMK;
import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.Build; import android.os.Build;
import android.os.RemoteException; import android.os.RemoteException;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import androidx.core.content.res.ResourcesCompat; import androidx.core.content.res.ResourcesCompat;
@ -28,6 +30,7 @@ import com.utsmyanmar.paylibs.model.PayDetail;
import com.utsmyanmar.paylibs.model.SettleData; import com.utsmyanmar.paylibs.model.SettleData;
import com.utsmyanmar.paylibs.print.PrintUtils; import com.utsmyanmar.paylibs.print.PrintUtils;
import com.utsmyanmar.paylibs.system.BaseErrorCode; import com.utsmyanmar.paylibs.system.BaseErrorCode;
import com.utsmyanmar.paylibs.utils.POSUtil;
import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil; import com.utsmyanmar.paylibs.utils.core_utils.ByteUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.enums.CardScheme; import com.utsmyanmar.paylibs.utils.enums.CardScheme;
@ -84,7 +87,8 @@ public abstract class BaseXPrint {
protected int fontSmall = 16; protected int fontSmall = 16;
// protected FontEntity fontSmall = new FontEntity(DotMatrixFontEnum.CH_SONG_20X20, DotMatrixFontEnum.ASC_SONG_8X16); // protected FontEntity fontSmall = new FontEntity(DotMatrixFontEnum.CH_SONG_20X20, DotMatrixFontEnum.ASC_SONG_8X16);
protected int fontNormal = 20; 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 fontBold = new FontEntity(DotMatrixFontEnum.CH_SONG_24X24, DotMatrixFontEnum.ASC_SONG_BOLD_16X24);
@ -117,13 +121,14 @@ public abstract class BaseXPrint {
Resources resources = PayLibsUtils.getInstance().context.getResources(); Resources resources = PayLibsUtils.getInstance().context.getResources();
// Typeface typeface = ResourcesCompat.getFont(PayLibsUtils.getInstance().context, R.font.consolas); // Typeface typeface = ResourcesCompat.getFont(PayLibsUtils.getInstance().context, R.font.consolas);
// printer.setTypeface(typeface); // printer.setTypeface(typeface);
printer.setTypeface(Typeface.createFromAsset(PayLibsUtils.getInstance().context.getAssets(), "fonts/firacode_regular.ttf")); // printer.setTypeface(Typeface.createFromAsset(PayLibsUtils.getInstance().context.getAssets(), "fonts/firacode_regular.ttf"));
printer.setTypeface(Typeface.createFromAsset(PayLibsUtils.getInstance().context.getAssets(), "fonts/fira_code_semibold.ttf"));
printer.setGray(getGrayLevel()); printer.setGray(getGrayLevel());
} }
private GrayLevelEnum getGrayLevel() { private GrayLevelEnum getGrayLevel() {
int gray = 2; int gray = 1;
GrayLevelEnum grayLevelEnum = GrayLevelEnum.LEVEL_1; GrayLevelEnum grayLevelEnum = GrayLevelEnum.LEVEL_1;
@ -186,12 +191,12 @@ public abstract class BaseXPrint {
} }
protected void lineBreak() { protected void lineBreak() {
printer.appendPrnStr("******************************", fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("*****************************", fontNormal, AlignEnum.LEFT,false);
} }
protected void dashBreak() { protected void dashBreak() {
printer.appendPrnStr("------------------------------", fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("-----------------------------", fontNormal, AlignEnum.LEFT,false);
} }
@ -380,7 +385,9 @@ public abstract class BaseXPrint {
batchNum = payDetail.getBatchNo(); batchNum = payDetail.getBatchNo();
printer.appendPrnStr("DATE :" + payDetail.getTransDate() + " TIME: " + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT,false); // 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 (Objects.equals(payDetail.getAccountType(), CardScheme.MPU_CTLS.name)) { if (Objects.equals(payDetail.getAccountType(), CardScheme.MPU_CTLS.name)) {
hostName = HOST_NAME_MPU; hostName = HOST_NAME_MPU;
} else { } else {
@ -627,6 +634,10 @@ public abstract class BaseXPrint {
printer.appendPrnStr(first + " " + second, fontNormal, align,true); printer.appendPrnStr(first + " " + second, fontNormal, align,true);
} }
protected void print2ColumnsStringBoldCenter(String first, String second, int fontSize, AlignEnum align) {
printer.appendPrnStr(first + " " + second, fontSize, align,true);
}
protected void print3ColumnsString(String first, String second, String third) { protected void print3ColumnsString(String first, String second, String third) {
// printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT,false); // printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT,false);
printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr(first + " " + second + " " + third, fontNormal, AlignEnum.LEFT,false);
@ -778,6 +789,9 @@ public abstract class BaseXPrint {
cvmText = "NO SIGNATURE REQUIRED"; cvmText = "NO SIGNATURE REQUIRED";
break; break;
} }
if(payDetail.getTransactionType() == TransactionsType.MMQR.value || payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value){
cvmText = "";
}
addSignatureBitmap(payDetail); addSignatureBitmap(payDetail);
@ -791,10 +805,11 @@ public abstract class BaseXPrint {
// } // }
emptyLine(0); emptyLine(0);
printer.appendPrnStr("I AGREE TO PAY THE ABOVE TOTAL AMOUNT", fontSmall, AlignEnum.CENTER,false); // 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); // printer.appendPrnStr("ACCORDING TO THE ISSUER AGREEMENT", fontSmall, AlignEnum.CENTER,false);
} else { } 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); printer.appendPrnStr("ACCORDING TO THE CARD ISSUER AGREEMENT", fontSmall, AlignEnum.CENTER,false);
} }
@ -846,12 +861,14 @@ public abstract class BaseXPrint {
String merchantAddress = ""; String merchantAddress = "";
String merchantAddress2 = ""; String merchantAddress2 = "";
String merchantPhoneNo = ""; String merchantPhoneNo = "";
String terminalName = "";
merchantName = SystemParamsOperation.getInstance().getMerchantName(); merchantName = SystemParamsOperation.getInstance().getMerchantName();
receiptHeader = SystemParamsOperation.getInstance().getReceiptHeader(); receiptHeader = SystemParamsOperation.getInstance().getReceiptHeader();
merchantAddress = SystemParamsOperation.getInstance().getMerchantAddress(); merchantAddress = SystemParamsOperation.getInstance().getMerchantAddress();
merchantAddress2 = SystemParamsOperation.getInstance().getMerchantAddress2(); merchantAddress2 = SystemParamsOperation.getInstance().getMerchantAddress2();
merchantPhoneNo = SystemParamsOperation.getInstance().getMerchantPhoneNo(); merchantPhoneNo = SystemParamsOperation.getInstance().getMerchantPhoneNo();
terminalName = SystemParamsOperation.getInstance().getTerminalName();
if (receiptHeader == null || TextUtils.equals(receiptHeader, "") || receiptHeader.trim().isEmpty()) { if (receiptHeader == null || TextUtils.equals(receiptHeader, "") || receiptHeader.trim().isEmpty()) {
receiptHeader = merchantName; receiptHeader = merchantName;
@ -865,13 +882,18 @@ public abstract class BaseXPrint {
// if (TextUtils.equals(merchantPhoneNo, "") || merchantPhoneNo == null) { // if (TextUtils.equals(merchantPhoneNo, "") || merchantPhoneNo == null) {
// merchantPhoneNo = "MERCHANT PHONENO"; // merchantPhoneNo = "MERCHANT PHONENO";
// } // }
if(TextUtils.equals(terminalName, "") || terminalName == null){
terminalName = "Terminal Name";
}
printer.appendPrnStr(receiptHeader, fontNormal, AlignEnum.CENTER,false); printer.appendPrnStr(receiptHeader, fontNormal, AlignEnum.CENTER,false);
printer.appendPrnStr(merchantAddress, fontNormal, AlignEnum.CENTER,false); printer.appendPrnStr(merchantAddress, fontNormal, AlignEnum.CENTER,false);
printer.appendPrnStr(merchantAddress2, 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); // printer.appendPrnStr(merchantPhoneNo, fontNormal, AlignEnum.CENTER,false);
emptyLine(1); // emptyLine(1);
// dashBreak();
lineBreak();
} }
protected void printKeyInfo() { protected void printKeyInfo() {
@ -925,16 +947,16 @@ public abstract class BaseXPrint {
batchNum = payDetail.getBatchNo(); batchNum = payDetail.getBatchNo();
printer.appendPrnStr("DATE :" + payDetail.getTransDate() + " TIME:" + payDetail.getTransTime(), fontNormal, AlignEnum.LEFT,false); // 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) { if (payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1) {
printer.appendPrnStr("TRACE NO:" + traceNum + " INV NO: " + invoiceNo, fontNormal, AlignEnum.LEFT,false); 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) { } 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); printer.appendPrnStr("BTH NO :" + batchNum + " INV NO:" + invoiceNo, fontNormal, AlignEnum.LEFT,false);
} else if (payDetail.getTransType().equals(SUMMARY)) { } else if (payDetail.getTransType().equals(SUMMARY)) {
printer.appendPrnStr("HOST :" + HOST_NAME_MPU + "", fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("HOST :" + HOST_NAME_MPU + "", fontNormal, AlignEnum.LEFT,false);
} }
/* 17 Sept 2024 Yoma requested to changed slip design for QR*/ /* 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[]{"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); // printer.printColumnsString(new String[]{"TID :" + payDetail.getTerminalNo(), ""}, new int[]{3, 1}, new int[]{0, 2}, innerResultCallback);
@ -949,7 +971,6 @@ public abstract class BaseXPrint {
printer.appendPrnStr(transType.replace("_", " "),fontNormal, AlignEnum.CENTER,true); printer.appendPrnStr(transType.replace("_", " "),fontNormal, AlignEnum.CENTER,true);
if (!(payDetail.getQrTransStatus() != 1 && (payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value || payDetail.getTransactionType() == TransactionsType.MMQR.value))) { if (!(payDetail.getQrTransStatus() != 1 && (payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value || payDetail.getTransactionType() == TransactionsType.MMQR.value))) {
printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
// printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false); // printer.appendPrnStr("\n", fontNormal, AlignEnum.LEFT,false);
} }
@ -984,5 +1005,126 @@ public abstract class BaseXPrint {
// LogUtil.d("lxy", "code:" + code + ",msg:" + msg); // LogUtil.d("lxy", "code:" + code + ",msg:" + msg);
} }
}; };
protected void printTerminalConfiguration() {
SystemParamsOperation sp = SystemParamsOperation.getInstance();
// ---------- PRIMARY HOST ----------
printer.appendPrnStr("PRIMARY HOST", fontNormal, AlignEnum.LEFT, true);
printer.appendPrnStr("Name : " + sp.getHostName(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("TID : " + sp.getTerminalId(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("MID : " + sp.getMerchantId(), fontNormal, AlignEnum.LEFT, false);
String[] ipPort = splitIpAndPort(sp.getIpAddress());
printer.appendPrnStr("Primary Ip : " + ipPort[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Primary Port : " + ipPort[1], fontNormal, AlignEnum.LEFT, false);
String[] secIpPort = splitIpAndPort(sp.getSecIpAddress());
printer.appendPrnStr("Secondary Ip : " + secIpPort[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Secondary Port: " + secIpPort[1], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Currency Code : " + sp.getCurrencyType(), fontNormal, AlignEnum.LEFT, false);
lineBreak();
// ---------- SECONDARY HOST (optional) ----------
if (!TextUtils.isEmpty(sp.getSecHostName())) {
printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true);
printer.appendPrnStr("Name : " + sp.getSecHostName(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("SHORT CODE : " + sp.getShortCode(), fontNormal, AlignEnum.LEFT, false);
String[] secHostIp = splitIpAndPort(sp.getSecHostIpAddress());
printer.appendPrnStr("Primary Ip : " + secHostIp[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Primary Port : " + secHostIp[1], fontNormal, AlignEnum.LEFT, false);
String[] secHostSecIp = splitIpAndPort(sp.getSecHostSecIpAddress());
printer.appendPrnStr("Secondary Ip : " + secHostSecIp[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Secondary Port: " + secHostSecIp[1], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Currency Code : " + sp.getCurrencyType(), fontNormal, AlignEnum.LEFT, false);
lineBreak();
printer.appendPrnStr("App Version : " + getAppVersion(), fontNormal, AlignEnum.LEFT, false);
}
}
private String getAppVersion() {
try {
return PayLibsUtils.getInstance().context
.getPackageManager()
.getPackageInfo(
PayLibsUtils.getInstance().context.getPackageName(),
0
)
.versionName;
} catch (Exception e) {
return "N/A";
}
}
private String[] splitIpAndPort(String raw) {
if (raw == null || raw.trim().isEmpty()) {
return new String[]{"", ""};
}
raw = raw.trim();
// If starts with http/https
if (raw.startsWith("http://") || raw.startsWith("https://")) {
// Attempt to extract host + port via URL
try {
java.net.URL url = new java.net.URL(raw);
String host = url.getHost(); // hostname or IP
int port = url.getPort(); // -1 if no port
String path = url.getPath(); // /api or /
// If port exists split normally
if (port != -1) {
return new String[]{
host, // e.g. 10.10.10.10
String.valueOf(port) // e.g. 5000
};
}
// No port do NOT split
return new String[]{ raw, "" };
} catch (Exception e) {
// fail-safe: do not split
return new String[]{ raw, "" };
}
}
// Normal "IP:Port" split
int idx = raw.lastIndexOf(":");
if (idx == -1) {
return new String[]{ raw, "" };
}
return new String[]{
raw.substring(0, idx),
raw.substring(idx + 1)
};
}
private void printLogo(Bitmap logoBitmap) {
try {
if (logoBitmap == null || printer == null) return;
Bitmap bmp = logoBitmap;
// Max printable width = 384px
if (bmp.getWidth() > 384) {
int newHeight = (int) (bmp.getHeight() * (384f / bmp.getWidth()));
bmp = Bitmap.createScaledBitmap(bmp, 384, newHeight, true);
}
printer.appendPrnStr("\n", fontNormal, AlignEnum.CENTER, false);
printer.appendImage(bmp, AlignEnum.CENTER);
printer.appendPrnStr("\n", fontNormal, AlignEnum.CENTER, false);
} catch (Exception e) {
Log.e("PRINT", "Logo error: " + e.getMessage());
}
}
} }

View File

@ -25,4 +25,7 @@ public interface PrintX {
void printKeyStatus(); void printKeyStatus();
void printTerminalConfig(PrintXStatus printXStatus);
} }

View File

@ -40,7 +40,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault()); SimpleDateFormat dfm = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", Locale.getDefault());
currentTime = dfm.format(new Date()); currentTime = dfm.format(new Date());
BitmapFactory.Options opts = new BitmapFactory.Options(); BitmapFactory.Options opts = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_kbz_logo_new_1, opts); bitmap = BitmapFactory.decodeResource(resources, R.drawable.print_kbz_logo_new, opts);
} }
@ -172,7 +172,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
} }
emptyLine(1); // emptyLine(1);
startPrintNex(); startPrintNex();
} catch (RemoteException | NullPointerException e) { } catch (RemoteException | NullPointerException e) {
@ -234,7 +234,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
printTransHeader(payDetail); printTransHeader(payDetail);
printTransDetailReport(lists,hostType); printTransDetailReport(lists,hostType);
emptyLine(1); // emptyLine(1);
startPrintNex(); startPrintNex();
} catch (RemoteException e) { } catch (RemoteException e) {
e.printStackTrace(); e.printStackTrace();
@ -310,16 +310,13 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
try { try {
// payDetail.getCustomerMobile() // as channel type // payDetail.getCustomerMobile() // as channel type
if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1 ) { if(payDetail.getTransactionType() == TransactionsType.MMQR.value && payDetail.getQrTransStatus() == 1 ) {
print2ColumnsStringNoSpace("PAYMENT TYPE ",": "+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile().toUpperCase())); print2ColumnsStringNoSpace("PAYMENT TYPE ",": "+ (payDetail.getCustomerMobile() == null || payDetail.getCustomerMobile().isEmpty() ? "-": payDetail.getCustomerMobile().toUpperCase()));
print2ColumnsStringNoSpace("TRXN REF ",": "+ payDetail.getReferNo()); print2ColumnsStringNoSpace("TRXN REF ",": "+ payDetail.getReferNo());
if(payDetail.getQrReferNo() != null && !payDetail.getQrReferNo().isEmpty()) { if(payDetail.getQrReferNo() != null && !payDetail.getQrReferNo().isEmpty()) {
print2ColumnsStringNoSpace("MMQR REF ",": "+ payDetail.getQrReferNo()); print2ColumnsStringNoSpace("MMQR REF ",": "+ payDetail.getQrReferNo());
} }
print2ColumnsStringNoSpace("TRXN ID ",": "+ (payDetail.getQrTransId() == null || payDetail.getQrTransId().isEmpty() ? "-": payDetail.getQrTransId())); print2ColumnsStringNoSpace("TRXN ID",":"+ (payDetail.getQrTransId() == null || payDetail.getQrTransId().isEmpty() ? "-": payDetail.getQrTransId()));
print2ColumnsStringNoSpace("STATUS ",": "+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus())); print2ColumnsStringNoSpace("STATUS ",": "+ PrintUtils.getInstance().getQrTransStatus(payDetail.getQrTransStatus()));
} else if(payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value && payDetail.getQrTransStatus() == 1) { } else if(payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value && payDetail.getQrTransStatus() == 1) {
@ -342,7 +339,9 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
if (payDetail.getQrTransStatus() == 1) { if (payDetail.getQrTransStatus() == 1) {
boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value; boolean isNeedMinusSign = payDetail.getTransactionType() == TransactionsType.MMQR_REFUND.value;
print2ColumnsStringBoldCenter("TOTAL MMK", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()): PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()), AlignEnum.LEFT); lineBreak();
print2ColumnsStringBoldCenter("TOTAL MMK", isNeedMinusSign? "- "+PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()): PrintUtils.getInstance().getSeparatorNumberFormat(payDetail.getAmount()),fontLarge, AlignEnum.LEFT);
lineBreak();
// if(payDetail.getTransactionType() == TransactionsType.MMQR.value) { // if(payDetail.getTransactionType() == TransactionsType.MMQR.value) {
// String data = payDetail.getReferNo()+"-"+payDetail.getAmount()+"-"+payDetail.getQrTransId()+"-"+payDetail.getMerchantNo()+"-"+payDetail.getCustomerMobile().toUpperCase()+"-"+payDetail.getOriginalTransDate(); // String data = payDetail.getReferNo()+"-"+payDetail.getAmount()+"-"+payDetail.getQrTransId()+"-"+payDetail.getMerchantNo()+"-"+payDetail.getCustomerMobile().toUpperCase()+"-"+payDetail.getOriginalTransDate();
@ -424,5 +423,21 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
@Override
public void printTerminalConfig(PrintXStatus printXStatus) {
this.callbackStatus = printXStatus;
try {
setHeight(0x12);
printLogo();
printMerchantHeader();
printer.appendPrnStr("TERMINAL CONFIGURATION", fontLarge, AlignEnum.CENTER, true);
printTerminalConfiguration();
startPrintNex();
} catch (RemoteException e) {
e.printStackTrace();
callbackStatus.onFailure();
}
}
} }

View File

@ -54,4 +54,8 @@ public class PrintXReceipt {
public void printDetailReport(PayDetail payDetail, List<PayDetail> lists, HostType hostType,PrintXStatus printXStatus) { public void printDetailReport(PayDetail payDetail, List<PayDetail> lists, HostType hostType,PrintXStatus printXStatus) {
printX.printDetailReport(payDetail,lists,hostType,printXStatus); printX.printDetailReport(payDetail,lists,hostType,printXStatus);
} }
public void printTerminalHostConfig(PrintXStatus printXStatus){
printX.printTerminalConfig(printXStatus);
}
} }

View File

@ -553,6 +553,21 @@ public class POSUtil {
} }
public String formatDisplayDate(String input){
SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
SimpleDateFormat outputFormat = new SimpleDateFormat("dd MMM yyyy", Locale.getDefault());
try {
Date date = inputFormat.parse(input);
return outputFormat.format(date);
} catch (ParseException e) {
e.printStackTrace();
}
return input;
}
public Date getDateByTransDateTime(String transDate,String transTime) { public Date getDateByTransDateTime(String transDate,String transTime) {
String dateFormatPattern = "dd/MM/yy HH:mm"; String dateFormatPattern = "dd/MM/yy HH:mm";
SimpleDateFormat formatter = new SimpleDateFormat(dateFormatPattern,Locale.getDefault()); SimpleDateFormat formatter = new SimpleDateFormat(dateFormatPattern,Locale.getDefault());

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB