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.
279 lines
9.3 KiB
279 lines
9.3 KiB
//
|
|
// WalletViewModel.swift
|
|
// GMERemittance
|
|
//
|
|
// Created by Sujal on 2/28/18.
|
|
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
class WalletViewModel: ModelExtension {
|
|
|
|
private var gmeID: String!
|
|
private var amount: String!
|
|
private var message: String!
|
|
private var mode: String!
|
|
private var fullName: String!
|
|
private var transactionID: String?
|
|
|
|
private var walletTransferLimitMax: String!
|
|
private var walletTransferLimitMin: String!
|
|
|
|
private var parameters: [String: String] = [String: String] ()
|
|
|
|
private var transaction: Transaction!
|
|
|
|
private let walletTransferCode = "offer"
|
|
private let walletRequestCode = "request"
|
|
private let moneyRequestCode = "request"
|
|
|
|
var walletLimitsFetched: Box<Bool?> = Box(nil)
|
|
var walletActionPerformed:Box<Bool?> = Box(nil)
|
|
|
|
var walletConnectionTimeOut: Box<Bool?> = Box(nil)
|
|
|
|
private let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as! String
|
|
|
|
|
|
}
|
|
|
|
extension WalletViewModel {
|
|
|
|
|
|
/**
|
|
To set control Segment Index
|
|
- parametet segmentIndex: index of control segment
|
|
*/
|
|
func setMode(segmentIndex: Int) {
|
|
if segmentIndex == 0 {
|
|
self.mode = self.walletTransferCode
|
|
} else if segmentIndex == 1 {
|
|
self.mode = self.walletRequestCode
|
|
} else if segmentIndex == 2 {
|
|
self.mode = self.moneyRequestCode
|
|
}
|
|
}
|
|
|
|
/// To set transaction id
|
|
func setMoneyRequestTransactionID(id: String) {
|
|
transactionID = id
|
|
}
|
|
|
|
/**
|
|
To get gmeId
|
|
- returns: gme id
|
|
*/
|
|
func getGMEID() -> String {
|
|
return gmeID
|
|
}
|
|
|
|
/**
|
|
To get Amount
|
|
- returns: amount
|
|
*/
|
|
func getAmount() -> String {
|
|
return amount
|
|
}
|
|
|
|
/**
|
|
To get message
|
|
- returns: message
|
|
*/
|
|
func getMessage() -> String {
|
|
return message
|
|
}
|
|
|
|
/**
|
|
To get mode code
|
|
- returns: code
|
|
*/
|
|
func getModeIndex() -> Int {
|
|
if mode == walletTransferCode {
|
|
return 0
|
|
} else if mode == walletRequestCode {
|
|
return 1
|
|
}
|
|
return 99
|
|
}
|
|
|
|
/**
|
|
To get Transaction info
|
|
- returns: transaction
|
|
*/
|
|
func getTransactionResult() -> Transaction {
|
|
return self.transaction
|
|
}
|
|
|
|
/**
|
|
To get Full name
|
|
- returns: name
|
|
*/
|
|
func getFullName() -> String {
|
|
return self.fullName
|
|
}
|
|
|
|
/**
|
|
To get gme user name
|
|
- returns: user name
|
|
*/
|
|
func setGMEUsername(fullName: String) {
|
|
self.fullName = fullName
|
|
}
|
|
|
|
/**
|
|
To get max transaction limit
|
|
- returns: transaction limit
|
|
*/
|
|
func getMaximumTransferLimit() -> String {
|
|
return walletTransferLimitMax
|
|
}
|
|
|
|
/**
|
|
To set amount for Wallet trasfer
|
|
- parameter amount: Transfer amount
|
|
- parameter gmeID: User gmeId
|
|
- parameter message: Transfer reason
|
|
*/
|
|
func setParam(amount: String, gmeID: String, message: String) {
|
|
self.amount = amount.removeSpacesTrailingPreceding().replacingOccurrences(of: " KRW", with: "", options: NSString.CompareOptions.literal, range: nil)
|
|
self.gmeID = gmeID.removeSpacesTrailingPreceding()
|
|
self.message = message.removeSpacesTrailingPreceding()
|
|
}
|
|
|
|
/**
|
|
To check validataion for wallet transfer
|
|
*/
|
|
func validateFields() -> isValid {
|
|
|
|
if gmeID == user_id {
|
|
return .InValid("Wallet action cannot be performed to own account!")
|
|
}
|
|
if gmeID.isBlank || amount.isBlank || message.isBlank {
|
|
return .InValid("Please fill all the fields")
|
|
}
|
|
if walletTransferLimitMax == nil || walletTransferLimitMin == nil {
|
|
return .InValid("min-max limit not fetched")
|
|
}
|
|
if let minAmount = Double(walletTransferLimitMin), let maxAmount = Double(walletTransferLimitMax) {
|
|
if Double(amount)! > maxAmount || Double(amount)! < minAmount {
|
|
return .InValid("Amount does not fall between min-max limit")
|
|
} else {
|
|
return .Valid
|
|
}
|
|
} else {
|
|
return .InValid("Wallet min and max are non numeric")
|
|
}
|
|
}
|
|
|
|
/**
|
|
Wallet transfer request detail
|
|
- parameter password: String
|
|
- parameter moneyRequestAccepted: Bool
|
|
*/
|
|
func getRequestParameter(password: String, moneyRequestAccepted: Bool) -> [String: String] {
|
|
parameters.removeAll()
|
|
if moneyRequestAccepted {
|
|
parameters["userId"] = user_id
|
|
parameters["transferType"] = self.mode
|
|
parameters["transactionId"] = self.transactionID!
|
|
parameters["txnPassword"] = password
|
|
parameters["amount"] = self.amount
|
|
} else {
|
|
parameters["recipientId"] = self.gmeID
|
|
parameters["amount"] = self.amount
|
|
parameters["reason"] = self.message
|
|
parameters["transferType"] = self.mode
|
|
parameters["txnPassword"] = password
|
|
parameters["userId"] = user_id
|
|
}
|
|
return parameters
|
|
}
|
|
}
|
|
|
|
extension WalletViewModel {
|
|
|
|
/**
|
|
Api request for transaction Detail
|
|
*/
|
|
func getTransactionInfo() {
|
|
if !Reachability.isConnectedToNetwork() {
|
|
self.internetConnection.value = false
|
|
} else {
|
|
RestApiMananger.sharedInstance.getTransactionInfo(param: ["countryId": "", "payoutMethodId": ""]) { result in
|
|
|
|
switch result {
|
|
case let .success(transactionInfoJSON):
|
|
self.walletTransferLimitMax = transactionInfoJSON["maximumTransferAmountWallet"].rawValue as! String
|
|
self.walletTransferLimitMin = transactionInfoJSON["minimumTransferAmountWallet"].rawValue as! String
|
|
self.walletLimitsFetched.value = true
|
|
case let .failure(errorJSON):
|
|
self.setErrorMessage(message: errorJSON["message"].stringValue)
|
|
self.walletLimitsFetched.value = false
|
|
case .updateAccessCode:
|
|
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
|
|
result in
|
|
if result != "Error"{
|
|
let uuid = RestApiMananger.sharedInstance.getUUID()
|
|
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
|
|
self.getTransactionInfo()
|
|
}
|
|
}
|
|
case .logOutUser():
|
|
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
|
|
self.anotherLogin.value = true
|
|
case .timeOut:
|
|
self.walletConnectionTimeOut.value = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Perform wallet action in review view page
|
|
- parameter password: String
|
|
- parameter moneyRequestAccepted: Bool
|
|
*/
|
|
func performWalletAction(password: String, moneyRequestAccepted: Bool) {
|
|
if !Reachability.isConnectedToNetwork() {
|
|
self.internetConnection.value = false
|
|
} else {
|
|
let param = getRequestParameter(password: password, moneyRequestAccepted: moneyRequestAccepted)
|
|
RestApiMananger.sharedInstance.performWalletAction(param: param, moneyRequestAccepted: moneyRequestAccepted) { result in
|
|
switch result {
|
|
case let .success(transferJSON):
|
|
|
|
UserDefaults.standard.set(transferJSON["availableBalance"].stringValue, forKey: "com.gmeremit.balance")
|
|
|
|
do {
|
|
self.transaction = try JSONDecoder().decode(Transaction.self, from: transferJSON.rawData())
|
|
} catch {
|
|
|
|
self.walletActionPerformed.value = false
|
|
}
|
|
|
|
self.walletActionPerformed.value = true
|
|
case let .failure(errorJSON):
|
|
self.setErrorMessage(message: errorJSON["message"].stringValue)
|
|
self.walletActionPerformed.value = false
|
|
case .updateAccessCode:
|
|
let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
|
|
let uuid = RestApiMananger.sharedInstance.getUUID()
|
|
|
|
RestApiMananger.sharedInstance.updateAccessCode(userId: userId!, password: self.getLoginPassword()) {
|
|
result in
|
|
if result != "Error" {
|
|
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
|
|
self.performWalletAction(password: password, moneyRequestAccepted: moneyRequestAccepted)
|
|
}
|
|
}
|
|
case .logOutUser():
|
|
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
|
|
self.anotherLogin.value = true
|
|
case .timeOut:
|
|
self.walletConnectionTimeOut.value = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|