// // TranscationStatementViewController.swift // GMERemittance // // Created by FMI-12 on 2/6/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class TranscationStatementViewController: UIViewController,TableViewCellTransactionDelegate { @IBOutlet weak var tableViewTranscation: UITableView! @IBOutlet weak var segmentedControl: UISegmentedControl! private var selectedTransaction: Transaction? private var tracktransactionviewmodel = TrackTransactionViewModel() private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() private var transactionCell: TranscationTableViewCell? private var loadMoreButtonOutlet:UIButton? private var status: Bool? private var segment: String = "all" private var allSize: Int = 20 private var allPage: Int = 0 private var receivedPage: Int = 0 private var sentPage: Int = 0 private var allTransaction = [Transaction]() private var sentTransaction = [Transaction]() private var receivedTransaction = [Transaction]() public var fromNotification: Int? public static var notificationCode: String = "" let pNotificationArray = ["p200","p203","p206","p207","p204", "p208"] public static var transactionConnectionTimeOutCheck = 0 override func viewDidAppear(_ animated: Bool) { setUpAnotherLoginListener(genericviewmodel: tracktransactionviewmodel) } override func viewDidLoad() { super.viewDidLoad() if pNotificationArray.contains(TranscationStatementViewController.notificationCode) { setUpNavBar(id: 207, title: "Transaction Statement") }else { setUpNavBar(id: 201, title: "Transaction Statement") } selectedSegmentControlTab() TranscationStatementViewController.notificationCode.removeAll() self.tableViewTranscation.delegate = self self.tableViewTranscation.dataSource = self self.tableViewTranscation.estimatedRowHeight = 119 self.tableViewTranscation.rowHeight = UITableViewAutomaticDimension self.tableViewTranscation.tableFooterView = UIView() segmentedControl.addTarget(self, action: #selector(transactionTypeChanged(_:)), for: .valueChanged) tracktransactionviewmodel.transactionListConnectionTimeOut.value = nil /** connection timeout */ tracktransactionviewmodel.transactionListConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if self.fromNotification != 0{ if TranscationStatementViewController.transactionConnectionTimeOutCheck == 0{ TranscationStatementViewController.transactionConnectionTimeOutCheck = TranscationStatementViewController.transactionConnectionTimeOutCheck+1 self.popUpMessage(value: 30) } } self.clearAllArray() self.tableViewTranscation.reloadData() self.loadMoreButtonOutlet?.isHidden = true } /** Check internet connection */ tracktransactionviewmodel.internetConnection.value = nil tracktransactionviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() self.popUpMessage(value: 15) self.clearAllArray() self.tableViewTranscation.reloadData() self.loadMoreButtonOutlet?.isHidden = true } /** Request user all transactions */ self.startLoading() tracktransactionviewmodel.transactionListObtained.bind{ [unowned self] in guard $0 != nil else { return } guard $0! else { self.stopLoading() if TranscationStatementViewController.transactionConnectionTimeOutCheck == 0{ TranscationStatementViewController.transactionConnectionTimeOutCheck = TranscationStatementViewController.transactionConnectionTimeOutCheck+1 self.popUpMessageError(value: 10, message: self.tracktransactionviewmodel.getErrorMessage()) } return } self.stopLoading() if self.tracktransactionviewmodel.getCount() > 0{ self.loadTableView() }else{ self.loadTableView() } } switch segmentedControl.selectedSegmentIndex { case 1: tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "received", startDate: nil, endDate: nil,page: self.allPage, size: self.allSize) case 2: tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "sent", startDate: nil, endDate: nil,page: self.allPage, size: self.allSize) default: tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "", startDate: nil, endDate: nil,page: self.allPage, size: self.allSize) } } @IBAction func actionSearch(_ sender: Any) { status = true self.performSegue(withIdentifier: "searchTransaction", sender: nil) } @IBAction func actionCalendarView(_ sender: Any) { status = false self.performSegue(withIdentifier: "searchTransaction", sender: nil) } /** Remove all array */ func clearAllArray(){ allTransaction.removeAll() sentTransaction.removeAll() receivedTransaction.removeAll() } /** Redirect to segment as per the notification type */ func selectedSegmentControlTab(){ switch TranscationStatementViewController.notificationCode { case "204", "208","p204", "p208": segment = "received" segmentedControl.selectedSegmentIndex = 1 case "200","203","206","207","p200","p203","p206","p207": segment = "sent" segmentedControl.selectedSegmentIndex = 2 default: segment = "all" segmentedControl.selectedSegmentIndex = 0 } } /** Append more transactions data into global array and reload tableview */ func loadTableView(){ self.tableViewTranscation.isHidden = false switch self.segment { case "all": allTransaction.append(contentsOf:self.tracktransactionviewmodel.getTransactions()) if self.tracktransactionviewmodel.getTransactions().count == self.allSize{ self.loadMoreButtonOutlet?.isHidden = false }else if (self.tracktransactionviewmodel.getTransactions().count < self.allSize || self.tracktransactionviewmodel.getTransactions().count == 0){ self.loadMoreButtonOutlet?.isHidden = true } case "received": receivedTransaction.append(contentsOf:self.tracktransactionviewmodel.getTransactions()) if self.tracktransactionviewmodel.getTransactions().count == self.allSize{ self.loadMoreButtonOutlet?.isHidden = false }else if (self.tracktransactionviewmodel.getTransactions().count < self.allSize || self.tracktransactionviewmodel.getTransactions().count == 0){ self.loadMoreButtonOutlet?.isHidden = true } case "sent": sentTransaction.append(contentsOf:self.tracktransactionviewmodel.getTransactions()) if self.tracktransactionviewmodel.getTransactions().count == self.allSize{ self.loadMoreButtonOutlet?.isHidden = false }else if (self.tracktransactionviewmodel.getTransactions().count < self.allSize || self.tracktransactionviewmodel.getTransactions().count == 0){ self.loadMoreButtonOutlet?.isHidden = true } default: break } self.tableViewTranscation.reloadData() self.tableViewStartFromBeginningRow() } /** Show tableview from 0 index */ func tableViewStartFromBeginningRow(){ switch segment { case "all": if (allTransaction.count > 0){ self.tableViewTranscation.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.bottom, animated: true) } case "received": if (receivedTransaction.count>0){ self.tableViewTranscation.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.bottom, animated: true) } case "sent": if (sentTransaction.count>0){ self.tableViewTranscation.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.bottom, animated: true) } default: break } } /** Request when user wants to view old transactions */ @objc func loadMoreButtonAction(sender: TranscationTableViewCell) { self.startLoading() switch segment { case "all": self.allPage = self.allPage+1 tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "", startDate: nil, endDate: nil,page: self.allPage, size: self.allSize) case "received": self.receivedPage = self.receivedPage+1 tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "received", startDate: nil, endDate: nil,page: self.receivedPage, size: self.allSize) case "sent": self.sentPage = self.sentPage+1 tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "sent", startDate: nil, endDate: nil,page: self.sentPage, size: self.allSize) default : break } } /** 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("Door to Door") == 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" // } /** Disable user interaction while fetching data from api */ func startLoading(){ tableViewTranscation.isHidden = true disableUserInteractions() showActivityIndicator(activityIndicator: activityIndicator) } /** Enable user interaction while fetching data from api */ func stopLoading(){ tableViewTranscation.isHidden = false enableUserInteractions() dismissActivityIndicator(activityIndicator: activityIndicator) } /** Show load more button if only transaction count value is greater than 20 - Parameter segment: UI have three different segment i.e. All, Received and Sent */ func checkLoadingMoreVisible(segment: String){ switch segment { case "all": if allTransaction.count >= self.allSize{ loadMoreButtonOutlet?.isHidden = false }else{ loadMoreButtonOutlet?.isHidden = true } case "received": if receivedTransaction.count >= self.allSize{ loadMoreButtonOutlet?.isHidden = false }else{ loadMoreButtonOutlet?.isHidden = true } case "sent": if sentTransaction.count >= self.allSize{ loadMoreButtonOutlet?.isHidden = false }else{ loadMoreButtonOutlet?.isHidden = true } default: break } } /** Action handle when user switch between three different segment i.e. All , Received and Sent */ @objc func transactionTypeChanged(_ segControl: UISegmentedControl) { switch segControl.selectedSegmentIndex { case 0: self.segment = "all" ///To display list from first page only When tap to all segmentControl allPage = 0 if allTransaction.count == 0 { startLoading() tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "", startDate: nil, endDate: nil, page: allPage, size: allSize) }else{ stopLoading() tableViewTranscation.reloadData() checkLoadingMoreVisible(segment: "all") } if (self.allTransaction.count>0){ self.tableViewTranscation.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.bottom, animated: true) } case 1: self.segment = "received" ///To display list from first page only When tap to received segmentControl allPage = 0 if receivedTransaction.count == 0{ startLoading() tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "received", startDate: nil, endDate: nil,page: receivedPage,size: allSize) }else{ stopLoading() tableViewTranscation.reloadData() checkLoadingMoreVisible(segment: "received") } if (receivedTransaction.count > 0){ self.tableViewTranscation.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.bottom, animated: true) } case 2: self.segment = "sent" ///To display list from first page only When tap to sent segmentControl allPage = 0 if sentTransaction.count == 0{ startLoading() tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "sent", startDate: nil, endDate: nil,page: sentPage, size:allSize) }else{ stopLoading() tableViewTranscation.reloadData() checkLoadingMoreVisible(segment: "sent") } if (sentTransaction.count > 0){ self.tableViewTranscation.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.bottom, animated: true) } default: break } } // MARK: - Navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "searchTransaction") { if status == true { let vc = segue.destination as! TransactionSearchViewController vc.status = status } else { let vc = segue.destination as! TransactionSearchViewController vc.status = status } } } /** Transaction from is differ as per the type of payoutMode - 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. - Parameter row: table view row */ func setTransactionToName(payoutMode: String,transactionType: String,row:Int){ switch segment { case "all": if (payoutMode.caseInsensitiveCompare("Topup") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + allTransaction[row].receiverPhone }else if (payoutMode.caseInsensitiveCompare("withdraw") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + allTransaction[row].bankName } else if (payoutMode.caseInsensitiveCompare("bonus") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + firstWord(text: allTransaction[row].senderName) } else if (payoutMode.caseInsensitiveCompare("load balance") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + allTransaction[row].bankName } else if (payoutMode.caseInsensitiveCompare("wallet transfer") == ComparisonResult.orderedSame) { if transactionType == "From: "{ if let name = allTransaction[row].senderName{ transactionCell?.labelName.text = transactionType + firstWord(text: name) } } else { if let name = allTransaction[row].receiverName{ transactionCell?.labelName.text = transactionType + firstWord(text: name) } } } else { if let name = allTransaction[row].receiverName{ transactionCell?.labelName.text = transactionType + firstWord(text: name) } } case "received": if (payoutMode.caseInsensitiveCompare("Topup") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + receivedTransaction[row].receiverPhone }else if (payoutMode.caseInsensitiveCompare("withdraw") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + receivedTransaction[row].bankName } else if (payoutMode.caseInsensitiveCompare("bonus") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + firstWord(text: receivedTransaction[row].senderName) } else if (payoutMode.caseInsensitiveCompare("load balance") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + receivedTransaction[row].bankName }else if (payoutMode.caseInsensitiveCompare("wallet transfer") == ComparisonResult.orderedSame){ if let name = receivedTransaction[row].senderName{ transactionCell?.labelName.text = transactionType + firstWord(text: name) } } else { if let name = receivedTransaction[row].receiverName{ transactionCell?.labelName.text = transactionType + firstWord(text: name) } } case "sent": if (payoutMode.caseInsensitiveCompare("Topup") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + sentTransaction[row].receiverPhone }else if (payoutMode.caseInsensitiveCompare("withdraw") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + sentTransaction[row].bankName } else if (payoutMode.caseInsensitiveCompare("bonus") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + firstWord(text: sentTransaction[row].senderName) } else if (payoutMode.caseInsensitiveCompare("load balance") == ComparisonResult.orderedSame){ transactionCell?.labelName.text = transactionType + sentTransaction[row].bankName }else { if let name = sentTransaction[row].receiverName{ transactionCell?.labelName.text = transactionType + firstWord(text: name) } } default: break } } } extension TranscationStatementViewController: UITableViewDataSource, UITableViewDelegate { /** Return size of an array as per the segment selected */ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { switch section { case 0: switch self.segment { case "all": return allTransaction.count case "received": return receivedTransaction.count case "sent": return sentTransaction.count default : return 0 } default: return 1 } } /** Two section, one is for transactions view and other for load more view */ func numberOfSections(in tableView: UITableView) -> Int { return 2 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { switch indexPath.section { case 0: transactionCell = tableView.dequeueReusableCell(withIdentifier: "transactionStatementCell", for: indexPath) as? TranscationTableViewCell transactionCell?.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor transactionCell?.layer.borderWidth = 5 transactionCell?.layer.cornerRadius = 10 switch segment{ case "all": if allTransaction[indexPath.row].transactionType == "received" { transactionCell?.labelAmountPay.textColor = UIColor(red:0.18, green:0.19, blue:0.57, alpha:1.0) if let payout = allTransaction[indexPath.row].payoutMethod{ setTransactionToName(payoutMode: payout,transactionType: "From: ", row: indexPath.row) } if let amount = allTransaction[indexPath.row].payoutAmountOriginal{ if amount == "N/A" { transactionCell?.labelAmountPay.text = amount } else { transactionCell?.labelAmountPay.text = "+" + getCommaAddedAmountString(amountString: amount) } } } else { transactionCell?.labelAmountPay.textColor = UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0) if let payout = allTransaction[indexPath.row].payoutMethod{ setTransactionToName(payoutMode: payout,transactionType: "To: ", row: indexPath.row) } if let amount = allTransaction[indexPath.row].payoutAmountOriginal{ if amount == "N/A" { transactionCell?.labelAmountPay.text = amount } else { transactionCell?.labelAmountPay.text = "-" + getCommaAddedAmountString(amountString: amount) } } } if let allDate = allTransaction[indexPath.row].date{ transactionCell?.labelDate.text = unixTimeStampToDate(unixTimeStamp: allDate) } if let payoutMethod = allTransaction[indexPath.row].payoutMethod{ transactionCell?.labelPayment.text = payoutMethod } if let transactionId = allTransaction[indexPath.row].transactionId{ transactionCell?.labelTranscationNo.text = "Transaction No." + " " + transactionId } case "received": transactionCell?.labelAmountPay.textColor = UIColor(red:0.18, green:0.19, blue:0.57, alpha:1.0) if let payout = receivedTransaction[indexPath.row].payoutMethod{ setTransactionToName(payoutMode: payout,transactionType: "From: ", row: indexPath.row) } if let amount = receivedTransaction[indexPath.row].payoutAmountOriginal{ if amount == "N/A" { transactionCell?.labelAmountPay.text = amount } else { transactionCell?.labelAmountPay.text = "+" + getCommaAddedAmountString(amountString: amount) } } if let receivedDate = receivedTransaction[indexPath.row].date{ transactionCell?.labelDate.text = unixTimeStampToDate(unixTimeStamp: receivedDate) } if let payoutMethod = receivedTransaction[indexPath.row].payoutMethod{ transactionCell?.labelPayment.text = payoutMethod } if let transactionId = receivedTransaction[indexPath.row].transactionId{ transactionCell?.labelTranscationNo.text = "Transaction No." + " " + transactionId } case "sent": transactionCell?.labelAmountPay.textColor = UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0) if let payout = sentTransaction[indexPath.row].payoutMethod{ setTransactionToName(payoutMode: payout,transactionType: "To: ", row: indexPath.row) } if let amount = sentTransaction[indexPath.row].payoutAmountOriginal{ if amount == "N/A" { transactionCell?.labelAmountPay.text = amount } else { transactionCell?.labelAmountPay.text = "-" + getCommaAddedAmountString(amountString: amount) } } if let sentDate = sentTransaction[indexPath.row].date{ transactionCell?.labelDate.text = unixTimeStampToDate(unixTimeStamp: sentDate) } if let payoutMethod = sentTransaction[indexPath.row].payoutMethod{ transactionCell?.labelPayment.text = payoutMethod } if let transactionId = sentTransaction[indexPath.row].transactionId{ transactionCell?.labelTranscationNo.text = "Transaction No." + " " + transactionId } default: break } return transactionCell! default : let loadMoreCell = tableView.dequeueReusableCell(withIdentifier: "loadMoreButtonCell", for: indexPath) as! TranscationTableViewCell loadMoreCell.loadMoreButtonOutlet.addTarget(self, action: #selector(loadMoreButtonAction(sender:)), for: .touchUpInside) self.loadMoreButtonOutlet = loadMoreCell.loadMoreButtonOutlet return loadMoreCell } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { switch segmentedControl.selectedSegmentIndex { case 0: selectedTransaction = allTransaction[indexPath.row] case 1: selectedTransaction = receivedTransaction[indexPath.row] case 2: selectedTransaction = sentTransaction[indexPath.row] default: return } 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 _ { } } }