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.
 
 
 
 

834 lines
29 KiB

//
// RecipientViewModel.swift
// GMERemittance
//
// Created by Sujal on 12/27/17.
// Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class RecipientViewModel: ModelExtension {
let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
private var cddTransferReasonList: [String] = [String] ()
private var cddTransferReasonValueList: [String] = [String] ()
private var cddStateList: [String] = [String]()
private var cddStateValueList: [String] = [String]()
private var cddDistrictList: [String] = [String]()
private var cddDistrictValueList: [String] = [String]()
private var cddRelationList: [String] = [String] ()
private var cddRelationValueList: [String] = [String] ()
private var countryList: [AgentCountryList] = [AgentCountryList] ()
private var cddCountryList: [String] = [String]()
private var cddCountryFlag: [String] = [String] ()
private var cddCountryIdList: [String] = [String] ()
var recipientModel = AgentCountryList()
var recipientCreatedUpdated: Box<Bool?> = Box(nil)
var recipientListObtained: Box<Bool?> = Box(nil)
var recipientDeleted: Box<Bool?> = Box(nil)
var cddCountryListAvailable: Box<Bool?> = Box(nil)
var cddListAvailable: Box<Int?> = Box(nil)
var recipientArray = [Recipient]()
private var recipient: Recipient!
private var newRecipient: Recipient!
/**
*/
var recipientConnectionTimeOut: Box<Bool?> = Box(nil)
var recipientDeletedTimeOut: Box<Bool?> = Box(nil)
override init() {
self.recipient = Recipient(firstName: "",
middleName: "",
lastName: "",
country: "",
state: "",
stateId: "",
city: "",
address: "",
district: "",
districtId: "",
relation: "",
relationId: "",
mobileNumber: "",
email: "",
recipientId: "",
reason: "",
reasonId: "",
countryId: "")
}
init(recipient: Recipient) {
self.recipient = recipient
}
/**
To update first name
- parameter firstName: first name
*/
func updateFirstName(firstName: String) {
recipient.firstName = firstName
}
/**
To update middle name
- parameter middleName: middle name
*/
func updateMiddleName(middleName: String) {
recipient.middleName = middleName
}
/**
To update lasr name
- parameter lastName: last name
*/
func updateLastName(lastName: String) {
recipient.lastName = lastName
}
/**
To update country
- parameter country: country
*/
func updateCountry(country: String) {
recipient.country = country
}
/**
To update state
- parameter state: state
*/
func updateState(state: String) {
recipient.state = state
}
/**
To update district
- parameter district: district
*/
func updateDistrict(district: String) {
recipient.district = district
}
/**
To update city
- parameter city: city
*/
func updateCity(city: String) {
recipient.city = city
}
/**
To update address
- parameter address: address
*/
func updateAddress(address: String) {
recipient.address = address
}
/**
To update address
- parameter address: address
*/
func updateRelation(relation: String) {
recipient.relation = relation
}
/**
To update mobile
- parameter mobile: mobile
*/
func updateMobile(mobile: String) {
recipient.mobileNumber = mobile
}
/**
To update email
- parameter email: email
*/
func updateEmail(email: String) {
recipient.email = email
}
/**
To update transferReason
- parameter reason: transferReason
*/
func updateTransferReason(reason: String){
recipient.reason = reason
}
/**
To get recipient details
- returns: recipient detail info
*/
func getRecipientDetails() -> [String: String] {
if recipient.email == nil {
if recipient.middleName == nil {
return ["firstName": recipient.firstName,
"lastName": recipient.lastName,
"city": recipient.city,
"state": recipient.state,
"address": recipient.address,
"country": recipient.country,
"district": recipient.district,
"relation": recipient.relation,
"mobileNumber": recipient.mobileNumber,
"userId": getUserId(),
"reason": recipient.reason]
} else {
return ["firstName": recipient.firstName,
"middleName": recipient.middleName!,
"lastName": recipient.lastName,
"city": recipient.city,
"state": recipient.state,
"address": recipient.address,
"country": recipient.country,
"district": recipient.district,
"relation": recipient.relation,
"mobileNumber": recipient.mobileNumber,
"userId": getUserId(),
"reason": recipient.reason]
}
} else {
if recipient.middleName == nil {
return ["firstName": recipient.firstName,
"lastName": recipient.lastName,
"city": recipient.city,
"state": recipient.state,
"address": recipient.address,
"country": recipient.country,
"district": recipient.district,
"relation": recipient.relation,
"mobileNumber": recipient.mobileNumber,
"email": recipient.email!,
"userId": getUserId(),
"reason": recipient.reason]
} else {
return ["firstName": recipient.firstName,
"middleName": recipient.middleName!,
"lastName": recipient.lastName,
"city": recipient.city,
"state": recipient.state,
"address": recipient.address,
"country": recipient.country,
"district": recipient.district,
"relation": recipient.relation,
"mobileNumber": recipient.mobileNumber,
"email": recipient.email!,
"userId": getUserId(),
"reason": recipient.reason]
}
}
}
/**
To remove Recipient
- parameter recipientId: id
*/
func removeRecipient(recipientId: String) {
let id = recipientId
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.deleteRecipient(recipientId: recipientId) { result in
switch result {
case .success(_):
self.recipientDeleted.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.recipientDeleted.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.removeRecipient(recipientId: id)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.recipientDeletedTimeOut.value = false
}
}
}
}
/**
To update recipient details
-parameter recipientId: id
- parameter updateParams: recipient updated detail info
*/
func updateRecipient(recipientId: String, updateParams: [String: String]) {
let id = recipientId
let upd_params = updateParams
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.updateRecipient(recipientId: recipientId, recipientDetails: updateParams) { result in
switch result {
case .success(_):
self.recipientCreatedUpdated.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.recipientCreatedUpdated.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.updateRecipient(recipientId: id, updateParams: upd_params)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.recipientConnectionTimeOut.value = false
}
}
}
}
/// To create recipient
func createRecipient(){
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.createNewRecipient(recipientDetails: self.getRecipientDetails()) { result in
switch result {
case let .success(createdJSON):
do {
self.newRecipient = try JSONDecoder().decode(Recipient.self, from: createdJSON.rawData())
self.recipientCreatedUpdated.value = true
} catch {
self.recipientCreatedUpdated.value = false
}
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.recipientCreatedUpdated.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.createRecipient()
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.recipientConnectionTimeOut.value = false
}
}
}
}
/**
To get recipients list with pagination
- parameter size: list size
- parameter page: page no
*/
func getAllRecipientsThroughPagination(size: Int , page: Int) {
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.fetchRecipientListThroughPagination(userId: userId!, page: page, size: size) { result in
switch result {
case let .success(fetchedJSON):
self.recipientArray.removeAll()
guard fetchedJSON.count > 0 else {
self.recipientListObtained.value = true
return
}
for i in 0 ... (fetchedJSON.count-1) {
do {
let recipient = try JSONDecoder().decode(Recipient.self, from: fetchedJSON[i].rawData())
self.recipientArray.append(recipient)
} catch {
}
}
self.recipientListObtained.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.recipientListObtained.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.getAllRecipientsThroughPagination(size: size , page: page)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.recipientConnectionTimeOut.value = false
}
}
}
}
/// - returns: recipient
func getCreatedRecipient() -> Recipient {
return newRecipient
}
/// - returns: recipient list
func getRecipientArray() -> [Recipient] {
return recipientArray
}
/// - returns: state list
func getStateList() -> [String] {
return cddStateList
}
/// - returns: list of state id
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 {
let isIndexValid = cddStateValueList.indices.contains(index)
if isIndexValid == true {
return cddStateValueList[index]
}
return ""
}
/// - returns: list of district
func getDistrictList() -> [String] {
return cddDistrictList
}
/// - returns: list of district id
func getDistrictValueList() -> [String] {
return cddDistrictValueList
}
/**
To get a district
- parameter index: position of district in an array
- returns: district
*/
func getDistrict(index: Int) -> String {
return cddDistrictList[index]
}
/**
To get a district id
- parameter index: position of district in an array
- returns: district id
*/
func getDistrictValue(index: Int) -> String {
let isIndexValid = cddDistrictValueList.indices.contains(index)
if isIndexValid == true {
return cddDistrictValueList[index]
}
return ""
}
/// - returns: list of transfer reason
func getTransferReason() -> [String] {
return cddTransferReasonList
}
/// - returns: list of transfer reason id
func getTransferReasonValueList() -> [String] {
return cddTransferReasonValueList
}
/**
To get a transferReason id
- parameter index: position of transferReason id in an array
- returns: transferReason id
*/
func getTransferReasonValue(index:Int) -> String {
let isIndexValid = cddTransferReasonValueList.indices.contains(index)
if isIndexValid == true {
return cddTransferReasonValueList[index]
}
return ""
}
/**
To get a transferReason
- parameter index: position of transferReason in an array
- returns: transferReason
*/
func getTransferReasonName(index: Int) -> String {
return cddTransferReasonList[index]
}
/// - returns: list of relation
func getRelationList() -> [String] {
return cddRelationList
}
/// - returns: list of relation id
func getRelationValueList() -> [String] {
return cddRelationValueList
}
/**
To get a relation id
- parameter index: position of relation id in an array
- returns: relation id
*/
func getRelationValue(index: Int) -> String{
let isIndexValid = cddRelationValueList.indices.contains(index)
if isIndexValid == true {
return cddRelationValueList[index]
}
return ""
}
/**
To get a relation
- parameter index: position of relation in an array
- returns: relation
*/
func getRelationName(index: Int) -> String {
return cddRelationList[index]
}
/// - returns: list of country detail
func getCountryList() -> [AgentCountryList] {
return countryList
}
/**
To get a Country Flag Url
- parameter index: position of Country Flag Url in an array
- returns: Country Flag Url
*/
func getCountryFlagUrl(index: Int) -> String {
if let countryFlag = countryList[index].flagUrl {
return countryFlag
}
return ""
}
/**
To get a Country id
- parameter index: position of Country id in an array
- returns: Country id
*/
func getCountryId(index: Int) -> String {
let isIndexValid = countryList.indices.contains(index)
if isIndexValid == true{
if let countryId = countryList[index].countryId{
return countryId
}
}
return ""
}
/**
To get a Country name
- parameter index: position of Country name in an array
- returns: Country name
*/
func getCountryName(index: Int) -> String {
return countryList[index].country!
}
/// - returns: list of Country name
func getCountryNameList() -> [String]{
return countryList.map{$0.country!}
}
/// - returns: list of country id
func getCountryIdList() -> [String]{
return countryList.map{$0.countryId!}
}
/// - returns: list of country flag url
func getCountryFlagUrlList() -> [String]{
return countryList.map{$0.flagUrl ?? ""}
}
/**
To set a Country id
- parameter referenceIndex: position of Country id in an array
*/
func setCountryId(referenceIndex: Int) {
recipient.country = cddCountryIdList[referenceIndex]
}
/**
To set a transfer reason
- parameter referenceIndex: position of transfer reason in an array
*/
func setTransferReason(referenceIndex: Int) {
recipient.reason = cddTransferReasonValueList[referenceIndex]
}
/**
To set a Relation
- parameter referenceIndex: position of Relation in an array
*/
func setRelation(referenceIndex: Int) {
recipient.relation = cddRelationValueList[referenceIndex]
}
/**
To set a state
- parameter referenceIndex: position of state in an array
*/
func setState(referenceIndex: Int) {
let isIndexValid = cddStateValueList.indices.contains(referenceIndex)
if isIndexValid == true{
recipient.state = cddStateValueList[referenceIndex]
}
}
/**
To set a District
- parameter referenceIndex: position of District in an array
*/
func setDistrict(referenceIndex: Int) {
recipient.district = cddDistrictValueList[referenceIndex]
}
/**
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):
switch cddName {
case cddCode.TransferReason.rawValue:
self.cddTransferReasonList.removeAll()
self.cddTransferReasonValueList.removeAll()
case cddCode.Province.rawValue:
self.cddStateValueList.removeAll()
self.cddStateList.removeAll()
case cddCode.District.rawValue:
self.cddDistrictList.removeAll()
self.cddDistrictValueList.removeAll()
case cddCode.Relation.rawValue:
self.cddRelationList.removeAll()
self.cddRelationValueList.removeAll()
default:
return
}
if cddJSON.count > 0 {
for i in 0 ... (cddJSON.count-1) {
do {
let cddNameValuePair = try JSONDecoder().decode(Cdd.self, from: cddJSON[i].rawData())
switch cddName {
/// used for transfer reason
case cddCode.TransferReason.rawValue:
self.cddTransferReasonList.append(cddNameValuePair.name)
self.cddTransferReasonValueList.append(cddNameValuePair.value)
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)
case cddCode.Relation.rawValue:
self.cddRelationList.append(cddNameValuePair.name)
self.cddRelationValueList.append(cddNameValuePair.value)
default:
return
}
} catch {
break
}
}
}
switch cddName {
case cddCode.TransferReason.rawValue:
self.cddListAvailable.value = 1
case cddCode.Province.rawValue:
self.cddListAvailable.value = 2
case cddCode.District.rawValue:
self.cddListAvailable.value = 3
case cddCode.Relation.rawValue:
self.cddListAvailable.value = 4
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.recipientConnectionTimeOut.value = false
}
}
}
}
/// To get list of country
func fetchListOfCountry(){
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.fetchCountryList() { result in
switch result {
case let .success(countryListJSON):
self.countryList.removeAll()
guard countryListJSON.count > 0 else {
self.cddCountryListAvailable.value = true
return
}
for i in 0 ... (countryListJSON.count-1) {
do {
let cddCountry = try JSONDecoder().decode(AgentCountryList.self, from: countryListJSON[i].rawData())
if cddCountry.countryId != "118" {
self.countryList.append(cddCountry)
self.cddCountryList.append(cddCountry.country!)
if let flagUrl = cddCountry.flagUrl {
self.cddCountryFlag.append(flagUrl)
} else {
self.cddCountryFlag.append("")
}
self.cddCountryIdList.append(cddCountry.countryId!)
}
} catch {
self.cddCountryListAvailable.value = false
}
}
self.cddCountryListAvailable.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.fetchListOfCountry()
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.recipientConnectionTimeOut.value = false
}
}
}
}
/**
To get inex of a country id
- parameter id: position of country id in an array
- returns: index
*/
func getIndex(id: String) -> Int {
return getCountryIdList().index(of: id)!
}
/**
check empty textfield in array
- parameter arrayofInfo: list of textfield
- returns: Bool
*/
func allFieldsFilled(arrayofInfo: [String]) -> Bool {
for info in arrayofInfo {
if info.isBlank {
return false
}
}
return true
}
}