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

6 years ago
  1. //
  2. // PaymentViewModel.swift
  3. // GMERemittance
  4. //
  5. // Created by Sujal on 1/18/18.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. import SwiftyJSON
  10. class PaymentMethodViewModel: ModelExtension {
  11. var payoutMethodType: Box<Bool?> = Box(nil)
  12. var payoutBankAvailable: Box<Bool?> = Box(nil)
  13. var payoutBankBranchAvailable: Box<Bool?> = Box(nil)
  14. var cddListAvailable: Box<Int?> = Box(nil)
  15. var paymentMethodConnectionTimeOut: Box<Bool?> = Box(nil)
  16. var accountNumber: String = String()
  17. var bankNames: [String] = [String] ()
  18. var bankIds: [String] = [String]()
  19. var branchNames: [String] = [String] ()
  20. var branchIds: [String] = [String] ()
  21. var cddStateList: [String] = [String]()
  22. var cddStateValueList: [String] = [String]()
  23. var cddDistrictList: [String] = [String]()
  24. var cddDistrictValueList: [String] = [String]()
  25. var payoutModeTypeArray = [PayoutMode]()
  26. var payoutCashArray = [AgentModel]()
  27. var payoutBankDetailArray = [AgentModel]()
  28. var payoutBankBranchArray = [BankBranch]()
  29. let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
  30. /**
  31. To update account number
  32. - parameter acNumber: Account number
  33. */
  34. func updateAccountNumber(acNumber: String) {
  35. accountNumber = acNumber
  36. }
  37. /**
  38. To get bank name
  39. - returns: bank name list
  40. */
  41. func getBankNames() -> [String] {
  42. return bankNames
  43. }
  44. /**
  45. To get bank branch name
  46. - returns: bank branch name list
  47. */
  48. func getBranchNames() -> [String] {
  49. return branchNames
  50. }
  51. /**
  52. To get a bank name
  53. - parameter index: position of bank in an array
  54. - returns: bank name
  55. */
  56. func getBankName(index: Int) -> String {
  57. return bankNames[index]
  58. }
  59. /**
  60. To get a bank id
  61. - parameter index: position of bank id in an array
  62. - returns: bank id
  63. */
  64. func getBankId(index: Int) -> String {
  65. return bankIds[index]
  66. }
  67. /**
  68. To get a bank branch name
  69. - parameter index: position of bank branch in an array
  70. - returns: bank branch name
  71. */
  72. func getBranchName(index: Int) -> String {
  73. return branchNames[index]
  74. }
  75. /**
  76. To get a bank branch id
  77. - parameter index: position of bank branch id in an array
  78. - returns: bank branchid
  79. */
  80. func getBranchId(index: Int) -> String {
  81. return branchIds[index]
  82. }
  83. /**
  84. To get payout method
  85. - returns: payout mode
  86. */
  87. func getPayoutMethodArray() -> [PayoutMode] {
  88. return payoutModeTypeArray
  89. }
  90. /**
  91. To get state list
  92. - returns: state list
  93. */
  94. func getStateList() -> [String] {
  95. return cddStateList
  96. }
  97. /**
  98. To get list of state id
  99. - returns: state id list
  100. */
  101. func getStateValueList() -> [String] {
  102. return cddStateValueList
  103. }
  104. /**
  105. To get a state
  106. - parameter index: position of state in an array
  107. - returns: state
  108. */
  109. func getState(index: Int) -> String {
  110. return cddStateList[index]
  111. }
  112. /**
  113. To get a state id
  114. - parameter index: position of state id in an array
  115. - returns: state id
  116. */
  117. func getStateValue(index: Int) -> String {
  118. return cddStateValueList[index]
  119. }
  120. /**
  121. To get list of district
  122. - returns: district list
  123. */
  124. func getDistrictList() -> [String] {
  125. return cddDistrictList
  126. }
  127. /**
  128. To get list of district id
  129. - returns: district id list
  130. */
  131. func getDistrictValueList() -> [String] {
  132. return cddDistrictValueList
  133. }
  134. /**
  135. To get a district
  136. - parameter index: position of a district in an array
  137. - returns: district
  138. */
  139. func getDistrict(index: Int) -> String {
  140. return cddDistrictList[index]
  141. }
  142. /**
  143. To get a district id
  144. - parameter index: position of a district id in an array
  145. - returns: district id
  146. */
  147. func getDistrictValue(index: Int) -> String {
  148. return cddDistrictValueList[index]
  149. }
  150. /**
  151. To get Banks detail information
  152. - returns: list of Agents with detail information each
  153. */
  154. func getPayoutBankDetailArray() -> [AgentModel] {
  155. return payoutBankDetailArray
  156. }
  157. /**
  158. To get Bank branchs detail information
  159. - returns: list of Agent branchs with detail information each
  160. */
  161. func getPayoutBankBranchArray() -> [BankBranch] {
  162. return payoutBankBranchArray
  163. }
  164. /**
  165. To get Agents detail information
  166. - returns: list of Agents with detail information each
  167. */
  168. func getPayoutCashArray() -> [AgentModel]{
  169. return payoutCashArray
  170. }
  171. /**
  172. To get transfer detail information
  173. - parameter bankIdReferenceValue: position of bank id in an array
  174. - parameter branchIdReferenceValue: position of bank branch id in an array
  175. - returns: transfer details
  176. */
  177. func getTransferDetails(bankIdReferenceValue: Int, branchIdReferenceValue: Int) -> [String: String] {
  178. let transferDetails: [String: String] = ["bankId": getBankId(index: bankIdReferenceValue),
  179. "bankName": getBankName(index: bankIdReferenceValue),
  180. "branchId": getBranchId(index: branchIdReferenceValue),
  181. "branchName": getBranchName(index: branchIdReferenceValue),
  182. "accountNumber": accountNumber]
  183. return transferDetails
  184. }
  185. /**
  186. To get a country payout mode i.e cash , bank or home delivery
  187. - Parameter country id: counrty id of selected country
  188. */
  189. func fetchCountryPayoutMode(countryId: String) {
  190. if !Reachability.isConnectedToNetwork() {
  191. self.internetConnection.value = false
  192. } else {
  193. self.payoutModeTypeArray.removeAll()
  194. RestApiMananger.sharedInstance.getCountryPayoutMode(countryId: countryId) { result in
  195. switch result {
  196. case let .success(countryPayoutJSON):
  197. if countryPayoutJSON.count > 0{
  198. for i in 0 ... (countryPayoutJSON.count-1) {
  199. do {
  200. let payout = try JSONDecoder().decode(PayoutMode.self, from: countryPayoutJSON[i].rawData())
  201. self.payoutModeTypeArray.append(payout)
  202. } catch {
  203. self.payoutMethodType.value = false
  204. }
  205. }
  206. }
  207. self.payoutMethodType.value = true
  208. case let .failure(errorJSON):
  209. self.setErrorMessage(message: errorJSON["message"].stringValue)
  210. case .updateAccessCode:
  211. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  212. result in
  213. if result != "Error"{
  214. let uuid = RestApiMananger.sharedInstance.getUUID()
  215. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  216. self.fetchCountryPayoutMode(countryId: countryId)
  217. }
  218. }
  219. case .logOutUser():
  220. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  221. self.anotherLogin.value = true
  222. case .timeOut:
  223. self.paymentMethodConnectionTimeOut.value = false
  224. }
  225. }
  226. }
  227. }
  228. /**
  229. To get bank detail with payout mode
  230. - parameter countryId: country id
  231. - parameter payoutMethodId: id of payout method
  232. */
  233. func fetchPayoutBankDetail(countryId: String,payoutMethodId: String){
  234. if payoutMethodId == "1" {
  235. payoutCashArray.removeAll()
  236. } else if payoutMethodId == "2" {
  237. payoutBankDetailArray.removeAll()
  238. }
  239. if !Reachability.isConnectedToNetwork() {
  240. self.internetConnection.value = false
  241. } else {
  242. RestApiMananger.sharedInstance.getPayoutBankDetail(countryId: countryId, payoutMethodId: payoutMethodId){
  243. result in
  244. switch result{
  245. case let .success(bankDetailJSON):
  246. guard bankDetailJSON.count > 0 else {
  247. return
  248. }
  249. self.setPayoutBankDetails(bankDetailJSON: bankDetailJSON, payoutMethodId: payoutMethodId)
  250. self.payoutBankAvailable.value = true
  251. case let .failure(errorJSON):
  252. self.setErrorMessage(message: errorJSON["message"].stringValue)
  253. self.payoutBankAvailable.value = false
  254. case .updateAccessCode:
  255. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  256. result in
  257. if result != "Error"{
  258. let uuid = RestApiMananger.sharedInstance.getUUID()
  259. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  260. self.fetchPayoutBankDetail(countryId: countryId, payoutMethodId: payoutMethodId )
  261. }
  262. }
  263. case .logOutUser():
  264. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  265. self.anotherLogin.value = true
  266. case .timeOut:
  267. self.paymentMethodConnectionTimeOut.value = false
  268. }
  269. }
  270. }
  271. }
  272. /// set up of payout bank detail
  273. func setPayoutBankDetails(bankDetailJSON: JSON,payoutMethodId: String ){
  274. if !bankDetailJSON.isEmpty {
  275. for i in 0 ... (bankDetailJSON.count-1) {
  276. do {
  277. let bankDetail = try JSONDecoder().decode(AgentModel.self, from: bankDetailJSON[i].rawData())
  278. if payoutMethodId == "1" {
  279. payoutCashArray.append(bankDetail)
  280. } else if payoutMethodId == "2"{
  281. payoutBankDetailArray.append(bankDetail)
  282. }
  283. } catch let err {
  284. self.setErrorMessage(message: err as! String)
  285. self.payoutBankAvailable.value = false
  286. }
  287. }
  288. }
  289. }
  290. /**
  291. To get bank branch detail with payout mode
  292. - parameter countryId: country id
  293. - parameter payoutId: id of payout ie.bank payout id
  294. */
  295. func fetchPayoutBankBranchDetail(countryId: String, payoutId: String ){
  296. payoutBankBranchArray.removeAll()
  297. if !Reachability.isConnectedToNetwork() {
  298. self.internetConnection.value = false
  299. } else {
  300. RestApiMananger.sharedInstance.getPayoutBankBranchDetail(countryId: countryId, payoutId: payoutId){
  301. result in
  302. switch result{
  303. case let .success(bankBranchDetailJSON):
  304. guard bankBranchDetailJSON.count > 0 else {
  305. return
  306. }
  307. for i in 0 ... (bankBranchDetailJSON.count-1) {
  308. do {
  309. let bankBranchDetail = try JSONDecoder().decode(BankBranch.self, from: bankBranchDetailJSON[i].rawData())
  310. self.payoutBankBranchArray.append(bankBranchDetail)
  311. } catch let err {
  312. self.setErrorMessage(message: err as! String)
  313. self.payoutBankBranchAvailable.value = false
  314. }
  315. }
  316. self.payoutBankBranchAvailable.value = true
  317. case let .failure(errorJSON):
  318. self.setErrorMessage(message: errorJSON["message"].stringValue)
  319. self.payoutBankBranchAvailable.value = false
  320. case .updateAccessCode:
  321. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  322. result in
  323. if result != "Error"{
  324. let uuid = RestApiMananger.sharedInstance.getUUID()
  325. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  326. self.fetchPayoutBankBranchDetail(countryId: countryId, payoutId: payoutId)
  327. }
  328. }
  329. case .logOutUser():
  330. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  331. self.anotherLogin.value = true
  332. case .timeOut:
  333. self.paymentMethodConnectionTimeOut.value = false
  334. }
  335. }
  336. }
  337. }
  338. /**
  339. To get cdd list such as occupation , relation, state ect
  340. - parameter cddName: cddcode
  341. - parameter param: cdd info
  342. */
  343. func fetchCDDListFor(cddName: String, param: [String: String]) {
  344. if !Reachability.isConnectedToNetwork() {
  345. self.internetConnection.value = false
  346. } else {
  347. RestApiMananger.sharedInstance.getCDDListFor(cddCode: cddName, param: param) { result in
  348. switch result {
  349. case let .success(cddJSON):
  350. if cddName == cddCode.Province.rawValue {
  351. self.cddStateValueList.removeAll()
  352. self.cddStateList.removeAll()
  353. } else if cddName == cddCode.District.rawValue {
  354. self.cddDistrictList.removeAll()
  355. self.cddDistrictValueList.removeAll()
  356. }
  357. guard cddJSON.count > 0 else {
  358. return
  359. }
  360. for i in 0 ... (cddJSON.count-1) {
  361. do {
  362. let cddNameValuePair = try JSONDecoder().decode(Cdd.self, from: cddJSON[i].rawData())
  363. switch cddName {
  364. case cddCode.Province.rawValue:
  365. self.cddStateList.append(cddNameValuePair.name)
  366. self.cddStateValueList.append(cddNameValuePair.value)
  367. case cddCode.District.rawValue:
  368. self.cddDistrictList.append(cddNameValuePair.name)
  369. self.cddDistrictValueList.append(cddNameValuePair.value)
  370. default:
  371. return
  372. }
  373. } catch {
  374. self.setErrorMessage(message: "Error decoding JSON")
  375. break
  376. }
  377. }
  378. switch cddName {
  379. case cddCode.Province.rawValue:
  380. self.cddListAvailable.value = 2
  381. case cddCode.District.rawValue:
  382. self.cddListAvailable.value = 3
  383. default:
  384. return
  385. }
  386. case let .failure(errorJSON):
  387. self.setErrorMessage(message: errorJSON["message"].stringValue)
  388. self.cddListAvailable.value = 0
  389. case .updateAccessCode:
  390. RestApiMananger.sharedInstance.updateAccessCode(userId: self.userId!, password: self.getLoginPassword()) {
  391. result in
  392. if result != "Error"{
  393. let uuid = RestApiMananger.sharedInstance.getUUID()
  394. UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
  395. self.fetchCDDListFor(cddName: cddName, param: param)
  396. }
  397. }
  398. case .logOutUser():
  399. RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
  400. self.anotherLogin.value = true
  401. case .timeOut:
  402. self.paymentMethodConnectionTimeOut.value = false
  403. }
  404. }
  405. }
  406. }
  407. }