// // TransactionViewModel.swift // GMERemittance // // Created by Sujal on 1/5/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import Foundation class TransactionViewModel: ModelExtension { var exchangeRateAvailable: Box = Box(nil) var transactionInfoAvailable: Box = Box(nil) var currencyInfoAvailable: Box = Box(nil) var countryInfoAvailable: Box = Box(nil) var transactionViewConnectionTimeOut: Box = Box(nil) private var exchangeRate: String? private var transferFee: String? private var transferLimit: Double = 0.0 private var transactionLimit: Int = 0 private var cAmt: String? private var pAmt: String? private var exchangeRateRefId: String? private var agentRefId: String? private var from: String? private var to: String? private var tAmount: String? private var rewardPoint: Int = 0 private var transferDetails: [String: String] = [String: String]() private var minimumTransferAmountPerTransaction:String = "nil" var currencyArray = [Currency]() var countryArray = [AgentCountryList]() let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String let sourceId = UserDefaults.standard.object(forKey: "com.gmeremit.sourceId") as? String /** To get exchange rate - parameter exchangeData: exchange rate info */ func fetchExchangeRate(exchangeData: [String: Any]) { if !Reachability.isConnectedToNetwork() { self.internetConnection.value = false } else { RestApiMananger.sharedInstance.getExchangeRates(param: exchangeData) { result in switch result { case let .success(exchangeRateJSON): self.exchangeRate = exchangeRateJSON["currentRate"].stringValue self.transferFee = exchangeRateJSON["transferFee"].stringValue self.cAmt = exchangeRateJSON["cAmt"].stringValue self.pAmt = exchangeRateJSON["pAmt"].stringValue self.tAmount = exchangeRateJSON["tAmt"].stringValue self.exchangeRateRefId = exchangeRateJSON["exchangeRateRefId"].stringValue self.agentRefId = exchangeRateJSON["agentRefId"].stringValue self.from = exchangeRateJSON["from"].stringValue self.to = exchangeRateJSON["to"].stringValue self.rewardPoint = exchangeRateJSON["rewardPoint"].intValue self.exchangeRateAvailable.value = true case let .failure(errorJSON): self.setErrorMessage(message: errorJSON["message"].stringValue) self.exchangeRateAvailable.value = false case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) { result in if result != "Error"{ let uuid = RestApiMananger.sharedInstance.getUUID() UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode") self.fetchExchangeRate(exchangeData: exchangeData) } } case .logOutUser(): RestApiMananger.sharedInstance.cancelExistingNetworkCalls() self.anotherLogin.value = true case .timeOut: self.transactionViewConnectionTimeOut.value = false } } } } /** To get transaction Information - parameter transactionInfo: transactionInfo (country id and paymethod id) */ func fetchTransactionInfo(transactionInfo: [String: String]) { if !Reachability.isConnectedToNetwork() { self.internetConnection.value = false } else { RestApiMananger.sharedInstance.getTransactionInfo(param: transactionInfo) { result in switch result { case let .success(transactionInfoJSON): self.transferLimit = transactionInfoJSON["transferLimit"].doubleValue self.transactionLimit = transactionInfoJSON["transactionLimit"].intValue self.minimumTransferAmountPerTransaction = transactionInfoJSON["minimumTransferAmountPerTransaction"].stringValue self.transactionInfoAvailable.value = true case let .failure(errorJSON): self.setErrorMessage(message: errorJSON["message"].stringValue) self.transactionInfoAvailable.value = false case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) { result in if result != "Error"{ let uuid = RestApiMananger.sharedInstance.getUUID() UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode") self.fetchTransactionInfo(transactionInfo: transactionInfo) } } case .logOutUser(): RestApiMananger.sharedInstance.cancelExistingNetworkCalls() self.anotherLogin.value = true case .timeOut: self.transactionViewConnectionTimeOut.value = false } } } } /** To get currency - parameter currencyInfo: currencyInfo (country id , payment method, payout locaiton id) */ func fetchCurrency(currencyInfo: [String: String]){ if !Reachability.isConnectedToNetwork() { self.internetConnection.value = false } else { RestApiMananger.sharedInstance.getCurrency(param: currencyInfo) { result in switch result { case let .success(currencyJSON): for i in 0 ... (currencyJSON.count-1) { do { let currencyDetail = try JSONDecoder().decode(Currency.self, from: currencyJSON[i].rawData()) self.currencyArray.append(currencyDetail) } catch let err { self.setErrorMessage(message: err as! String) self.currencyInfoAvailable.value = false } } self.currencyInfoAvailable.value = true case let .failure(errorJSON): self.setErrorMessage(message: errorJSON["message"].stringValue) self.currencyInfoAvailable.value = false case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) { result in if result != "Error"{ let uuid = RestApiMananger.sharedInstance.getUUID() UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode") self.fetchCurrency(currencyInfo: currencyInfo) } } case .logOutUser(): RestApiMananger.sharedInstance.cancelExistingNetworkCalls() self.anotherLogin.value = true case .timeOut: self.transactionViewConnectionTimeOut.value = false } } } } /** To get a country detail - parameter countryId: country id */ func fetchCountry(countryId: String){ if !Reachability.isConnectedToNetwork() { self.internetConnection.value = false } else { RestApiMananger.sharedInstance.getCountryInfo(countryId: countryId) { result in switch result { case let .success(countryJSON): for i in 0 ... (countryJSON.count-1) { do { let countryDetail = try JSONDecoder().decode(AgentCountryList.self, from: countryJSON[i].rawData()) self.countryArray.append(countryDetail) } catch { self.countryInfoAvailable.value = false } } self.countryInfoAvailable.value = true case let .failure(errorJSON): self.setErrorMessage(message: errorJSON["message"].stringValue) self.countryInfoAvailable.value = false case .updateAccessCode: RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) { result in if result != "Error"{ let uuid = RestApiMananger.sharedInstance.getUUID() UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode") self.fetchCountry(countryId: countryId) } } case .logOutUser(): RestApiMananger.sharedInstance.cancelExistingNetworkCalls() self.anotherLogin.value = true case .timeOut: self.transactionViewConnectionTimeOut.value = false } } } } /** To get currency list - returns: list of currency */ func getCurrencyArray() -> [Currency]{ return currencyArray } /** To get country list - returns: list of currency */ func getCountryDetail() -> [AgentCountryList]{ return countryArray } /** To set transfer details - parameter transferDetails: transferDetails information */ func setTransferDetails(transferDetails: [String: String]) { self.transferDetails = transferDetails } /** To get transfer details - parameter recipient: recipient info - parameter paymentMethodId: payment method id - parameter calcBy: calculate by - returns: transferDetails */ func getTransferDetails(recipient: Recipient, paymentMethodId: String, calcBy: String) -> [String: String] { transferDetails["sourceId"] = sourceId transferDetails["from"] = from transferDetails["to"] = to transferDetails["reasonId"] = recipient.reasonId transferDetails["recipientId"] = recipient.recipientId transferDetails["payoutMethodId"] = paymentMethodId transferDetails["exRate"] = exchangeRate transferDetails["calcBy"] = calcBy transferDetails["transferFee"] = transferFee transferDetails["cAmount"] = cAmt transferDetails["pAmount"] = pAmt transferDetails["tAmount"] = tAmount transferDetails["userId"] = userId transferDetails["agentRefId"] = agentRefId transferDetails["countryId"] = recipient.countryId return transferDetails } /** To get transfer details for home delivery - parameter recipient: recipient info - parameter paymentMethodId: payment method id - parameter calcBy: calculate by - returns: transferDetails */ func getTransferDetailsForHomeDelivery(recipient: Recipient, paymentMethodId: String, calcBy: String, homeDetails: [String: String]) -> [String: String] { transferDetails["sourceId"] = sourceId transferDetails["from"] = from transferDetails["to"] = to transferDetails["reasonId"] = recipient.reasonId transferDetails["recipientId"] = recipient.recipientId transferDetails["payoutMethodId"] = paymentMethodId transferDetails["exRate"] = exchangeRate transferDetails["calcBy"] = calcBy transferDetails["transferFee"] = transferFee transferDetails["cAmount"] = cAmt transferDetails["pAmount"] = pAmt transferDetails["tAmount"] = tAmount transferDetails["userId"] = userId transferDetails["agentRefId"] = agentRefId transferDetails["countryId"] = recipient.countryId /// stateid is send as body transferDetails["updatedState"] = homeDetails["stateId"] /// to dispaly state name in view transferDetails["updatedStateId"] = homeDetails["state"] /// districtid is send as body transferDetails["updatedDistrict"] = homeDetails["districtId"] /// to display district name in view transferDetails["updatedDistrictId"] = homeDetails["district"] transferDetails["updatedCity"] = homeDetails["city"] transferDetails["updatedAddress"] = homeDetails["address"] return transferDetails } /** To get minimun transfer amount per transaction - returns: amount */ func getMinimumTransferAmountPerTransaction() -> String{ if minimumTransferAmountPerTransaction != "nil"{ return self.minimumTransferAmountPerTransaction } return minimumTransferAmountPerTransaction } /// - returns: exchange rate func getExchangeRate() -> String { return exchangeRate ?? "0.0" } /// - returns: transfer fee func getTransferFee() -> String { return transferFee ?? "0.0" } /// - returns: transfer limit func getTransferLimit() -> Double { return transferLimit } /// - returns: transaction limit func getTransactionLimit() -> Int{ return transactionLimit } /// - returns: reward point func getRewardPoint() -> Int { return rewardPoint } /// - returns: collection Amount func getcAmt() -> String { return cAmt ?? "0.0" } /// - returns: payment Amount func getpAmt() -> String { return pAmt ?? "0.0" } }