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

// 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)
}
}
}