// TransactionSearchViewController.swift // GMERemittance // // Created by FMI-12 on 2/9/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class TransactionSearchViewController: UIViewController { @IBOutlet weak var searchBarOutlet: UISearchBar! @IBOutlet weak var searchBar: UISearchBar! @IBOutlet weak var tableViewTransactionSearch: UITableView! @IBOutlet weak var calendarButtonOutlet: UIButton! private var tracktransactionviewmodel = TrackTransactionViewModel() private var transactionArray = [Transaction]() private var selectedTransaction: Transaction? private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() private var timer: Timer? public var status: Bool? private var checkDialog = 0 override func viewDidLoad() { super.viewDidLoad() setUpNavBar(id: 201, title: "Transaction Statement") setUpAnotherLoginListener(genericviewmodel: tracktransactionviewmodel) self.searchBar.delegate = self self.searchBar.backgroundColor = UIColor(red:0.90, green:0.90, blue:0.91, alpha:1.0) self.searchBar.tintColor = UIColor(red:0.98, green:0.98, blue:0.98, alpha:1.0) self.searchBar.layer.borderColor = UIColor(red:0.98, green:0.98, blue:0.98, alpha:1.0).cgColor self.searchBar.layer.borderWidth = 2 tracktransactionviewmodel.transactionListConnectionTimeOut.value = nil /** connection timeout */ tracktransactionviewmodel.transactionListConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if self.checkDialog == 0{ self.checkDialog = self.checkDialog+1 self.popUpMessage(value: 20) } } /** Check internet connection */ tracktransactionviewmodel.internetConnection.value = nil tracktransactionviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.searchBar.resignFirstResponder() self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) } /** Request for transaction data as per user search keyword */ tracktransactionviewmodel.transactionListObtained.bind{ [unowned self] in guard $0 != nil else { return } guard $0! else { //self.popUpMessageError(value: 10, message: self.tracktransactionviewmodel.getErrorMessage()) self.stopLoading() return } self.stopLoading() if (self.tracktransactionviewmodel.getTransactions().count>0) { self.transactionArray = self.tracktransactionviewmodel.getTransactions() self.tableViewTransactionSearch.isHidden = false self.tableViewTransactionSearch.reloadData() }else{ self.tableViewTransactionSearch.isHidden = true } } if status == false { calendarViewController() } else { searchBar.becomeFirstResponder() } hideKeyboardWhenTappedAround() tableViewTransactionSearch.tableFooterView = UIView() } @IBAction func buttonCalender(_ sender: Any) { calendarViewController() } /** Check whether transaction type is sent or received - Parameter payoutMode: the type of payout mode are like cash,bank,topup door to dorr and withdraw. - Parameter transferType: the type of transferType are like offer and request. - Returns : transactions type is sent or received */ func checkSentOrReceive(payoutMode: String, userId: String?) -> String { if(payoutMode.caseInsensitiveCompare("cash") == ComparisonResult.orderedSame || payoutMode.caseInsensitiveCompare("bank") == ComparisonResult.orderedSame || payoutMode.caseInsensitiveCompare("topup") == ComparisonResult.orderedSame || payoutMode.caseInsensitiveCompare("withdraw") == ComparisonResult.orderedSame){ return "sent" } else if (payoutMode.caseInsensitiveCompare("wallet Transfer") == ComparisonResult.orderedSame){ let selfUserId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String if userId != nil { if userId == selfUserId! { return "sent" } return "received" } } return "received" } /** Open calendar view to help user in finding transaction as per date selected */ func calendarViewController(){ guard let navController = self.navigationController else { return } let popUpViewController = UIStoryboard(name: "TransactionStatement", bundle: nil).instantiateViewController(withIdentifier: "calendarViewController") as! CalendarViewController popUpViewController.delegate = self navController.addChildViewController(popUpViewController) popUpViewController.view.frame = navController.view.bounds navController.view.addSubview(popUpViewController.view) popUpViewController.didMove(toParentViewController: navController) } /** Disable user interaction while fetching data from api */ func startLoading(){ self.showActivityIndicator(activityIndicator: self.activityIndicator) self.disableUserInteractions() } /** Enable user interaction while fetching data from api */ func stopLoading(){ self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() } /** Api request to find transactions as per search keyword */ @objc func requestSearchApi(){ if let search = searchBar.text{ self.startLoading() tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: search, transactionType: "search", startDate: nil, endDate: nil, txPage: nil, txSize: nil) } } } extension TransactionSearchViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tracktransactionviewmodel.getCount() } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "transactionSearchCell", for: indexPath) as! TransactionSearchTableViewCell cell.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor cell.layer.borderWidth = 5 cell.layer.cornerRadius = 10 var transactionType:String = "" let payout = tracktransactionviewmodel.getPaymentMethod(index: indexPath.row) // let transfer = tracktransactionviewmodel.getTransferType(index: indexPath.row) if payout != "N/A" { // transactionType = checkSentOrReceive(payoutMode: tracktransactionviewmodel.getPaymentMethod(index: indexPath.row), userId: tracktransactionviewmodel.getTransaction(index: indexPath.row).userId) transactionType = tracktransactionviewmodel.getTransactionType(index: indexPath.row) } if transactionType == "received" { cell.labelAmountPay.textColor = UIColor(red:0.18, green:0.19, blue:0.57, alpha:1.0) cell.labelName.text = getName(payoutMode: payout,transactionType: "From: ", row: indexPath.row) let amount = tracktransactionviewmodel.getAmount(index: indexPath.row) if amount == "N/A" { cell.labelAmountPay.text = amount } else { cell.labelAmountPay.text = "+" + amount } cell.labelDate.text = unixTimeStampToDate(unixTimeStamp: tracktransactionviewmodel.getDate(index: indexPath.row)) cell.labelPayment.text = tracktransactionviewmodel.getPaymentMethod(index: indexPath.row) cell.labelTranscationNo.text = tracktransactionviewmodel.getTransactionId(index: indexPath.row) } else if transactionType == "sent" { cell.labelAmountPay.textColor = UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0) cell.labelName.text = getName(payoutMode: payout,transactionType: "To: ", row: indexPath.row) let amount = tracktransactionviewmodel.getAmount(index: indexPath.row) if amount == "N/A" { cell.labelAmountPay.text = amount } else { cell.labelAmountPay.text = "-" + amount } cell.labelDate.text = unixTimeStampToDate(unixTimeStamp: tracktransactionviewmodel.getDate(index: indexPath.row)) cell.labelPayment.text = tracktransactionviewmodel.getPaymentMethod(index: indexPath.row) cell.labelTranscationNo.text = tracktransactionviewmodel.getTransactionId(index: indexPath.row) } return cell } func getName(payoutMode: String,transactionType: String,row:Int) -> String { if (payoutMode.caseInsensitiveCompare("Topup") == ComparisonResult.orderedSame){ return transactionType + transactionArray[row].receiverPhone }else if (payoutMode.caseInsensitiveCompare("withdraw") == ComparisonResult.orderedSame){ return transactionType + transactionArray[row].bankName } else if (payoutMode.caseInsensitiveCompare("bonus") == ComparisonResult.orderedSame){ return transactionType + firstWord(text: transactionArray[row].senderName) } else if (payoutMode.caseInsensitiveCompare("load balance") == ComparisonResult.orderedSame){ return transactionType + transactionArray[row].bankName } else if (payoutMode.caseInsensitiveCompare("wallet transfer") == ComparisonResult.orderedSame) { if transactionType == "From: "{ if let name = transactionArray[row].senderName{ return transactionType + firstWord(text: name) } } else { if let name = transactionArray[row].receiverName{ return transactionType + firstWord(text: name) } } } else { if let name = transactionArray[row].receiverName{ return transactionType + firstWord(text: name) } } return "-" } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { selectedTransaction = tracktransactionviewmodel.getTransaction(index: indexPath.row) do { let encodedTransaction = try JSONEncoder().encode(selectedTransaction) let encodedTransactionDictionary = try JSONSerialization.jsonObject(with: encodedTransaction, options: .allowFragments) as? [String: Any] switch (encodedTransactionDictionary!["payoutMethod"] as? String)?.lowercased() { case "cash"?, "bank"?, "door to door"?: let storyboard = UIStoryboard.init(name: "RecipientListViewController", bundle: Bundle.main) let transferSuccessViewController = storyboard.instantiateViewController(withIdentifier: "showTransferInfo") as! TransferSuccessfulViewController transferSuccessViewController.responseDetails = encodedTransactionDictionary self.navigationController!.pushViewController(transferSuccessViewController, animated: true) case "wallet transfer"?: let storyboard = UIStoryboard.init(name: "WalletTransfer", bundle: Bundle.main) let walletSuccessViewController = storyboard.instantiateViewController(withIdentifier: "walletSuccess") as! WalletSuccessViewController walletSuccessViewController.transaction = selectedTransaction self.navigationController!.pushViewController(walletSuccessViewController, animated: true) case "load balance"?, "withdraw"?, "bonus"?, "topup"?: popUpMessageInfo(value: 16, title: "Alert", message: "No details available") default: popUpMessageInfo(value: 16, title: "Alert", message: "No details available") } } catch let error { } } } extension TransactionSearchViewController: UISearchBarDelegate { func createSearchBar() { searchBar.tintColor = .red//UIColor(red:0.90, green:0.90, blue:0.91, alpha:1.0) searchBar.backgroundColor = .green//UIColor(red:0.90, green:0.90, blue:0.91, alpha:1.0) searchBar.returnKeyType = UIReturnKeyType.done } func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { } func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { calendarButtonOutlet.isEnabled = true } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { calendarButtonOutlet.isEnabled = true searchBar.showsCancelButton = false searchBar.resignFirstResponder() } func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { searchBar.resignFirstResponder() } func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { if !searchText.isBlank{ calendarButtonOutlet.isEnabled = false }else{ calendarButtonOutlet.isEnabled = true } self.timer?.invalidate() if searchText != "" && !searchText.isEmpty{ self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(TransactionSearchViewController.requestSearchApi), userInfo: searchText, repeats: false) }else{ self.tableViewTransactionSearch.isHidden = true searchBar.resignFirstResponder() } } } extension TransactionSearchViewController: CalendarViewDelegate { func getDate(fromDate:String, toDate:String) { self.startLoading() self.searchBar.text = "" self.tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "date", startDate: fromDate, endDate: toDate, txPage: nil, txSize: nil) } func goBackOneScreen() { if tableViewTransactionSearch.numberOfRows(inSection: 0) == 0 { navigationController?.popViewController(animated: true) } } }