// // TrackTransactionViewModel.swift // GMERemittance // // Created by Fm-user on 2/6/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import Foundation class TrackTransactionViewModel: ModelExtension { var transactionListObtained: Box = Box(nil) var transactionListConnectionTimeOut: Box = Box(nil) private var transactionArray: [Transaction] = [Transaction] () private var walletArray: [Transaction] = [Transaction] () //Search Transaction /** APi request for specific recipient - parameter recipientId: recipient Id - parameter recipientName: recipient name - parameter transactionType: type of transaction - parameter startDate: Start date for search - parameter endDate: end date for search - parameter txPage: page number - parameter txSize: number of transactions */ func fetchTransactionList(recipientId: String, recipientName: String, transactionType: String, startDate: String?, endDate: String?, txPage: String?, txSize: String?) { if !Reachability.isConnectedToNetwork() { self.internetConnection.value = false } else { let recipient_id = recipientId let recipient_name = recipientName let transaction_type = transactionType var start_date = startDate var end_date = endDate let date = Date() let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd" if end_date == nil { end_date = formatter.string(from: date) } let yearsToAdd = -5 if start_date == nil { start_date = formatter.string(from: Calendar.current.date(byAdding: .year, value: yearsToAdd, to: date)!) } var page = txPage var size = txSize if page == nil { page = "" } if size == nil { size = "" } RestApiMananger.sharedInstance.getTransactionList(userId: self.getUserId(), recipientId: recipientId, recipientName: recipientName, transactionType: transactionType, startDate: start_date!, endDate: end_date!, txPage: page!, txSize: size!) { result in switch result { case let .success(fetchedJSON): self.transactionArray.removeAll() guard fetchedJSON.count > 0 else { self.transactionListObtained.value = true return } for i in 0 ... (fetchedJSON.count-1) { do { let transaction = try JSONDecoder().decode(Transaction.self, from: fetchedJSON[i].rawData()) self.transactionArray.append(transaction) self.walletArray.append(transaction) } catch { self.transactionListObtained.value = false } } self.transactionListObtained.value = true case let .failure(errorJSON): self.setErrorMessage(message: errorJSON["message"].stringValue) self.transactionListObtained.value = false case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.getUserId(), password: self.getLoginPassword()) { result in if result != "Error"{ UserDefaults.standard.set((result + ":" + RestApiMananger.sharedInstance.getUUID()).toBase64(), forKey: "com.gmeremit.accessCode") self.fetchTransactionList(recipientId: recipient_id, recipientName: recipient_name, transactionType: transaction_type, startDate: nil, endDate: nil, txPage: txPage, txSize: txSize) } } case .logOutUser(): RestApiMananger.sharedInstance.cancelExistingNetworkCalls() self.anotherLogin.value = true case .timeOut: self.transactionListConnectionTimeOut.value = false } } } } /** Transaction Pagination APi request for specific recipient - parameter recipientId: recipient Id - parameter recipientName: recipient name - parameter transactionType: type of transaction - parameter startDate: Start date for search - parameter endDate: end date for search - parameter page: page number - parameter size: number of transactions */ func fetchTransactionList(recipientId: String, recipientName: String, transactionType: String, startDate: String?, endDate: String?, page: Int?, size: Int?) { if !Reachability.isConnectedToNetwork() { self.internetConnection.value = false } else { self.transactionArray.removeAll() let recipient_id = recipientId let recipient_name = recipientName let transaction_type = transactionType var start_date = startDate var end_date = endDate let date = Date() let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd" if start_date == nil { start_date = formatter.string(from: date) } let yearsToAdd = -5 if end_date == nil { end_date = formatter.string(from: Calendar.current.date(byAdding: .year, value: yearsToAdd, to: date)!) } RestApiMananger.sharedInstance.getTransactionList(userId: getUserId(), recipientId: recipientId, recipientName: "", transactionType: transactionType, startDate: end_date!, endDate: start_date!, page: page!, size: size!) { result in switch result { case let .success(fetchedJSON): self.transactionArray.removeAll() guard fetchedJSON.count > 0 else { self.transactionListObtained.value = true return } for i in 0 ... (fetchedJSON.count-1) { do { let transaction = try JSONDecoder().decode(Transaction.self, from: fetchedJSON[i].rawData()) self.transactionArray.append(transaction) } catch { self.transactionListObtained.value = false } } self.transactionListObtained.value = true case let .failure(errorJSON): self.setErrorMessage(message: errorJSON["message"].stringValue) self.transactionListObtained.value = false case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.getUserId(), password: self.getLoginPassword()) { result in if result != "Error"{ UserDefaults.standard.set((result + ":" + RestApiMananger.sharedInstance.getUUID()).toBase64(), forKey: "com.gmeremit.accessCode") self.fetchTransactionList(recipientId: recipient_id, recipientName: recipient_name, transactionType: transaction_type, startDate: nil, endDate: nil, page: page!, size: size!) } } case .logOutUser(): RestApiMananger.sharedInstance.cancelExistingNetworkCalls() self.anotherLogin.value = true case .timeOut: self.transactionListConnectionTimeOut.value = false } } } } /** - returns: the count of array */ func getCount() -> Int { return transactionArray.count } /** - returns: the count of array */ func getTotalCount() -> Int { return walletArray.count } /** - parameter index: position of transaction in an array - returns: transaction */ func getTransaction(index: Int) -> Transaction { return transactionArray[index] } /** get transaction in an array - returns: transaction array */ func getTransactions() -> [Transaction]{ return transactionArray } /** - parameter index: position of reciver name in an array - returns: reciver name */ func getRecipient(index: Int) -> String { if let name = transactionArray[index].receiverName{ return name } else { return "N/A" } } /** - parameter index: position of recivername in wallet array - returns: reciver name */ func getRecipientForWallet(index: Int) -> String { if let name = walletArray[index].receiverName{ return name } else { return "N/A" } } /** - parameter index: position of sender name in wallet array - returns: sendar name */ func getSenderForWallet(index: Int) -> String { if let name = walletArray[index].senderName{ return name } else { return "N/A" } } /** - parameter index: position of transaction date in an array - returns: date */ func getDate(index: Int) -> String { if let date = transactionArray[index].date { return date } else { return "N/A" } } /** - parameter index: position of transaction date in wallet array - returns: date */ func getDateForWallet(index: Int) -> String { if let date = walletArray[index].date { return date } else { return "N/A" } } /** - parameter index: position of transaction payoutMethod in an array - returns: paymentMode */ func getPaymentMethod(index: Int) -> String { if let paymentMode = transactionArray[index].payoutMethod { return paymentMode } else { return "N/A" } } /** - parameter index: position of transaction type in an array - returns: transactionType */ func getTransactionType(index: Int) -> String { if let transactionType = transactionArray[index].transactionType { return transactionType } else { return "N/A" } } /** - parameter index: position of transaction payout method in an array - returns: payout method */ func getPaymentMethodUpdated(index: Int) -> String { if let paymentMethod = transactionArray[index].payoutMethod { return paymentMethod } else { return "N/A" } } /** - parameter index: position of payment method in wallet array - returns: paymentMethod */ func getPaymentMethodUpdatedForWallet(index: Int) -> String { if let paymentMethod = walletArray[index].payoutMethod { return paymentMethod } else { return "N/A" } } /** - parameter index: position of transaction amount in an array - returns: amount */ func getAmount(index: Int) -> String { if let amount = transactionArray[index].payoutAmountOriginal { return amount } else { return "N/A" } } /** - parameter index: position of amount for wallet in an array - returns: amount */ func getAmountForWallet(index: Int) -> String { if let amount = walletArray[index].payoutAmountOriginal { return amount } else { return "N/A" } } /** - parameter index: position of transferType in an array - returns: transferType */ func getTransferType(index: Int) -> String { if let transferType = transactionArray[index].transferType { return transferType } else { return "N/A" } } /** - parameter index: position of transactionId in an array - returns: transactionId */ func getTransactionId(index: Int) -> String { if let getTransactionId = transactionArray[index].transactionId { return getTransactionId } else { return "N/A" } } /** - parameter index: position of walletId in an array - returns: wallet id */ func getTransactionIdForWallet(index: Int) -> String { if let getTransactionId = walletArray[index].transactionId { return getTransactionId } else { return "N/A" } } /** - parameter index: position of countrol number in an array - returns: gme countrol number */ func getGMEControlNo(index: Int) -> String { if let getGMEControlNo = transactionArray[index].gmeControlNumber { return getGMEControlNo } else { return "N/A" } } /** - parameter index: position of relation in an array - returns: relation */ func getRelation(index: Int) -> String { if let getRelation = transactionArray[index].relation{ return getRelation } else { return "N/A" } } /** - parameter index: position of mobile nos. in an array - returns: mobile nos. */ func getMobileNo(index: Int) -> String { if let getMobileNo = transactionArray[index].receiverPhone { return getMobileNo } else { return "N/A" } } /** - parameter index: position of email in an array - returns: email */ func getEmail(index: Int) -> String { if let getEmail = transactionArray[index].receiverEmail { return getEmail } else { return "-" } } func getPayoutAgent(index: Int) -> String { if let getBankName = transactionArray[index].bankName { return getBankName } else { return "[Any Where]" } } /** - parameter index: position of address in an array - returns: address */ func getAddess(index: Int) -> String { if let getAddess = transactionArray[index].receiverAddress { return getAddess } else { return "N/A" } } /** - parameter index: position of bank branch in an array - returns: bank branch */ func getBankBranch(index: Int) -> String { if let getBankBranch = transactionArray[index].bankBranch{ return getBankBranch } else { return "-" } } /** - parameter index: position of account in an array - returns: account number */ func getAccountNo(index: Int) -> String { if let getAccountNo = transactionArray[index].accountNumber{ return getAccountNo } else { return "-" } } /** - parameter index: position of payoutmode in an array - returns: payoutMethod */ func getPayoutMode(index: Int) -> String { if let getPayoutMethod = transactionArray[index].payoutMethod{ return getPayoutMethod } else { return "-" } } /** - parameter index: position of borrow status in an array - returns: borrow status */ func getBorrowStatus(index: Int) -> String { if let status = transactionArray[index].txnStatus { return status } return "N/A" } /** - parameter index: position of borrow status in an array - returns: borrow status */ func getBorrowStatusForWallet(index: Int) -> String { if let status = walletArray[index].txnStatus { return status } return "N/A" } /* USE THIS ONLY FOR TRACK YOUR TRANSFER AND WALLET BECAUSE START AND END DATES ARE OPPOSITE FROM TRANSACTION STATEMENT, HERE END DATE NEEDS TO BE SET TO THE PRESENT DATE AND START DATE TO ~5 YEARS PAST FROM NOW - parameter recipientId: recipient Id - parameter recipientName: recipient name - parameter transactionType: type of transaction - parameter startDate: Start date for search - parameter endDate: end date for search - parameter txPage: page number - parameter txSize: number of transactions */ func fetchTransactionListForTrackAndWallet(recipientId: String, recipientName: String, transactionType: String, startDate: String?, endDate: String?, txPage: String?, txSize: String?) { if !Reachability.isConnectedToNetwork() { self.internetConnection.value = false } else { let recipient_id = recipientId let recipient_name = recipientName let transaction_type = transactionType var start_date = startDate var end_date = endDate let date = Date() let formatter = DateFormatter() formatter.dateFormat = "yyyy/MM/dd" if end_date == nil { end_date = formatter.string(from: date) } let yearsToAdd = -5 if start_date == nil { start_date = formatter.string(from: Calendar.current.date(byAdding: .year, value: yearsToAdd, to: date)!) } var page = txPage var size = txSize if page == nil { page = "" } if size == nil { size = "" } RestApiMananger.sharedInstance.getTransactionList(userId: getUserId(), recipientId: recipientId, recipientName: "", transactionType: transactionType, startDate: start_date!, endDate: end_date!, txPage: page!, txSize: size!) { result in switch result { case let .success(fetchedJSON): self.transactionArray.removeAll() guard fetchedJSON.count > 0 else { self.transactionListObtained.value = true return } for i in 0 ... (fetchedJSON.count-1) { do { let transaction = try JSONDecoder().decode(Transaction.self, from: fetchedJSON[i].rawData()) self.transactionArray.append(transaction) self.walletArray.append(transaction) } catch { self.transactionListObtained.value = false } } self.transactionListObtained.value = true case let .failure(errorJSON): self.setErrorMessage(message: errorJSON["message"].stringValue) self.transactionListObtained.value = false case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.getUserId(), password: self.getLoginPassword()) { result in if result != "Error"{ UserDefaults.standard.set((result + ":" + RestApiMananger.sharedInstance.getUUID()).toBase64(), forKey: "com.gmeremit.accessCode") self.fetchTransactionListForTrackAndWallet(recipientId: recipient_id, recipientName: recipient_name, transactionType: transaction_type, startDate: start_date, endDate: end_date, txPage: txPage, txSize: txSize) } } case .logOutUser(): RestApiMananger.sharedInstance.cancelExistingNetworkCalls() self.anotherLogin.value = true case .timeOut: self.transactionListConnectionTimeOut.value = false } } } } }