Merge branch 'test' into duel_settlement

This commit is contained in:
moon 2026-05-25 15:14:58 +06:30
commit daba685f40
22 changed files with 700 additions and 193 deletions

View File

@ -116,8 +116,8 @@ public class MainActivity extends AppCompatActivity implements
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar();
BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); // BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar();
// Keep screen on // Keep screen on
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@ -160,10 +160,10 @@ public class MainActivity extends AppCompatActivity implements
} }
private void initKey(){ private void initKey(){
// SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius"); // SystemParamsOperation.getInstance().setTmsAddress("https://api-tms.kbzbank.com/sirius");
SystemParamsOperation.getInstance().setTmsAddress("https://sirius-nest.utsmyanmar.com/api/v1"); // SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms.kbzbank.com/receipt");
// SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt"); SystemParamsOperation.getInstance().setTmsAddress("https://api-tms-uat.kbzbank.com:8443/sirius");
SystemParamsOperation.getInstance().setEReceiptAddress("https://receipt-nest.utsmyanmar.com/api/v1"); SystemParamsOperation.getInstance().setEReceiptAddress("https://api-tms-uat.kbzbank.com:8443/receipt");
PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad(); PinPad pinPad = MyApplication.getInstance().deviceEngine.getPinPad();
byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK(); byte[] encryptedPIK = SystemParamsOperation.getInstance().getPIK();
@ -436,8 +436,8 @@ public class MainActivity extends AppCompatActivity implements
SystemParamsOperation.getInstance().setDownloadedParams(false); SystemParamsOperation.getInstance().setDownloadedParams(false);
handleAutoSettlementIntent(getIntent()); handleAutoSettlementIntent(getIntent());
// BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar(); BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar();
BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); // BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar();
} }
@ -445,8 +445,6 @@ public class MainActivity extends AppCompatActivity implements
public void onStop(){ public void onStop(){
super.onStop(); super.onStop();
BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar(); BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar();
// BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton();
// BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton();
} }
@Override @Override
@ -564,9 +562,6 @@ public class MainActivity extends AppCompatActivity implements
@Override @Override
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar();
// BaseApplication.getInstance().deviceEngine.getPlatform().enableHomeButton();
// BaseApplication.getInstance().deviceEngine.getPlatform().enableTaskButton();
// Clean up RxJava disposables // Clean up RxJava disposables
compositeDisposable.clear(); compositeDisposable.clear();
// Reset screen mode // Reset screen mode

View File

@ -4,18 +4,25 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import androidx.appcompat.app.AlertDialog;
import android.os.RemoteException; import android.os.RemoteException;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.TypedValue;
import android.view.View; import android.view.View;
import android.view.Gravity;
import android.widget.Toast; import android.widget.Toast;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.appcompat.widget.AppCompatButton;
import androidx.core.content.ContextCompat;
import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.ImageSlider;
import com.denzcoskun.imageslider.constants.ScaleTypes; import com.denzcoskun.imageslider.constants.ScaleTypes;
@ -71,6 +78,7 @@ import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -100,6 +108,13 @@ public class MainFragment extends DataBindingFragment {
private final ArrayList<SlideModel> imgList = new ArrayList<>(); private final ArrayList<SlideModel> imgList = new ArrayList<>();
private Observer<PayDetail> observeLastTrans; private Observer<PayDetail> observeLastTrans;
private PayDetail lastPay; private PayDetail lastPay;
private boolean cardPrimaryHostCached = false;
private String cardPrimaryHostName = "";
private String cardPrimaryTid = "";
private String cardPrimaryMid = "";
private String cardPrimaryIp = "";
private String cardPrimarySecIp = "";
private CurrencyType cardPrimaryCurrency = CurrencyType.MMK;
private CurrencySelectionHelper currencySelectionHelper; private CurrencySelectionHelper currencySelectionHelper;
@Inject @Inject
@ -162,18 +177,10 @@ public class MainFragment extends DataBindingFragment {
NexGoSDK.getInstance().cancelCheckCard(); NexGoSDK.getInstance().cancelCheckCard();
NexGoSDK.getInstance().closeReader(); NexGoSDK.getInstance().closeReader();
enableHomeButton(); enableHomeButton();
// enablePinPadSound(false);
// disableTaskButton();
// BaseApplication.getInstance().deviceEngine.getPlatform().hideNavigationBar();
// BaseApplication.getInstance().deviceEngine.getPlatform().showNavigationBar();
}); });
} }
// private void enablePinPadSound(boolean flag) {n
// int result = BaseApplication.getInstance().deviceEngine.getPlatform().enablePinpadBeep(flag);
// LogUtil.d(TAG, "Pin Pad Beep Result:" + result);
// }
private void disableHomeButton() { private void disableHomeButton() {
int result = BaseApplication.getInstance().deviceEngine.getPlatform().disableHomeButton(); int result = BaseApplication.getInstance().deviceEngine.getPlatform().disableHomeButton();
LogUtil.d(TAG, "Disable Home Button Result:" + result); LogUtil.d(TAG, "Disable Home Button Result:" + result);
@ -447,7 +454,190 @@ public class MainFragment extends DataBindingFragment {
} }
private void showCurrencyChooserForCardSale() { private void showCurrencyChooserForCardSale() {
currencySelectionHelper.showCardCurrencyChooser(this::startCardSaleFlow); List<String> currencies = getAvailableCardSaleCurrencies();
if (currencies.isEmpty()) {
applyCardCurrencyAndHost("MMK");
startCardSaleFlow();
return;
}
if (currencies.size() == 1) {
applyCardCurrencyAndHost(currencies.get(0));
startCardSaleFlow();
return;
}
showCurrencyPickerDialog("Choose Currency", currencies, currency -> {
applyCardCurrencyAndHost(currency);
startCardSaleFlow();
});
}
private List<String> getAvailableCardSaleCurrencies() {
cachePrimaryCardHostIfNeeded();
LinkedHashSet<String> values = new LinkedHashSet<>();
if (cardPrimaryCurrency != null && !TextUtils.isEmpty(cardPrimaryCurrency.name)) {
values.add(normalizeCurrency(cardPrimaryCurrency.name));
}
String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency());
if (!TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) && !TextUtils.isEmpty(secondaryCurrency)) {
values.add(secondaryCurrency);
}
return new ArrayList<>(values);
}
private void applyCardCurrencyAndHost(String selectedCurrency) {
cachePrimaryCardHostIfNeeded();
String selected = normalizeCurrency(selectedCurrency);
String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency());
boolean useSecondaryCardHost = !TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName())
&& !TextUtils.isEmpty(secondaryCurrency)
&& secondaryCurrency.equals(selected);
if (useSecondaryCardHost) {
SystemParamsOperation.getInstance().setHostName(SystemParamsOperation.getInstance().getThirdHostName());
SystemParamsOperation.getInstance().setTerminalId(SystemParamsOperation.getInstance().getThirdHostTerminalId());
SystemParamsOperation.getInstance().setMerchantId(SystemParamsOperation.getInstance().getThirdHostMerchantId());
SystemParamsOperation.getInstance().setIpAddress(SystemParamsOperation.getInstance().getThirdHostIpAddress());
SystemParamsOperation.getInstance().setSecIpAddress(SystemParamsOperation.getInstance().getThirdHostSecIpAddress());
} else {
SystemParamsOperation.getInstance().setHostName(cardPrimaryHostName);
SystemParamsOperation.getInstance().setTerminalId(cardPrimaryTid);
SystemParamsOperation.getInstance().setMerchantId(cardPrimaryMid);
SystemParamsOperation.getInstance().setIpAddress(cardPrimaryIp);
SystemParamsOperation.getInstance().setSecIpAddress(cardPrimarySecIp);
}
CurrencyType currencyType = useSecondaryCardHost ? toCurrencyType(selected) : cardPrimaryCurrency;
SystemParamsOperation.getInstance().setCurrencyType(currencyType);
sharedViewModel.set_currencyText(currencyType.name);
}
private void cachePrimaryCardHostIfNeeded() {
if (cardPrimaryHostCached) {
return;
}
cardPrimaryHostName = SystemParamsOperation.getInstance().getHostName();
cardPrimaryTid = SystemParamsOperation.getInstance().getTerminalId();
cardPrimaryMid = SystemParamsOperation.getInstance().getMerchantId();
cardPrimaryIp = SystemParamsOperation.getInstance().getIpAddress();
cardPrimarySecIp = SystemParamsOperation.getInstance().getSecIpAddress();
CurrencyType activeCurrency = SystemParamsOperation.getInstance().getCurrencyType();
cardPrimaryCurrency = activeCurrency == null ? CurrencyType.MMK : activeCurrency;
cardPrimaryHostCached = true;
}
private void showCurrencyPickerDialog(String title, List<String> currencies, CurrencySelectCallback callback) {
LinearLayout root = new LinearLayout(requireContext());
root.setOrientation(LinearLayout.VERTICAL);
root.setPadding(dp(20), dp(20), dp(20), dp(12));
TextView tvTitle = new TextView(requireContext());
tvTitle.setText(title);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
tvTitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorTextTitle));
tvTitle.setPadding(0, 0, 0, dp(16));
root.addView(tvTitle);
final AlertDialog[] dialogHolder = new AlertDialog[1];
for (String currency : currencies) {
AppCompatButton button = new AppCompatButton(requireContext());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
dp(56)
);
lp.bottomMargin = dp(10);
button.setLayoutParams(lp);
button.setAllCaps(false);
button.setText(currency);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
button.setGravity(Gravity.CENTER);
button.setBackgroundResource(R.drawable.bg_rounded_btn_cv);
button.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
button.setOnClickListener(v -> {
if (dialogHolder[0] != null) {
dialogHolder[0].dismiss();
}
callback.onSelected(currency);
});
root.addView(button);
}
AppCompatButton cancel = new AppCompatButton(requireContext());
LinearLayout.LayoutParams cancelLp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
dp(52)
);
cancel.setLayoutParams(cancelLp);
cancel.setAllCaps(false);
cancel.setText("Cancel");
cancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
cancel.setBackgroundResource(R.drawable.bg_rounded_btn_cancel_cv);
cancel.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary));
cancel.setOnClickListener(v -> {
if (dialogHolder[0] != null) {
dialogHolder[0].dismiss();
}
});
root.addView(cancel);
AlertDialog dialog = new AlertDialog.Builder(requireContext())
.setView(root)
.create();
dialogHolder[0] = dialog;
dialog.show();
}
private int dp(int value) {
return Math.round(value * requireContext().getResources().getDisplayMetrics().density);
}
private interface CurrencySelectCallback {
void onSelected(String currency);
}
private CurrencyType toCurrencyType(String value) {
String normalized = normalizeCurrency(value);
try {
return CurrencyType.valueOf(normalized);
} catch (Exception ignored) {
return CurrencyType.MMK;
}
}
private String normalizeCurrency(String raw) {
if (TextUtils.isEmpty(raw)) {
return "";
}
String value = raw.trim().toUpperCase();
switch (value) {
case "104":
case "MMK":
return "MMK";
case "840":
case "USD":
return "USD";
case "156":
case "CNY":
case "RMB":
return "CNY";
case "764":
case "THB":
return "THB";
case "643":
case "RUB":
return "RUB";
default:
return value;
}
// currencySelectionHelper.showCardCurrencyChooser(this::startCardSaleFlow);
} }
private void showCurrencyChooserForSignOn() { private void showCurrencyChooserForSignOn() {

View File

@ -2,16 +2,25 @@ package com.utsmm.kbz.ui.dashboard;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.View; import android.view.View;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.AppCompatButton;
import androidx.core.content.ContextCompat;
import com.utsmm.kbz.util.enums.SettlementType; import com.utsmm.kbz.util.enums.SettlementType;
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.paylibs.utils.LogUtil; import com.utsmyanmar.paylibs.utils.LogUtil;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
import com.utsmyanmar.paylibs.utils.enums.CurrencyType;
import com.utsmyanmar.paylibs.utils.enums.TransMenu; import com.utsmyanmar.paylibs.utils.enums.TransMenu;
import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType; import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType;
import com.utsmm.kbz.BR; import com.utsmm.kbz.BR;
@ -25,6 +34,8 @@ import com.utsmm.kbz.util.CurrencySelectionHelper;
import com.utsmm.kbz.util.tms.TMSUtil; import com.utsmm.kbz.util.tms.TMSUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
public class DashboardTransFragment extends DataBindingFragment { public class DashboardTransFragment extends DataBindingFragment {
@ -36,6 +47,13 @@ public class DashboardTransFragment extends DataBindingFragment {
private ArrayList<Features> featuresList = new ArrayList<>(); private ArrayList<Features> featuresList = new ArrayList<>();
MainAdapter mainAdapter; MainAdapter mainAdapter;
private boolean cardPrimaryHostCached = false;
private String cardPrimaryHostName = "";
private String cardPrimaryTid = "";
private String cardPrimaryMid = "";
private String cardPrimaryIp = "";
private String cardPrimarySecIp = "";
private CurrencyType cardPrimaryCurrency = CurrencyType.MMK;
private static final int hostId = Constants.NAV_HOST_ID; private static final int hostId = Constants.NAV_HOST_ID;
private int routeId; private int routeId;
@ -290,7 +308,190 @@ public class DashboardTransFragment extends DataBindingFragment {
} }
private void showCurrencyChooserForCardFlow(Runnable onSelected) { private void showCurrencyChooserForCardFlow(Runnable onSelected) {
currencySelectionHelper.showCardCurrencyChooser(onSelected); List<String> currencies = getAvailableCardSaleCurrencies();
if (currencies.isEmpty()) {
applyCardCurrencyAndHost("MMK");
onSelected.run();
return;
}
if (currencies.size() == 1) {
applyCardCurrencyAndHost(currencies.get(0));
onSelected.run();
return;
}
showCurrencyPickerDialog("Choose Currency", currencies, currency -> {
applyCardCurrencyAndHost(currency);
onSelected.run();
});
}
private List<String> getAvailableCardSaleCurrencies() {
cachePrimaryCardHostIfNeeded();
LinkedHashSet<String> values = new LinkedHashSet<>();
if (cardPrimaryCurrency != null && !TextUtils.isEmpty(cardPrimaryCurrency.name)) {
values.add(normalizeCurrency(cardPrimaryCurrency.name));
}
String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency());
if (!TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName()) && !TextUtils.isEmpty(secondaryCurrency)) {
values.add(secondaryCurrency);
}
return new ArrayList<>(values);
}
private void applyCardCurrencyAndHost(String selectedCurrency) {
cachePrimaryCardHostIfNeeded();
String selected = normalizeCurrency(selectedCurrency);
String secondaryCurrency = normalizeCurrency(SystemParamsOperation.getInstance().getThirdHostCurrency());
boolean useSecondaryCardHost = !TextUtils.isEmpty(SystemParamsOperation.getInstance().getThirdHostName())
&& !TextUtils.isEmpty(secondaryCurrency)
&& secondaryCurrency.equals(selected);
if (useSecondaryCardHost) {
SystemParamsOperation.getInstance().setHostName(SystemParamsOperation.getInstance().getThirdHostName());
SystemParamsOperation.getInstance().setTerminalId(SystemParamsOperation.getInstance().getThirdHostTerminalId());
SystemParamsOperation.getInstance().setMerchantId(SystemParamsOperation.getInstance().getThirdHostMerchantId());
SystemParamsOperation.getInstance().setIpAddress(SystemParamsOperation.getInstance().getThirdHostIpAddress());
SystemParamsOperation.getInstance().setSecIpAddress(SystemParamsOperation.getInstance().getThirdHostSecIpAddress());
} else {
SystemParamsOperation.getInstance().setHostName(cardPrimaryHostName);
SystemParamsOperation.getInstance().setTerminalId(cardPrimaryTid);
SystemParamsOperation.getInstance().setMerchantId(cardPrimaryMid);
SystemParamsOperation.getInstance().setIpAddress(cardPrimaryIp);
SystemParamsOperation.getInstance().setSecIpAddress(cardPrimarySecIp);
}
CurrencyType currencyType = useSecondaryCardHost ? toCurrencyType(selected) : cardPrimaryCurrency;
SystemParamsOperation.getInstance().setCurrencyType(currencyType);
sharedViewModel.set_currencyText(currencyType.name);
}
private void cachePrimaryCardHostIfNeeded() {
if (cardPrimaryHostCached) {
return;
}
cardPrimaryHostName = SystemParamsOperation.getInstance().getHostName();
cardPrimaryTid = SystemParamsOperation.getInstance().getTerminalId();
cardPrimaryMid = SystemParamsOperation.getInstance().getMerchantId();
cardPrimaryIp = SystemParamsOperation.getInstance().getIpAddress();
cardPrimarySecIp = SystemParamsOperation.getInstance().getSecIpAddress();
CurrencyType activeCurrency = SystemParamsOperation.getInstance().getCurrencyType();
cardPrimaryCurrency = activeCurrency == null ? CurrencyType.MMK : activeCurrency;
cardPrimaryHostCached = true;
}
private CurrencyType toCurrencyType(String value) {
String normalized = normalizeCurrency(value);
try {
return CurrencyType.valueOf(normalized);
} catch (Exception ignored) {
return CurrencyType.MMK;
}
}
private String normalizeCurrency(String raw) {
if (TextUtils.isEmpty(raw)) {
return "";
}
String value = raw.trim().toUpperCase();
switch (value) {
case "104":
case "MMK":
return "MMK";
case "840":
case "USD":
return "USD";
case "156":
case "CNY":
case "RMB":
return "CNY";
case "764":
case "THB":
return "THB";
case "643":
case "RUB":
return "RUB";
default:
return value;
}
}
private void showCurrencyPickerDialog(String title, List<String> currencies, CurrencySelectCallback callback) {
LinearLayout root = new LinearLayout(requireContext());
root.setOrientation(LinearLayout.VERTICAL);
root.setPadding(dp(20), dp(20), dp(20), dp(12));
TextView tvTitle = new TextView(requireContext());
tvTitle.setText(title);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
tvTitle.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorTextTitle));
tvTitle.setPadding(0, 0, 0, dp(16));
root.addView(tvTitle);
final AlertDialog[] dialogHolder = new AlertDialog[1];
for (String currency : currencies) {
AppCompatButton button = new AppCompatButton(requireContext());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
dp(56)
);
lp.bottomMargin = dp(10);
button.setLayoutParams(lp);
button.setAllCaps(false);
button.setText(currency);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
button.setGravity(Gravity.CENTER);
button.setBackgroundResource(R.drawable.bg_rounded_btn_cv);
button.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
button.setOnClickListener(v -> {
if (dialogHolder[0] != null) {
dialogHolder[0].dismiss();
}
callback.onSelected(currency);
});
root.addView(button);
}
AppCompatButton cancel = new AppCompatButton(requireContext());
LinearLayout.LayoutParams cancelLp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
dp(52)
);
cancel.setLayoutParams(cancelLp);
cancel.setAllCaps(false);
cancel.setText("Cancel");
cancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
cancel.setBackgroundResource(R.drawable.bg_rounded_btn_cancel_cv);
cancel.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary));
cancel.setOnClickListener(v -> {
if (dialogHolder[0] != null) {
dialogHolder[0].dismiss();
}
});
root.addView(cancel);
AlertDialog dialog = new AlertDialog.Builder(requireContext())
.setView(root)
.create();
dialogHolder[0] = dialog;
dialog.show();
}
private int dp(int value) {
return Math.round(value * requireContext().getResources().getDisplayMetrics().density);
}
private interface CurrencySelectCallback {
void onSelected(String currency);
// currencySelectionHelper.showCardCurrencyChooser(onSelected);
} }
} }

View File

@ -1,5 +1,7 @@
package com.utsmm.kbz.ui.management; package com.utsmm.kbz.ui.management;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@ -40,6 +42,8 @@ public class ReprintReceiptFragment extends DataBindingFragment {
private static final String TAG = ReprintReceiptFragment.class.getSimpleName(); private static final String TAG = ReprintReceiptFragment.class.getSimpleName();
private PayDetail payDetail; private PayDetail payDetail;
private ObjectAnimator slideUpAnimator;
private View printingCard;
@Override @Override
protected void initViewModel() { protected void initViewModel() {
@ -76,6 +80,7 @@ public class ReprintReceiptFragment extends DataBindingFragment {
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
stopPrintingAnimation();
} }
@ -105,7 +110,7 @@ public class ReprintReceiptFragment extends DataBindingFragment {
@Override @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
printingCard = mBinding.getRoot().findViewById(R.id.printingCard);
} }
private void updateUIPrintReceiptFailure(PayDetail payDetail) { private void updateUIPrintReceiptFailure(PayDetail payDetail) {
@ -140,6 +145,7 @@ public class ReprintReceiptFragment extends DataBindingFragment {
} }
} else if (PrintHelper.getInstance().paperRollStatus() == SdkResult.Success) { } else if (PrintHelper.getInstance().paperRollStatus() == SdkResult.Success) {
startPrintingAnimation();
printReceipt(payDetail); printReceipt(payDetail);
} }
} }
@ -195,17 +201,44 @@ public class ReprintReceiptFragment extends DataBindingFragment {
private PrintXStatus printXStatus = new PrintXStatus() { private PrintXStatus printXStatus = new PrintXStatus() {
@Override @Override
public void onSuccess() { public void onSuccess() {
stopPrintingAnimation();
delayFunctionCall(ReprintReceiptFragment.this::navigateMainScreen); delayFunctionCall(ReprintReceiptFragment.this::navigateMainScreen);
} }
@Override @Override
public void onFailure() { public void onFailure() {
stopPrintingAnimation();
updateUIPrintReceiptFailure(payDetail); updateUIPrintReceiptFailure(payDetail);
// checkPaperExists(payDetail); // checkPaperExists(payDetail);
} }
}; };
private void startPrintingAnimation() {
if (printingCard == null) {
return;
}
if (slideUpAnimator != null && slideUpAnimator.isRunning()) {
return;
}
slideUpAnimator = ObjectAnimator.ofFloat(printingCard, View.TRANSLATION_Y, 0f, -20f);
slideUpAnimator.setDuration(420);
slideUpAnimator.setRepeatMode(ValueAnimator.REVERSE);
slideUpAnimator.setRepeatCount(ValueAnimator.INFINITE);
slideUpAnimator.start();
}
private void stopPrintingAnimation() {
if (slideUpAnimator != null) {
slideUpAnimator.cancel();
slideUpAnimator = null;
}
if (printingCard != null) {
printingCard.setTranslationY(0f);
}
}
@SuppressWarnings("ConstantConditions") @SuppressWarnings("ConstantConditions")
private void navigateMainScreen() { private void navigateMainScreen() {

View File

@ -42,8 +42,7 @@ public class RefundCertificateManager {
return; return;
}; };
// String downloadBase = tmsAddress.trim() + "/api/v1/file/download?filePath="; //local String downloadBase = tmsAddress.trim() + "/file/download?filePath=";
String downloadBase = tmsAddress.trim() + "/file/download?filePath="; // uat and prod
String certUrl = SystemParamsOperation.getInstance().getCertificateUrl(); String certUrl = SystemParamsOperation.getInstance().getCertificateUrl();
String clientCertUrl = SystemParamsOperation.getInstance().getCertificateClientUrl(); String clientCertUrl = SystemParamsOperation.getInstance().getCertificateClientUrl();

View File

@ -1,6 +1,10 @@
package com.utsmm.kbz.ui.settings; package com.utsmm.kbz.ui.settings;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.animation.LinearInterpolator;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -15,6 +19,8 @@ import com.utsmm.kbz.databinding.FragmentHostConfigBinding;
import com.utsmm.kbz.ui.core_viewmodel.SharedViewModel; 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.paylibs.print.printx.PrintXReceipt;
import com.utsmyanmar.paylibs.print.printx.PrintXStatus;
import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation;
@ -26,6 +32,9 @@ public class HostConfigFragment extends DataBindingFragment {
protected Printer printer; protected Printer printer;
int FONT_NORMAL = 20; int FONT_NORMAL = 20;
int FONT_HEADER = 24; int FONT_HEADER = 24;
private ObjectAnimator rollUpAnimator;
private View hostCardView;
private volatile boolean isPrintingHostConfig = false;
@Override @Override
protected void initViewModel() { protected void initViewModel() {
@ -45,6 +54,7 @@ public class HostConfigFragment extends DataBindingFragment {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
FragmentHostConfigBinding binding = (FragmentHostConfigBinding) this.binding; FragmentHostConfigBinding binding = (FragmentHostConfigBinding) this.binding;
hostCardView = binding.getRoot().findViewById(R.id.hostCard);
viewModel.loadConfig(); viewModel.loadConfig();
} }
@ -56,6 +66,13 @@ public class HostConfigFragment extends DataBindingFragment {
sharedViewModel.printerDisabled.setValue(!SystemParamsOperation.getInstance().getPrinterEnabled()); sharedViewModel.printerDisabled.setValue(!SystemParamsOperation.getInstance().getPrinterEnabled());
} }
@Override
public void onPause() {
super.onPause();
stopRollUpAnimation();
isPrintingHostConfig = false;
}
@Override @Override
protected int currentId() { protected int currentId() {
return R.id.hostConfigFragment; return R.id.hostConfigFragment;
@ -81,7 +98,72 @@ public class HostConfigFragment extends DataBindingFragment {
showDeclineDialog("Printer is disabled!"); showDeclineDialog("Printer is disabled!");
return; return;
} }
sharedViewModel.printTerminalHostConfigs(); if (isPrintingHostConfig) {
return;
}
startHostConfigPrint();
}
}
private void startHostConfigPrint() {
isPrintingHostConfig = true;
startRollUpAnimation();
PrintXReceipt.getInstance().printTerminalHostConfig(new PrintXStatus() {
@Override
public void onSuccess() {
requireActivity().runOnUiThread(() -> {
isPrintingHostConfig = false;
stopRollUpAnimation();
Log.d("PrintConfig", "Print Terminal Config Success.");
});
}
@Override
public void onFailure() {
requireActivity().runOnUiThread(() -> {
isPrintingHostConfig = false;
stopRollUpAnimation();
Log.e("PrintConfig", "Print Terminal Config Failure.");
showDeclineDialog("Failed to print host config.");
});
}
});
}
private void startRollUpAnimation() {
if (hostCardView == null) {
return;
}
if (rollUpAnimator != null && rollUpAnimator.isRunning()) {
return;
}
hostCardView.post(() -> {
int cardTop = hostCardView.getTop();
int cardHeight = hostCardView.getHeight();
if (cardHeight <= 0) {
return;
}
// Move past the top edge so the card fully leaves the screen.
float offScreenDistance = cardTop + cardHeight + 80f;
rollUpAnimator = ObjectAnimator.ofFloat(hostCardView, View.TRANSLATION_Y, 0f, -offScreenDistance);
rollUpAnimator.setDuration(3000);
rollUpAnimator.setInterpolator(new LinearInterpolator());
rollUpAnimator.setRepeatMode(ValueAnimator.RESTART);
rollUpAnimator.setRepeatCount(ValueAnimator.INFINITE);
rollUpAnimator.start();
});
}
private void stopRollUpAnimation() {
if (rollUpAnimator != null) {
rollUpAnimator.cancel();
rollUpAnimator = null;
}
if (hostCardView != null) {
hostCardView.setTranslationY(0f);
} }
} }
} }

View File

@ -77,6 +77,10 @@ public class SettlementViewModel extends ViewModel {
public SingleLiveEvent<Integer> sale_count = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> sale_count = new SingleLiveEvent<>();
public SingleLiveEvent<Long> sale_amount = new SingleLiveEvent<>(); public SingleLiveEvent<Long> sale_amount = new SingleLiveEvent<>();
public SingleLiveEvent<String> sale_breakdown = new SingleLiveEvent<>(); public SingleLiveEvent<String> sale_breakdown = new SingleLiveEvent<>();
public SingleLiveEvent<Integer> void_count = new SingleLiveEvent<>();
public SingleLiveEvent<Long> void_amount = new SingleLiveEvent<>();
public SingleLiveEvent<String> void_breakdown = new SingleLiveEvent<>();
public SingleLiveEvent<Integer> pre_count = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> pre_count = new SingleLiveEvent<>();
public SingleLiveEvent<Long> pre_amount = new SingleLiveEvent<>(); public SingleLiveEvent<Long> pre_amount = new SingleLiveEvent<>();

View File

@ -210,7 +210,7 @@ public class TMSSetupsImpl implements TMSSetups{
} }
// For dual-currency card flow, prefer MMK as PRIMARY HOST. // For dual-currency card flow, prefer MMK as PRIMARY HOST.
if (isDualCurrencyEnabled && cardHosts.size() >= 2) { if (cardHosts.size() >= 2) {
SiriusHost first = cardHosts.get(0); SiriusHost first = cardHosts.get(0);
SiriusHost second = cardHosts.get(1); SiriusHost second = cardHosts.get(1);
boolean firstIsMMK = "MMK".equalsIgnoreCase(first.getCurrency()); boolean firstIsMMK = "MMK".equalsIgnoreCase(first.getCurrency());
@ -240,7 +240,7 @@ public class TMSSetupsImpl implements TMSSetups{
} }
// SECONDARY HOST (Card #2) // SECONDARY HOST (Card #2)
if (isDualCurrencyEnabled && cardHosts.size() > 1) { if (cardHosts.size() > 1) {
SiriusHost secondaryCard = cardHosts.get(1); SiriusHost secondaryCard = cardHosts.get(1);
SystemParamsOperation.getInstance().setThirdHostName(secondaryCard.getName() == null ? "" : secondaryCard.getName()); SystemParamsOperation.getInstance().setThirdHostName(secondaryCard.getName() == null ? "" : secondaryCard.getName());
SystemParamsOperation.getInstance().setThirdHostTerminalId(secondaryCard.getTid() == null ? "" : secondaryCard.getTid()); SystemParamsOperation.getInstance().setThirdHostTerminalId(secondaryCard.getTid() == null ? "" : secondaryCard.getTid());

View File

@ -142,7 +142,9 @@
android:weightSum="3"> android:weightSum="3">
<!-- Tap Card --> <!-- Tap Card -->
<!-- android:onClick="@{()->click.onClickTap()}"-->
<androidx.cardview.widget.CardView <androidx.cardview.widget.CardView
android:onClick="@{()->click.onClickTap()}"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="96dp" android:layout_height="96dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
@ -150,7 +152,6 @@
android:layout_weight="1" android:layout_weight="1"
app:cardCornerRadius="12dp" app:cardCornerRadius="12dp"
app:cardElevation="2dp" app:cardElevation="2dp"
android:onClick="@{()->click.onClickTap()}"
android:backgroundTint="#fff" android:backgroundTint="#fff"
android:foreground="?android:attr/selectableItemBackground" android:foreground="?android:attr/selectableItemBackground"
android:focusable="true" android:focusable="true"

View File

@ -4,8 +4,9 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<data> <data>
<import type="android.text.TextUtils"/>
<import type="android.view.View"/> <import type="android.view.View"/>
<import type="android.text.TextUtils"/>
<variable <variable
name="viewModel" name="viewModel"
type="com.utsmm.kbz.ui.settings.HostConfigViewModel"/> type="com.utsmm.kbz.ui.settings.HostConfigViewModel"/>
@ -99,7 +100,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:visibility="@{TextUtils.isEmpty(viewModel.hostName) ? View.GONE : View.VISIBLE}"> android:visibility='@{!TextUtils.isEmpty(viewModel.hostName) ? View.VISIBLE : View.GONE}'
tools:visibility="visible">
<TextView <TextView
android:text="PRIMARY HOST" android:text="PRIMARY HOST"
@ -113,56 +115,48 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:stretchColumns="1"> android:stretchColumns="1">
<TableRow <TableRow>
android:visibility="@{TextUtils.isEmpty(viewModel.hostName) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Name"/> <TextView style="@style/HostLabelStyle" android:text="Name"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.hostName}'/> android:text='@{": " + viewModel.hostName}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.tid) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.tid) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="TID"/> <TextView style="@style/HostLabelStyle" android:text="TID"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.tid}'/> android:text='@{": " + viewModel.tid}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.mid) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.mid) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="MID"/> <TextView style="@style/HostLabelStyle" android:text="MID"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.mid}'/> android:text='@{": " + viewModel.mid}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.primaryIp) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.primaryIp) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Primary IP"/> <TextView style="@style/HostLabelStyle" android:text="Primary IP"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.primaryIp}'/> android:text='@{": " + viewModel.primaryIp}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.primaryPort) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.primaryPort) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Primary Port"/> <TextView style="@style/HostLabelStyle" android:text="Primary Port"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.primaryPort}'/> android:text='@{": " + viewModel.primaryPort}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.secondaryIp) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.secondaryIp) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Secondary IP"/> <TextView style="@style/HostLabelStyle" android:text="Secondary IP"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secondaryIp}'/> android:text='@{": " + viewModel.secondaryIp}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.secondaryPort) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.secondaryPort) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Secondary Port"/> <TextView style="@style/HostLabelStyle" android:text="Secondary Port"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secondaryPort}'/> android:text='@{": " + viewModel.secondaryPort}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.currencyCode) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.currencyCode) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Currency"/> <TextView style="@style/HostLabelStyle" android:text="Currency"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.currencyCode}'/> android:text='@{": " + viewModel.currencyCode}'/>
@ -174,7 +168,6 @@
android:text="--------------------------------------------------------------------------" android:text="--------------------------------------------------------------------------"
android:gravity="left" android:gravity="left"
android:paddingVertical="8dp" android:paddingVertical="8dp"
android:visibility="@{TextUtils.isEmpty(viewModel.hostName) ? View.GONE : View.VISIBLE}"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="match_parent"/> android:layout_width="match_parent"/>
@ -183,7 +176,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostName) ? View.GONE : View.VISIBLE}"> android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostName) ? View.VISIBLE : View.GONE}'
tools:visibility="gone">
<TextView <TextView
android:text="SECONDARY HOST" android:text="SECONDARY HOST"
@ -200,57 +194,43 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:stretchColumns="1"> android:stretchColumns="1">
<TableRow <TableRow>
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostName) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Name"/> <TextView style="@style/HostLabelStyle" android:text="Name"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostName}'/> android:text='@{": " + viewModel.thirdHostName}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostShortCode) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostTid) ? View.GONE : View.VISIBLE}"> <TextView style="@style/HostLabelStyle" android:text="Short Code"/>
<TextView style="@style/HostLabelStyle" android:text="TID"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostTid}'/> android:text='@{": " + viewModel.thirdHostShortCode}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostPrimaryIp) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostMid) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="MID"/>
<TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostMid}'/>
</TableRow>
<TableRow
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostPrimaryIp) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Primary IP"/> <TextView style="@style/HostLabelStyle" android:text="Primary IP"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostPrimaryIp}'/> android:text='@{": " + viewModel.thirdHostPrimaryIp}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostPrimaryPort) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostPrimaryPort) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Primary Port"/> <TextView style="@style/HostLabelStyle" android:text="Primary Port"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostPrimaryPort}'/> android:text='@{": " + viewModel.thirdHostPrimaryPort}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostSecondaryIp) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostSecondaryIp) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Secondary IP"/> <TextView style="@style/HostLabelStyle" android:text="Secondary IP"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostSecondaryIp}'/> android:text='@{": " + viewModel.thirdHostSecondaryIp}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostSecondaryPort) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostSecondaryPort) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Secondary Port"/> <TextView style="@style/HostLabelStyle" android:text="Secondary Port"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostSecondaryPort}'/> android:text='@{": " + viewModel.thirdHostSecondaryPort}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.thirdHostCurrency) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostCurrency) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Currency"/> <TextView style="@style/HostLabelStyle" android:text="Currency"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.thirdHostCurrency}'/> android:text='@{": " + viewModel.thirdHostCurrency}'/>
@ -261,7 +241,6 @@
android:text="--------------------------------------------------------------------------" android:text="--------------------------------------------------------------------------"
android:gravity="left" android:gravity="left"
android:paddingVertical="8dp" android:paddingVertical="8dp"
android:visibility="@{TextUtils.isEmpty(viewModel.thirdHostName) ? View.GONE : View.VISIBLE}"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="match_parent"/> android:layout_width="match_parent"/>
</LinearLayout> </LinearLayout>
@ -271,7 +250,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:visibility="@{TextUtils.isEmpty(viewModel.secHostName) ? View.GONE : View.VISIBLE}"> android:visibility='@{!TextUtils.isEmpty(viewModel.secHostName) ? View.VISIBLE : View.GONE}'
tools:visibility="visible">
<TextView <TextView
android:text="QR HOST" android:text="QR HOST"
@ -288,50 +268,43 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:stretchColumns="1"> android:stretchColumns="1">
<TableRow <TableRow>
android:visibility="@{TextUtils.isEmpty(viewModel.secHostName) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Name"/> <TextView style="@style/HostLabelStyle" android:text="Name"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secHostName}'/> android:text='@{": " + viewModel.secHostName}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.shortCode) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.shortCode) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Short Code"/> <TextView style="@style/HostLabelStyle" android:text="Short Code"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.shortCode}'/> android:text='@{": " + viewModel.shortCode}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.secHostPrimaryIp) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.secHostPrimaryIp) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Primary IP"/> <TextView style="@style/HostLabelStyle" android:text="Primary IP"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secHostPrimaryIp}'/> android:text='@{": " + viewModel.secHostPrimaryIp}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.secHostPrimaryPort) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.secHostPrimaryPort) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Primary Port"/> <TextView style="@style/HostLabelStyle" android:text="Primary Port"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secHostPrimaryPort}'/> android:text='@{": " + viewModel.secHostPrimaryPort}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.secHostSecondaryIp) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.secHostSecondaryIp) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Secondary IP"/> <TextView style="@style/HostLabelStyle" android:text="Secondary IP"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secHostSecondaryIp}'/> android:text='@{": " + viewModel.secHostSecondaryIp}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.secHostSecondaryPort) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.secHostSecondaryPort) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Secondary Port"/> <TextView style="@style/HostLabelStyle" android:text="Secondary Port"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secHostSecondaryPort}'/> android:text='@{": " + viewModel.secHostSecondaryPort}'/>
</TableRow> </TableRow>
<TableRow <TableRow android:visibility='@{!TextUtils.isEmpty(viewModel.secHostCurrency) ? View.VISIBLE : View.GONE}'>
android:visibility="@{TextUtils.isEmpty(viewModel.secHostCurrency) ? View.GONE : View.VISIBLE}">
<TextView style="@style/HostLabelStyle" android:text="Currency"/> <TextView style="@style/HostLabelStyle" android:text="Currency"/>
<TextView style="@style/HostValueStyle" <TextView style="@style/HostValueStyle"
android:text='@{": " + viewModel.secHostCurrency}'/> android:text='@{": " + viewModel.secHostCurrency}'/>
@ -342,7 +315,6 @@
android:text="--------------------------------------------------------------------------" android:text="--------------------------------------------------------------------------"
android:gravity="left" android:gravity="left"
android:paddingVertical="8dp" android:paddingVertical="8dp"
android:visibility="@{TextUtils.isEmpty(viewModel.secHostName) ? View.GONE : View.VISIBLE}"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="match_parent"/> android:layout_width="match_parent"/>
</LinearLayout> </LinearLayout>
@ -367,6 +339,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:visibility="@{sharedViewModel.printerDisabled ? View.GONE : View.VISIBLE}"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"> app:layout_constraintStart_toStartOf="parent">
@ -386,7 +359,6 @@
android:layout_height="52dp" android:layout_height="52dp"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:visibility="@{sharedViewModel.printerDisabled ? View.GONE : View.VISIBLE}"
android:text="Print" android:text="Print"
android:onClick="@{()-> click.onPrint()}" android:onClick="@{()-> click.onPrint()}"
android:background="@drawable/bg_rounded_btn_cv" android:background="@drawable/bg_rounded_btn_cv"

View File

@ -127,6 +127,63 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_marginTop="19dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@string/txt_subtitle_void"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@={settleViewModel.sale_count+``}"
tools:text="5"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:textColor="@color/black"
android:fontFamily="@font/rubik_regular"
android:text="@{POSUtil.getInstance().getDecimalAmountSeparatorFormat(settleViewModel.sale_amount)}"
tools:text="65.00"
android:textAlignment="textEnd"
android:textSize="16sp" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:fontFamily="@font/rubik_regular"
android:text="@{settleViewModel.sale_breakdown}"
android:textColor="@color/colorTextContent"
android:textSize="12sp"
tools:text="MMK 2 / 10,000.00 USD 1 / 25.00" />
</LinearLayout>
<FrameLayout <FrameLayout
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -255,6 +255,7 @@
<string name="txt_title_count">Count</string> <string name="txt_title_count">Count</string>
<string name="txt_title_totals">Totals</string> <string name="txt_title_totals">Totals</string>
<string name="txt_subtitle_sale">Sale</string> <string name="txt_subtitle_sale">Sale</string>
<string name="txt_subtitle_void">Void</string>
<string name="txt_subtitle_sale_completion">Sale Completion</string> <string name="txt_subtitle_sale_completion">Sale Completion</string>
<string name="txt_subtitle_refund">Refund</string> <string name="txt_subtitle_refund">Refund</string>
<string name="txt_subtitle_amount">Amount</string> <string name="txt_subtitle_amount">Amount</string>

View File

@ -11,8 +11,8 @@
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"attributes": [], "attributes": [],
"versionCode": 1, "versionCode": 33,
"versionName": "1.00-uat", "versionName": "2.13-uat",
"outputFile": "app-uat-release.apk" "outputFile": "app-uat-release.apk"
} }
], ],

View File

@ -27,10 +27,6 @@ public final class TerminalKeyUtil {
private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase()); private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("875f63741753d18811a3449090d1777b".toUpperCase());
// private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU // private static final byte[] main_key_data = ByteUtil.hexStr2Bytes("e121249099a677e8b7d4f6a9d49fe8d1".toUpperCase()); // MPU
private static final byte[] work_key_data = new byte[16]; private static final byte[] work_key_data = new byte[16];
public static void initNexKey() { public static void initNexKey() {
byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK byte[] IPEKByte = ByteUtil.hexStr2Bytes("5A4CFF6DE93F0488926166F3317EFD2F"); // IPEK
byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18"); byte[] IPEKKCVByte = ByteUtil.hexStr2Bytes("1F0C18");
@ -54,8 +50,8 @@ public final class TerminalKeyUtil {
// int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.IPEK,IPEKByte,16,KSNByte); // int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.IPEK,IPEKByte,16,KSNByte);
// int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn); // int result = pinPad.dukptKeyInject(9, DukptKeyTypeEnum.BDK,IPEKByte,16,ksn);
LogUtil.d(TAG, "save tmk key result: "+result); // LogUtil.d(TAG, "save tmk key result: "+result);
LogUtil.d(TAG, "save tmk kcv: "+ByteUtil.bytes2HexStr(kcv)); // LogUtil.d(TAG, "save tmk kcv: "+ByteUtil.bytes2HexStr(kcv));
// byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0); // byte[] encryptedPIK = SystemParamsOperation.getInstance().getKeyPIK().get(0);
// //

View File

@ -254,7 +254,8 @@ public class NetworkModule {
} }
if (baseUrl.isEmpty()) { if (baseUrl.isEmpty()) {
baseUrl = "http://api-uat.kbzpay.com/payment/gateway/uat/"; // baseUrl = "http://api-uat.kbzpay.com/payment/gateway/uat/"; //UAT
baseUrl = "https://api.kbzpay.com/payment/gateway/"; //Prod
} }
return new Retrofit.Builder() return new Retrofit.Builder()
.baseUrl(baseUrl) .baseUrl(baseUrl)
@ -310,8 +311,8 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) {
// char[] password = "test123".toCharArray(); // char[] password = "test123".toCharArray();
// String refundBaseUrl = "https://api.kbzpay.com:8008/payment/gateway/"; String refundBaseUrl = "https://api.kbzpay.com:8008/payment/gateway/";
String refundBaseUrl = "https://api-uat.kbzpay.com:18008/payment/gateway/uat/"; // String refundBaseUrl = "https://api-uat.kbzpay.com:18008/payment/gateway/uat/";
// String IpAddress = SystemParamsOperation.getInstance().getSecHostIpAddress(); // String IpAddress = SystemParamsOperation.getInstance().getSecHostIpAddress();
@ -325,7 +326,7 @@ public Retrofit provideKPayRefundRetrofit(@ApplicationContext Context context) {
String pass = SystemParamsOperation.getInstance().getCertificatePassword(); String pass = SystemParamsOperation.getInstance().getCertificatePassword();
if (TextUtils.isEmpty(pass)) { if (TextUtils.isEmpty(pass)) {
pass = "test123"; pass = "";
} }
char[] password = pass.toCharArray(); char[] password = pass.toCharArray();

View File

@ -3,15 +3,10 @@ package com.utsmyanmar.baselib.network;
import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest; import com.utsmyanmar.baselib.network.model.KPayQRQueryRequest;
import com.utsmyanmar.baselib.network.model.KPayQRRequest; import com.utsmyanmar.baselib.network.model.KPayQRRequest;
import com.utsmyanmar.baselib.network.model.KPayQRResponse; import com.utsmyanmar.baselib.network.model.KPayQRResponse;
import com.utsmyanmar.baselib.network.model.MMQRStatusResponse;
import com.utsmyanmar.baselib.network.model.WaveQRRequest;
import com.utsmyanmar.baselib.network.model.WaveQRResponse;
import com.utsmyanmar.baselib.network.model.WaveStatusRequest;
import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.Body; import retrofit2.http.Body;
import retrofit2.http.POST; import retrofit2.http.POST;
import retrofit2.http.Url;
public interface KPayApiService { public interface KPayApiService {
@ -23,13 +18,13 @@ public interface KPayApiService {
Observable<KPayQRQueryRequest.QRQueryResponse> checkStatus(@Body KPayQRQueryRequest.QRQueryRequest waveStatusRequest); Observable<KPayQRQueryRequest.QRQueryResponse> checkStatus(@Body KPayQRQueryRequest.QRQueryRequest waveStatusRequest);
//this accept "url" bez this api start with https and other are http in uat //this accepts "url" bez this api start with https and other are http in uat
@POST // @POST
Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Url String url, @Body KPayQRRequest.CloseOrderRequest closeOrderRequest); // Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Url String url, @Body KPayQRRequest.CloseOrderRequest closeOrderRequest);
//this 2 is for production //this 2 is for production
// @POST("closeorder") @POST("closeorder")
// Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest); Observable<KPayQRRequest.CloseOrderResponse> closeOrder(@Body KPayQRRequest.CloseOrderRequest closeOrderRequest);
} }

View File

@ -86,9 +86,9 @@ public class Repository {
} }
public Observable<KPayQRRequest.CloseOrderResponse> qrCloseOrder(KPayQRRequest.CloseOrderRequest request){ public Observable<KPayQRRequest.CloseOrderResponse> qrCloseOrder(KPayQRRequest.CloseOrderRequest request){
String url = "https://api-uat.kbzpay.com/payment/gateway/uat/closeorder"; //close this in prod // String url = "https://api-uat.kbzpay.com/payment/gateway/uat/closeorder"; //close this in prod
return kPayApiService.closeOrder(url, request); // this is for local // return kPayApiService.closeOrder(url, request); // this is for uat
// return kPayApiService.closeOrder(request); //this is for prod return kPayApiService.closeOrder(request); //this is for prod
} }
public Observable<KPayQRQueryRequest.QRQueryResponse> qrStatusCheck(KPayQRQueryRequest.QRQueryRequest request) { public Observable<KPayQRQueryRequest.QRQueryResponse> qrStatusCheck(KPayQRQueryRequest.QRQueryRequest request) {

View File

@ -290,9 +290,9 @@ public abstract class BaseXPrint {
} }
private void printSettlementCurrencySection(String currencyLabel, CurrencySettlementSummary summary) { private void printSettlementCurrencySection(String currencyLabel, CurrencySettlementSummary summary) {
if (!summary.hasAnyValue()) { // if (!summary.hasAnyValue()) {
return; // return;
} // }
boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable(); boolean isDecimalEnabled = SystemParamsOperation.getInstance().getDecimalEnable();
int totalCount = summary.saleCount + summary.preAuthCompCount + summary.refundCount + summary.cashAdvanceCount; int totalCount = summary.saleCount + summary.preAuthCompCount + summary.refundCount + summary.cashAdvanceCount;
@ -390,6 +390,13 @@ public abstract class BaseXPrint {
} }
protected void printTransFooterForSettlement() {
String receiptFooter = SystemParamsOperation.getInstance().getReceiptFooter();
String finalVersion = SystemParamsOperation.getInstance().getFinalVersion();
printer.appendPrnStr("***** SETTLEMENT CONFIRM *****", fontNormal, AlignEnum.CENTER,false);
printer.appendPrnStr(receiptFooter, fontNormal, AlignEnum.CENTER,false);
}
protected void printTransDetail(PayDetail payDetail) { protected void printTransDetail(PayDetail payDetail) {
@ -1600,10 +1607,10 @@ public abstract class BaseXPrint {
}else{ }else{
if(isSettlement && isDuelCurrency){ if(isSettlement && isDuelCurrency){
printer.appendPrnStr("MID :" + safe(SystemParamsOperation.getInstance().getMerchantId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("MID :" + SystemParamsOperation.getInstance().getMerchantId(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("TID :" + safe(SystemParamsOperation.getInstance().getTerminalId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("TID :" + SystemParamsOperation.getInstance().getTerminalId(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("MID :" + safe(SystemParamsOperation.getInstance().getThirdHostMerchantId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("MID :" + SystemParamsOperation.getInstance().getThirdHostMerchantId(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("TID :" + safe(SystemParamsOperation.getInstance().getThirdHostTerminalId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("TID :" + SystemParamsOperation.getInstance().getThirdHostTerminalId(), fontNormal, AlignEnum.LEFT, false);
}else{ }else{
printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("MID :" + payDetail.getMerchantNo(), fontNormal, AlignEnum.LEFT,false);
printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false); printer.appendPrnStr("TID :" + payDetail.getTerminalNo(), fontNormal, AlignEnum.LEFT,false);
@ -1739,74 +1746,48 @@ public abstract class BaseXPrint {
// ---------- PRIMARY HOST ---------- // ---------- PRIMARY HOST ----------
printer.appendPrnStr("PRIMARY HOST", fontNormal, AlignEnum.LEFT, true); printer.appendPrnStr("PRIMARY HOST", fontNormal, AlignEnum.LEFT, true);
printer.appendPrnStr("Name : " + safe(sp.getHostName()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Name : " + sp.getHostName(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("TID : " + safe(sp.getTerminalId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("TID : " + sp.getTerminalId(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("MID : " + safe(sp.getMerchantId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("MID : " + sp.getMerchantId(), fontNormal, AlignEnum.LEFT, false);
String[] ipPort = splitIpAndPort(sp.getIpAddress()); String[] ipPort = splitIpAndPort(sp.getIpAddress());
printer.appendPrnStr("Primary IP : " + ipPort[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Primary IP : " + ipPort[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Primary Port : " + ipPort[1], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Primary Port : " + ipPort[1], fontNormal, AlignEnum.LEFT, false);
String[] secIpPort = splitIpAndPort(sp.getSecIpAddress()); String[] secIpPort = splitIpAndPort(sp.getSecIpAddress());
printer.appendPrnStr("Secondary IP : " + secIpPort[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary IP : " + secIpPort[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Secondary Port: " + secIpPort[1], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary Port: " + secIpPort[1], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Currency : " + normalizeHostCurrency(sp.getCurrencyType() == null ? "" : sp.getCurrencyType().toString()), fontNormal, AlignEnum.LEFT, false); sp.getCurrencyType();
printer.appendPrnStr(sp.getCurrencyType().toString(), fontNormal, AlignEnum.LEFT, false);
dotBreak(); dotBreak();
// ---------- SECONDARY HOST (optional) ----------
if (!TextUtils.isEmpty(sp.getSecHostName())) {
printer.appendPrnStr("QR 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);
String qrHostCurrency = TextUtils.isEmpty(sp.getSecHostCurrency()) ? String.valueOf(sp.getCurrencyType()) : sp.getSecHostCurrency();
printer.appendPrnStr("Currency Code : " + qrHostCurrency, fontNormal, AlignEnum.LEFT, false);
dotBreak();
printer.appendPrnStr("App Version : " + getAppVersion(), fontNormal, AlignEnum.LEFT, false);
}
// ---------- SECONDARY HOST ---------- // ---------- THIRD HOST (optional) ----------
printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true); if (!TextUtils.isEmpty(sp.getThirdHostName())) {
printer.appendPrnStr("Name : " + safe(sp.getThirdHostName()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("SECONDARY HOST", fontNormal, AlignEnum.LEFT, true);
printer.appendPrnStr("TID : " + safe(sp.getThirdHostTerminalId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Name : " + sp.getThirdHostName(), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("MID : " + safe(sp.getThirdHostMerchantId()), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("SHORT CODE : " + sp.getThirdHostShortCode(), fontNormal, AlignEnum.LEFT, false);
String[] thirdHostIp = splitIpAndPort(sp.getThirdHostIpAddress()); String[] thirdHostIp = splitIpAndPort(sp.getThirdHostIpAddress());
printer.appendPrnStr("Primary IP : " + thirdHostIp[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Primary Ip : " + thirdHostIp[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Primary Port : " + thirdHostIp[1], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Primary Port : " + thirdHostIp[1], fontNormal, AlignEnum.LEFT, false);
String[] thirdHostSecIp = splitIpAndPort(sp.getThirdHostSecIpAddress()); String[] thirdHostSecIp = splitIpAndPort(sp.getThirdHostSecIpAddress());
printer.appendPrnStr("Secondary IP : " + thirdHostSecIp[0], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary Ip : " + thirdHostSecIp[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Secondary Port: " + thirdHostSecIp[1], fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Secondary Port: " + thirdHostSecIp[1], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Currency : " + normalizeHostCurrency(safe(sp.getThirdHostCurrency())), fontNormal, AlignEnum.LEFT, false); printer.appendPrnStr("Currency Code : " + sp.getThirdHostCurrency(), fontNormal, AlignEnum.LEFT, false);
dotBreak(); dotBreak();
// ---------- QR HOST ----------
printer.appendPrnStr("QR HOST", fontNormal, AlignEnum.LEFT, true);
printer.appendPrnStr("Name : " + safe(sp.getSecHostName()), fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Short Code : " + safe(sp.getShortCode()), fontNormal, AlignEnum.LEFT, false);
String[] qrHostIp = splitIpAndPort(sp.getSecHostIpAddress());
printer.appendPrnStr("Primary IP : " + qrHostIp[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Primary Port : " + qrHostIp[1], fontNormal, AlignEnum.LEFT, false);
String[] qrHostSecIp = splitIpAndPort(sp.getSecHostSecIpAddress());
printer.appendPrnStr("Secondary IP : " + qrHostSecIp[0], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Secondary Port: " + qrHostSecIp[1], fontNormal, AlignEnum.LEFT, false);
printer.appendPrnStr("Currency : " + normalizeHostCurrency(safe(sp.getSecHostCurrency())), fontNormal, AlignEnum.LEFT, false);
dotBreak();
printer.appendPrnStr("App Version : " + getAppVersion(), fontNormal, AlignEnum.LEFT, false);
}
private String safe(String value) {
return value == null ? "" : value;
}
private String normalizeHostCurrency(String raw) {
if (TextUtils.isEmpty(raw)) return "";
String value = raw.trim().toUpperCase();
switch (value) {
case "104":
case "MMK":
return "MMK";
case "840":
case "USD":
return "USD";
case "156":
case "CNY":
case "RMB":
return "CNY";
case "764":
case "THB":
return "THB";
case "643":
case "RUB":
return "RUB";
default:
return value;
} }
} }

View File

@ -193,7 +193,8 @@ public class PrintXImpl extends BaseXPrint implements PrintX {
printMerchantHeader(); printMerchantHeader();
printTransHeader(payDetail); printTransHeader(payDetail);
printTransDetailSettlement(payDetail); printTransDetailSettlement(payDetail);
printTransFooterSummary(); // printTransFooterSummary();
printTransFooterForSettlement();
emptyLine(1); emptyLine(1);
startPrintNex(); startPrintNex();

View File

@ -39,13 +39,11 @@ public class SystemParamsSettings implements Serializable {
private boolean manualEntryPinEnable = false; private boolean manualEntryPinEnable = false;
private boolean checkExpSwitch = false; private boolean checkExpSwitch = false;
// private String tmsAddress = "https://tms.smile-mm.com"; // private String tmsAddress = "https://api-tms.kbzbank.com/sirius";
// private String tmsAddress = "http://128.199.170.203"; // private String ereceiptAddress = "https://api-tms.kbzbank.com/receipt";
private String tmsAddress = "https://sirius-nest.utsmyanmar.com/api/v1"; private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius";
// private String tmsAddress = "https://api-tms-uat.kbzbank.com:8443/sirius"; //for uat private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt";
private String ereceiptAddress = "https://receipt-nest.utsmyanmar.com/api/v1"; //for on prime
// private String ereceiptAddress = "https://api-tms-uat.kbzbank.com:8443/receipt"; //for uat
private String binValues = ""; private String binValues = "";
private String restrictedBinValues = ""; private String restrictedBinValues = "";