// // RecipientTranscationViewController.swift // GMERemittance // // Created by Fm-user on 12/22/17. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class RecipientTranscationViewController: UIViewController { @IBOutlet weak var pickerViewCurrency: UIPickerView! @IBOutlet weak var viewContainWithKoreanCurrency: UIView! @IBOutlet weak var viewContainWithOtherCountryCurrency: UIView! @IBOutlet weak var availableBalance: UILabel! @IBOutlet weak var viewContentMain: UIView! @IBOutlet weak var buttonSave: UIButton! @IBOutlet weak var dropDownCountryButton: UIButton! @IBOutlet weak var imageViewCountry: UIImageView! @IBOutlet weak var transferLimitMessageLabel: UILabel! @IBOutlet weak var moneySendingMessageLabel: UILabel! @IBOutlet weak var rewardPointlabel: UILabel! @IBOutlet weak var serviceFeeLabel: UILabel! @IBOutlet weak var transactionLimit: UILabel! @IBOutlet weak var labelCurrency: UILabel! @IBOutlet weak var labelExchangeRate: UILabel! @IBOutlet weak var viewBalance: UIView! @IBOutlet weak var viewExchange: UIView! @IBOutlet weak var textFieldKRW: UITextField! @IBOutlet weak var textFieldNPR: UITextField! private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() private var numberPad = UIKeyboardType.numberPad private var amountNPR: Float! private var networkDialogShown: Bool = false private var buttomCurrencyStatus: Bool? private var isScrolled: Bool = false //Recieved from previous ViewController var recipient: Recipient? var paymentMode: String? var paymentMethodId: String? //Recieved, updated and transferred to next var transferDetails: [String: String]? //Added for home delivery var homeDetails: [String: String]? /// to send exchange body private var exchangeData: [String: Any]? private var pickerData: [String] = [String]() private var calculateBy: String? private var currencyDetailArray: [Currency] = [Currency]() private var currencyArray = [String]() private var transactionviewmodel = TransactionViewModel() public static var recipientListViewControllerConnectionCheck = 0 @IBAction func selectPaymentMethod(_ sender: Any) { dismissKeyboard() performSegue(withIdentifier: "reviewTransfer", sender: nil) } override func viewDidLoad() { super.viewDidLoad() setUpAnotherLoginListener(genericviewmodel: transactionviewmodel) pickerViewCurrency.dataSource = self pickerViewCurrency.delegate = self let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapKoreanCurrencyView)) tap.delegate = self as? UIGestureRecognizerDelegate viewContainWithKoreanCurrency.addGestureRecognizer(tap) let tapOtherView = UITapGestureRecognizer(target: self, action: #selector(handleTapOtherCountryCurrencyView)) tap.delegate = self as? UIGestureRecognizerDelegate viewContainWithOtherCountryCurrency.addGestureRecognizer(tapOtherView) ///Background listner let notificationCenter = NotificationCenter.default notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: Notification.Name.UIApplicationWillResignActive, object: nil) setUpNavBar(id: 201, title: "Send Money") viewContentMain.isHidden = true buttomCurrencyStatus = true buttonSave.isUserInteractionEnabled = false buttonSave.alpha = 0.3 textFieldPlaceHolderAttribute() countryPickerViewButtonDesign() transactionviewmodel.transactionViewConnectionTimeOut.value = nil /** connection timeout */ transactionviewmodel.transactionViewConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if RecipientTranscationViewController.recipientListViewControllerConnectionCheck == 0{ RecipientTranscationViewController.recipientListViewControllerConnectionCheck = RecipientTranscationViewController.recipientListViewControllerConnectionCheck+1 self.popUpMessage(value: 25) } } /** Check internet connection */ transactionviewmodel.internetConnection.value = nil transactionviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if !self.networkDialogShown { self.popUpMessage(value: 15) self.networkDialogShown = true } } guard paymentMode != nil else { self.popUpMessageError(value: 10, message: "Error getting data") return } if paymentMode! == paymentModeType.cashPayment.rawValue { guard recipient != nil else { self.popUpMessageError(value: 10, message: "Error getting data") return } } else { guard transferDetails?.count != 0 && recipient != nil else { self.popUpMessageError(value: 10, message: "Error getting data") return } transactionviewmodel.setTransferDetails(transferDetails: transferDetails!) } exchangeRateBindCall() transactionInfoBindCall() currrencyBindCall() countryBindCall() self.startLoading() transactionviewmodel.fetchTransactionInfo(transactionInfo: transactionInfoParam()) transactionviewmodel.fetchCurrency(currencyInfo: currencyParam()) if let countryId = recipient?.countryId{ transactionviewmodel.fetchCountry(countryId: countryId) } textFieldKRW.delegate = self textFieldNPR.delegate = self viewBalance.layer.cornerRadius = 10 viewExchange.layer.cornerRadius = 10 } /** In case when app move to background */ @objc func appMovedToBackground() { textFieldKRW.resignFirstResponder() textFieldNPR.resignFirstResponder() } /** Disable user interaction while fetching data from api */ func startLoading(){ disableUserInteractions() showActivityIndicator(activityIndicator: activityIndicator) } /** Enable user interaction while fetching data from api */ func stopLoading(){ self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() } /** Handle tap action in view */ @objc func handleTapKoreanCurrencyView(){ textFieldKRW.becomeFirstResponder() } /** Handle tap action in view */ @objc func handleTapOtherCountryCurrencyView(){ textFieldNPR.becomeFirstResponder() } /** Api request for exchange rate */ func exchangeRateBindCall(){ transactionviewmodel.exchangeRateAvailable.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() guard $0! else { self.popUpMessageError(value: 10, message: self.transactionviewmodel.getErrorMessage()) self.viewContentMain.isHidden = false return } self.exchangeRateDisplay() self.serviceFeeDataDisplay() if self.paymentMode != paymentModeType.cashPayment.rawValue{ if let transferDetails = self.transferDetails{ self.transactionviewmodel.setTransferDetails(transferDetails: transferDetails) } } self.textFieldNPR.text = self.transactionviewmodel.getpAmt() self.textFieldKRW.text = self.transactionviewmodel.getcAmt() self.rewardPointlabel.text = "+" + String(self.transactionviewmodel.getRewardPoint()) self.viewContentMain.isHidden = false self.buttonSave.isUserInteractionEnabled = true self.buttonSave.alpha = 1 } } /** Api request for transaction info */ func transactionInfoBindCall(){ transactionviewmodel.transactionInfoAvailable.bind { [weak self] in guard $0 != nil else { return } self?.stopLoading() guard $0! else { self?.popUpMessageError(value: 10, message: (self?.transactionviewmodel.getErrorMessage())!) self?.viewContentMain.isHidden = false return } if let availableBalance = UserDefaults.standard.object(forKey: "com.gmeremit.balance") as? String { self?.availableBalance.text = (self?.getCommaAddedAmountString(amountString: availableBalance ))! + " KRW" } self?.setTransferLimitMessage(amount: String(format: "%.0f", (self?.transactionviewmodel.getTransferLimit())!)) self?.setTransactionLimit(amount:String(format: "%d", (self?.transactionviewmodel.getTransactionLimit())!)) self?.setMoneySendingMessage(sender:(self?.recipient?.getFullName())!) self?.viewContentMain.isHidden = false } } /** Api request for currency */ func currrencyBindCall(){ transactionviewmodel.currencyInfoAvailable.bind{[weak self] in guard $0 != nil else { return } self?.stopLoading() guard $0! else { self?.popUpMessageError(value: 10, message: (self?.transactionviewmodel.getErrorMessage())!) self?.viewContentMain.isHidden = false return } if let count = self?.transactionviewmodel.getCurrencyArray().count{ if count > 0{ self?.currencyDetailArray = (self?.transactionviewmodel.getCurrencyArray())! self?.currencyArray = (self!.currencyDetailArray.map{$0.name!}) if let count = self?.currencyArray.count{ if count > 0{ self?.pickerData = (self?.currencyArray)! } } if let currency = self?.pickerData[0]{ self?.labelCurrency.text = currency self?.dropDownCountryButton.setTitle(currency + " ", for: UIControlState.normal) } } } } } /** Api request for country */ func countryBindCall(){ transactionviewmodel.countryInfoAvailable.bind{[weak self] in guard $0 != nil else { return } self?.stopLoading() guard $0! else { self?.popUpMessageError(value: 10, message: (self?.transactionviewmodel.getErrorMessage())!) self?.viewContentMain.isHidden = false return } if let flagUrl = self?.transactionviewmodel.getCountryDetail()[0].flagUrl{ self?.imageViewCountry?.sd_setImage(with:URL(string: flagUrl), placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil) } } } @IBAction func buttonCurrencyTap(_ sender: Any) { pickerViewCurrency.reloadAllComponents() if currencyArray.count != 0{ self.pickerData = self.currencyArray } buttomCurrencyStatus = !buttomCurrencyStatus! if buttomCurrencyStatus! { pickerViewCurrency.isHidden = true } else { pickerViewCurrency.isHidden = false } } /** Get payment method id */ func getPaymentMethodId() -> String{ if paymentMode == paymentModeType.cashPayment.rawValue || paymentMode == paymentModeType.cashPaymentPartner.rawValue { paymentMethodId = paymentMethodIdType.cashMethod.rawValue } else if paymentMode == paymentModeType.bankPayment.rawValue { paymentMethodId = paymentMethodIdType.bankMethod.rawValue } else if paymentMode == paymentModeType.homeDelivery.rawValue { paymentMethodId = paymentMethodIdType.homeMethod.rawValue } return paymentMethodId! } /** Get transaction info param */ func transactionInfoParam() -> [String: String]{ var transactionParam: [String: String]? if let countryId = recipient?.countryId{ transactionParam = ["countryId": (countryId), "payoutMethodId": getPaymentMethodId()] } return transactionParam! } /** Get currency param */ func currencyParam() -> [String: String]{ var pam: [String: Any]? if let countryId = recipient?.countryId{ pam = ["countryId": countryId, "payoutMethodId": getPaymentMethodId(), "payoutLocationId": transferDetails?["bankPayoutId"] ?? "" ] as [String : Any] } return pam as! [String : String] } /** Text field place holder attribute */ func textFieldPlaceHolderAttribute(){ textFieldKRW.attributedPlaceholder = NSAttributedString(string: "0", attributes: [NSAttributedStringKey.foregroundColor: UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0)]) textFieldNPR.attributedPlaceholder = NSAttributedString(string: "0", attributes: [NSAttributedStringKey.foregroundColor: UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0)]) } /** Country picker view button design */ func countryPickerViewButtonDesign(){ dropDownCountryButton.layer.borderColor = UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0).cgColor dropDownCountryButton.layer.borderWidth = 1.0 dropDownCountryButton.layer.cornerRadius = 8 } /** Exchange rate value display */ func exchangeRateDisplay(){ let exchangeRateValueColor = UIColor(red: 236/255, green: 28/255.0, blue: 36/255, alpha: 1.0) let exchangeRate: String = String("Exchange Rate: ") let mutableExchangeRate = NSMutableAttributedString(string: exchangeRate) let mutableExchangeRateValue = NSMutableAttributedString(string: String(transactionviewmodel.getExchangeRate())) mutableExchangeRateValue.addAttribute(NSAttributedStringKey.foregroundColor, value: exchangeRateValueColor, range: NSRange(location:0, length: mutableExchangeRateValue.length)) let exchangeRateData = NSMutableAttributedString() exchangeRateData.append(mutableExchangeRate) exchangeRateData.append(mutableExchangeRateValue) labelExchangeRate.attributedText = exchangeRateData } /** Display service fee data */ func serviceFeeDataDisplay(){ let serviceFeeValueColor = UIColor(red: 236/255, green: 28/255.0, blue: 36/255, alpha: 1.0) let serviceFee: String = String("Service Fee: ") let mutableServiceFee = NSMutableAttributedString(string: serviceFee) let mutableServiceFeeValue = NSMutableAttributedString(string: transactionviewmodel.getTransferFee() + " KRW" + " (Inclusive)") mutableServiceFeeValue.addAttribute(NSAttributedStringKey.foregroundColor, value: serviceFeeValueColor, range: NSRange(location:0, length: mutableServiceFeeValue.length)) let transferFee = NSMutableAttributedString() transferFee.append(mutableServiceFee) transferFee.append(mutableServiceFeeValue) serviceFeeLabel.attributedText = transferFee } /** Set custom first transaction message */ func setFirstTransactionFreeMessage(){ let feeMessage: String = String("Your First Transfer Fees is ") let mutableFeeMessage1 = NSMutableAttributedString(string: feeMessage) let attrs = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 15),NSAttributedStringKey.foregroundColor:UIColor.red] let freeMessageInBold = NSMutableAttributedString(string:"Free", attributes:attrs) let mutableFeeMessage = NSMutableAttributedString() mutableFeeMessage.append(mutableFeeMessage1) mutableFeeMessage.append(freeMessageInBold) } /** Set custom message money sending */ func setMoneySendingMessage(sender:String){ let sendingMessage: String = String("You are sending money to ") let mutableSenderMessage1 = NSMutableAttributedString(string: sendingMessage) let attrs = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 15)] let senderMessageInBold = NSMutableAttributedString(string:sender, attributes:attrs) let mutableSenderMessage = NSMutableAttributedString() mutableSenderMessage.append(mutableSenderMessage1) mutableSenderMessage.append(senderMessageInBold) moneySendingMessageLabel.attributedText = mutableSenderMessage } /** Set transfer limit message */ func setTransferLimitMessage(amount:String){ let transferMessage1: String = String("Transfer Limit Max \n") let transferMessage3: String = String(" KRW per day") let mutableTransferMessage1 = NSMutableAttributedString(string: transferMessage1) let mutableTransferMessage3 = NSMutableAttributedString(string: transferMessage3) let attrs = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 15)] let transferMessageInBold = NSMutableAttributedString(string:"\(amount)", attributes:attrs) let mutableTransferMessage = NSMutableAttributedString() mutableTransferMessage.append(mutableTransferMessage1) mutableTransferMessage.append(transferMessageInBold) mutableTransferMessage.append(mutableTransferMessage3) transferLimitMessageLabel.attributedText = mutableTransferMessage } /** Set transaction limit message */ func setTransactionLimit(amount:String){ let transactionLimitMessage1: String = String("Transaction Limit Upto \n") let transactionLimitMessage2: String = String(" times per day") let mutableTransactionLimitMessage1 = NSMutableAttributedString(string: transactionLimitMessage1) let mutableTransactionLimitMessage2 = NSMutableAttributedString(string: transactionLimitMessage2) let attrs = [NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 15)] let transactionLimitMessageInBold = NSMutableAttributedString(string:amount, attributes:attrs) let mutableTransactionLimitMessage = NSMutableAttributedString() mutableTransactionLimitMessage.append(mutableTransactionLimitMessage1) mutableTransactionLimitMessage.append(transactionLimitMessageInBold) mutableTransactionLimitMessage.append(mutableTransactionLimitMessage2) transactionLimit.attributedText = mutableTransactionLimitMessage } @IBAction func buttonSavedMoney(_ sender: Any) { guard let navController = self.navigationController else { return } let popOverVC = UIStoryboard(name: "RecipientListViewController", bundle: nil).instantiateViewController(withIdentifier: "savingPopup") as! PopUpSavingViewController navController.addChildViewController(popOverVC) popOverVC.view.frame = navController.view.bounds navController.view.addSubview(popOverVC.view) popOverVC.didMove(toParentViewController: navController) } /** Add done and cancel button */ func addDoneButtonOnKeyboard() { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction)) done.tintColor = UIColor(hex: 0xED1C24) let cancel: UIBarButtonItem = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelAction)) cancel.tintColor = UIColor.black let items = [cancel, flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() self.textFieldKRW.inputAccessoryView = doneToolbar self.textFieldNPR.inputAccessoryView = doneToolbar } /** Add cancel button in keypad */ @objc func cancelAction() { textFieldKRW.text = "" textFieldNPR.text = "" serviceFeeLabel.text = "Exchange Rate:" labelExchangeRate.text = "Service Fee:" rewardPointlabel.text = "" textFieldNPR.resignFirstResponder() textFieldKRW.resignFirstResponder() pickerViewCurrency.isHidden = true if !buttomCurrencyStatus! { buttomCurrencyStatus! = !buttomCurrencyStatus! } } /** Picker view done action button */ @objc func doneButtonAction() { self.networkDialogShown = false textFieldKRW.resignFirstResponder() textFieldNPR.resignFirstResponder() guard textFieldNPR.text != "" || textFieldKRW.text != "" else { self.popUpMessageInfo(value: 16, title: "Missing amount", message: "Please enter amount") return } viewContentMain.isHidden = true self.startLoading() transactionviewmodel.fetchExchangeRate(exchangeData: exchangeData!) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "reviewTransfer" { let reviewViewController = segue.destination as! ReviewViewController //ADDED FOR HOMEDELIVERY if paymentMode! == paymentModeType.homeDelivery.rawValue { if let localRecipient = recipient, let localCalculateBy = calculateBy , let localHomeDetails = homeDetails{ reviewViewController.transferDetails = transactionviewmodel.getTransferDetailsForHomeDelivery(recipient: localRecipient, paymentMethodId: getPaymentMethodId(), calcBy: localCalculateBy, homeDetails: localHomeDetails) } } else { if let localRecipient = recipient, let localCalculateBy = calculateBy{ reviewViewController.transferDetails = transactionviewmodel.getTransferDetails(recipient: localRecipient, paymentMethodId: getPaymentMethodId(), calcBy: localCalculateBy) } } reviewViewController.recipient = recipient reviewViewController.paymentMode = self.paymentMode } } } extension RecipientTranscationViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { addDoneButtonOnKeyboard() buttonSave.isUserInteractionEnabled = false buttonSave.alpha = 0.3 if textField == textFieldKRW { textFieldNPR.text = "" } else { textFieldKRW.text = "" } checkScroll() } func textFieldDidEndEditing(_ textField: UITextField) { checkScroll() if textField == textFieldKRW { calculateBy = "C" if let countryId = recipient?.countryId{ exchangeData = ["from":"KRW", "to":labelCurrency.text!, "calcBy": calculateBy!, "cAmt": textFieldKRW.text!, "payoutmethodid": getPaymentMethodId(), "countryId":countryId, "sendMoney":true ] } } else { if let countryId = recipient?.countryId{ calculateBy = "P" exchangeData = ["from":"KRW", "to":labelCurrency.text!, "calcBy": calculateBy!, "pAmt": textFieldNPR.text!, "payoutmethodid": getPaymentMethodId(), "countryId":countryId, "sendMoney":true ] } } textFieldKRW.sizeToFit() textFieldNPR.sizeToFit() } func getWidth(text: String) -> CGFloat { let txtField = UITextField(frame: .zero) txtField.text = text txtField.sizeToFit() return txtField.frame.size.width } override open func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(true) } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string) let currentText = textField.text ?? "" guard let stringRange = Range(range, in: currentText) else { return false } let updatedText = currentText.replacingCharacters(in: stringRange, with: string) if updatedText.count != 0 { if textField == textFieldKRW { if inputText.isDouble() { if Double(inputText)! <= transactionviewmodel.getTransferLimit() { return true } else { return false } } } else { if inputText.isDouble() { if Double(inputText)! <= 999999999999999 { return true } else { return false } } } } return true } } extension RecipientTranscationViewController: UIPickerViewDelegate, UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerData.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return pickerData[row] } func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { let label = (view as? UILabel) ?? UILabel() label.textColor = UIColor(red:0.29, green:0.29, blue:0.29, alpha:1.0) label.textAlignment = .center label.font = UIFont.systemFont(ofSize: 18) label.text = pickerData[row] return label } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { buttomCurrencyStatus = true pickerViewCurrency.isHidden = true dropDownCountryButton.setTitle(pickerData[row] + " ", for: UIControlState.normal) labelCurrency.text = pickerData[row] if textFieldKRW.text != "" && textFieldNPR.text != "" { textFieldNPR.text = "" buttonSave.isUserInteractionEnabled = false buttonSave.alpha = 0.3 } } } extension RecipientTranscationViewController : ScrollableProtocol { var offset: CGFloat { get { return 160 } } var viewScrolled: Bool { get { return isScrolled } } func checkScroll() { if !viewScrolled { performScroll(direction: 0) isScrolled = !isScrolled } else { performScroll(direction: 1) isScrolled = !isScrolled } } func registerTapListener() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard)) view.addGestureRecognizer(tap) } @objc func clearKeyboard() { textFieldKRW.resignFirstResponder() textFieldNPR.resignFirstResponder() if viewScrolled { performScroll(direction: 1) isScrolled = !isScrolled } } func performScroll(direction: Int) { if direction == 0 { UIView.animate(withDuration: 0.3, animations: { self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1) }) } else if direction == 1 { UIView.animate(withDuration: 0.3, animations: { self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset) }) } } } extension String { func isDouble() -> Bool { if let doubleValue = Double(self) { if doubleValue >= 0 { return true } } return false } }