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.
 
 
 
 

348 lines
14 KiB

//
// 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<Bool?> = Box(nil)
var transactionInfoAvailable: Box<Bool?> = Box(nil)
var currencyInfoAvailable: Box<Bool?> = Box(nil)
var countryInfoAvailable: Box<Bool?> = Box(nil)
var transactionViewConnectionTimeOut: Box<Bool?> = 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"
}
}