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