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

6 years ago
  1. //
  2. // WalletViewModel.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 2/28/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. class WalletViewModel: ModelExtension {
  10. private var gmeID: String!
  11. private var amount: String!
  12. private var message: String!
  13. private var mode: String!
  14. private var fullName: String!
  15. private var transactionID: String?
  16. private var walletTransferLimitMax: String!
  17. private var walletTransferLimitMin: String!
  18. private var parameters: [String: String] = [String: String] ()
  19. private var transaction: Transaction!
  20. private let walletTransferCode = "offer"
  21. private let walletRequestCode = "request"
  22. private let moneyRequestCode = "request"
  23. var walletLimitsFetched: Box<Bool?> = Box(nil)
  24. var walletActionPerformed:Box<Bool?> = Box(nil)
  25. var walletConnectionTimeOut: Box<Bool?> = Box(nil)
  26. private let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as! String
  27. }
  28. extension WalletViewModel {
  29. /**
  30. To set control Segment Index
  31. - parametet segmentIndex: index of control segment
  32. */
  33. func setMode(segmentIndex: Int) {
  34. if segmentIndex == 0 {
  35. self.mode = self.walletTransferCode
  36. } else if segmentIndex == 1 {
  37. self.mode = self.walletRequestCode
  38. } else if segmentIndex == 2 {
  39. self.mode = self.moneyRequestCode
  40. }
  41. }
  42. /// To set transaction id
  43. func setMoneyRequestTransactionID(id: String) {
  44. transactionID = id
  45. }
  46. /**
  47. To get gmeId
  48. - returns: gme id
  49. */
  50. func getGMEID() -> String {
  51. return gmeID
  52. }
  53. /**
  54. To get Amount
  55. - returns: amount
  56. */
  57. func getAmount() -> String {
  58. return amount
  59. }
  60. /**
  61. To get message
  62. - returns: message
  63. */
  64. func getMessage() -> String {
  65. return message
  66. }
  67. /**
  68. To get mode code
  69. - returns: code
  70. */
  71. func getModeIndex() -> Int {
  72. if mode == walletTransferCode {
  73. return 0
  74. } else if mode == walletRequestCode {
  75. return 1
  76. }
  77. return 99
  78. }
  79. /**
  80. To get Transaction info
  81. - returns: transaction
  82. */
  83. func getTransactionResult() -> Transaction {
  84. return self.transaction
  85. }
  86. /**
  87. To get Full name
  88. - returns: name
  89. */
  90. func getFullName() -> String {
  91. return self.fullName
  92. }
  93. /**
  94. To get gme user name
  95. - returns: user name
  96. */
  97. func setGMEUsername(fullName: String) {
  98. self.fullName = fullName
  99. }
  100. /**
  101. To get max transaction limit
  102. - returns: transaction limit
  103. */
  104. func getMaximumTransferLimit() -> String {
  105. return walletTransferLimitMax
  106. }
  107. /**
  108. To set amount for Wallet trasfer
  109. - parameter amount: Transfer amount
  110. - parameter gmeID: User gmeId
  111. - parameter message: Transfer reason
  112. */
  113. func setParam(amount: String, gmeID: String, message: String) {
  114. self.amount = amount.removeSpacesTrailingPreceding().replacingOccurrences(of: " KRW", with: "", options: NSString.CompareOptions.literal, range: nil)
  115. self.gmeID = gmeID.removeSpacesTrailingPreceding()
  116. self.message = message.removeSpacesTrailingPreceding()
  117. }
  118. /**
  119. To check validataion for wallet transfer
  120. */
  121. func validateFields() -> isValid {
  122. if gmeID == user_id {
  123. return .InValid("Wallet action cannot be performed to own account!")
  124. }
  125. if gmeID.isBlank || amount.isBlank || message.isBlank {
  126. return .InValid("Please fill all the fields")
  127. }
  128. if walletTransferLimitMax == nil || walletTransferLimitMin == nil {
  129. return .InValid("min-max limit not fetched")
  130. }
  131. if let minAmount = Double(walletTransferLimitMin), let maxAmount = Double(walletTransferLimitMax) {
  132. if Double(amount)! > maxAmount || Double(amount)! < minAmount {
  133. return .InValid("Amount does not fall between min-max limit")
  134. } else {
  135. return .Valid
  136. }
  137. } else {
  138. return .InValid("Wallet min and max are non numeric")
  139. }
  140. }
  141. /**
  142. Wallet transfer request detail
  143. - parameter password: String
  144. - parameter moneyRequestAccepted: Bool
  145. */
  146. func getRequestParameter(password: String, moneyRequestAccepted: Bool) -> [String: String] {
  147. parameters.removeAll()
  148. if moneyRequestAccepted {
  149. parameters["userId"] = user_id
  150. parameters["transferType"] = self.mode
  151. parameters["transactionId"] = self.transactionID!
  152. parameters["txnPassword"] = password
  153. parameters["amount"] = self.amount
  154. } else {
  155. parameters["recipientId"] = self.gmeID
  156. parameters["amount"] = self.amount
  157. parameters["reason"] = self.message
  158. parameters["transferType"] = self.mode
  159. parameters["txnPassword"] = password
  160. parameters["userId"] = user_id
  161. }
  162. return parameters
  163. }
  164. }
  165. extension WalletViewModel {
  166. /**
  167. Api request for transaction Detail
  168. */
  169. func getTransactionInfo() {
  170. if !Reachability.isConnectedToNetwork() {
  171. self.internetConnection.value = false
  172. } else {
  173. RestApiMananger.sharedInstance.getTransactionInfo(param: ["countryId": "", "payoutMethodId": ""]) { result in
  174. switch result {
  175. case let .success(transactionInfoJSON):
  176. self.walletTransferLimitMax = transactionInfoJSON["maximumTransferAmountWallet"].rawValue as! String
  177. self.walletTransferLimitMin = transactionInfoJSON["minimumTransferAmountWallet"].rawValue as! String
  178. self.walletLimitsFetched.value = true
  179. case let .failure(errorJSON):
  180. self.setErrorMessage(message: errorJSON["message"].stringValue)
  181. self.walletLimitsFetched.value = false
  182. case .updateAccessCode:
  183. RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id, password: self.getLoginPassword()) {
  184. result in
  185. if result != "Error"{
  186. let uuid = RestApiMananger.sharedInstance.getUUID()
  187. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  188. self.getTransactionInfo()
  189. }
  190. }
  191. case .logOutUser():
  192. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  193. self.anotherLogin.value = true
  194. case .timeOut:
  195. self.walletConnectionTimeOut.value = false
  196. }
  197. }
  198. }
  199. }
  200. /**
  201. Perform wallet action in review view page
  202. - parameter password: String
  203. - parameter moneyRequestAccepted: Bool
  204. */
  205. func performWalletAction(password: String, moneyRequestAccepted: Bool) {
  206. if !Reachability.isConnectedToNetwork() {
  207. self.internetConnection.value = false
  208. } else {
  209. let param = getRequestParameter(password: password, moneyRequestAccepted: moneyRequestAccepted)
  210. RestApiMananger.sharedInstance.performWalletAction(param: param, moneyRequestAccepted: moneyRequestAccepted) { result in
  211. switch result {
  212. case let .success(transferJSON):
  213. UserDefaults.standard.set(transferJSON["availableBalance"].stringValue, forKey: "com.gmeremit.balance")
  214. do {
  215. self.transaction = try JSONDecoder().decode(Transaction.self, from: transferJSON.rawData())
  216. } catch {
  217. self.walletActionPerformed.value = false
  218. }
  219. self.walletActionPerformed.value = true
  220. case let .failure(errorJSON):
  221. self.setErrorMessage(message: errorJSON["message"].stringValue)
  222. self.walletActionPerformed.value = false
  223. case .updateAccessCode:
  224. let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
  225. let uuid = RestApiMananger.sharedInstance.getUUID()
  226. RestApiMananger.sharedInstance.updateAccessCode(userId: userId!, password: self.getLoginPassword()) {
  227. result in
  228. if result != "Error" {
  229. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  230. self.performWalletAction(password: password, moneyRequestAccepted: moneyRequestAccepted)
  231. }
  232. }
  233. case .logOutUser():
  234. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  235. self.anotherLogin.value = true
  236. case .timeOut:
  237. self.walletConnectionTimeOut.value = false
  238. }
  239. }
  240. }
  241. }
  242. }