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.
 
 
 
 

457 lines
17 KiB

//
// PaymentViewModel.swift
// GMERemittance
//
// Created by Sujal on 1/18/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
import SwiftyJSON
class PaymentMethodViewModel: ModelExtension {
var payoutMethodType: Box<Bool?> = Box(nil)
var payoutBankAvailable: Box<Bool?> = Box(nil)
var payoutBankBranchAvailable: Box<Bool?> = Box(nil)
var cddListAvailable: Box<Int?> = Box(nil)
var paymentMethodConnectionTimeOut: Box<Bool?> = Box(nil)
var accountNumber: String = String()
var bankNames: [String] = [String] ()
var bankIds: [String] = [String]()
var branchNames: [String] = [String] ()
var branchIds: [String] = [String] ()
var cddStateList: [String] = [String]()
var cddStateValueList: [String] = [String]()
var cddDistrictList: [String] = [String]()
var cddDistrictValueList: [String] = [String]()
var payoutModeTypeArray = [PayoutMode]()
var payoutCashArray = [AgentModel]()
var payoutBankDetailArray = [AgentModel]()
var payoutBankBranchArray = [BankBranch]()
let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
/**
To update account number
- parameter acNumber: Account number
*/
func updateAccountNumber(acNumber: String) {
accountNumber = acNumber
}
/**
To get bank name
- returns: bank name list
*/
func getBankNames() -> [String] {
return bankNames
}
/**
To get bank branch name
- returns: bank branch name list
*/
func getBranchNames() -> [String] {
return branchNames
}
/**
To get a bank name
- parameter index: position of bank in an array
- returns: bank name
*/
func getBankName(index: Int) -> String {
return bankNames[index]
}
/**
To get a bank id
- parameter index: position of bank id in an array
- returns: bank id
*/
func getBankId(index: Int) -> String {
return bankIds[index]
}
/**
To get a bank branch name
- parameter index: position of bank branch in an array
- returns: bank branch name
*/
func getBranchName(index: Int) -> String {
return branchNames[index]
}
/**
To get a bank branch id
- parameter index: position of bank branch id in an array
- returns: bank branchid
*/
func getBranchId(index: Int) -> String {
return branchIds[index]
}
/**
To get payout method
- returns: payout mode
*/
func getPayoutMethodArray() -> [PayoutMode] {
return payoutModeTypeArray
}
/**
To get state list
- returns: state list
*/
func getStateList() -> [String] {
return cddStateList
}
/**
To get list of state id
- returns: state id list
*/
func getStateValueList() -> [String] {
return cddStateValueList
}
/**
To get a state
- parameter index: position of state in an array
- returns: state
*/
func getState(index: Int) -> String {
return cddStateList[index]
}
/**
To get a state id
- parameter index: position of state id in an array
- returns: state id
*/
func getStateValue(index: Int) -> String {
return cddStateValueList[index]
}
/**
To get list of district
- returns: district list
*/
func getDistrictList() -> [String] {
return cddDistrictList
}
/**
To get list of district id
- returns: district id list
*/
func getDistrictValueList() -> [String] {
return cddDistrictValueList
}
/**
To get a district
- parameter index: position of a district in an array
- returns: district
*/
func getDistrict(index: Int) -> String {
return cddDistrictList[index]
}
/**
To get a district id
- parameter index: position of a district id in an array
- returns: district id
*/
func getDistrictValue(index: Int) -> String {
return cddDistrictValueList[index]
}
/**
To get Banks detail information
- returns: list of Agents with detail information each
*/
func getPayoutBankDetailArray() -> [AgentModel] {
return payoutBankDetailArray
}
/**
To get Bank branchs detail information
- returns: list of Agent branchs with detail information each
*/
func getPayoutBankBranchArray() -> [BankBranch] {
return payoutBankBranchArray
}
/**
To get Agents detail information
- returns: list of Agents with detail information each
*/
func getPayoutCashArray() -> [AgentModel]{
return payoutCashArray
}
/**
To get transfer detail information
- parameter bankIdReferenceValue: position of bank id in an array
- parameter branchIdReferenceValue: position of bank branch id in an array
- returns: transfer details
*/
func getTransferDetails(bankIdReferenceValue: Int, branchIdReferenceValue: Int) -> [String: String] {
let transferDetails: [String: String] = ["bankId": getBankId(index: bankIdReferenceValue),
"bankName": getBankName(index: bankIdReferenceValue),
"branchId": getBranchId(index: branchIdReferenceValue),
"branchName": getBranchName(index: branchIdReferenceValue),
"accountNumber": accountNumber]
return transferDetails
}
/**
To get a country payout mode i.e cash , bank or home delivery
- Parameter country id: counrty id of selected country
*/
func fetchCountryPayoutMode(countryId: String) {
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
self.payoutModeTypeArray.removeAll()
RestApiMananger.sharedInstance.getCountryPayoutMode(countryId: countryId) { result in
switch result {
case let .success(countryPayoutJSON):
if countryPayoutJSON.count > 0{
for i in 0 ... (countryPayoutJSON.count-1) {
do {
let payout = try JSONDecoder().decode(PayoutMode.self, from: countryPayoutJSON[i].rawData())
self.payoutModeTypeArray.append(payout)
} catch {
self.payoutMethodType.value = false
}
}
}
self.payoutMethodType.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
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.fetchCountryPayoutMode(countryId: countryId)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.paymentMethodConnectionTimeOut.value = false
}
}
}
}
/**
To get bank detail with payout mode
- parameter countryId: country id
- parameter payoutMethodId: id of payout method
*/
func fetchPayoutBankDetail(countryId: String,payoutMethodId: String){
if payoutMethodId == "1" {
payoutCashArray.removeAll()
} else if payoutMethodId == "2" {
payoutBankDetailArray.removeAll()
}
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.getPayoutBankDetail(countryId: countryId, payoutMethodId: payoutMethodId){
result in
switch result{
case let .success(bankDetailJSON):
guard bankDetailJSON.count > 0 else {
return
}
self.setPayoutBankDetails(bankDetailJSON: bankDetailJSON, payoutMethodId: payoutMethodId)
self.payoutBankAvailable.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.payoutBankAvailable.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.fetchPayoutBankDetail(countryId: countryId, payoutMethodId: payoutMethodId )
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.paymentMethodConnectionTimeOut.value = false
}
}
}
}
/// set up of payout bank detail
func setPayoutBankDetails(bankDetailJSON: JSON,payoutMethodId: String ){
if !bankDetailJSON.isEmpty {
for i in 0 ... (bankDetailJSON.count-1) {
do {
let bankDetail = try JSONDecoder().decode(AgentModel.self, from: bankDetailJSON[i].rawData())
if payoutMethodId == "1" {
payoutCashArray.append(bankDetail)
} else if payoutMethodId == "2"{
payoutBankDetailArray.append(bankDetail)
}
} catch let err {
self.setErrorMessage(message: err as! String)
self.payoutBankAvailable.value = false
}
}
}
}
/**
To get bank branch detail with payout mode
- parameter countryId: country id
- parameter payoutId: id of payout ie.bank payout id
*/
func fetchPayoutBankBranchDetail(countryId: String, payoutId: String ){
payoutBankBranchArray.removeAll()
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.getPayoutBankBranchDetail(countryId: countryId, payoutId: payoutId){
result in
switch result{
case let .success(bankBranchDetailJSON):
guard bankBranchDetailJSON.count > 0 else {
return
}
for i in 0 ... (bankBranchDetailJSON.count-1) {
do {
let bankBranchDetail = try JSONDecoder().decode(BankBranch.self, from: bankBranchDetailJSON[i].rawData())
self.payoutBankBranchArray.append(bankBranchDetail)
} catch let err {
self.setErrorMessage(message: err as! String)
self.payoutBankBranchAvailable.value = false
}
}
self.payoutBankBranchAvailable.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.payoutBankBranchAvailable.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.fetchPayoutBankBranchDetail(countryId: countryId, payoutId: payoutId)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.paymentMethodConnectionTimeOut.value = false
}
}
}
}
/**
To get cdd list such as occupation , relation, state ect
- parameter cddName: cddcode
- parameter param: cdd info
*/
func fetchCDDListFor(cddName: String, param: [String: String]) {
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.getCDDListFor(cddCode: cddName, param: param) { result in
switch result {
case let .success(cddJSON):
if cddName == cddCode.Province.rawValue {
self.cddStateValueList.removeAll()
self.cddStateList.removeAll()
} else if cddName == cddCode.District.rawValue {
self.cddDistrictList.removeAll()
self.cddDistrictValueList.removeAll()
}
guard cddJSON.count > 0 else {
return
}
for i in 0 ... (cddJSON.count-1) {
do {
let cddNameValuePair = try JSONDecoder().decode(Cdd.self, from: cddJSON[i].rawData())
switch cddName {
case cddCode.Province.rawValue:
self.cddStateList.append(cddNameValuePair.name)
self.cddStateValueList.append(cddNameValuePair.value)
case cddCode.District.rawValue:
self.cddDistrictList.append(cddNameValuePair.name)
self.cddDistrictValueList.append(cddNameValuePair.value)
default:
return
}
} catch {
self.setErrorMessage(message: "Error decoding JSON")
break
}
}
switch cddName {
case cddCode.Province.rawValue:
self.cddListAvailable.value = 2
case cddCode.District.rawValue:
self.cddListAvailable.value = 3
default:
return
}
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.cddListAvailable.value = 0
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.fetchCDDListFor(cddName: cddName, param: param)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.paymentMethodConnectionTimeOut.value = false
}
}
}
}
}