You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
395 lines
16 KiB
Dart
395 lines
16 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter/material.dart';
|
|
// import 'package:flutter_contacts/contact.dart';
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:uco_mobile_poc/app/core/config/server_response.dart';
|
|
import 'package:uco_mobile_poc/app/core/constants/app_contants.dart';
|
|
import 'package:uco_mobile_poc/app/core/constants/translation_keys.dart';
|
|
import 'package:uco_mobile_poc/app/core/data/repositories/app_repositories.dart';
|
|
import 'package:uco_mobile_poc/app/core/enums/request_constants.dart';
|
|
import 'package:uco_mobile_poc/app/core/utils/SessionCache.dart';
|
|
import 'package:uco_mobile_poc/app/core/utils/app_utils.dart';
|
|
import 'package:uco_mobile_poc/app/core/utils/logs_utils.dart';
|
|
import 'package:uco_mobile_poc/app/custom_widgets/Fields/field_validations.dart';
|
|
import 'package:uco_mobile_poc/app/custom_widgets/Fields/input_field.dart';
|
|
import 'package:uco_mobile_poc/app/custom_widgets/custom_dropdown.dart';
|
|
import 'package:uco_mobile_poc/app/custom_widgets/custom_toasty.dart';
|
|
import 'package:uco_mobile_poc/app/models/AccountInquiryResponseModel.dart';
|
|
import 'package:uco_mobile_poc/app/models/DepositAccountResponse.dart';
|
|
import 'package:uco_mobile_poc/app/models/ExchangeRate.dart';
|
|
import 'package:uco_mobile_poc/app/models/SendTransactionStep1ResponseModel.dart';
|
|
import 'package:uco_mobile_poc/app/models/TransactionPinRequestModel.dart';
|
|
import 'package:uco_mobile_poc/app/models/TransactionSubmitRequestModel.dart';
|
|
import 'package:uco_mobile_poc/app/modules/qr_setting/controllers/qr_setting_controller.dart';
|
|
import 'package:uco_mobile_poc/app/modules/qr_setting/views/qr_scan_screen.dart';
|
|
import 'package:uco_mobile_poc/app/res/app_colors.dart';
|
|
import 'package:uco_mobile_poc/app/routes/app_pages.dart';
|
|
|
|
class USendController extends GetxController {
|
|
TextEditingController pinPutController = TextEditingController();
|
|
TextEditingController referenceCodeController = TextEditingController();
|
|
final AppRepositories repository = Get.find<AppRepositories>();
|
|
|
|
BuildContext context = Get.context as BuildContext;
|
|
|
|
String OPTION_PHONE = "01";
|
|
|
|
String OPTION_EMAIL = "02";
|
|
|
|
//drop down
|
|
RxList<DropDown> allDepositAccounts = RxList.empty();
|
|
|
|
Rx<DepositAccount> selectedDepositAccount = DepositAccount.empty().obs;
|
|
|
|
RxList<DropDown> allRecipientDetailOptions = RxList.empty();
|
|
Rx<DropDown> selectedRecipientDetailOption = DropDown.empty().obs;
|
|
|
|
RxList<DropDown> allCurrencieList = RxList.empty();
|
|
DropDown selectedCurrency = DropDown.empty();
|
|
RxString currencySymbol = "".obs;
|
|
|
|
// Contact? selectedContact;
|
|
ExchangeRate? selectedExchangeRate;
|
|
String receiverAccountNumber = "";
|
|
String receiverAccountTitle = "";
|
|
|
|
// fields
|
|
late InputField depositAccountField;
|
|
late InputField selectRecipientDetailField;
|
|
|
|
// late InputField selectCurrencyField;
|
|
late InputField identityPhoneNumberField;
|
|
late InputField identityEmailField;
|
|
late InputField recipientCardNameField;
|
|
late InputField sendingAmountField;
|
|
late InputField exchangeRateField;
|
|
late InputField messageField;
|
|
late InputField userTransactionPinField;
|
|
late InputField referenceCodeField;
|
|
|
|
// @override
|
|
// void onInit() {
|
|
// super.onInit();
|
|
//
|
|
// for (int i = 0; i < SessionCache.instance.depositAccountList.length; i++) {
|
|
// DepositAccount depositAccount = SessionCache.instance.depositAccountList.elementAt(i);
|
|
//
|
|
// allDepositAccounts.add(DropDown(i.toString(), "${depositAccount.mbmBkmstitle} - ${depositAccount.mbmBkmsnumber}", depositAccount));
|
|
// }
|
|
//
|
|
// selectedDepositAccount.value = allDepositAccounts.first.data;
|
|
//
|
|
// allRecipientDetailOptions.value = <DropDown>[
|
|
// DropDown(OPTION_PHONE, TranslationKeys.makeTranslation(TranslationKeys.textPhoneNumber)),
|
|
// DropDown(OPTION_EMAIL, TranslationKeys.makeTranslation(TranslationKeys.textEmail)),
|
|
// ];
|
|
//
|
|
// for (int i = 0; i < SessionCache.instance.exchangeRateList.length; i++) {
|
|
// ExchangeRate exchangeRate = SessionCache.instance.exchangeRateList.elementAt(i);
|
|
// allCurrencieList.add(DropDown(exchangeRate.pcrCurrcode, exchangeRate.pcrCurrdesc, exchangeRate));
|
|
// }
|
|
// }
|
|
|
|
@override
|
|
Future<void> onReady() async {
|
|
super.onReady();
|
|
|
|
disposeAllResources();
|
|
|
|
updateSelectedDeposit(allDepositAccounts.elementAt(0));
|
|
|
|
Future.delayed(Duration.zero).then((value) {
|
|
depositAccountField.setText((allDepositAccounts.first.label));
|
|
});
|
|
}
|
|
|
|
void disposeAllResources() {
|
|
depositAccountField.clear();
|
|
selectRecipientDetailField.clear();
|
|
// selectCurrencyField.clear();
|
|
identityPhoneNumberField.clear();
|
|
identityEmailField.clear();
|
|
recipientCardNameField.clear();
|
|
sendingAmountField.clear();
|
|
exchangeRateField.clear();
|
|
messageField.clear();
|
|
userTransactionPinField.clear();
|
|
referenceCodeField.clear();
|
|
referenceCodeController.clear();
|
|
}
|
|
|
|
void updateSelectedDeposit(DropDown item) {
|
|
selectedDepositAccount.value = item.data as DepositAccount;
|
|
}
|
|
|
|
void updateSelectedCurrency(/*DropDown? item*/ AccountInquiryResponseModel model) {
|
|
print("************************model>> $model");
|
|
|
|
for (int i = 0; i < SessionCache.instance.exchangeRateList.length; i++) {
|
|
print("************************elementAt(i).pcrCurrcode>> ${SessionCache.instance.exchangeRateList.elementAt(i).pcrCurrcode}");
|
|
if (SessionCache.instance.exchangeRateList.elementAt(i).pcrCurrcode == model.pcrCurrcode) {
|
|
currencySymbol.value = SessionCache.instance.exchangeRateList.elementAt(i).pcrCurrshort;
|
|
selectedExchangeRate = SessionCache.instance.exchangeRateList.elementAt(i);
|
|
exchangeRateField.setText(selectedExchangeRate!.perEratrateact.toString());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void updateRecipientDetail(DropDown? item) {
|
|
selectedRecipientDetailOption.value = item!;
|
|
}
|
|
|
|
Future<void> selectContact() async {
|
|
dynamic result = await Get.toNamed(Routes.CONTACTS_SCREEN);
|
|
|
|
// if ((result != null && result[AppConstants.SELECTED_CONTACT] != null)) {
|
|
// selectedContact = result[AppConstants.SELECTED_CONTACT];
|
|
// identityPhoneNumberField.setText(AppUtils.formatPhoneNumber(selectedContact!.phones.first.number) /*"${selectedContact!.displayName} (${AppUtils.formatPhoneNumber(selectedContact!.phones.first.number + ")")}"*/);
|
|
// }
|
|
}
|
|
|
|
bool validate() {
|
|
bool isValid = FieldValidation.validateAll([
|
|
depositAccountField,
|
|
selectRecipientDetailField,
|
|
recipientCardNameField,
|
|
sendingAmountField,
|
|
exchangeRateField,
|
|
userTransactionPinField,
|
|
referenceCodeField,
|
|
]);
|
|
if (selectedRecipientDetailOption.value.id == OPTION_PHONE) {
|
|
isValid = FieldValidation.validateAll([identityPhoneNumberField]);
|
|
} else if (selectedRecipientDetailOption.value.id == OPTION_EMAIL) {
|
|
isValid = FieldValidation.validateAll([identityEmailField]);
|
|
}
|
|
dp("Validate value", isValid);
|
|
if (pinPutController.text.isEmpty) {
|
|
return false;
|
|
}
|
|
if (referenceCodeController.text.isEmpty) {
|
|
return false;
|
|
}
|
|
return isValid;
|
|
}
|
|
|
|
Future<void> sendTransaction({navigate = true}) async {
|
|
//
|
|
|
|
// if (!validate()) {
|
|
// Toasty.error("Please input and then proceed");
|
|
// return;
|
|
// }
|
|
|
|
// TransactionSubmitRequestModel transactionSubmitRequestModel = TransactionSubmitRequestModel(
|
|
// porOrgacode: RequestConstants.porOrgacode,
|
|
// pctCstycode: RequestConstants.pctCstycode,
|
|
// channelCode: RequestConstants.channelCode,
|
|
// cmpCustcode: SessionCache.instance.userInfo.cmpCustcode,
|
|
// drMbmBkmsnumber: selectedDepositAccount.value.mbmBkmsnumber,
|
|
// drMbmBkmstitle: selectedDepositAccount.value.mbmBkmstitle,
|
|
// drPcrCurrcode: selectedDepositAccount.value.pcrCurrcode,
|
|
// drPcrCurrdesc: selectedDepositAccount.value.pcrCurrdesc,
|
|
// drPcrCurrshort: selectedDepositAccount.value.pcrCurrshort,
|
|
// crMbmBkmsnumber: receiverAccountNumber,
|
|
// crMbmBkmstitle: receiverAccountTitle,
|
|
// crPcrCurrcode: selectedExchangeRate!.pcrCurrcode,
|
|
// crPcrCurrdesc: selectedExchangeRate!.pcrCurrdesc,
|
|
// crPcrCurrshort: selectedExchangeRate!.pcrCurrshort,
|
|
// sgtGntrnarration: "",
|
|
// dmpProdCode: selectedDepositAccount.value.dmpProdcode,
|
|
// transType: "DR",
|
|
// notificationId: "",
|
|
// transMode: "Online",
|
|
// sgtGntramtfc: double.parse(sendingAmountField.getCustomText().isEmpty ? "0.0" : sendingAmountField.getCustomText()),
|
|
// otdTrancomment: messageField.getCustomText(),
|
|
// isOtpRequired: false,
|
|
// cmpRefcode: referenceCodeField.getCustomText(),
|
|
// );
|
|
|
|
TransactionPinRequestModel transactionPinRequestModel = TransactionPinRequestModel(
|
|
porOrgacode: RequestConstants.porOrgacode,
|
|
pctCstycode: RequestConstants.pctCstycode,
|
|
channelCode: RequestConstants.channelCode,
|
|
cmpCustcode: SessionCache.instance.userInfo.cmpCustcode,
|
|
email: SessionCache.instance.userInfo.cmpUserId,
|
|
pinType: "TRAN",
|
|
transPincode: userTransactionPinField.getCustomText(),
|
|
isOtpRequired: false,
|
|
);
|
|
|
|
ServerResponse response = await repository.sendTransactionStep1(transactionPinRequestModel);
|
|
|
|
// if (response.isError) {
|
|
// Toasty.error(response.errorMsg);
|
|
// return;
|
|
// }
|
|
//
|
|
// SendTransactionStep1ResponseModel step1responseModel = SendTransactionStep1ResponseModel.fromMap(response.response);
|
|
// transactionSubmitRequestModel.notificationId = step1responseModel.notificationId.toString();
|
|
|
|
if (navigate) {
|
|
Get.toNamed(Routes.U_SEND_OTP,
|
|
// arguments: {
|
|
// AppConstants.SEND_TRANS_STEP1_DATA: transactionSubmitRequestModel,
|
|
// AppConstants.EXCHANGE_RATE: exchangeRateField.getCustomText(),
|
|
// }
|
|
);
|
|
} else {
|
|
Fluttertoast.showToast(
|
|
msg: "OTP successfully send to your email address",
|
|
);
|
|
}
|
|
}
|
|
|
|
void clearTransaction() {
|
|
selectRecipientDetailField.clear();
|
|
identityPhoneNumberField.clear();
|
|
identityEmailField.clear();
|
|
recipientCardNameField.clear();
|
|
sendingAmountField.clear();
|
|
exchangeRateField.clear();
|
|
messageField.clear();
|
|
userTransactionPinField.clear();
|
|
pinPutController.clear();
|
|
referenceCodeField.clear();
|
|
referenceCodeController.clear();
|
|
}
|
|
|
|
Future<void> verifyAccountAgainstIt() async {
|
|
String valua = selectedRecipientDetailOption.value.id == OPTION_PHONE ? identityPhoneNumberField.getCustomText() : (selectedRecipientDetailOption.value.id == OPTION_EMAIL ? identityEmailField.getCustomText() : "");
|
|
|
|
bool isValid = true;
|
|
|
|
if (selectedRecipientDetailOption.value.id == OPTION_PHONE) {
|
|
isValid = FieldValidation.validateAll([identityPhoneNumberField]);
|
|
} else if (selectedRecipientDetailOption.value.id == OPTION_EMAIL) {
|
|
isValid = FieldValidation.validateAll([identityEmailField]);
|
|
}
|
|
if (!isValid) {
|
|
Toasty.error("Please input and then proceed");
|
|
return;
|
|
}
|
|
ServerResponse response = await repository.fetchAccountInquiry(selectedRecipientDetailOption.value.id, valua);
|
|
|
|
if (response.isError) {
|
|
if (selectedRecipientDetailOption.value.id == OPTION_PHONE) {
|
|
identityPhoneNumberField.setError(response.errorMsg);
|
|
} else {
|
|
identityEmailField.setError(response.errorMsg);
|
|
}
|
|
// Toasty.error(response.errorMsg);
|
|
return;
|
|
}
|
|
|
|
List<dynamic> responseData = response.response ?? [];
|
|
|
|
List<AccountInquiryResponseModel> accountInquiryList;
|
|
accountInquiryList = AccountInquiryResponseModel.fromList(responseData);
|
|
|
|
accountsDialog(accountInquiryList);
|
|
// AccountInquiryResponseModel transactionSubmitRequestModel = AccountInquiryResponseModel.fromMap(((response.response ?? {}) as Map<Object?, Object?>).map((key, value) => MapEntry(key.toString(), value)));
|
|
}
|
|
|
|
// void scanQr() async {
|
|
// Get.put(QrSettingController());
|
|
//
|
|
// var scanResult = await Get.to(() => const QrScanScreen());
|
|
//
|
|
// var resultJson = jsonDecode(scanResult);
|
|
//
|
|
// var accNumber = resultJson["phoneNumber"];
|
|
//
|
|
// dp("Phone", accNumber);
|
|
//
|
|
// identityPhoneNumberField.setText(accNumber);
|
|
//
|
|
// verifyAccountAgainstIt();
|
|
// }
|
|
|
|
/// Accounts Dialogs...........u-send
|
|
void accountsDialog(List<AccountInquiryResponseModel> accountInquiryList) {
|
|
if (accountInquiryList.length == 1) {
|
|
receiverAccountTitle = accountInquiryList.first.mbmBkmstitle;
|
|
receiverAccountNumber = accountInquiryList.first.mbmBkmsnumber;
|
|
recipientCardNameField.setText(receiverAccountTitle);
|
|
updateSelectedCurrency(accountInquiryList.first);
|
|
return;
|
|
}
|
|
Get.dialog(
|
|
responsiveWidget(
|
|
Dialog(
|
|
backgroundColor: Colors.transparent,
|
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
|
child: Container(
|
|
decoration: const BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.all(Radius.circular(10.0)),
|
|
),
|
|
child: SingleChildScrollView(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(10),
|
|
child: ListView(
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
shrinkWrap: true,
|
|
children: [
|
|
Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Text(TranslationKeys.makeTranslation(TranslationKeys.textSelectAccount), style: Theme.of(context).textTheme.titleMedium),
|
|
const SizedBox(height: 20),
|
|
ListView.separated(
|
|
shrinkWrap: true,
|
|
itemBuilder: (context, index) {
|
|
return GestureDetector(
|
|
onTap: () {
|
|
receiverAccountTitle = accountInquiryList[index].mbmBkmstitle;
|
|
receiverAccountNumber = accountInquiryList[index].mbmBkmsnumber;
|
|
recipientCardNameField.setText(receiverAccountTitle);
|
|
updateSelectedCurrency(accountInquiryList[index]);
|
|
Get.back();
|
|
},
|
|
child: Column(children: [
|
|
Container(
|
|
height: 40,
|
|
width: double.infinity,
|
|
decoration: const BoxDecoration(
|
|
color: AppColors.colorGrey100,
|
|
borderRadius: BorderRadius.all(Radius.circular(8.0)),
|
|
),
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text("${accountInquiryList[index].mbmBkmstitle} (${accountInquiryList[index].pcrCurrshort})", style: Theme.of(context).textTheme.titleSmall),
|
|
Text(accountInquiryList[index].mbmBkmsnumber, style: Theme.of(context).textTheme.titleSmall),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
]),
|
|
);
|
|
},
|
|
separatorBuilder: (BuildContext context, int index) {
|
|
return const Padding(padding: EdgeInsets.symmetric(vertical: 5));
|
|
},
|
|
itemCount: accountInquiryList.length),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
barrierDismissible: false,
|
|
);
|
|
}
|
|
}
|