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.

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