You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
15 KiB

6 years ago
  1. // TransactionSearchViewController.swift
  2. // GMERemittance
  3. //
  4. // Created by FMI-12 on 2/9/18.
  5. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  6. //
  7. import UIKit
  8. class TransactionSearchViewController: UIViewController {
  9. @IBOutlet weak var searchBarOutlet: UISearchBar!
  10. @IBOutlet weak var searchBar: UISearchBar!
  11. @IBOutlet weak var tableViewTransactionSearch: UITableView!
  12. @IBOutlet weak var calendarButtonOutlet: UIButton!
  13. private var tracktransactionviewmodel = TrackTransactionViewModel()
  14. private var transactionArray = [Transaction]()
  15. private var selectedTransaction: Transaction?
  16. private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
  17. private var timer: Timer?
  18. public var status: Bool?
  19. private var checkDialog = 0
  20. override func viewDidLoad() {
  21. super.viewDidLoad()
  22. setUpNavBar(id: 201, title: "Transaction Statement")
  23. setUpAnotherLoginListener(genericviewmodel: tracktransactionviewmodel)
  24. self.searchBar.delegate = self
  25. self.searchBar.backgroundColor = UIColor(red:0.90, green:0.90, blue:0.91, alpha:1.0)
  26. self.searchBar.tintColor = UIColor(red:0.98, green:0.98, blue:0.98, alpha:1.0)
  27. self.searchBar.layer.borderColor = UIColor(red:0.98, green:0.98, blue:0.98, alpha:1.0).cgColor
  28. self.searchBar.layer.borderWidth = 2
  29. tracktransactionviewmodel.transactionListConnectionTimeOut.value = nil
  30. /**
  31. connection timeout
  32. */
  33. tracktransactionviewmodel.transactionListConnectionTimeOut.bind { [unowned self] in
  34. guard $0 != nil else {
  35. return
  36. }
  37. self.stopLoading()
  38. if self.checkDialog == 0{
  39. self.checkDialog = self.checkDialog+1
  40. self.popUpMessage(value: 20)
  41. }
  42. }
  43. /**
  44. Check internet connection
  45. */
  46. tracktransactionviewmodel.internetConnection.value = nil
  47. tracktransactionviewmodel.internetConnection.bind { [unowned self] in
  48. guard $0 != nil else {
  49. return
  50. }
  51. self.searchBar.resignFirstResponder()
  52. self.enableUserInteractions()
  53. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  54. self.popUpMessage(value: 15)
  55. }
  56. /**
  57. Request for transaction data as per user search keyword
  58. */
  59. tracktransactionviewmodel.transactionListObtained.bind{ [unowned self] in
  60. guard $0 != nil else {
  61. return
  62. }
  63. guard $0! else {
  64. //self.popUpMessageError(value: 10, message: self.tracktransactionviewmodel.getErrorMessage())
  65. self.stopLoading()
  66. return
  67. }
  68. self.stopLoading()
  69. if (self.tracktransactionviewmodel.getTransactions().count>0) {
  70. self.transactionArray = self.tracktransactionviewmodel.getTransactions()
  71. self.tableViewTransactionSearch.isHidden = false
  72. self.tableViewTransactionSearch.reloadData()
  73. }else{
  74. self.tableViewTransactionSearch.isHidden = true
  75. }
  76. }
  77. if status == false {
  78. calendarViewController()
  79. } else {
  80. searchBar.becomeFirstResponder()
  81. }
  82. hideKeyboardWhenTappedAround()
  83. tableViewTransactionSearch.tableFooterView = UIView()
  84. }
  85. @IBAction func buttonCalender(_ sender: Any) {
  86. calendarViewController()
  87. }
  88. /**
  89. Check whether transaction type is sent or received
  90. - Parameter payoutMode: the type of payout mode are like cash,bank,topup door to dorr and withdraw.
  91. - Parameter transferType: the type of transferType are like offer and request.
  92. - Returns : transactions type is sent or received
  93. */
  94. func checkSentOrReceive(payoutMode: String, userId: String?) -> String {
  95. if(payoutMode.caseInsensitiveCompare("cash") == ComparisonResult.orderedSame ||
  96. payoutMode.caseInsensitiveCompare("bank") == ComparisonResult.orderedSame ||
  97. payoutMode.caseInsensitiveCompare("topup") == ComparisonResult.orderedSame ||
  98. payoutMode.caseInsensitiveCompare("withdraw") == ComparisonResult.orderedSame){
  99. return "sent"
  100. } else if (payoutMode.caseInsensitiveCompare("wallet Transfer") == ComparisonResult.orderedSame){
  101. let selfUserId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
  102. if userId != nil {
  103. if userId == selfUserId! {
  104. return "sent"
  105. }
  106. return "received"
  107. }
  108. }
  109. return "received"
  110. }
  111. /**
  112. Open calendar view to help user in finding transaction as per date selected
  113. */
  114. func calendarViewController(){
  115. guard let navController = self.navigationController else { return }
  116. let popUpViewController = UIStoryboard(name: "TransactionStatement", bundle: nil).instantiateViewController(withIdentifier: "calendarViewController") as! CalendarViewController
  117. popUpViewController.delegate = self
  118. navController.addChildViewController(popUpViewController)
  119. popUpViewController.view.frame = navController.view.bounds
  120. navController.view.addSubview(popUpViewController.view)
  121. popUpViewController.didMove(toParentViewController: navController)
  122. }
  123. /**
  124. Disable user interaction while fetching data from api
  125. */
  126. func startLoading(){
  127. self.showActivityIndicator(activityIndicator: self.activityIndicator)
  128. self.disableUserInteractions()
  129. }
  130. /**
  131. Enable user interaction while fetching data from api
  132. */
  133. func stopLoading(){
  134. self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
  135. self.enableUserInteractions()
  136. }
  137. /**
  138. Api request to find transactions as per search keyword
  139. */
  140. @objc func requestSearchApi(){
  141. if let search = searchBar.text{
  142. self.startLoading()
  143. tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: search, transactionType: "search", startDate: nil, endDate: nil, txPage: nil, txSize: nil)
  144. }
  145. }
  146. }
  147. extension TransactionSearchViewController: UITableViewDelegate, UITableViewDataSource {
  148. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  149. return tracktransactionviewmodel.getCount()
  150. }
  151. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  152. let cell = tableView.dequeueReusableCell(withIdentifier: "transactionSearchCell", for: indexPath) as! TransactionSearchTableViewCell
  153. cell.layer.borderColor = UIColor(red:0.91, green:0.93, blue:0.95, alpha:1.0).cgColor
  154. cell.layer.borderWidth = 5
  155. cell.layer.cornerRadius = 10
  156. var transactionType:String = ""
  157. let payout = tracktransactionviewmodel.getPaymentMethod(index: indexPath.row)
  158. // let transfer = tracktransactionviewmodel.getTransferType(index: indexPath.row)
  159. if payout != "N/A" {
  160. // transactionType = checkSentOrReceive(payoutMode: tracktransactionviewmodel.getPaymentMethod(index: indexPath.row), userId: tracktransactionviewmodel.getTransaction(index: indexPath.row).userId)
  161. transactionType = tracktransactionviewmodel.getTransactionType(index: indexPath.row)
  162. }
  163. if transactionType == "received" {
  164. cell.labelAmountPay.textColor = UIColor(red:0.18, green:0.19, blue:0.57, alpha:1.0)
  165. cell.labelName.text = getName(payoutMode: payout,transactionType: "From: ", row: indexPath.row)
  166. let amount = tracktransactionviewmodel.getAmount(index: indexPath.row)
  167. if amount == "N/A" {
  168. cell.labelAmountPay.text = amount
  169. } else {
  170. cell.labelAmountPay.text = "+" + amount
  171. }
  172. cell.labelDate.text = unixTimeStampToDate(unixTimeStamp: tracktransactionviewmodel.getDate(index: indexPath.row))
  173. cell.labelPayment.text = tracktransactionviewmodel.getPaymentMethod(index: indexPath.row)
  174. cell.labelTranscationNo.text = tracktransactionviewmodel.getTransactionId(index: indexPath.row)
  175. } else if transactionType == "sent" {
  176. cell.labelAmountPay.textColor = UIColor(red:0.93, green:0.11, blue:0.14, alpha:1.0)
  177. cell.labelName.text = getName(payoutMode: payout,transactionType: "To: ", row: indexPath.row)
  178. let amount = tracktransactionviewmodel.getAmount(index: indexPath.row)
  179. if amount == "N/A" {
  180. cell.labelAmountPay.text = amount
  181. } else {
  182. cell.labelAmountPay.text = "-" + amount
  183. }
  184. cell.labelDate.text = unixTimeStampToDate(unixTimeStamp: tracktransactionviewmodel.getDate(index: indexPath.row))
  185. cell.labelPayment.text = tracktransactionviewmodel.getPaymentMethod(index: indexPath.row)
  186. cell.labelTranscationNo.text = tracktransactionviewmodel.getTransactionId(index: indexPath.row)
  187. }
  188. return cell
  189. }
  190. func getName(payoutMode: String,transactionType: String,row:Int) -> String {
  191. if (payoutMode.caseInsensitiveCompare("Topup") == ComparisonResult.orderedSame){
  192. return transactionType + transactionArray[row].receiverPhone
  193. }else if (payoutMode.caseInsensitiveCompare("withdraw") == ComparisonResult.orderedSame){
  194. return transactionType + transactionArray[row].bankName
  195. }
  196. else if (payoutMode.caseInsensitiveCompare("bonus") == ComparisonResult.orderedSame){
  197. return transactionType + firstWord(text: transactionArray[row].senderName)
  198. }
  199. else if (payoutMode.caseInsensitiveCompare("load balance") == ComparisonResult.orderedSame){
  200. return transactionType + transactionArray[row].bankName
  201. } else if (payoutMode.caseInsensitiveCompare("wallet transfer") == ComparisonResult.orderedSame) {
  202. if transactionType == "From: "{
  203. if let name = transactionArray[row].senderName{
  204. return transactionType + firstWord(text: name)
  205. }
  206. } else {
  207. if let name = transactionArray[row].receiverName{
  208. return transactionType + firstWord(text: name)
  209. }
  210. }
  211. } else {
  212. if let name = transactionArray[row].receiverName{
  213. return transactionType + firstWord(text: name)
  214. }
  215. }
  216. return "-"
  217. }
  218. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  219. selectedTransaction = tracktransactionviewmodel.getTransaction(index: indexPath.row)
  220. do {
  221. let encodedTransaction = try JSONEncoder().encode(selectedTransaction)
  222. let encodedTransactionDictionary = try JSONSerialization.jsonObject(with: encodedTransaction, options: .allowFragments) as? [String: Any]
  223. switch (encodedTransactionDictionary!["payoutMethod"] as? String)?.lowercased() {
  224. case "cash"?, "bank"?, "door to door"?:
  225. let storyboard = UIStoryboard.init(name: "RecipientListViewController", bundle: Bundle.main)
  226. let transferSuccessViewController = storyboard.instantiateViewController(withIdentifier: "showTransferInfo") as! TransferSuccessfulViewController
  227. transferSuccessViewController.responseDetails = encodedTransactionDictionary
  228. self.navigationController!.pushViewController(transferSuccessViewController, animated: true)
  229. case "wallet transfer"?:
  230. let storyboard = UIStoryboard.init(name: "WalletTransfer", bundle: Bundle.main)
  231. let walletSuccessViewController = storyboard.instantiateViewController(withIdentifier: "walletSuccess") as! WalletSuccessViewController
  232. walletSuccessViewController.transaction = selectedTransaction
  233. self.navigationController!.pushViewController(walletSuccessViewController, animated: true)
  234. case "load balance"?, "withdraw"?, "bonus"?, "topup"?:
  235. popUpMessageInfo(value: 16, title: "Alert", message: "No details available")
  236. default:
  237. popUpMessageInfo(value: 16, title: "Alert", message: "No details available")
  238. }
  239. } catch let error {
  240. }
  241. }
  242. }
  243. extension TransactionSearchViewController: UISearchBarDelegate {
  244. func createSearchBar() {
  245. searchBar.tintColor = .red//UIColor(red:0.90, green:0.90, blue:0.91, alpha:1.0)
  246. searchBar.backgroundColor = .green//UIColor(red:0.90, green:0.90, blue:0.91, alpha:1.0)
  247. searchBar.returnKeyType = UIReturnKeyType.done
  248. }
  249. func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
  250. }
  251. func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
  252. calendarButtonOutlet.isEnabled = true
  253. }
  254. func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
  255. calendarButtonOutlet.isEnabled = true
  256. searchBar.showsCancelButton = false
  257. searchBar.resignFirstResponder()
  258. }
  259. func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
  260. searchBar.resignFirstResponder()
  261. }
  262. func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
  263. if !searchText.isBlank{
  264. calendarButtonOutlet.isEnabled = false
  265. }else{
  266. calendarButtonOutlet.isEnabled = true
  267. }
  268. self.timer?.invalidate()
  269. if searchText != "" && !searchText.isEmpty{
  270. self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(TransactionSearchViewController.requestSearchApi), userInfo: searchText, repeats: false)
  271. }else{
  272. self.tableViewTransactionSearch.isHidden = true
  273. searchBar.resignFirstResponder()
  274. }
  275. }
  276. }
  277. extension TransactionSearchViewController: CalendarViewDelegate {
  278. func getDate(fromDate:String, toDate:String) {
  279. self.startLoading()
  280. self.searchBar.text = ""
  281. self.tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "date", startDate: fromDate, endDate: toDate, txPage: nil, txSize: nil)
  282. }
  283. func goBackOneScreen() {
  284. if tableViewTransactionSearch.numberOfRows(inSection: 0) == 0 {
  285. navigationController?.popViewController(animated: true)
  286. }
  287. }
  288. }