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.

294 lines
11 KiB

6 years ago
  1. //
  2. // UserInfoViewModel.swift
  3. // GMERemittance
  4. //
  5. // Created by FMI-12 on 1/30/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. class UserInfoViewModel: ModelExtension {
  10. var userDataAvailable:Box<Bool?> = Box(nil)
  11. var userOccupationProvinceAvailable:Box<Int?> = Box(nil) // -1 = handle keypad when user is auto logout, 0 = Error, 5 = Occupation, 3 = Province
  12. var userSourceFundAvailable:Box<Bool?> = Box(nil)
  13. var userConnectionTimeOut: Box<Bool?> = Box(nil)
  14. private var cddOccupationList: [String] = [String] ()
  15. private var cddOccupationValueList: [String] = [String] ()
  16. private var cddSourceFundList: [String] = [String] ()
  17. private var cddSourceFundValueList: [String] = [String] ()
  18. private var cddProvinceList: [String] = [String] ()
  19. private var cddProvinceValueList: [String] = [String] ()
  20. private var userInfo = KYCModel()
  21. let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
  22. /**
  23. APi request for user information
  24. */
  25. func fetchUserInfo() {
  26. if !Reachability.isConnectedToNetwork() {
  27. self.internetConnection.value = false
  28. } else {
  29. RestApiMananger.sharedInstance.fetchUserInfoFromKyc(userId: user_id!) { result in
  30. switch result {
  31. case let .success(fetchedJSON):
  32. guard fetchedJSON.count > 0 else {
  33. self.userDataAvailable.value = false
  34. return
  35. }
  36. do {
  37. self.userInfo = try JSONDecoder().decode(KYCModel.self, from: fetchedJSON.rawData())
  38. self.userDataAvailable.value = true
  39. } catch {
  40. self.userDataAvailable.value = false
  41. }
  42. case let .failure(errorJSON):
  43. self.setErrorMessage(message: errorJSON["message"].stringValue)
  44. self.userDataAvailable.value = false
  45. case .updateAccessCode:
  46. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
  47. result in
  48. if result != "Error"{
  49. let uuid = RestApiMananger.sharedInstance.getUUID()
  50. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  51. self.fetchUserInfo()
  52. }
  53. }
  54. case .logOutUser():
  55. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  56. self.anotherLogin.value = true
  57. case .timeOut:
  58. self.userConnectionTimeOut.value = false
  59. }
  60. }
  61. }
  62. }
  63. /**
  64. APi Request to update userINfo
  65. - parameter param: user info in Dictionary
  66. */
  67. func updateUserInfo(param: [String: String]) {
  68. if !Reachability.isConnectedToNetwork() {
  69. self.internetConnection.value = false
  70. } else {
  71. RestApiMananger.sharedInstance.updateUserInfoForKyc(userId: getUserId(), parameter: param) { result in
  72. switch result {
  73. case .success(_):
  74. self.userDataAvailable.value = true
  75. self.userDataAvailable.value = nil
  76. case let .failure(errorJSON):
  77. self.setErrorMessage(message: errorJSON["message"].stringValue)
  78. self.userDataAvailable.value = false
  79. self.userDataAvailable.value = nil
  80. case .updateAccessCode:
  81. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
  82. result in
  83. if result != "Error"{
  84. let uuid = RestApiMananger.sharedInstance.getUUID()
  85. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  86. self.updateUserInfo(param: param)
  87. }
  88. }
  89. case .logOutUser():
  90. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  91. self.anotherLogin.value = true
  92. case .timeOut:
  93. self.userConnectionTimeOut.value = false
  94. }
  95. }
  96. }
  97. }
  98. /**
  99. Api request for CddList value
  100. - parameter cddName: Type of cddName
  101. - parameter param: [:]
  102. */
  103. func fetchCDDList(cddName: String, param: [String: String]?) {
  104. let cdd_name = cddName
  105. if !Reachability.isConnectedToNetwork() {
  106. self.internetConnection.value = false
  107. } else {
  108. RestApiMananger.sharedInstance.getCDDListFor(cddCode: cddName, param: param) { result in
  109. switch result {
  110. case let .success(cddJSON):
  111. switch cddName {
  112. case cddCode.Occupation.rawValue:
  113. self.cddOccupationList.removeAll()
  114. self.cddOccupationValueList.removeAll()
  115. case cddCode.SourceFund.rawValue:
  116. self.cddSourceFundList.removeAll()
  117. self.cddSourceFundValueList.removeAll()
  118. case cddCode.Province.rawValue:
  119. self.cddProvinceList.removeAll()
  120. self.cddProvinceValueList.removeAll()
  121. default:
  122. return
  123. }
  124. if cddJSON.count > 0 {
  125. for i in 0 ... (cddJSON.count-1) {
  126. do {
  127. let cddNameValuePair = try JSONDecoder().decode(Cdd.self, from: cddJSON[i].rawData())
  128. switch cddName {
  129. case cddCode.Occupation.rawValue:
  130. self.cddOccupationList.append(cddNameValuePair.name)
  131. self.cddOccupationValueList.append(cddNameValuePair.value)
  132. case cddCode.SourceFund.rawValue:
  133. self.cddSourceFundList.append(cddNameValuePair.name)
  134. self.cddSourceFundValueList.append(cddNameValuePair.value)
  135. case cddCode.Province.rawValue:
  136. self.cddProvinceList.append(cddNameValuePair.name)
  137. self.cddProvinceValueList.append(cddNameValuePair.value)
  138. default:
  139. return
  140. }
  141. } catch {
  142. switch cddName {
  143. case cddCode.Occupation.rawValue:
  144. self.userOccupationProvinceAvailable.value = 0
  145. case cddCode.SourceFund.rawValue:
  146. self.userSourceFundAvailable.value = false
  147. default:
  148. return
  149. }
  150. break
  151. }
  152. }
  153. }
  154. switch cddName {
  155. case cddCode.Occupation.rawValue:
  156. self.userOccupationProvinceAvailable.value = 5
  157. case cddCode.Province.rawValue:
  158. self.userOccupationProvinceAvailable.value = 3
  159. case cddCode.SourceFund.rawValue:
  160. self.userSourceFundAvailable.value = true
  161. default:
  162. return
  163. }
  164. case .failure(_):
  165. switch cddName {
  166. case cddCode.Occupation.rawValue:
  167. self.userOccupationProvinceAvailable.value = 0
  168. case cddCode.SourceFund.rawValue:
  169. self.userSourceFundAvailable.value = false
  170. default:
  171. return
  172. }
  173. return
  174. case .updateAccessCode:
  175. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
  176. result in
  177. if result != "Error"{
  178. let uuid = RestApiMananger.sharedInstance.getUUID()
  179. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  180. self.fetchCDDList(cddName: cdd_name, param: param)
  181. }
  182. }
  183. case .logOutUser():
  184. self.userOccupationProvinceAvailable.value = -1
  185. self.userSourceFundAvailable.value = nil
  186. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  187. self.anotherLogin.value = true
  188. case .timeOut:
  189. self.userConnectionTimeOut.value = false
  190. }
  191. }
  192. }
  193. }
  194. /**
  195. To get occupation List
  196. - returns: occupation list
  197. */
  198. func getOccupationList() -> [String] {
  199. return cddOccupationList
  200. }
  201. /**
  202. - parameter index: position of occupation in an array
  203. - returns: occupation
  204. */
  205. func getOccupationID(index: Int) -> String {
  206. return cddOccupationValueList[index]
  207. }
  208. /**
  209. To get province List
  210. - returns: privince list
  211. */
  212. func getProvinceList() -> [String] {
  213. return cddProvinceList
  214. }
  215. /**
  216. - parameter index: position of province in an array
  217. - returns: province
  218. */
  219. func getProvinceID(index: Int) -> String {
  220. return cddProvinceValueList[index]
  221. }
  222. /**
  223. To get source fund List
  224. - returns: source fund list
  225. */
  226. func getSourceFundList() -> [String] {
  227. return cddSourceFundList
  228. }
  229. /**
  230. - parameter index: position of source fund in an array
  231. - returns: source fund
  232. */
  233. func getSourceFundID(index: Int) -> String {
  234. return cddSourceFundValueList[index]
  235. }
  236. /**
  237. To get user info
  238. - returns: user info
  239. */
  240. func getInfo() -> KYCModel {
  241. return userInfo
  242. }
  243. /**
  244. To get address
  245. - returns: address
  246. */
  247. func getAddress() -> String {
  248. return ""// userInfo.address + ", " + userInfo.city
  249. }
  250. /**
  251. To get data array
  252. - returns: empty array
  253. */
  254. func getEmptyData() -> [String] {
  255. return [String]()
  256. }
  257. }