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.

438 lines
17 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. //
  2. // SendMoneyPaymentModeViewController.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 28/08/2018.
  6. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import UIKit
  9. class SendMoneyPaymentModeViewController: UIViewController {
  10. struct Constants {
  11. static let validationBankKey = "Bank"
  12. static let validationBranchKey = "Branch"
  13. static let validationAccountKey = "Account Number"
  14. static let validationErrorMessageBank = "Please select a bank"
  15. static let validationErrorMessageBranch = "Please select a branch"
  16. static let validationErrorMessageAccountNumber = "Please provide an account no"
  17. }
  18. // MARK: IBOutlets
  19. @IBOutlet weak var collectionView: UICollectionView!
  20. @IBOutlet weak var titleLabel: UILabel!
  21. @IBOutlet weak var bankStackView: UIStackView!
  22. @IBOutlet weak var branchStackView: UIStackView!
  23. @IBOutlet weak var countinueButton: UIButton!
  24. @IBOutlet weak var accountNumberStackView: UIStackView!
  25. @IBOutlet weak var accountTextField: UITextField!
  26. @IBOutlet weak var bankStackViewConstraint: NSLayoutConstraint!
  27. @IBOutlet weak var branchStackViewConstraint: NSLayoutConstraint!
  28. @IBOutlet weak var accountNumberStackViewConstraint: NSLayoutConstraint!
  29. @IBOutlet weak var branchTextField: UITextField!
  30. @IBOutlet weak var bankTextField: UITextField!
  31. // MARK: Properties
  32. var presenter: SendMoneyPaymentModeModuleInterface?
  33. var recipient: Recipient?
  34. var hudDelegate: HUDStatusDelegate?
  35. var actionDelegate: SendMoneyPaymentModeActionDelegate?
  36. var payoutMode: [SendMoneyPayoutMode]? {
  37. didSet {
  38. self.collectionView.reloadData()
  39. self.selectedPaymentIndex = IndexPath.init(row: 0, section: 0)
  40. }
  41. }
  42. var selectedPaymentIndex: IndexPath = IndexPath.init(row: 0, section: 0) {
  43. didSet {
  44. self.selectedPayoutMode = self.payoutMode?.elementAt(index: self.selectedPaymentIndex.row)
  45. }
  46. }
  47. var selectedPayoutMode: SendMoneyPayoutMode? {
  48. didSet {
  49. self.accountTextField.text = ""
  50. self.bankTextField.text = ""
  51. self.branchTextField.text = ""
  52. // self.bankStackView.isHidden = true
  53. self.bankStackViewConstraint.constant = 0
  54. // self.branchStackView.isHidden = true
  55. self.branchStackViewConstraint.constant = 0
  56. // self.accountNumberStackView.isHidden = true
  57. self.accountNumberStackViewConstraint.constant = 0
  58. self.bankStackView.alpha = 0
  59. self.branchStackView.alpha = 0
  60. self.accountNumberStackView.alpha = 0
  61. if (self.selectedPayoutMode?.bankRequired ?? "false").lowercased() == "true" {
  62. // self.bankStackView.isHidden = false
  63. UIView.animate(withDuration: 0.33) {
  64. self.bankStackViewConstraint.constant = 44
  65. self.bankStackView.alpha = 1
  66. }
  67. }else {
  68. }
  69. collectionView.reloadData()
  70. }
  71. }
  72. var selectedBank: SendMoneyBank? {
  73. didSet {
  74. self.bankTextField.text = selectedBank?.name
  75. let shouldShowBranch = (self.selectedBank?.branchRequired ?? "false").lowercased() == "true"
  76. // self.branchStackView.isHidden = !shouldShowBranch
  77. if shouldShowBranch {
  78. UIView.animate(withDuration: 0.33) {
  79. self.branchStackViewConstraint.constant = 44
  80. self.branchStackView.alpha = 1
  81. }
  82. }else {
  83. UIView.animate(withDuration: 0.33) {
  84. self.branchStackViewConstraint.constant = 0
  85. self.branchStackView.alpha = 0
  86. }
  87. }
  88. let shouldShowAccountNumber = (self.selectedBank?.accountRequired ?? "false").lowercased() == "true"
  89. if shouldShowAccountNumber {
  90. UIView.animate(withDuration: 0.33) {
  91. self.accountNumberStackViewConstraint.constant = 44
  92. self.accountNumberStackView.alpha = 1
  93. }
  94. }else {
  95. UIView.animate(withDuration: 0.33) {
  96. self.accountNumberStackViewConstraint.constant = 0
  97. self.accountNumberStackView.alpha = 0
  98. }
  99. }
  100. }
  101. }
  102. var selectedBranch: SendMoneyBankBranch? {
  103. didSet {
  104. self.branchTextField.text = selectedBranch?.name
  105. }
  106. }
  107. // MARK: VC's Life cycle
  108. override func viewDidLoad() {
  109. super.viewDidLoad()
  110. self.setup()
  111. if let reciepient = self.recipient {
  112. self.presenter?.viewIsReady(for: reciepient)
  113. }
  114. }
  115. // MARK: IBActions
  116. @IBAction func _continue(_ sender: UIButton) {
  117. // these validation should be in interactor, but since it is only empty validation and the time constraint is very tight, I am putting these in here for now.
  118. // if bank validate bank, if branch validate branch if account validate account
  119. var shouldGoNextPage = true
  120. var callingApi = false
  121. var errors = ""
  122. if self.selectedPayoutMode == nil {
  123. self.show(error: "please select Payment mode")
  124. return
  125. }
  126. if shouldValidateBank() {
  127. let bank = bankTextField.text!
  128. if bank.isEmpty {
  129. shouldGoNextPage = false
  130. errors = errors + " " + Constants.validationErrorMessageBank
  131. }else {
  132. if shouldValidateBranch() {
  133. let branch = self.branchTextField.text!
  134. if branch.isEmpty {
  135. shouldGoNextPage = false
  136. errors = errors + " " + Constants.validationErrorMessageBranch
  137. }
  138. }
  139. let shouldShowAccountNumber = (self.selectedBank?.accountRequired ?? "false").lowercased() == "true"
  140. if shouldShowAccountNumber {
  141. let accountNumber = self.accountTextField.text!
  142. if accountNumber.isEmpty {
  143. shouldGoNextPage = false
  144. errors = errors + " " + Constants.validationErrorMessageAccountNumber
  145. }
  146. }
  147. if shouldValidateAccount() {
  148. let accountNumber = self.accountTextField.text!
  149. if accountNumber.isEmpty {
  150. shouldGoNextPage = false
  151. errors = errors + " " + Constants.validationErrorMessageAccountNumber
  152. }else {
  153. let validationRequest = SendMoneyAccountValidationRequestModel()
  154. validationRequest.idType = "1"
  155. validationRequest.idNumber = ""
  156. validationRequest.customerFirstName = ""
  157. validationRequest.customerLastName = ""
  158. validationRequest.reciverFirstName = self.recipient?.firstName
  159. validationRequest.reciverLastName = self.recipient?.lastName
  160. validationRequest.country = self.recipient?.countryCode
  161. validationRequest.accountType = "1" // saving account, current account type ko
  162. validationRequest.issuerCode = self.selectedBank?.code
  163. validationRequest.accountNo = self.accountTextField.text!
  164. validationRequest.bankCode = self.selectedBank?.code
  165. validationRequest.payoutPartner = self.selectedPayoutMode?.payoutPartner
  166. validationRequest.amount = "10000.0"
  167. validationRequest.processId = ""
  168. callingApi = true
  169. self.presenter?.validate(model: validationRequest)
  170. }
  171. }
  172. }
  173. }
  174. if !callingApi {
  175. if shouldGoNextPage {
  176. proceedToNextPage()
  177. }else {
  178. self.show(error: errors)
  179. }
  180. }
  181. }
  182. // MARK: Other Functions
  183. private func setup() {
  184. // all setup should be done here
  185. setupDelegates()
  186. configureViews()
  187. configureTitle()
  188. }
  189. private func configureViews() {
  190. self.selectedPaymentIndex = IndexPath.init(row: 0, section: 0)
  191. self.view.layer.cornerRadius = 8
  192. self.countinueButton.rounded()
  193. DispatchQueue.main.async {
  194. self.bankStackView.alpha = 0
  195. self.branchStackView.alpha = 0
  196. self.accountNumberStackView.alpha = 0
  197. self.bankStackViewConstraint.constant = 0
  198. self.branchStackViewConstraint.constant = 0
  199. self.accountNumberStackViewConstraint.constant = 0
  200. // self.bankStackView.isHidden = true
  201. // self.branchStackView.isHidden = true
  202. // self.accountNumberStackView.isHidden = true
  203. }
  204. }
  205. private func configureTitle() {
  206. if let country = self.recipient?.country {
  207. self.titleLabel.text = "How would you like to pick your money in \(country)?"
  208. }
  209. }
  210. private func goToExchangeView() {
  211. self.actionDelegate?.continueToExchangeAction()
  212. }
  213. private func shouldValidateAccount() -> Bool {
  214. // return true
  215. return (self.selectedBank?.accountValidationRequired ?? "false").lowercased() == "true"
  216. }
  217. private func shouldValidateBank() -> Bool {
  218. return (self.selectedPayoutMode?.bankRequired ?? "false").lowercased() == "true"
  219. }
  220. private func shouldValidateBranch() -> Bool {
  221. return (self.selectedBank?.branchRequired ?? "false").lowercased() == "true"
  222. }
  223. private func setupDelegates() {
  224. self.bankTextField.delegate = self
  225. self.branchTextField.delegate = self
  226. self.collectionView.delegate = self
  227. self.collectionView.dataSource = self
  228. }
  229. private func showBankPickerView() {
  230. let viewcontroller = self.getPickerViewController()
  231. let banks = self.selectedPayoutMode?.bankList ?? []
  232. viewcontroller.data = banks
  233. viewcontroller.type = PickerTitle.bank
  234. viewcontroller.doneAction = self.bankSelected
  235. self.present(viewcontroller, animated: true, completion: nil)
  236. }
  237. private func showBranchPickerView() {
  238. let viewcontroller = self.getBankBranchPickerViewController()
  239. // let branches = self.selectedBank?.branches ?? []
  240. // viewcontroller.data = branches
  241. viewcontroller.type = PickerTitle.branch
  242. viewcontroller.countryCode = self.recipient?.countryCode ?? ""
  243. viewcontroller.bankId = self.selectedBank?.id ?? ""
  244. viewcontroller.doneAction = self.branchSelected
  245. viewcontroller.defaultSelectedData = [self.selectedBranch]
  246. self.present(viewcontroller, animated: true, completion: nil)
  247. }
  248. func branchSelected(branches: [SendMoneyBankBranch?]) {
  249. if let data = branches.first {
  250. self.selectedBranch = data
  251. }
  252. }
  253. func bankSelected(banks: [SendMoneyBank?]) {
  254. if let data = banks.first {
  255. self.selectedBank = data
  256. }
  257. }
  258. private func proceedToNextPage() {
  259. self.selectedPayoutMode?.accountNumber = self.accountTextField.text
  260. self.actionDelegate?.selected(payoutMethod: self.selectedPayoutMode)
  261. if shouldValidateBank() { self.actionDelegate?.selected(bank: self.selectedBank) }
  262. if shouldValidateBranch() { self.actionDelegate?.selected(branch: self.selectedBranch) }
  263. if shouldValidateAccount() { self.actionDelegate?.added(acountNumber: accountTextField.text!) }
  264. self.goToExchangeView()
  265. }
  266. private func getPickerViewController()-> BankPickerViewController {
  267. return UIStoryboard.init(name: "BankPicker", bundle: nil).instantiateViewController(withIdentifier: "BankPickerViewController") as! BankPickerViewController
  268. }
  269. private func getBankBranchPickerViewController()-> BankBranchPickerViewController {
  270. return UIStoryboard.init(name: "BankBranchPicker", bundle: nil).instantiateViewController(withIdentifier: "BankBranchPickerViewController") as! BankBranchPickerViewController
  271. }
  272. }
  273. extension SendMoneyPaymentModeViewController: UICollectionViewDelegate {
  274. func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
  275. if selectedPaymentIndex != indexPath {
  276. self.selectedPaymentIndex = indexPath
  277. self.selectedPayoutMode = self.payoutMode?.elementAt(index: indexPath.row)
  278. }
  279. }
  280. }
  281. extension SendMoneyPaymentModeViewController: UICollectionViewDataSource {
  282. func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  283. return self.payoutMode?.count ?? 0
  284. }
  285. func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  286. let paymentMode = self.payoutMode?.elementAt(index: indexPath.row)
  287. guard let index = PaymentMode.init(rawValue: paymentMode?.id ?? "") else {
  288. let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SendMoenyPaymentModeCollectionViewCell", for: indexPath) as! SendMoenyPaymentModeCollectionViewCell
  289. cell.image = #imageLiteral(resourceName: "ic_cash")
  290. cell.cellSelected = indexPath == self.selectedPaymentIndex
  291. cell.setup()
  292. return cell
  293. }
  294. switch index {
  295. case .bankDeposite:
  296. return configureBankDepositeCell(collectionView: collectionView, indexPath: indexPath)
  297. case .cashDelivery:
  298. return configureCashDeliveryCell(collectionView: collectionView, indexPath: indexPath)
  299. case .homeDelivery:
  300. return configureHomeDeliveryCell(collectionView: collectionView, indexPath: indexPath)
  301. case .mobileWallet:
  302. return configureWalletDeliveryCell(collectionView: collectionView, indexPath: indexPath)
  303. }
  304. }
  305. func configureBankDepositeCell(collectionView: UICollectionView, indexPath: IndexPath) -> UICollectionViewCell {
  306. let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SendMoenyPaymentModeCollectionViewCell", for: indexPath) as! SendMoenyPaymentModeCollectionViewCell
  307. cell.cellSelected = self.selectedPaymentIndex == indexPath
  308. cell.paymentServiceMethod = self.payoutMode?.elementAt(index: indexPath.row)
  309. cell.image = #imageLiteral(resourceName: "ic_bank")
  310. cell.setup()
  311. return cell
  312. }
  313. func configureWalletDeliveryCell(collectionView: UICollectionView, indexPath: IndexPath) -> UICollectionViewCell {
  314. let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SendMoenyPaymentModeCollectionViewCell", for: indexPath) as! SendMoenyPaymentModeCollectionViewCell
  315. cell.cellSelected = self.selectedPaymentIndex == indexPath
  316. cell.paymentServiceMethod = self.payoutMode?.elementAt(index: indexPath.row)
  317. cell.image = #imageLiteral(resourceName: "wallet-transfer")
  318. cell.setup()
  319. return cell
  320. }
  321. func configureCashDeliveryCell(collectionView: UICollectionView, indexPath: IndexPath) -> UICollectionViewCell {
  322. let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SendMoenyPaymentModeCollectionViewCell", for: indexPath) as! SendMoenyPaymentModeCollectionViewCell
  323. cell.cellSelected = self.selectedPaymentIndex == indexPath
  324. cell.paymentServiceMethod = self.payoutMode?.elementAt(index: indexPath.row)
  325. cell.image = #imageLiteral(resourceName: "ic_cash")
  326. cell.setup()
  327. return cell
  328. }
  329. func configureHomeDeliveryCell(collectionView: UICollectionView, indexPath: IndexPath) -> UICollectionViewCell {
  330. let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SendMoenyPaymentModeCollectionViewCell", for: indexPath) as! SendMoenyPaymentModeCollectionViewCell
  331. cell.cellSelected = self.selectedPaymentIndex == indexPath
  332. cell.paymentServiceMethod = self.payoutMode?.elementAt(index: indexPath.row)
  333. cell.image = #imageLiteral(resourceName: "ic_homeDelivery")
  334. cell.setup()
  335. return cell
  336. }
  337. }
  338. // MARK: SendMoneyPaymentModeViewInterface
  339. extension SendMoneyPaymentModeViewController: SendMoneyPaymentModeViewInterface {
  340. func success() {
  341. self.proceedToNextPage()
  342. }
  343. func show(model: [SendMoneyPayoutMode]) {
  344. self.payoutMode = model
  345. }
  346. func show(error: String) {
  347. self.alert(message: error)
  348. }
  349. func showLoading() {
  350. self.hudDelegate?.showLoading()
  351. }
  352. func hideLoading() {
  353. self.hudDelegate?.hideLoading()
  354. }
  355. }
  356. extension SendMoneyPaymentModeViewController: UITextFieldDelegate {
  357. func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  358. switch textField {
  359. case bankTextField:
  360. self.showBankPickerView()
  361. return false
  362. case branchTextField:
  363. self.showBranchPickerView()
  364. return false
  365. default:
  366. return true
  367. }
  368. }
  369. }