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.

348 lines
14 KiB

6 years ago
  1. //
  2. // TransactionViewModel.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 1/5/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. class TransactionViewModel: ModelExtension {
  10. var exchangeRateAvailable: Box<Bool?> = Box(nil)
  11. var transactionInfoAvailable: Box<Bool?> = Box(nil)
  12. var currencyInfoAvailable: Box<Bool?> = Box(nil)
  13. var countryInfoAvailable: Box<Bool?> = Box(nil)
  14. var transactionViewConnectionTimeOut: Box<Bool?> = Box(nil)
  15. private var exchangeRate: String?
  16. private var transferFee: String?
  17. private var transferLimit: Double = 0.0
  18. private var transactionLimit: Int = 0
  19. private var cAmt: String?
  20. private var pAmt: String?
  21. private var exchangeRateRefId: String?
  22. private var agentRefId: String?
  23. private var from: String?
  24. private var to: String?
  25. private var tAmount: String?
  26. private var rewardPoint: Int = 0
  27. private var transferDetails: [String: String] = [String: String]()
  28. private var minimumTransferAmountPerTransaction:String = "nil"
  29. var currencyArray = [Currency]()
  30. var countryArray = [AgentCountryList]()
  31. let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
  32. let sourceId = UserDefaults.standard.object(forKey: "com.gmeremit.sourceId") as? String
  33. /**
  34. To get exchange rate
  35. - parameter exchangeData: exchange rate info
  36. */
  37. func fetchExchangeRate(exchangeData: [String: Any]) {
  38. if !Reachability.isConnectedToNetwork() {
  39. self.internetConnection.value = false
  40. } else {
  41. RestApiMananger.sharedInstance.getExchangeRates(param: exchangeData) { result in
  42. switch result {
  43. case let .success(exchangeRateJSON):
  44. self.exchangeRate = exchangeRateJSON["currentRate"].stringValue
  45. self.transferFee = exchangeRateJSON["transferFee"].stringValue
  46. self.cAmt = exchangeRateJSON["cAmt"].stringValue
  47. self.pAmt = exchangeRateJSON["pAmt"].stringValue
  48. self.tAmount = exchangeRateJSON["tAmt"].stringValue
  49. self.exchangeRateRefId = exchangeRateJSON["exchangeRateRefId"].stringValue
  50. self.agentRefId = exchangeRateJSON["agentRefId"].stringValue
  51. self.from = exchangeRateJSON["from"].stringValue
  52. self.to = exchangeRateJSON["to"].stringValue
  53. self.rewardPoint = exchangeRateJSON["rewardPoint"].intValue
  54. self.exchangeRateAvailable.value = true
  55. case let .failure(errorJSON):
  56. self.setErrorMessage(message: errorJSON["message"].stringValue)
  57. self.exchangeRateAvailable.value = false
  58. case .updateAccessCode:
  59. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  60. result in
  61. if result != "Error"{
  62. let uuid = RestApiMananger.sharedInstance.getUUID()
  63. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  64. self.fetchExchangeRate(exchangeData: exchangeData)
  65. }
  66. }
  67. case .logOutUser():
  68. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  69. self.anotherLogin.value = true
  70. case .timeOut:
  71. self.transactionViewConnectionTimeOut.value = false
  72. }
  73. }
  74. }
  75. }
  76. /**
  77. To get transaction Information
  78. - parameter transactionInfo: transactionInfo (country id and paymethod id)
  79. */
  80. func fetchTransactionInfo(transactionInfo: [String: String]) {
  81. if !Reachability.isConnectedToNetwork() {
  82. self.internetConnection.value = false
  83. } else {
  84. RestApiMananger.sharedInstance.getTransactionInfo(param: transactionInfo) { result in
  85. switch result {
  86. case let .success(transactionInfoJSON):
  87. self.transferLimit = transactionInfoJSON["transferLimit"].doubleValue
  88. self.transactionLimit = transactionInfoJSON["transactionLimit"].intValue
  89. self.minimumTransferAmountPerTransaction = transactionInfoJSON["minimumTransferAmountPerTransaction"].stringValue
  90. self.transactionInfoAvailable.value = true
  91. case let .failure(errorJSON):
  92. self.setErrorMessage(message: errorJSON["message"].stringValue)
  93. self.transactionInfoAvailable.value = false
  94. case .updateAccessCode:
  95. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  96. result in
  97. if result != "Error"{
  98. let uuid = RestApiMananger.sharedInstance.getUUID()
  99. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  100. self.fetchTransactionInfo(transactionInfo: transactionInfo)
  101. }
  102. }
  103. case .logOutUser():
  104. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  105. self.anotherLogin.value = true
  106. case .timeOut:
  107. self.transactionViewConnectionTimeOut.value = false
  108. }
  109. }
  110. }
  111. }
  112. /**
  113. To get currency
  114. - parameter currencyInfo: currencyInfo (country id , payment method, payout locaiton id)
  115. */
  116. func fetchCurrency(currencyInfo: [String: String]){
  117. if !Reachability.isConnectedToNetwork() {
  118. self.internetConnection.value = false
  119. } else {
  120. RestApiMananger.sharedInstance.getCurrency(param: currencyInfo) { result in
  121. switch result {
  122. case let .success(currencyJSON):
  123. for i in 0 ... (currencyJSON.count-1) {
  124. do {
  125. let currencyDetail = try JSONDecoder().decode(Currency.self, from: currencyJSON[i].rawData())
  126. self.currencyArray.append(currencyDetail)
  127. } catch let err {
  128. self.setErrorMessage(message: err as! String)
  129. self.currencyInfoAvailable.value = false
  130. }
  131. }
  132. self.currencyInfoAvailable.value = true
  133. case let .failure(errorJSON):
  134. self.setErrorMessage(message: errorJSON["message"].stringValue)
  135. self.currencyInfoAvailable.value = false
  136. case .updateAccessCode:
  137. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  138. result in
  139. if result != "Error"{
  140. let uuid = RestApiMananger.sharedInstance.getUUID()
  141. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  142. self.fetchCurrency(currencyInfo: currencyInfo)
  143. }
  144. }
  145. case .logOutUser():
  146. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  147. self.anotherLogin.value = true
  148. case .timeOut:
  149. self.transactionViewConnectionTimeOut.value = false
  150. }
  151. }
  152. }
  153. }
  154. /**
  155. To get a country detail
  156. - parameter countryId: country id
  157. */
  158. func fetchCountry(countryId: String){
  159. if !Reachability.isConnectedToNetwork() {
  160. self.internetConnection.value = false
  161. } else {
  162. RestApiMananger.sharedInstance.getCountryInfo(countryId: countryId) { result in
  163. switch result {
  164. case let .success(countryJSON):
  165. for i in 0 ... (countryJSON.count-1) {
  166. do {
  167. let countryDetail = try JSONDecoder().decode(AgentCountryList.self, from: countryJSON[i].rawData())
  168. self.countryArray.append(countryDetail)
  169. } catch {
  170. self.countryInfoAvailable.value = false
  171. }
  172. }
  173. self.countryInfoAvailable.value = true
  174. case let .failure(errorJSON):
  175. self.setErrorMessage(message: errorJSON["message"].stringValue)
  176. self.countryInfoAvailable.value = false
  177. case .updateAccessCode:
  178. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  179. result in
  180. if result != "Error"{
  181. let uuid = RestApiMananger.sharedInstance.getUUID()
  182. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  183. self.fetchCountry(countryId: countryId)
  184. }
  185. }
  186. case .logOutUser():
  187. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  188. self.anotherLogin.value = true
  189. case .timeOut:
  190. self.transactionViewConnectionTimeOut.value = false
  191. }
  192. }
  193. }
  194. }
  195. /**
  196. To get currency list
  197. - returns: list of currency
  198. */
  199. func getCurrencyArray() -> [Currency]{
  200. return currencyArray
  201. }
  202. /**
  203. To get country list
  204. - returns: list of currency
  205. */
  206. func getCountryDetail() -> [AgentCountryList]{
  207. return countryArray
  208. }
  209. /**
  210. To set transfer details
  211. - parameter transferDetails: transferDetails information
  212. */
  213. func setTransferDetails(transferDetails: [String: String]) {
  214. self.transferDetails = transferDetails
  215. }
  216. /**
  217. To get transfer details
  218. - parameter recipient: recipient info
  219. - parameter paymentMethodId: payment method id
  220. - parameter calcBy: calculate by
  221. - returns: transferDetails
  222. */
  223. func getTransferDetails(recipient: Recipient, paymentMethodId: String, calcBy: String) -> [String: String] {
  224. transferDetails["sourceId"] = sourceId
  225. transferDetails["from"] = from
  226. transferDetails["to"] = to
  227. transferDetails["reasonId"] = recipient.reasonId
  228. transferDetails["recipientId"] = recipient.recipientId
  229. transferDetails["payoutMethodId"] = paymentMethodId
  230. transferDetails["exRate"] = exchangeRate
  231. transferDetails["calcBy"] = calcBy
  232. transferDetails["transferFee"] = transferFee
  233. transferDetails["cAmount"] = cAmt
  234. transferDetails["pAmount"] = pAmt
  235. transferDetails["tAmount"] = tAmount
  236. transferDetails["userId"] = userId
  237. transferDetails["agentRefId"] = agentRefId
  238. transferDetails["countryId"] = recipient.countryId
  239. return transferDetails
  240. }
  241. /**
  242. To get transfer details for home delivery
  243. - parameter recipient: recipient info
  244. - parameter paymentMethodId: payment method id
  245. - parameter calcBy: calculate by
  246. - returns: transferDetails
  247. */
  248. func getTransferDetailsForHomeDelivery(recipient: Recipient, paymentMethodId: String, calcBy: String, homeDetails: [String: String]) -> [String: String] {
  249. transferDetails["sourceId"] = sourceId
  250. transferDetails["from"] = from
  251. transferDetails["to"] = to
  252. transferDetails["reasonId"] = recipient.reasonId
  253. transferDetails["recipientId"] = recipient.recipientId
  254. transferDetails["payoutMethodId"] = paymentMethodId
  255. transferDetails["exRate"] = exchangeRate
  256. transferDetails["calcBy"] = calcBy
  257. transferDetails["transferFee"] = transferFee
  258. transferDetails["cAmount"] = cAmt
  259. transferDetails["pAmount"] = pAmt
  260. transferDetails["tAmount"] = tAmount
  261. transferDetails["userId"] = userId
  262. transferDetails["agentRefId"] = agentRefId
  263. transferDetails["countryId"] = recipient.countryId
  264. /// stateid is send as body
  265. transferDetails["updatedState"] = homeDetails["stateId"]
  266. /// to dispaly state name in view
  267. transferDetails["updatedStateId"] = homeDetails["state"]
  268. /// districtid is send as body
  269. transferDetails["updatedDistrict"] = homeDetails["districtId"]
  270. /// to display district name in view
  271. transferDetails["updatedDistrictId"] = homeDetails["district"]
  272. transferDetails["updatedCity"] = homeDetails["city"]
  273. transferDetails["updatedAddress"] = homeDetails["address"]
  274. return transferDetails
  275. }
  276. /**
  277. To get minimun transfer amount per transaction
  278. - returns: amount
  279. */
  280. func getMinimumTransferAmountPerTransaction() -> String{
  281. if minimumTransferAmountPerTransaction != "nil"{
  282. return self.minimumTransferAmountPerTransaction
  283. }
  284. return minimumTransferAmountPerTransaction
  285. }
  286. /// - returns: exchange rate
  287. func getExchangeRate() -> String {
  288. return exchangeRate ?? "0.0"
  289. }
  290. /// - returns: transfer fee
  291. func getTransferFee() -> String {
  292. return transferFee ?? "0.0"
  293. }
  294. /// - returns: transfer limit
  295. func getTransferLimit() -> Double {
  296. return transferLimit
  297. }
  298. /// - returns: transaction limit
  299. func getTransactionLimit() -> Int{
  300. return transactionLimit
  301. }
  302. /// - returns: reward point
  303. func getRewardPoint() -> Int {
  304. return rewardPoint
  305. }
  306. /// - returns: collection Amount
  307. func getcAmt() -> String {
  308. return cAmt ?? "0.0"
  309. }
  310. /// - returns: payment Amount
  311. func getpAmt() -> String {
  312. return pAmt ?? "0.0"
  313. }
  314. }