Browse Source

Domestic Remittance

pull/1/head
InKwon James Kim 5 years ago
parent
commit
fc3aaaf78e
  1. 326
      GME Remit.xcodeproj/project.pbxproj
  2. 16
      GME Remit/Extensions/UIImageView+Ext.swift
  3. 11
      GME Remit/Extensions/UIView+Ext.swift
  4. BIN
      GME Remit/Modules/.DS_Store
  5. 11
      GME Remit/Modules/AutoDebitModules/AddAccount/Application Logic/Model/KFTCBankList.swift
  6. 19
      GME Remit/Modules/Home/User Interface/View/Cell/HomeCollectionTableViewCell.swift
  7. 4
      GME Remit/Modules/Home/User Interface/View/Home.storyboard
  8. 40
      GME Remit/Modules/Home/User Interface/View/HomeViewController.swift
  9. 10
      GME Remit/Modules/RecipientModules/Recipients/Application Logic/Model/Account/AccountModel.swift
  10. 2
      GME Remit/Modules/RecipientModules/Recipients/User Interface/View/RecipientsViewController.swift
  11. 2
      GME Remit/Modules/RecipientModules/SetupRecipient/User Interface/View/SetupRecipientViewController.swift
  12. 44
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Interactor/DomesticRemitInteractor.swift
  13. 18
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Interactor/DomesticRemitInteractorIO.swift
  14. 26
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Model/DomesticRemitModel.swift
  15. 23
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Model/RecipientNameModel.swift
  16. 188
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Service/DomesticRemitService.swift
  17. 21
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Service/DomesticRemitServiceType.swift
  18. 13
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Module Interface/DomesticRemitModuleInterface.swift
  19. 75
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/Presenter/DomesticRemitPresenter.swift
  20. 491
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/DomesticRemit.storyboard
  21. 318
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/DomesticRemitViewController.swift
  22. 125
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/ViewModel/DomesticRemitViewModel.swift
  23. 16
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/ViewModel/DomesticRemitViewModelInterface.swift
  24. 89
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/Wireframe/DomesticRemitWireframe.swift
  25. 18
      GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/Wireframe/DomesticRemitWireframeInputOutput.swift
  26. 40
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Interactor/RecentHistoriesInteractor.swift
  27. 19
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Interactor/RecentHistoriesInteractorIO.swift
  28. 35
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Model/RecentRecipientModel.swift
  29. 73
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Service/RecentHistoriesService.swift
  30. 16
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Service/RecentHistoriesServiceType.swift
  31. 14
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Module Interface/RecentHistoriesModuleInterface.swift
  32. 44
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/Presenter/RecentHistoriesPresenter.swift
  33. 21
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/Cell/RecentRecipientCell.swift
  34. 196
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/RecentHistories.storyboard
  35. 128
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/RecentHistoriesViewController.swift
  36. 82
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/ViewModel/RecentHistoriesViewModel.swift
  37. 14
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/ViewModel/RecentHistoriesViewModelInterface.swift
  38. 50
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/Wireframe/RecentHistoriesWireframe.swift
  39. 17
      GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/Wireframe/RecentHistoriesWireframeInputOutput.swift
  40. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Interactor/PaymentSelectionInteractor.swift
  41. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Interactor/PaymentSelectionInteractorIO.swift
  42. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Service/PaymentSelectionService.swift
  43. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Service/PaymentSelectionServiceType.swift
  44. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Module Interface/PaymentSelectionModuleInterface.swift
  45. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/Presenter/PaymentSelectionPresenter.swift
  46. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/Cells/PaymentSelectionTableViewCell.swift
  47. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/PaymentSelection.storyboard
  48. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/PaymentSelectionViewController.swift
  49. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/PaymentSelectionViewInterface.swift
  50. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/Wireframe/PaymentSelectionWireframe.swift
  51. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/Wireframe/PaymentSelectionWireframeInput.swift
  52. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Interactor/ResendInteractor.swift
  53. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Interactor/ResendInteractorIO.swift
  54. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Service/ResendService.swift
  55. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Service/ResendServiceType.swift
  56. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Module Interface/ResendModuleInterface.swift
  57. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/Presenter/ResendPresenter.swift
  58. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/Cell/ResendTableViewCell.swift
  59. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/Resend.storyboard
  60. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/ResendViewController.swift
  61. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/ResendViewInterface.swift
  62. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/Wireframe/ResendWireframe.swift
  63. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/Wireframe/ResendWireframeInput.swift
  64. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Interactor/ResendExchangeInteractor.swift
  65. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Interactor/ResendExchangeInteractorIO.swift
  66. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Service/ResendExchangeService.swift
  67. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Service/ResendExchangeServiceType.swift
  68. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Module Interface/ResendExchangeModuleInterface.swift
  69. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/Presenter/ResendExchangePresenter.swift
  70. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/View/ResendExchange.storyboard
  71. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/View/ResendExchangeViewController.swift
  72. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/View/ResendExchangeViewInterface.swift
  73. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/Wireframe/ResendExchangeWireframe.swift
  74. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/Wireframe/ResendExchangeWireframeInput.swift
  75. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Interactor/SelectCouponInteractor.swift
  76. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Interactor/SelectCouponInteractorIO.swift
  77. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Service/SelectCouponService.swift
  78. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Service/SelectCouponServiceType.swift
  79. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Module Interface/SelectCouponModuleInterface.swift
  80. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/Presenter/SelectCouponPresenter.swift
  81. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/Cell/CouponCell.swift
  82. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/SelectCoupon.storyboard
  83. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/SelectCouponViewController.swift
  84. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/SelectCouponViewInterface.swift
  85. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/Wireframe/SelectCouponWireframe.swift
  86. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/Wireframe/SelectCouponWireframeInput.swift
  87. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Interactor/SelectPaymentInteractor.swift
  88. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Interactor/SelectPaymentInteractorIO.swift
  89. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Service/SelectPaymentService.swift
  90. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Service/SelectPaymentServiceType.swift
  91. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Module Interface/SelectPaymentModuleInterface.swift
  92. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/Presenter/SelectPaymentPresenter.swift
  93. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/Cell/PaymentCell.swift
  94. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/SelectPayment.storyboard
  95. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/SelectPaymentViewController.swift
  96. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/SelectPaymentViewInterface.swift
  97. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/Wireframe/SelectPaymentWireframe.swift
  98. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/Wireframe/SelectPaymentWireframeInput.swift
  99. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SendMoneyCode/Application Logic/Interactor/SendMoneyCodeInteractor.swift
  100. 0
      GME Remit/Modules/RemittanceModules/OverseasModules/SendMoneyCode/Application Logic/Interactor/SendMoneyCodeInteractorIO.swift

326
GME Remit.xcodeproj/project.pbxproj

@ -219,6 +219,9 @@
73195ABC22FD14D500151434 /* SetupRecipient.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 73195AB022FD14D400151434 /* SetupRecipient.storyboard */; };
73195ABD22FD14D500151434 /* SetupRecipientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73195AB122FD14D400151434 /* SetupRecipientViewController.swift */; };
73195B3522FD5BC600151434 /* APIRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73195B3422FD5BC600151434 /* APIRouter.swift */; };
73197D3D2330B2BF002C0F85 /* RecentRecipientCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73197D3C2330B2BF002C0F85 /* RecentRecipientCell.swift */; };
73197D3F2330B919002C0F85 /* RecentRecipientModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73197D3E2330B919002C0F85 /* RecentRecipientModel.swift */; };
73197D412330D207002C0F85 /* RecipientNameModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73197D402330D207002C0F85 /* RecipientNameModel.swift */; };
731AADEB230CC08F008BE38F /* ValidationTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731AADEA230CC08E008BE38F /* ValidationTextField.swift */; };
73210DA122FBE73100715D6C /* RecipientsModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73210D8E22FBE73100715D6C /* RecipientsModuleInterface.swift */; };
73210DA222FBE73100715D6C /* RecipientsService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73210D9222FBE73100715D6C /* RecipientsService.swift */; };
@ -291,6 +294,8 @@
738FD48C2303E157008B144D /* FieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738FD48B2303E157008B144D /* FieldModel.swift */; };
738FD48E2303F87D008B144D /* DynamicFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738FD48D2303F87D008B144D /* DynamicFieldModel.swift */; };
73927A90230BADA700B856D0 /* CountryAndServiceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73927A8F230BADA700B856D0 /* CountryAndServiceModel.swift */; };
73976D202331B4F4003CF5E1 /* UIImageView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73976D1F2331B4F4003CF5E1 /* UIImageView+Ext.swift */; };
73976D222331BFB1003CF5E1 /* BankEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73976D212331BFB1003CF5E1 /* BankEnum.swift */; };
739A7781228BB2B40018A1A9 /* DetailOrderModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 739A776E228BB2B30018A1A9 /* DetailOrderModuleInterface.swift */; };
739A7782228BB2B40018A1A9 /* DetailOrderService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 739A7772228BB2B40018A1A9 /* DetailOrderService.swift */; };
739A7783228BB2B40018A1A9 /* DetailOrderServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 739A7773228BB2B40018A1A9 /* DetailOrderServiceType.swift */; };
@ -302,6 +307,31 @@
739A7789228BB2B40018A1A9 /* DetailOrderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 739A777E228BB2B40018A1A9 /* DetailOrderViewController.swift */; };
739A778A228BB2B40018A1A9 /* DetailOrderViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 739A777F228BB2B40018A1A9 /* DetailOrderViewInterface.swift */; };
739A778B228BB2B40018A1A9 /* DetailOrder.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 739A7780228BB2B40018A1A9 /* DetailOrder.storyboard */; };
73A621382330742C000FFB5B /* DomesticRemitModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621232330742C000FFB5B /* DomesticRemitModuleInterface.swift */; };
73A621392330742C000FFB5B /* DomesticRemitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621272330742C000FFB5B /* DomesticRemitService.swift */; };
73A6213A2330742C000FFB5B /* DomesticRemitServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621282330742C000FFB5B /* DomesticRemitServiceType.swift */; };
73A6213B2330742C000FFB5B /* DomesticRemitInteractorIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6212A2330742C000FFB5B /* DomesticRemitInteractorIO.swift */; };
73A6213C2330742C000FFB5B /* DomesticRemitInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6212B2330742C000FFB5B /* DomesticRemitInteractor.swift */; };
73A6213D2330742C000FFB5B /* DomesticRemitPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6212E2330742C000FFB5B /* DomesticRemitPresenter.swift */; };
73A6213E2330742C000FFB5B /* DomesticRemitWireframeInputOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621302330742C000FFB5B /* DomesticRemitWireframeInputOutput.swift */; };
73A6213F2330742C000FFB5B /* DomesticRemitWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621312330742C000FFB5B /* DomesticRemitWireframe.swift */; };
73A621402330742C000FFB5B /* DomesticRemitViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621342330742C000FFB5B /* DomesticRemitViewModel.swift */; };
73A621412330742C000FFB5B /* DomesticRemitViewModelInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621352330742C000FFB5B /* DomesticRemitViewModelInterface.swift */; };
73A621422330742C000FFB5B /* DomesticRemitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621362330742C000FFB5B /* DomesticRemitViewController.swift */; };
73A621432330742C000FFB5B /* DomesticRemit.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 73A621372330742C000FFB5B /* DomesticRemit.storyboard */; };
73A62145233082D6000FFB5B /* DomesticRemitModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A62144233082D6000FFB5B /* DomesticRemitModel.swift */; };
73A6215F2330AD20000FFB5B /* RecentHistoriesModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6214A2330AD1F000FFB5B /* RecentHistoriesModuleInterface.swift */; };
73A621602330AD20000FFB5B /* RecentHistoriesServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6214E2330AD1F000FFB5B /* RecentHistoriesServiceType.swift */; };
73A621612330AD20000FFB5B /* RecentHistoriesService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6214F2330AD1F000FFB5B /* RecentHistoriesService.swift */; };
73A621622330AD20000FFB5B /* RecentHistoriesInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621512330AD1F000FFB5B /* RecentHistoriesInteractor.swift */; };
73A621632330AD20000FFB5B /* RecentHistoriesInteractorIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621522330AD1F000FFB5B /* RecentHistoriesInteractorIO.swift */; };
73A621642330AD20000FFB5B /* RecentHistoriesPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621552330AD1F000FFB5B /* RecentHistoriesPresenter.swift */; };
73A621652330AD20000FFB5B /* RecentHistoriesWireframeInputOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621572330AD1F000FFB5B /* RecentHistoriesWireframeInputOutput.swift */; };
73A621662330AD20000FFB5B /* RecentHistoriesWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A621582330AD1F000FFB5B /* RecentHistoriesWireframe.swift */; };
73A621672330AD20000FFB5B /* RecentHistoriesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6215B2330AD1F000FFB5B /* RecentHistoriesViewModel.swift */; };
73A621682330AD20000FFB5B /* RecentHistoriesViewModelInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6215C2330AD1F000FFB5B /* RecentHistoriesViewModelInterface.swift */; };
73A621692330AD20000FFB5B /* RecentHistories.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 73A6215D2330AD1F000FFB5B /* RecentHistories.storyboard */; };
73A6216A2330AD20000FFB5B /* RecentHistoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6215E2330AD1F000FFB5B /* RecentHistoriesViewController.swift */; };
73A6E20222CEE51600E9BC68 /* BadgeAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6E1FE22CEE51600E9BC68 /* BadgeAppearance.swift */; };
73A6E20322CEE51600E9BC68 /* UIBarButtonItem+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6E1FF22CEE51600E9BC68 /* UIBarButtonItem+Ext.swift */; };
73A6E20422CEE51600E9BC68 /* BadgeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A6E20022CEE51600E9BC68 /* BadgeLabel.swift */; };
@ -2442,6 +2472,9 @@
73195AB022FD14D400151434 /* SetupRecipient.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = SetupRecipient.storyboard; sourceTree = "<group>"; };
73195AB122FD14D400151434 /* SetupRecipientViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetupRecipientViewController.swift; sourceTree = "<group>"; };
73195B3422FD5BC600151434 /* APIRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRouter.swift; sourceTree = "<group>"; };
73197D3C2330B2BF002C0F85 /* RecentRecipientCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentRecipientCell.swift; sourceTree = "<group>"; };
73197D3E2330B919002C0F85 /* RecentRecipientModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentRecipientModel.swift; sourceTree = "<group>"; };
73197D402330D207002C0F85 /* RecipientNameModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientNameModel.swift; sourceTree = "<group>"; };
731AADEA230CC08E008BE38F /* ValidationTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationTextField.swift; sourceTree = "<group>"; };
73210D8E22FBE73100715D6C /* RecipientsModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecipientsModuleInterface.swift; sourceTree = "<group>"; };
73210D9222FBE73100715D6C /* RecipientsService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecipientsService.swift; sourceTree = "<group>"; };
@ -2514,6 +2547,8 @@
738FD48B2303E157008B144D /* FieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FieldModel.swift; sourceTree = "<group>"; };
738FD48D2303F87D008B144D /* DynamicFieldModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DynamicFieldModel.swift; sourceTree = "<group>"; };
73927A8F230BADA700B856D0 /* CountryAndServiceModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountryAndServiceModel.swift; sourceTree = "<group>"; };
73976D1F2331B4F4003CF5E1 /* UIImageView+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+Ext.swift"; sourceTree = "<group>"; };
73976D212331BFB1003CF5E1 /* BankEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BankEnum.swift; sourceTree = "<group>"; };
739A776E228BB2B30018A1A9 /* DetailOrderModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailOrderModuleInterface.swift; sourceTree = "<group>"; };
739A7772228BB2B40018A1A9 /* DetailOrderService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailOrderService.swift; sourceTree = "<group>"; };
739A7773228BB2B40018A1A9 /* DetailOrderServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailOrderServiceType.swift; sourceTree = "<group>"; };
@ -2525,6 +2560,31 @@
739A777E228BB2B40018A1A9 /* DetailOrderViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailOrderViewController.swift; sourceTree = "<group>"; };
739A777F228BB2B40018A1A9 /* DetailOrderViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailOrderViewInterface.swift; sourceTree = "<group>"; };
739A7780228BB2B40018A1A9 /* DetailOrder.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = DetailOrder.storyboard; sourceTree = "<group>"; };
73A621232330742C000FFB5B /* DomesticRemitModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitModuleInterface.swift; sourceTree = "<group>"; };
73A621272330742C000FFB5B /* DomesticRemitService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitService.swift; sourceTree = "<group>"; };
73A621282330742C000FFB5B /* DomesticRemitServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitServiceType.swift; sourceTree = "<group>"; };
73A6212A2330742C000FFB5B /* DomesticRemitInteractorIO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitInteractorIO.swift; sourceTree = "<group>"; };
73A6212B2330742C000FFB5B /* DomesticRemitInteractor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitInteractor.swift; sourceTree = "<group>"; };
73A6212E2330742C000FFB5B /* DomesticRemitPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitPresenter.swift; sourceTree = "<group>"; };
73A621302330742C000FFB5B /* DomesticRemitWireframeInputOutput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitWireframeInputOutput.swift; sourceTree = "<group>"; };
73A621312330742C000FFB5B /* DomesticRemitWireframe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitWireframe.swift; sourceTree = "<group>"; };
73A621342330742C000FFB5B /* DomesticRemitViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitViewModel.swift; sourceTree = "<group>"; };
73A621352330742C000FFB5B /* DomesticRemitViewModelInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitViewModelInterface.swift; sourceTree = "<group>"; };
73A621362330742C000FFB5B /* DomesticRemitViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomesticRemitViewController.swift; sourceTree = "<group>"; };
73A621372330742C000FFB5B /* DomesticRemit.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = DomesticRemit.storyboard; sourceTree = "<group>"; };
73A62144233082D6000FFB5B /* DomesticRemitModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticRemitModel.swift; sourceTree = "<group>"; };
73A6214A2330AD1F000FFB5B /* RecentHistoriesModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesModuleInterface.swift; sourceTree = "<group>"; };
73A6214E2330AD1F000FFB5B /* RecentHistoriesServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesServiceType.swift; sourceTree = "<group>"; };
73A6214F2330AD1F000FFB5B /* RecentHistoriesService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesService.swift; sourceTree = "<group>"; };
73A621512330AD1F000FFB5B /* RecentHistoriesInteractor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesInteractor.swift; sourceTree = "<group>"; };
73A621522330AD1F000FFB5B /* RecentHistoriesInteractorIO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesInteractorIO.swift; sourceTree = "<group>"; };
73A621552330AD1F000FFB5B /* RecentHistoriesPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesPresenter.swift; sourceTree = "<group>"; };
73A621572330AD1F000FFB5B /* RecentHistoriesWireframeInputOutput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesWireframeInputOutput.swift; sourceTree = "<group>"; };
73A621582330AD1F000FFB5B /* RecentHistoriesWireframe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesWireframe.swift; sourceTree = "<group>"; };
73A6215B2330AD1F000FFB5B /* RecentHistoriesViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesViewModel.swift; sourceTree = "<group>"; };
73A6215C2330AD1F000FFB5B /* RecentHistoriesViewModelInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesViewModelInterface.swift; sourceTree = "<group>"; };
73A6215D2330AD1F000FFB5B /* RecentHistories.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RecentHistories.storyboard; sourceTree = "<group>"; };
73A6215E2330AD1F000FFB5B /* RecentHistoriesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecentHistoriesViewController.swift; sourceTree = "<group>"; };
73A6E1FE22CEE51600E9BC68 /* BadgeAppearance.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BadgeAppearance.swift; sourceTree = "<group>"; };
73A6E1FF22CEE51600E9BC68 /* UIBarButtonItem+Ext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIBarButtonItem+Ext.swift"; sourceTree = "<group>"; };
73A6E20022CEE51600E9BC68 /* BadgeLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BadgeLabel.swift; sourceTree = "<group>"; };
@ -4625,6 +4685,7 @@
9FA00FBD1FEE69AF0049753E /* UIView+Ext.swift */,
0496B84C1FE7DFCC0044810E /* UIViewController+Ext.swift */,
736E3219230A3CC1005799AA /* UIDevice+Ext.swift */,
73976D1F2331B4F4003CF5E1 /* UIImageView+Ext.swift */,
);
path = Extensions;
sourceTree = "<group>";
@ -5878,6 +5939,14 @@
path = ViewModel;
sourceTree = "<group>";
};
73197D3B2330B2A3002C0F85 /* Cell */ = {
isa = PBXGroup;
children = (
73197D3C2330B2BF002C0F85 /* RecentRecipientCell.swift */,
);
path = Cell;
sourceTree = "<group>";
};
73210D8C22FBE73100715D6C /* Recipients */ = {
isa = PBXGroup;
children = (
@ -6432,6 +6501,226 @@
path = View;
sourceTree = "<group>";
};
73A6211E233073D2000FFB5B /* RemittanceModules */ = {
isa = PBXGroup;
children = (
73A6216B2330AD25000FFB5B /* DomesticModules */,
D946717B21426CBA003924DB /* OverseasModules */,
);
path = RemittanceModules;
sourceTree = "<group>";
};
73A621212330742C000FFB5B /* DomesticRemit */ = {
isa = PBXGroup;
children = (
73A621222330742C000FFB5B /* Module Interface */,
73A621242330742C000FFB5B /* Application Logic */,
73A6212C2330742C000FFB5B /* User Interface */,
);
path = DomesticRemit;
sourceTree = "<group>";
};
73A621222330742C000FFB5B /* Module Interface */ = {
isa = PBXGroup;
children = (
73A621232330742C000FFB5B /* DomesticRemitModuleInterface.swift */,
);
path = "Module Interface";
sourceTree = "<group>";
};
73A621242330742C000FFB5B /* Application Logic */ = {
isa = PBXGroup;
children = (
73A621252330742C000FFB5B /* Model */,
73A621262330742C000FFB5B /* Service */,
73A621292330742C000FFB5B /* Interactor */,
);
path = "Application Logic";
sourceTree = "<group>";
};
73A621252330742C000FFB5B /* Model */ = {
isa = PBXGroup;
children = (
73A62144233082D6000FFB5B /* DomesticRemitModel.swift */,
73197D402330D207002C0F85 /* RecipientNameModel.swift */,
);
path = Model;
sourceTree = "<group>";
};
73A621262330742C000FFB5B /* Service */ = {
isa = PBXGroup;
children = (
73A621272330742C000FFB5B /* DomesticRemitService.swift */,
73A621282330742C000FFB5B /* DomesticRemitServiceType.swift */,
);
path = Service;
sourceTree = "<group>";
};
73A621292330742C000FFB5B /* Interactor */ = {
isa = PBXGroup;
children = (
73A6212A2330742C000FFB5B /* DomesticRemitInteractorIO.swift */,
73A6212B2330742C000FFB5B /* DomesticRemitInteractor.swift */,
);
path = Interactor;
sourceTree = "<group>";
};
73A6212C2330742C000FFB5B /* User Interface */ = {
isa = PBXGroup;
children = (
73A6212D2330742C000FFB5B /* Presenter */,
73A6212F2330742C000FFB5B /* Wireframe */,
73A621322330742C000FFB5B /* View */,
);
path = "User Interface";
sourceTree = "<group>";
};
73A6212D2330742C000FFB5B /* Presenter */ = {
isa = PBXGroup;
children = (
73A6212E2330742C000FFB5B /* DomesticRemitPresenter.swift */,
);
path = Presenter;
sourceTree = "<group>";
};
73A6212F2330742C000FFB5B /* Wireframe */ = {
isa = PBXGroup;
children = (
73A621302330742C000FFB5B /* DomesticRemitWireframeInputOutput.swift */,
73A621312330742C000FFB5B /* DomesticRemitWireframe.swift */,
);
path = Wireframe;
sourceTree = "<group>";
};
73A621322330742C000FFB5B /* View */ = {
isa = PBXGroup;
children = (
73A621332330742C000FFB5B /* ViewModel */,
73A621362330742C000FFB5B /* DomesticRemitViewController.swift */,
73A621372330742C000FFB5B /* DomesticRemit.storyboard */,
);
path = View;
sourceTree = "<group>";
};
73A621332330742C000FFB5B /* ViewModel */ = {
isa = PBXGroup;
children = (
73A621342330742C000FFB5B /* DomesticRemitViewModel.swift */,
73A621352330742C000FFB5B /* DomesticRemitViewModelInterface.swift */,
);
path = ViewModel;
sourceTree = "<group>";
};
73A621482330AD1F000FFB5B /* RecentHistories */ = {
isa = PBXGroup;
children = (
73A621492330AD1F000FFB5B /* Module Interface */,
73A6214B2330AD1F000FFB5B /* Application Logic */,
73A621532330AD1F000FFB5B /* User Interface */,
);
path = RecentHistories;
sourceTree = "<group>";
};
73A621492330AD1F000FFB5B /* Module Interface */ = {
isa = PBXGroup;
children = (
73A6214A2330AD1F000FFB5B /* RecentHistoriesModuleInterface.swift */,
);
path = "Module Interface";
sourceTree = "<group>";
};
73A6214B2330AD1F000FFB5B /* Application Logic */ = {
isa = PBXGroup;
children = (
73A6214C2330AD1F000FFB5B /* Model */,
73A6214D2330AD1F000FFB5B /* Service */,
73A621502330AD1F000FFB5B /* Interactor */,
);
path = "Application Logic";
sourceTree = "<group>";
};
73A6214C2330AD1F000FFB5B /* Model */ = {
isa = PBXGroup;
children = (
73197D3E2330B919002C0F85 /* RecentRecipientModel.swift */,
);
path = Model;
sourceTree = "<group>";
};
73A6214D2330AD1F000FFB5B /* Service */ = {
isa = PBXGroup;
children = (
73A6214E2330AD1F000FFB5B /* RecentHistoriesServiceType.swift */,
73A6214F2330AD1F000FFB5B /* RecentHistoriesService.swift */,
);
path = Service;
sourceTree = "<group>";
};
73A621502330AD1F000FFB5B /* Interactor */ = {
isa = PBXGroup;
children = (
73A621512330AD1F000FFB5B /* RecentHistoriesInteractor.swift */,
73A621522330AD1F000FFB5B /* RecentHistoriesInteractorIO.swift */,
);
path = Interactor;
sourceTree = "<group>";
};
73A621532330AD1F000FFB5B /* User Interface */ = {
isa = PBXGroup;
children = (
73A621542330AD1F000FFB5B /* Presenter */,
73A621562330AD1F000FFB5B /* Wireframe */,
73A621592330AD1F000FFB5B /* View */,
);
path = "User Interface";
sourceTree = "<group>";
};
73A621542330AD1F000FFB5B /* Presenter */ = {
isa = PBXGroup;
children = (
73A621552330AD1F000FFB5B /* RecentHistoriesPresenter.swift */,
);
path = Presenter;
sourceTree = "<group>";
};
73A621562330AD1F000FFB5B /* Wireframe */ = {
isa = PBXGroup;
children = (
73A621572330AD1F000FFB5B /* RecentHistoriesWireframeInputOutput.swift */,
73A621582330AD1F000FFB5B /* RecentHistoriesWireframe.swift */,
);
path = Wireframe;
sourceTree = "<group>";
};
73A621592330AD1F000FFB5B /* View */ = {
isa = PBXGroup;
children = (
73197D3B2330B2A3002C0F85 /* Cell */,
73A6215A2330AD1F000FFB5B /* ViewModel */,
73A6215D2330AD1F000FFB5B /* RecentHistories.storyboard */,
73A6215E2330AD1F000FFB5B /* RecentHistoriesViewController.swift */,
);
path = View;
sourceTree = "<group>";
};
73A6215A2330AD1F000FFB5B /* ViewModel */ = {
isa = PBXGroup;
children = (
73A6215B2330AD1F000FFB5B /* RecentHistoriesViewModel.swift */,
73A6215C2330AD1F000FFB5B /* RecentHistoriesViewModelInterface.swift */,
);
path = ViewModel;
sourceTree = "<group>";
};
73A6216B2330AD25000FFB5B /* DomesticModules */ = {
isa = PBXGroup;
children = (
73A621482330AD1F000FFB5B /* RecentHistories */,
73A621212330742C000FFB5B /* DomesticRemit */,
);
path = DomesticModules;
sourceTree = "<group>";
};
73A6E1FD22CEE51600E9BC68 /* Badge */ = {
isa = PBXGroup;
children = (
@ -7198,6 +7487,7 @@
D907AB96212AA8A300915A87 /* Modules */ = {
isa = PBXGroup;
children = (
73A6211E233073D2000FFB5B /* RemittanceModules */,
FF6E7D7921BF951D00A003B9 /* AppUpdate */,
BE74AF8E227C8FF100F05CE7 /* AutoDebitModules */,
736A8C262277EAC100337A50 /* BiometricAuthModules */,
@ -7213,7 +7503,6 @@
9F9DF0CA1FEBC0A0005B8F42 /* RecipientModules */,
73138D9322B7509F001280D3 /* RegisterModules */,
730D784F227A94E1007E517E /* RewardModules */,
D946717B21426CBA003924DB /* SendMoneyModules */,
042E6EFB203EAE3A004667A1 /* SideMenu */,
D96A4FBF21460B4900CFD507 /* SplashScreen */,
73138D9622B7511D001280D3 /* TransactionHistoryModules */,
@ -10457,7 +10746,7 @@
path = ViewModels;
sourceTree = "<group>";
};
D946717B21426CBA003924DB /* SendMoneyModules */ = {
D946717B21426CBA003924DB /* OverseasModules */ = {
isa = PBXGroup;
children = (
D9BE021321E2DD44003AA8C7 /* PaymentSelection */,
@ -10472,7 +10761,7 @@
D9790608223F58410025BD5B /* Resend */,
73B4C8A622A5F2430078D495 /* SelectCoupon */,
);
path = SendMoneyModules;
path = OverseasModules;
sourceTree = "<group>";
};
D946718021426DFB003924DB /* Login */ = {
@ -10813,6 +11102,7 @@
D95B7044213FB5F00053CC3D /* WebLinks */,
738F04B02316238600BA5EE7 /* ShadowView.swift */,
731703CB23221EA0005752DE /* SwipeNavigationController.swift */,
73976D212331BFB1003CF5E1 /* BankEnum.swift */,
);
path = Utilities;
sourceTree = "<group>";
@ -13157,6 +13447,7 @@
D93C29CB22000D650079BF03 /* iPhone_transkey_number_cmd_10_thai_down.png in Resources */,
D93C2B2F22000D650079BF03 /* iPad_transkey_alnum_cmd_8_indonesian.png in Resources */,
5565FF2C1FE275E5002934E9 /* SanFranciscoText-Medium.otf in Resources */,
73A621432330742C000FFB5B /* DomesticRemit.storyboard in Resources */,
D93C289622000D640079BF03 /* iPad_transkey_alnum_cmd_fix.png in Resources */,
D93C2B5822000D660079BF03 /* iPhone_transkey_number_key_random_9.png in Resources */,
D93C28F722000D640079BF03 /* iPad_transkey_landscape_alnum_cmd_8_2.png in Resources */,
@ -13213,6 +13504,7 @@
D93C274722000D630079BF03 /* iPhone_transkey_alnum_eng_4.png in Resources */,
D93C2AD822000D650079BF03 /* iPad_transkey_landscape_alnum_cmd_5_chinese.png in Resources */,
D93C297B22000D650079BF03 /* iPhone_transkey_input_done_down_japanese.png in Resources */,
73A621692330AD20000FFB5B /* RecentHistories.storyboard in Resources */,
D93C2A0D22000D650079BF03 /* iPhone_transkey_landscape_number_cmd_1_english.png in Resources */,
D93C2A2A22000D650079BF03 /* iPhone_transkey_alnum_cmd_10_english.png in Resources */,
D93C2A7522000D650079BF03 /* iPhone_transkey_number_cmd_2_2_mongolian_down.png in Resources */,
@ -13934,12 +14226,14 @@
73B6D6882306402200A0CB6E /* PaymentMethodModel.swift in Sources */,
D9D2242B22407EBA00C7313D /* ResendListModel.swift in Sources */,
04E36E2121AE585200783685 /* PennyTestSubmitViewController.swift in Sources */,
73A6213A2330742C000FFB5B /* DomesticRemitServiceType.swift in Sources */,
D945F125213E1D5100A24824 /* SendMoneyReceiptViewInterface.swift in Sources */,
D92B80262140C3CB00A25B26 /* MainService.swift in Sources */,
D9B414422161AE2800A53D9D /* DatePickerViewController.swift in Sources */,
D9BE022E21E2DD45003AA8C7 /* PaymentSelectionWireframeInput.swift in Sources */,
D9BE023121E2DD45003AA8C7 /* PaymentSelectionViewInterface.swift in Sources */,
730D788B227A94E1007E517E /* RewardServiceType.swift in Sources */,
73A621662330AD20000FFB5B /* RecentHistoriesWireframe.swift in Sources */,
730197A122535135001954AB /* kycForm3ModuleInterface.swift in Sources */,
9FD260F81FD00458007A511D /* AppDelegate.swift in Sources */,
D903113E214786EA00AD5BA9 /* ForgotPasswordService.swift in Sources */,
@ -13981,6 +14275,7 @@
73149F6322E5AF8000D66B26 /* LauncherScreenModuleInterface.swift in Sources */,
730197A422535135001954AB /* kycForm3InteractorIO.swift in Sources */,
730D7887227A94E1007E517E /* RedeemViewInterface.swift in Sources */,
73197D412330D207002C0F85 /* RecipientNameModel.swift in Sources */,
73FE8837228A4A8C00A5EB56 /* OrderHistoryModuleInterface.swift in Sources */,
736A8C442277EB2A00337A50 /* BiometricNotificationInteractorIO.swift in Sources */,
73FE8839228A4A8C00A5EB56 /* OrderHistoryServiceType.swift in Sources */,
@ -13996,10 +14291,12 @@
D92E656C222620A0004D1B3D /* SendMoneyCodePresenter.swift in Sources */,
FF6E7D9021BF951D00A003B9 /* AppUpdateService.swift in Sources */,
BE74AFBD227C8FF200F05CE7 /* AddAccountServiceType.swift in Sources */,
73A621392330742C000FFB5B /* DomesticRemitService.swift in Sources */,
043770E721AD04240005B22D /* PennyTestModuleInterface.swift in Sources */,
730D787E227A94E1007E517E /* RedeemServiceType.swift in Sources */,
73195ABD22FD14D500151434 /* SetupRecipientViewController.swift in Sources */,
D99D72AA212D595B00601F48 /* CountryInfo.swift in Sources */,
73A621382330742C000FFB5B /* DomesticRemitModuleInterface.swift in Sources */,
730D78BA227A94F2007E517E /* SearchAddressPresenter.swift in Sources */,
D95B5E4721314A3C000C0B33 /* GmeContactsTableViewCell.swift in Sources */,
739A7789228BB2B40018A1A9 /* DetailOrderViewController.swift in Sources */,
@ -14042,6 +14339,7 @@
73210DA422FBE73100715D6C /* RecipientsInteractorIO.swift in Sources */,
043770E921AD04240005B22D /* PennyTestService.swift in Sources */,
73FE8844228A571400A5EB56 /* OrderCell.swift in Sources */,
73A621612330AD20000FFB5B /* RecentHistoriesService.swift in Sources */,
730D78B4227A94F2007E517E /* JusoCommon.swift in Sources */,
73B6D68423063DFD00A0CB6E /* ResponseContainer.swift in Sources */,
D97785AC215DD23400754079 /* TransactionModel.swift in Sources */,
@ -14067,8 +14365,10 @@
7301978C22535135001954AB /* KycService.swift in Sources */,
D92E6568222620A0004D1B3D /* SendMoneyCodeServiceType.swift in Sources */,
73469F9C2293C1B00062946B /* SelectPaymentInteractor.swift in Sources */,
73197D3F2330B919002C0F85 /* RecentRecipientModel.swift in Sources */,
D9BE023521E2DDEC003AA8C7 /* PaymentSelectionTableViewCell.swift in Sources */,
D9031143214786EA00AD5BA9 /* ForgotPasswordWireframeInput.swift in Sources */,
73A621632330AD20000FFB5B /* RecentHistoriesInteractorIO.swift in Sources */,
73469F9B2293C1B00062946B /* SelectPaymentInteractorIO.swift in Sources */,
738FD4882303D70E008B144D /* RequestModelType.swift in Sources */,
730197A722535135001954AB /* kycForm3Wireframe.swift in Sources */,
@ -14081,6 +14381,7 @@
739A7784228BB2B40018A1A9 /* DetailOrderInteractor.swift in Sources */,
D9BE022C21E2DD45003AA8C7 /* PaymentSelectionInteractorIO.swift in Sources */,
736A8C452277EB2A00337A50 /* BiometricNotificationPresenter.swift in Sources */,
73197D3D2330B2BF002C0F85 /* RecentRecipientCell.swift in Sources */,
D9A060DF223F680B00F5D7C4 /* ResendExchangeViewController.swift in Sources */,
730D787F227A94E1007E517E /* RedeemService.swift in Sources */,
73BCCDCF228993040057B161 /* RewardGroupModuleInterface.swift in Sources */,
@ -14111,6 +14412,7 @@
73195B3522FD5BC600151434 /* APIRouter.swift in Sources */,
73A6E20222CEE51600E9BC68 /* BadgeAppearance.swift in Sources */,
D97785AA215DD04400754079 /* TransactionHistoryTableViewCell.swift in Sources */,
73A621622330AD20000FFB5B /* RecentHistoriesInteractor.swift in Sources */,
730D7894227A94E1007E517E /* RewardItemCollectionViewCell.swift in Sources */,
736A8C432277EB2A00337A50 /* BiometricNotificationInteractor.swift in Sources */,
D95B5E3921311057000C0B33 /* GmeContactsModuleInterface.swift in Sources */,
@ -14130,6 +14432,7 @@
D95B5E4021311057000C0B33 /* GmeContactsWireframe.swift in Sources */,
BEC9B005224FC49C00A2DA06 /* BiometricAuthenticationViewController.swift in Sources */,
0496B84E1FE7DFCD0044810E /* UIViewController+Ext.swift in Sources */,
73A621602330AD20000FFB5B /* RecentHistoriesServiceType.swift in Sources */,
BEC9AFFD224FC49C00A2DA06 /* BiometricAuthenticationService.swift in Sources */,
73210DAA22FBE73100715D6C /* RecipientsViewModelInterface.swift in Sources */,
73157B9D22DC1EEC009B836F /* PopupNotificationService.swift in Sources */,
@ -14190,10 +14493,12 @@
73157BA722DC3F14009B836F /* Date+Ext.swift in Sources */,
73B4C8BF22A5F2440078D495 /* SelectCouponInteractorIO.swift in Sources */,
73BCCDD8228993040057B161 /* RewardGroupViewInterface.swift in Sources */,
73A621422330742C000FFB5B /* DomesticRemitViewController.swift in Sources */,
D9790624223F58420025BD5B /* ResendWireframe.swift in Sources */,
BE74AFC3227C8FF200F05CE7 /* AddAccountViewController.swift in Sources */,
D9A060DA223F680B00F5D7C4 /* ResendExchangeInteractor.swift in Sources */,
73B4C8C222A5F2440078D495 /* SelectCouponWireframe.swift in Sources */,
73A6213B2330742C000FFB5B /* DomesticRemitInteractorIO.swift in Sources */,
D950BED121549242008367A1 /* HomeModuleInterface.swift in Sources */,
04E36E1D21AE585200783685 /* PennyTestSubmitInteractor.swift in Sources */,
BEC9B004224FC49C00A2DA06 /* BiometricAuthenticationViewInterface.swift in Sources */,
@ -14202,6 +14507,7 @@
043770EC21AD04240005B22D /* PennyTestPresenter.swift in Sources */,
0496B8481FE7DFA20044810E /* RestApiManager.swift in Sources */,
D9B7ADFA2130048E009B0564 /* ExchangeRatesViewInterface.swift in Sources */,
73A621652330AD20000FFB5B /* RecentHistoriesWireframeInputOutput.swift in Sources */,
D9E57945212E938D00D47AC0 /* ExchangeRateDetailModel.swift in Sources */,
D96848C7212D3A7400EF12B1 /* DataRequest+Ext.swift in Sources */,
D95B5E3D21311057000C0B33 /* GmeContactsInteractorIO.swift in Sources */,
@ -14217,6 +14523,7 @@
73BE702C22D33E6800E87DD2 /* GMENumberTextField.swift in Sources */,
D96A4FD921460B4A00CFD507 /* SplashScreenPresenter.swift in Sources */,
D9768C88213BAE92009E01BC /* User.swift in Sources */,
73A6213F2330742C000FFB5B /* DomesticRemitWireframe.swift in Sources */,
7301979022535135001954AB /* KycPresenter.swift in Sources */,
73210DAB22FBE73100715D6C /* RecipientsViewController.swift in Sources */,
D945F124213E1D5100A24824 /* SendMoneyReceiptWireframeInput.swift in Sources */,
@ -14242,12 +14549,14 @@
73157B9E22DC1EEC009B836F /* PopupNotificationInteractor.swift in Sources */,
D96BD1262164875800DFE7D8 /* WalletStatementTableViewCell.swift in Sources */,
BE74AFCF227C8FF200F05CE7 /* AutoDebitTableViewCell.swift in Sources */,
73976D222331BFB1003CF5E1 /* BankEnum.swift in Sources */,
04E36E2221AE585200783685 /* PennyTestSubmitViewInterface.swift in Sources */,
04DC27EC21A51E29003714F5 /* AutoRefund.swift in Sources */,
D96BD11A216479E200DFE7D8 /* WalletStatementPresenter.swift in Sources */,
D945F121213E1D5100A24824 /* SendMoneyReceiptInteractorIO.swift in Sources */,
BE74AFBA227C8FF200F05CE7 /* AddAccountModuleInterface.swift in Sources */,
D97785A2215DC55F00754079 /* TransactionHistoryPresenter.swift in Sources */,
73A6213E2330742C000FFB5B /* DomesticRemitWireframeInputOutput.swift in Sources */,
73469F982293C1B00062946B /* SelectPaymentModuleInterface.swift in Sources */,
042E6EFD203EAF95004667A1 /* SideMenuViewController.swift in Sources */,
D9535CCC2150C14700EDFCD2 /* KYCResponseModel.swift in Sources */,
@ -14255,6 +14564,7 @@
736A8C412277EB2A00337A50 /* BiometricNotificationService.swift in Sources */,
73210DA122FBE73100715D6C /* RecipientsModuleInterface.swift in Sources */,
D9A060D9223F680B00F5D7C4 /* ResendExchangeServiceType.swift in Sources */,
73A621412330742C000FFB5B /* DomesticRemitViewModelInterface.swift in Sources */,
730D788A227A94E1007E517E /* RewardProduct.swift in Sources */,
73469F9A2293C1B00062946B /* SelectPaymentService.swift in Sources */,
D9A060DC223F680B00F5D7C4 /* ResendExchangePresenter.swift in Sources */,
@ -14271,6 +14581,7 @@
730D78C0227A94F2007E517E /* SearchAddressViewController.swift in Sources */,
738FD48C2303E157008B144D /* FieldModel.swift in Sources */,
732D17972297899400ACEBF1 /* HotLineCell.swift in Sources */,
73A621642330AD20000FFB5B /* RecentHistoriesPresenter.swift in Sources */,
73210DA722FBE73100715D6C /* RecipientsWireframe.swift in Sources */,
BE74AFD1227C8FF200F05CE7 /* AutoDebitViewInterface.swift in Sources */,
D922D9652135145F00D43053 /* SendMoneyParentInteractor.swift in Sources */,
@ -14284,6 +14595,7 @@
D9BE022F21E2DD45003AA8C7 /* PaymentSelectionWireframe.swift in Sources */,
D92B80292140C3CB00A25B26 /* MainInteractorIO.swift in Sources */,
730197AB22535135001954AB /* kycForm3ViewController.swift in Sources */,
73976D202331B4F4003CF5E1 /* UIImageView+Ext.swift in Sources */,
0496B84F1FE7DFCD0044810E /* String+Ext.swift in Sources */,
D9B7ADF52130048E009B0564 /* ExchangeRatesPresenter.swift in Sources */,
D9BE022821E2DD45003AA8C7 /* PaymentSelectionModuleInterface.swift in Sources */,
@ -14303,9 +14615,11 @@
D945F129213E4A9D00A24824 /* SendMoneyReciept.swift in Sources */,
D9B7ADF02130048E009B0564 /* ExchangeRatesModuleInterface.swift in Sources */,
D979061E223F58420025BD5B /* ResendServiceType.swift in Sources */,
73A6215F2330AD20000FFB5B /* RecentHistoriesModuleInterface.swift in Sources */,
043770EE21AD04240005B22D /* PennyTestWireframe.swift in Sources */,
73B4C8C622A5F2440078D495 /* SelectCouponViewController.swift in Sources */,
D96A4FBC2146079600CFD507 /* AppConstants.swift in Sources */,
73A62145233082D6000FFB5B /* DomesticRemitModel.swift in Sources */,
73071AC52296CF9B008840FD /* HotLineService.swift in Sources */,
FF6E7D9321BF951D00A003B9 /* AppUpdatePresenter.swift in Sources */,
FF6E7D9221BF951D00A003B9 /* AppUpdateModuleInterface.swift in Sources */,
@ -14334,6 +14648,7 @@
D9B7ADF72130048E009B0564 /* ExchangeRatesWireframe.swift in Sources */,
BE74AFD0227C8FF200F05CE7 /* AutoDebitViewController.swift in Sources */,
D96A4FFA2146625C00CFD507 /* RegisterInteractorIO.swift in Sources */,
73A621682330AD20000FFB5B /* RecentHistoriesViewModelInterface.swift in Sources */,
736A8C4A2277EB2A00337A50 /* BiometricNotificationViewInterface.swift in Sources */,
738FD48E2303F87D008B144D /* DynamicFieldModel.swift in Sources */,
D9B7ADF82130048E009B0564 /* ExchangeRatesViewController.swift in Sources */,
@ -14367,6 +14682,7 @@
73071AC92296CF9B008840FD /* HotLinePresenter.swift in Sources */,
D90A9D66213696E400A96E45 /* BankPickerViewController.swift in Sources */,
04DC27EE21A51E83003714F5 /* autoRefundService.swift in Sources */,
73A6213D2330742C000FFB5B /* DomesticRemitPresenter.swift in Sources */,
D9BE022D21E2DD45003AA8C7 /* PaymentSelectionPresenter.swift in Sources */,
73FE883B228A4A8C00A5EB56 /* OrderHistoryInteractor.swift in Sources */,
730197B622535135001954AB /* kycForm2ViewController.swift in Sources */,
@ -14378,6 +14694,7 @@
730D7886227A94E1007E517E /* RedeemViewController.swift in Sources */,
D97785A3215DC55F00754079 /* TransactionHistoryWireframeInput.swift in Sources */,
7383F43622DEB864003D6393 /* GMEDB.swift in Sources */,
73A6216A2330AD20000FFB5B /* RecentHistoriesViewController.swift in Sources */,
04E36E2021AE585200783685 /* PennyTestSubmitWireframeInput.swift in Sources */,
D90A9D5C2136942300A96E45 /* BankBranchPickerViewController.swift in Sources */,
D922D9682135145F00D43053 /* SendMoneyParentWireframe.swift in Sources */,
@ -14389,10 +14706,12 @@
D922D9A821351B7400D43053 /* SendMoneyVerificationModuleInterface.swift in Sources */,
730197AE22535135001954AB /* kycForm2Service.swift in Sources */,
D950BEDB21549242008367A1 /* HomeViewInterface.swift in Sources */,
73A6213C2330742C000FFB5B /* DomesticRemitInteractor.swift in Sources */,
FF6E7D9121BF951D00A003B9 /* AppUpdateServiceType.swift in Sources */,
D945F11F213E1D5100A24824 /* SendMoneyReceiptServiceType.swift in Sources */,
D96BD117216479E200DFE7D8 /* WalletStatementService.swift in Sources */,
D90D55B121326DA800EEEE04 /* ReciepientEx.swift in Sources */,
73A621402330742C000FFB5B /* DomesticRemitViewModel.swift in Sources */,
D9790625223F58420025BD5B /* ResendViewController.swift in Sources */,
73FE883A228A4A8C00A5EB56 /* OrderHistoryInteractorIO.swift in Sources */,
D950BED821549242008367A1 /* HomeWireframe.swift in Sources */,
@ -14498,6 +14817,7 @@
D9BE022921E2DD45003AA8C7 /* PaymentSelectionService.swift in Sources */,
D950BED621549242008367A1 /* HomePresenter.swift in Sources */,
D96A4FF82146625C00CFD507 /* RegisterService.swift in Sources */,
73A621672330AD20000FFB5B /* RecentHistoriesViewModel.swift in Sources */,
04E36E1F21AE585200783685 /* PennyTestSubmitWireframe.swift in Sources */,
738FD48023038FDE008B144D /* UIFont+Ext.swift in Sources */,
73149F6622E5AF8000D66B26 /* LauncherScreenInteractorIO.swift in Sources */,

16
GME Remit/Extensions/UIImageView+Ext.swift

@ -0,0 +1,16 @@
//
// UIImageView+Ext.swift
// GME Remit
//
// Created by InKwon James Kim on 18/09/2019.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
extension UIImageView {
func setDropDownImage(tintColor: UIColor){
self.image = #imageLiteral(resourceName: "dropdown_white").withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
self.tintColor = tintColor
}
}

11
GME Remit/Extensions/UIView+Ext.swift

@ -127,6 +127,17 @@ extension UIView {
self.subviews.forEach { $0.travelSubView(block: block) }
}
}
func rotate(duration: Double = 0.1, angle: CGFloat = .pi) {
let animator = UIViewPropertyAnimator(
duration: duration,
curve: .easeInOut
) {
self.transform = CGAffineTransform(rotationAngle: .pi)
}
animator.startAnimation()
}
}
// MARK: - FOR Badge

BIN
GME Remit/Modules/.DS_Store

11
GME Remit/Modules/AutoDebitModules/AddAccount/Application Logic/Model/KFTCBankList.swift

@ -23,6 +23,17 @@ class BankInformation: Mappable {
}
}
extension BankInformation: TablePresenterProtocol {
var cellTitle: String? {
return bankName
}
var cellImage: UIImage? {
let bankType = BankEnum(rawValue: bankCode ?? "")
return bankType?.ciImage
}
}
class KFTCBankList: Mappable {
var errorCode: String?
var msg: String?

19
GME Remit/Modules/Home/User Interface/View/Cell/HomeCollectionTableViewCell.swift

@ -16,6 +16,7 @@ struct MenuNotificationName {
static let resend = "resend"
static let transactionStatement = "transactionStatement"
static let walletToWallet = "walletToWallet"
static let demosticRemit = "demosticRemit"
static let collectionHeight = "height_height"
}
@ -35,6 +36,8 @@ class HomeCollectionTableViewCell: UITableViewCell, UICollectionViewDelegateFlow
case walletStatement
case resend
case walletToWallet
case demosticRemit
}
@IBOutlet weak var collectionView: UICollectionView!
@ -102,7 +105,12 @@ class HomeCollectionTableViewCell: UITableViewCell, UICollectionViewDelegateFlow
walletToWalletMenu.title = "Wallet to Wallet Transfer"
walletToWalletMenu.icon = #imageLiteral(resourceName: "wallet-transfer")
let menus = [sendMoneyMenu, toadaysRateMenu, transactionStatementMenu, trackTransferMenu]
let domesticRemitMenu = HomeCollectionModel()
domesticRemitMenu.index = 6
domesticRemitMenu.title = "Demostic Remittance"
domesticRemitMenu.icon = #imageLiteral(resourceName: "fav-selected")
let menus = [sendMoneyMenu, toadaysRateMenu, transactionStatementMenu, trackTransferMenu, domesticRemitMenu]
return menus
}
@ -205,6 +213,8 @@ extension HomeCollectionTableViewCell: UICollectionViewDelegate {
center.post(name: self.getResendNotificationName(), object: nil)
case .walletToWallet:
center.post(name: self.getWalletToWalletNotificationName(), object: nil)
case .demosticRemit:
center.post(name: self.getDomesticRemitNotificationName(), object: nil)
}
}
@ -212,6 +222,10 @@ extension HomeCollectionTableViewCell: UICollectionViewDelegate {
return Notification.Name.init(rawValue: MenuNotificationName.sendMoney)
}
func getDomesticRemitNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.demosticRemit)
}
func getMobileRechargeNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.mobileRecharge)
}
@ -219,12 +233,15 @@ extension HomeCollectionTableViewCell: UICollectionViewDelegate {
func getTodaysRateNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.todaysRate)
}
func getTrackYourTransferNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.transactionStatement)
}
func getResendNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.resend)
}
func getWalletToWalletNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.walletToWallet)
}

4
GME Remit/Modules/Home/User Interface/View/Home.storyboard

@ -265,7 +265,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="b18-X5-UHi">
<rect key="frame" x="0.0" y="0.0" width="414" height="250"/>
<subviews>
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" bounces="NO" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" bouncesZoom="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="cS9-wt-rNH">
<collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="cS9-wt-rNH">
<rect key="frame" x="20" y="20" width="374" height="210"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="0.0" id="V5P-ja-etg">
@ -299,7 +299,7 @@
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Send Money" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" minimumFontSize="7" translatesAutoresizingMaskIntoConstraints="NO" id="1gB-BN-h1P">
<rect key="frame" x="24" y="121.66666666666667" width="122" height="15.333333333333329"/>
<rect key="frame" x="24" y="121.66666666666667" width="122" height="15.666666666666671"/>
<fontDescription key="fontDescription" name="SanFranciscoText-Bold" family="San Francisco Text" pointSize="13"/>
<color key="textColor" white="0.33333333329999998" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>

40
GME Remit/Modules/Home/User Interface/View/HomeViewController.swift

@ -477,6 +477,12 @@ class HomeViewController: UIViewController {
object: nil
)
center.addObserver(
self,
selector: #selector(self.showDomesticRemit),
name: self.getDomesticRemitNotificationName(),
object: nil
)
}
@objc private func showSendMoney() {
@ -496,6 +502,23 @@ class HomeViewController: UIViewController {
}
}
@objc private func showDomesticRemit() {
let kycSubmited = user?.kyc ?? false
let pennyTestComplete = Utility.pennyTestVerified()
if kycSubmited == true && pennyTestComplete == false {
self.show(error: StringConstants().pennyTestPrimaryBankText)
return
}
if isUserVerified() {
// TODO: move domestic remit
DomesticRemitWireframe().open(on: self)
} else {
self.showUnVerifiedMessage()
}
}
@objc private func showResendMoney() {
let kycSubmited = user?.kyc ?? false
let pennyTestComplete = Utility.pennyTestVerified()
@ -523,7 +546,7 @@ class HomeViewController: UIViewController {
return
}
self.alert(message: "This feature is coming soon")
self.alert(type: .error, message: "This feature is coming soon")
}
@objc private func showTodaysRate() {
@ -558,11 +581,11 @@ class HomeViewController: UIViewController {
@objc private func showUnVerifiedMessage() {
if didNotSubmitKycAndNotVerified() {
self.alert(message: StringConstants().registerProcessText)
self.alert(type: .error, message: StringConstants().registerProcessText)
} else if Utility.didSubmitKyc() && !Utility.pennyTestVerified() {
self.alert(message: StringConstants().pennyTestPrimaryBankText)
self.alert(type: .error, message: StringConstants().pennyTestPrimaryBankText)
} else if didSubmitKycAndNotVerified() {
self.alert(message: "verification_in_aproval_process_text".localized())
self.alert(type: .error, message: "verification_in_aproval_process_text".localized())
}
}
@ -571,7 +594,7 @@ class HomeViewController: UIViewController {
}
@objc private func showWalletToWallet() {
self.alert(message: "This feature is coming soon")
self.alert(type: .error, message: "This feature is coming soon")
}
@objc private func setupHeight(sender: Notification) {
@ -797,6 +820,10 @@ extension HomeViewController {
return Notification.Name.init(rawValue: MenuNotificationName.sendMoney)
}
func getDomesticRemitNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.demosticRemit)
}
func getMobileRechargeNotificationName() -> Notification.Name {
return Notification.Name.init(rawValue: MenuNotificationName.mobileRecharge)
}
@ -837,6 +864,7 @@ extension HomeViewController {
return Notification.Name.init(SideMenuNavigationNotifications.KftcAccountList)
}
}
// MARK: - UIGestureRecognizerDelegate
@ -940,7 +968,7 @@ extension HomeViewController {
@unknown default: message += "(8)"
}
self.alert(message: message)
self.alert(type: .error, message: message)
}
}

10
GME Remit/Modules/RecipientModules/Recipients/Application Logic/Model/Account/AccountModel.swift

@ -59,3 +59,13 @@ struct Account: Mappable {
fullAccountName <- map["FullAccountName"]
}
}
extension Account: TablePresenterProtocol {
var cellTitle: String? {
return bankName
}
var cellImage: UIImage? {
return BankEnum(rawValue: bankCode ?? "")?.ciImage
}
}

2
GME Remit/Modules/RecipientModules/Recipients/User Interface/View/RecipientsViewController.swift

@ -156,7 +156,7 @@ extension RecipientsViewController {
output
.isError.drive(
onNext: { [weak self] in guard let `self` = self else { return }
self.alert(message: $0.localizedDescription)
self.alert(type: .error, message: $0.localizedDescription)
}
).disposed(by: disposeBag)

2
GME Remit/Modules/RecipientModules/SetupRecipient/User Interface/View/SetupRecipientViewController.swift

@ -269,7 +269,7 @@ extension SetupRecipientViewController {
output.isError
.drive(onNext: { [weak self] in guard let `self` = self else { return }
self.alert(message: $0.localizedDescription)
self.alert(type: .error, message: $0.localizedDescription)
})
.disposed(by: disposeBag)

44
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Interactor/DomesticRemitInteractor.swift

@ -0,0 +1,44 @@
//
// DomesticRemitInteractor.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class DomesticRemitInteractor {
// MARK: Properties
weak var output: DomesticRemitInteractorOutput?
private let service: DomesticRemitServiceType
// MARK: Initialization
init(service: DomesticRemitServiceType) {
self.service = service
}
}
// MARK: DomesticRemit interactor input interface
extension DomesticRemitInteractor: DomesticRemitInteractorInput {
func fetchInformation() {
service.fetchInformation(
success: {self.output?.setModel(with: $0)},
failure: {self.output?.setError(with: $0)}
)
}
func getRecipientName(account: String, bankCode: String) {
service.getRecipientName(
account: account,
bankCode: bankCode,
success: {self.output?.setRecipientName(with:$0)},
failure: {self.output?.setError(with: $0)}
)
}
}

18
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Interactor/DomesticRemitInteractorIO.swift

@ -0,0 +1,18 @@
//
// DomesticRemitInteractorIO.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol DomesticRemitInteractorInput: class {
func fetchInformation()
func getRecipientName(account: String, bankCode: String)
}
protocol DomesticRemitInteractorOutput: class {
func setModel(with model: DomesticRemitModel)
func setRecipientName(with model: RecipientNameModel)
func setError(with error: Error)
}

26
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Model/DomesticRemitModel.swift

@ -0,0 +1,26 @@
//
// DemesticRemitModel.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import ObjectMapper
struct DomesticRemitModel: Mappable {
var accounts: [Account]?
var banks: [BankInformation]?
var serviceFee: String?
init?(map: Map) {
}
mutating func mapping(map: Map) {
accounts <- map["accounts"]
banks <- map["banks"]
serviceFee <- map["serviceFee"]
}
}

23
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Model/RecipientNameModel.swift

@ -0,0 +1,23 @@
//
// RecipientNameModel.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import ObjectMapper
struct RecipientNameModel: Mappable {
var name: String?
var mobile: String?
init?(map: Map) {
}
mutating func mapping(map: Map) {
name <- map["RecipientName"]
mobile <- map["RecipientPhone"]
}
}

188
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Service/DomesticRemitService.swift

@ -0,0 +1,188 @@
//
// DomesticRemitService.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class DomesticRemitService: DomesticRemitServiceType {
func fetchInformation(
success: @escaping (DomesticRemitModel) -> Void,
failure: @escaping (Error) -> Void
) {
// FIXME: Test Model
let testModel =
"""
{
"accounts" : [
{
"BankCode" : null,
"UserCi" : null,
"AccountNum" : null,
"BankName" : "신한은행",
"WalletName" : null,
"AutoDebit" : null,
"Type" : null,
"FintechUseNo" : null,
"AccountNumMasked" : "110223458***",
"FullAccountName" : null,
"IsApproved" : null,
"AccHolderInfoType" : null,
"Scope" : null,
"UserSeqNo" : null,
"KftcAccountId" : "IUgUkVvizgTGwzYtJ+qIZw==",
"CustomerId" : null,
"BankCodeStd" : null,
"IsShowRefresh" : "N",
"AccessToken" : null,
"AccHolderInfo" : null,
"AccountName" : null,
"TokenType" : null
},
{
"BankCode" : null,
"UserCi" : null,
"AccountNum" : null,
"BankName" : "KB국민은행",
"WalletName" : null,
"AutoDebit" : null,
"Type" : null,
"FintechUseNo" : null,
"AccountNumMasked" : "40790204056***",
"FullAccountName" : null,
"IsApproved" : null,
"AccHolderInfoType" : null,
"Scope" : null,
"UserSeqNo" : null,
"KftcAccountId" : "zy5wvuekamf9soEMhw5trA==",
"CustomerId" : null,
"BankCodeStd" : null,
"IsShowRefresh" : "N",
"AccessToken" : null,
"AccHolderInfo" : null,
"AccountName" : null,
"TokenType" : null
}
],
"banks" : [
{
"RowId" : "7",
"BankName" : "Korea Development Bank(KDB)",
"BankCode" : "002"
},
{
"RowId" : "3",
"BankName" : "Industrial Bank of Korea(IBK)",
"BankCode" : "003"
},
{
"RowId" : "2",
"BankName" : "Kookmin-Bank(KB)",
"BankCode" : "004"
},
{
"RowId" : "9",
"BankName" : "Suhyup Local Cooperatives",
"BankCode" : "007"
},
{
"RowId" : "4",
"BankName" : "Nonghyup Bank(NH)",
"BankCode" : "011"
},
{
"RowId" : "21",
"BankName" : "Woori Bank",
"BankCode" : "020"
},
{
"RowId" : "16",
"BankName" : "Standard Chartered Korea(SC First)",
"BankCode" : "023"
},
{
"RowId" : "18",
"BankName" : "Citibank Korea",
"BankCode" : "027"
},
{
"RowId" : "5",
"BankName" : "Daegu Bank(DGB)",
"BankCode" : "031"
},
{
"RowId" : "20",
"BankName" : "Busan Bank(BNK)",
"BankCode" : "032"
},
{
"RowId" : "1",
"BankName" : "Kwangju Bank(KJ)",
"BankCode" : "034"
},
{
"RowId" : "17",
"BankName" : "Jeju Bank",
"BankCode" : "035"
},
{
"RowId" : "15",
"BankName" : "Jeonbuk Bank(JB)",
"BankCode" : "037"
},
{
"RowId" : "25",
"BankName" : "Kyongnam Bank",
"BankCode" : "039"
},
{
"RowId" : "13",
"BankName" : "KEB Hana Bank",
"BankCode" : "081"
},
{
"RowId" : "10",
"BankName" : "Shinhan Bank",
"BankCode" : "088"
}
],
"serviceFee": "1500"
}
"""
guard let json = DomesticRemitModel(JSONString: testModel) else { return }
success(json)
}
func getRecipientName(
account: String,
bankCode: String,
success: @escaping (RecipientNameModel) -> Void,
failure: @escaping (Error) -> Void
) {
let testModel =
"""
{
"ErrorCode": "0",
"Msg": "Success",
"Id": null,
"Extra": "",
"Extra2": "",
"Data": {
"RecipientName": "James",
"RecipientPhone": "01052850125"
}
}
"""
guard
let json = ResponseContainerObject<RecipientNameModel>(JSONString: testModel),
let data = json.data else { return }
success(data)
}
}

21
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Application Logic/Service/DomesticRemitServiceType.swift

@ -0,0 +1,21 @@
//
// DomesticRemitServiceType.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol DomesticRemitServiceType: class {
func fetchInformation(
success: @escaping (DomesticRemitModel) -> Void,
failure: @escaping (Error) -> Void
)
func getRecipientName(
account: String,
bankCode: String,
success: @escaping (RecipientNameModel) -> Void,
failure: @escaping (Error) -> Void
)
}

13
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/Module Interface/DomesticRemitModuleInterface.swift

@ -0,0 +1,13 @@
//
// DomesticRemitModuleInterface.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol DomesticRemitModuleInterface: class {
func fetchInformation()
func showTablePresenter(type: DomesticRemitPresenter.ShowType)
func getRecipientName(account: String, bankCode: String)
}

75
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/Presenter/DomesticRemitPresenter.swift

@ -0,0 +1,75 @@
//
// DomesticRemitPresenter.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class DomesticRemitPresenter {
// MARK: Properties
weak var viewModel: DomesticRemitViewModelInterface?
var interactor: DomesticRemitInteractorInput?
var wireframe: DomesticRemitWireframeInput?
private var banks: [BankInformation]?
private var accounts: [Account]?
enum ShowType: Int {
case histories = 0
case banks
case autodebit
}
}
// MARK: DomesticRemit module interface
extension DomesticRemitPresenter: DomesticRemitModuleInterface {
func fetchInformation() {
interactor?.fetchInformation()
}
func showTablePresenter(type: ShowType) {
switch type {
case .histories:
wireframe?.showRecentHistories()
case .banks:
wireframe?.showTablePresenter(with: banks, type: type)
case .autodebit:
wireframe?.showTablePresenter(with: accounts, type: type)
}
}
func getRecipientName(account: String, bankCode: String) {
interactor?.getRecipientName(account: account, bankCode: bankCode)
}
}
// MARK: DomesticRemit interactor output interface
extension DomesticRemitPresenter: DomesticRemitInteractorOutput {
func setModel(with model: DomesticRemitModel) {
banks = model.banks
accounts = model.accounts
viewModel?.setModel(with: model)
}
func setRecipientName(with model: RecipientNameModel) {
viewModel?.setRecipientName(with: model)
}
func setError(with error: Error) {
viewModel?.setError(with: error)
}
}
// MARK: DomesticRemit wireframe output interface
extension DomesticRemitPresenter: DomesticRemitWireframeOutput {
func selectedData(with model: TablePresenterProtocol?, type: ShowType) {
viewModel?.selectedData(with: model, type: type)
}
}

491
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/DomesticRemit.storyboard

@ -0,0 +1,491 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Sd9-9A-f1x">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<customFonts key="customFonts">
<array key="SanFranciscoDisplay-Bold.otf">
<string>SanFranciscoDisplay-Bold</string>
</array>
<array key="SanFranciscoDisplay-Medium.otf">
<string>SanFranciscoDisplay-Medium</string>
</array>
<array key="SanFranciscoDisplay-Regular.otf">
<string>SanFranciscoDisplay-Regular</string>
</array>
</customFonts>
<scenes>
<!--DomesticRemit-->
<scene sceneID="R60-Pu-Hpy">
<objects>
<viewController storyboardIdentifier="DomesticRemitViewController" title="DomesticRemit" id="HSb-ou-7T5" customClass="DomesticRemitViewController" customModule="GME_Remit" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="9Uc-9s-KgO">
<rect key="frame" x="0.0" y="0.0" width="375" height="1000"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2Ck-HF-rZz">
<rect key="frame" x="0.0" y="0.0" width="375" height="1000"/>
<subviews>
<view contentMode="scaleToFill" placeholderIntrinsicWidth="375" placeholderIntrinsicHeight="575" translatesAutoresizingMaskIntoConstraints="NO" id="att-q4-f6H">
<rect key="frame" x="0.0" y="0.0" width="375" height="726"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0TS-Id-072">
<rect key="frame" x="0.0" y="0.0" width="375" height="150"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="NIp-JO-z9g">
<rect key="frame" x="20" y="20" width="335" height="110"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="gPj-g8-2ov">
<rect key="frame" x="0.0" y="0.0" width="335" height="50"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="YRe-d3-yhC" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="255" height="50"/>
<color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="oXe-1h-5E9"/>
</constraints>
<nil key="textColor"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="isShowTitle" value="NO"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isUseTitle" value="NO"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isLineHidden" value="YES"/>
<userDefinedRuntimeAttribute type="string" keyPath="placeholder" value="Select your Auto-debit Account"/>
</userDefinedRuntimeAttributes>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="GVA-E4-iXk">
<rect key="frame" x="255" y="0.0" width="30" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="lEj-uX-aLI">
<rect key="frame" x="0.0" y="14.5" width="30" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="NGc-vF-OmM"/>
<constraint firstAttribute="height" constant="30" id="ec9-wR-xap"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<gestureRecognizers/>
<constraints>
<constraint firstItem="lEj-uX-aLI" firstAttribute="centerY" secondItem="GVA-E4-iXk" secondAttribute="centerY" multiplier="1:0.85" id="0QP-7R-3Yh"/>
<constraint firstItem="lEj-uX-aLI" firstAttribute="centerX" secondItem="GVA-E4-iXk" secondAttribute="centerX" id="Piv-FH-osv"/>
<constraint firstAttribute="width" constant="30" id="c91-Wv-FbA"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eOv-y4-ViC">
<rect key="frame" x="285" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="EvG-UU-HiC"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Zoq-Ph-ipO">
<rect key="frame" x="0.0" y="60" width="335" height="50"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pJB-eJ-bWJ">
<rect key="frame" x="128.5" y="0.0" width="78.5" height="50"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="N/A" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="crF-eg-HNv">
<rect key="frame" x="0.0" y="0.0" width="28.5" height="50"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="(KRW)" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JOx-My-xUB">
<rect key="frame" x="28.5" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="3Z6-tp-ZQk"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FST-pR-26v">
<rect key="frame" x="217" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="Zer-sU-Nul"/>
<constraint firstAttribute="width" secondItem="FST-pR-26v" secondAttribute="height" multiplier="1:1" id="dm6-TC-USy"/>
</constraints>
<color key="tintColor" red="0.92941176469999998" green="0.1137254902" blue="0.1960784314" alpha="1" colorSpace="calibratedRGB"/>
<state key="normal" image="refresh"/>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="pJB-eJ-bWJ" firstAttribute="centerY" secondItem="Zoq-Ph-ipO" secondAttribute="centerY" id="6tL-hR-pIv"/>
<constraint firstItem="pJB-eJ-bWJ" firstAttribute="top" secondItem="Zoq-Ph-ipO" secondAttribute="top" id="9RI-TG-bPS"/>
<constraint firstItem="pJB-eJ-bWJ" firstAttribute="centerX" secondItem="Zoq-Ph-ipO" secondAttribute="centerX" id="cKf-rQ-gdO"/>
<constraint firstAttribute="bottom" secondItem="FST-pR-26v" secondAttribute="bottom" id="gf1-4Y-OJY"/>
<constraint firstItem="FST-pR-26v" firstAttribute="top" secondItem="Zoq-Ph-ipO" secondAttribute="top" id="qrF-Ot-isr"/>
<constraint firstAttribute="bottom" secondItem="pJB-eJ-bWJ" secondAttribute="bottom" id="xRn-NY-zgy"/>
<constraint firstItem="FST-pR-26v" firstAttribute="leading" secondItem="pJB-eJ-bWJ" secondAttribute="trailing" constant="10" id="zcQ-O2-b2r"/>
</constraints>
</view>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" red="0.93333333333333335" green="0.93333333333333335" blue="0.93333333333333335" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="NIp-JO-z9g" secondAttribute="trailing" constant="20" id="49C-sk-Lnv"/>
<constraint firstAttribute="bottom" secondItem="NIp-JO-z9g" secondAttribute="bottom" constant="20" id="OPa-VP-hxT"/>
<constraint firstItem="NIp-JO-z9g" firstAttribute="leading" secondItem="0TS-Id-072" secondAttribute="leading" constant="20" id="oz2-GS-lv9"/>
<constraint firstItem="NIp-JO-z9g" firstAttribute="top" secondItem="0TS-Id-072" secondAttribute="top" constant="20" id="rAH-II-bAa"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="me5-tr-dab">
<rect key="frame" x="10" y="150.5" width="355" height="565.5"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="Rbv-gn-yFV">
<rect key="frame" x="10" y="10" width="335" height="545.5"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="llz-Zu-HbC" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="335" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="kJe-RG-2Ot"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Bold" family="San Francisco Display" pointSize="19"/>
<textInputTraits key="textInputTraits" keyboardType="numberPad"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="titleText" value="Send Amount (KRW)"/>
<userDefinedRuntimeAttribute type="string" keyPath="placeholder" value="Enter send amount (KRW)"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isShowTitle" value="NO"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isUseTitle" value="NO"/>
</userDefinedRuntimeAttributes>
</textField>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="wV6-Ic-ufc">
<rect key="frame" x="0.0" y="70" width="335" height="475.5"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="o37-sL-MaJ">
<rect key="frame" x="0.0" y="0.0" width="335" height="115"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="TF3-ZE-jcy">
<rect key="frame" x="10" y="0.0" width="315" height="115"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eAq-NK-j8L">
<rect key="frame" x="0.0" y="0.0" width="315" height="50"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="12" translatesAutoresizingMaskIntoConstraints="NO" id="w0i-OB-a1z" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="245" height="50"/>
<color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="zPm-Kf-gje"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="titleText" value="Bank"/>
<userDefinedRuntimeAttribute type="string" keyPath="placeholder" value="Select Korea Bank"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isShowTitle" value="NO"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isLineHidden" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isUseTitle" value="NO"/>
</userDefinedRuntimeAttributes>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Oci-4B-frb">
<rect key="frame" x="245" y="0.0" width="30" height="50"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="NvU-Xp-kr1">
<rect key="frame" x="0.0" y="14.5" width="30" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="MKE-lg-2Vc"/>
<constraint firstAttribute="height" constant="30" id="VtJ-i1-k2E"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<gestureRecognizers/>
<constraints>
<constraint firstAttribute="width" constant="30" id="GTR-yA-IqE"/>
<constraint firstItem="NvU-Xp-kr1" firstAttribute="centerX" secondItem="Oci-4B-frb" secondAttribute="centerX" id="jF1-Rd-Pcn"/>
<constraint firstItem="NvU-Xp-kr1" firstAttribute="centerY" secondItem="Oci-4B-frb" secondAttribute="centerY" multiplier="1:0.85" id="odp-CE-I8u"/>
</constraints>
<connections>
<outletCollection property="gestureRecognizers" destination="UO0-lt-tVC" appends="YES" id="w1J-Uv-aCY"/>
</connections>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nva-Ya-0qv">
<rect key="frame" x="275" y="0.0" width="10" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="10" id="jsC-vJ-RqV"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Axn-7w-JlA">
<rect key="frame" x="285" y="0.0" width="30" height="50"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="y20-K6-Nqn">
<rect key="frame" x="0.0" y="14.5" width="30" height="30"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="OIu-71-u8h"/>
<constraint firstAttribute="height" constant="30" id="mds-Hy-TsR"/>
</constraints>
<color key="tintColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<state key="normal" image="ic_review"/>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<gestureRecognizers/>
<constraints>
<constraint firstItem="y20-K6-Nqn" firstAttribute="centerX" secondItem="Axn-7w-JlA" secondAttribute="centerX" id="3uX-bp-kjq"/>
<constraint firstAttribute="width" constant="30" id="BLk-Ld-m1H"/>
<constraint firstItem="y20-K6-Nqn" firstAttribute="centerY" secondItem="Axn-7w-JlA" secondAttribute="centerY" multiplier="1:0.85" id="Sz9-yp-8Cs"/>
</constraints>
</view>
</subviews>
</stackView>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="HP6-ed-Nsb" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="65" width="315" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="Rda-Uz-UNf"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits" keyboardType="numberPad"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="titleText" value="Account Number"/>
<userDefinedRuntimeAttribute type="string" keyPath="placeholder" value="Enter account number"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isShowTitle" value="NO"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isLineHidden" value="YES"/>
</userDefinedRuntimeAttributes>
</textField>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="TF3-ZE-jcy" firstAttribute="top" secondItem="o37-sL-MaJ" secondAttribute="top" id="J6O-mL-owU"/>
<constraint firstAttribute="trailing" secondItem="TF3-ZE-jcy" secondAttribute="trailing" constant="10" id="S2Y-JQ-Tie"/>
<constraint firstAttribute="bottom" secondItem="TF3-ZE-jcy" secondAttribute="bottom" id="Zq1-eF-dDO"/>
<constraint firstItem="TF3-ZE-jcy" firstAttribute="leading" secondItem="o37-sL-MaJ" secondAttribute="leading" constant="10" id="pkd-6p-S8T"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ARJ-wR-Qth">
<rect key="frame" x="0.0" y="135" width="335" height="50"/>
<color key="backgroundColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="Lj3-hr-AGQ"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<state key="normal" title="Ok">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="sDV-rn-swX">
<rect key="frame" x="0.0" y="205" width="335" height="200.5"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="15" translatesAutoresizingMaskIntoConstraints="NO" id="4tZ-8j-Zm2">
<rect key="frame" x="10" y="0.0" width="315" height="200.5"/>
<subviews>
<textField opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Zv6-JS-Obe" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="315" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="9Vo-Te-ee3"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="titleText" value="Recipient's Name"/>
<userDefinedRuntimeAttribute type="string" keyPath="placeholder" value="Recipient's Name"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isLineHidden" value="YES"/>
</userDefinedRuntimeAttributes>
</textField>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Enter recipient's phone number" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="xHy-UE-MgN" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="65" width="315" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="Ea4-uA-N7E"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits" keyboardType="phonePad"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="titleText" value="Recipient's Mobile Number"/>
<userDefinedRuntimeAttribute type="string" keyPath="placeholder" value="Enter mobile number (Optional)"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isShowTitle" value="NO"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isLineHidden" value="YES"/>
</userDefinedRuntimeAttributes>
</textField>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9QG-ay-o3w">
<rect key="frame" x="0.0" y="130" width="315" height="70.5"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cbp-DC-HyK">
<rect key="frame" x="-30" y="0.0" width="375" height="0.5"/>
<color key="backgroundColor" white="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="0.5" id="ajh-OG-NBT"/>
</constraints>
</view>
<textField opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Service Fee" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="xGB-im-tHp" customClass="ValidationTextField" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="20.5" width="315" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="KoJ-Zu-TAj"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Medium" family="San Francisco Display" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="titleText" value="Service Fee"/>
<userDefinedRuntimeAttribute type="string" keyPath="placeholder" value="Service Fee"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isLineHidden" value="YES"/>
<userDefinedRuntimeAttribute type="boolean" keyPath="isShowTitle" value="YES"/>
</userDefinedRuntimeAttributes>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="cbp-DC-HyK" secondAttribute="trailing" constant="-30" id="3OF-oK-qOX"/>
<constraint firstItem="xGB-im-tHp" firstAttribute="top" secondItem="cbp-DC-HyK" secondAttribute="bottom" constant="20" id="D9R-eL-k5j"/>
<constraint firstItem="cbp-DC-HyK" firstAttribute="top" secondItem="9QG-ay-o3w" secondAttribute="top" id="MOK-tg-b4Z"/>
<constraint firstAttribute="bottom" secondItem="xGB-im-tHp" secondAttribute="bottom" id="NYo-5J-nRD"/>
<constraint firstAttribute="trailing" secondItem="xGB-im-tHp" secondAttribute="trailing" id="NgK-aC-g3J"/>
<constraint firstItem="xGB-im-tHp" firstAttribute="leading" secondItem="9QG-ay-o3w" secondAttribute="leading" id="UXs-e0-gfC"/>
<constraint firstItem="cbp-DC-HyK" firstAttribute="leading" secondItem="9QG-ay-o3w" secondAttribute="leading" constant="-30" id="dD3-Vv-RtT"/>
</constraints>
</view>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="4tZ-8j-Zm2" secondAttribute="trailing" constant="10" id="0SY-4j-vCE"/>
<constraint firstItem="4tZ-8j-Zm2" firstAttribute="top" secondItem="sDV-rn-swX" secondAttribute="top" id="DpA-IS-HGd"/>
<constraint firstItem="4tZ-8j-Zm2" firstAttribute="leading" secondItem="sDV-rn-swX" secondAttribute="leading" constant="10" id="NUI-pO-Ccy"/>
<constraint firstAttribute="bottom" secondItem="4tZ-8j-Zm2" secondAttribute="bottom" id="ebH-gv-hze"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="UYi-o5-Inc">
<rect key="frame" x="0.0" y="425.5" width="335" height="50"/>
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="Cft-tW-Ta2"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="17"/>
<state key="normal" title="Send">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
</button>
</subviews>
</stackView>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="Rbv-gn-yFV" firstAttribute="leading" secondItem="me5-tr-dab" secondAttribute="leading" constant="10" id="224-hO-IeM"/>
<constraint firstItem="Rbv-gn-yFV" firstAttribute="top" secondItem="me5-tr-dab" secondAttribute="top" constant="10" id="5hl-Ov-Kz9"/>
<constraint firstAttribute="trailing" secondItem="Rbv-gn-yFV" secondAttribute="trailing" constant="10" id="VbY-HO-wiP"/>
<constraint firstAttribute="bottom" secondItem="Rbv-gn-yFV" secondAttribute="bottom" constant="10" id="cXA-HM-n2R"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HNr-Vg-UtG">
<rect key="frame" x="0.0" y="150" width="375" height="0.5"/>
<color key="backgroundColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="0.5" id="en2-Cw-FD0"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="me5-tr-dab" firstAttribute="top" secondItem="HNr-Vg-UtG" secondAttribute="bottom" id="AHz-Pz-98M"/>
<constraint firstItem="HNr-Vg-UtG" firstAttribute="top" secondItem="0TS-Id-072" secondAttribute="bottom" id="Gjn-6h-LdM"/>
<constraint firstItem="HNr-Vg-UtG" firstAttribute="leading" secondItem="att-q4-f6H" secondAttribute="leading" id="LUb-N2-lef"/>
<constraint firstAttribute="trailing" secondItem="me5-tr-dab" secondAttribute="trailing" constant="10" id="LaW-qS-mZ8"/>
<constraint firstItem="0TS-Id-072" firstAttribute="leading" secondItem="att-q4-f6H" secondAttribute="leading" id="Lk5-Y5-XGQ"/>
<constraint firstItem="0TS-Id-072" firstAttribute="top" secondItem="att-q4-f6H" secondAttribute="top" id="k48-n6-USF"/>
<constraint firstAttribute="bottom" secondItem="me5-tr-dab" secondAttribute="bottom" constant="10" id="kzi-EQ-EQp"/>
<constraint firstItem="me5-tr-dab" firstAttribute="leading" secondItem="att-q4-f6H" secondAttribute="leading" constant="10" id="lzA-66-lwH"/>
<constraint firstAttribute="trailing" secondItem="HNr-Vg-UtG" secondAttribute="trailing" id="wJG-uY-G5r"/>
<constraint firstAttribute="trailing" secondItem="0TS-Id-072" secondAttribute="trailing" id="zvh-Jz-Qmt"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="att-q4-f6H" secondAttribute="trailing" id="NLc-4P-6iE"/>
<constraint firstItem="att-q4-f6H" firstAttribute="leading" secondItem="2Ck-HF-rZz" secondAttribute="leading" id="Uad-Wi-K4y"/>
<constraint firstItem="att-q4-f6H" firstAttribute="width" secondItem="2Ck-HF-rZz" secondAttribute="width" id="deG-TI-x5e"/>
<constraint firstItem="att-q4-f6H" firstAttribute="top" secondItem="2Ck-HF-rZz" secondAttribute="top" id="exA-kP-hrn"/>
<constraint firstAttribute="bottom" secondItem="att-q4-f6H" secondAttribute="bottom" id="oBi-Y2-98u"/>
</constraints>
</scrollView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="2Ck-HF-rZz" secondAttribute="trailing" id="1Oi-8m-DES"/>
<constraint firstItem="2Ck-HF-rZz" firstAttribute="leading" secondItem="9Uc-9s-KgO" secondAttribute="leading" id="3T0-Z4-Rbv"/>
<constraint firstItem="2Ck-HF-rZz" firstAttribute="top" secondItem="9Uc-9s-KgO" secondAttribute="top" id="SV6-Xz-azw"/>
<constraint firstItem="O1T-1R-Sun" firstAttribute="bottom" secondItem="2Ck-HF-rZz" secondAttribute="bottom" id="foV-kH-Tqo"/>
</constraints>
<viewLayoutGuide key="safeArea" id="O1T-1R-Sun"/>
</view>
<navigationItem key="navigationItem" title="Domestic Remittance" id="Osp-Sl-e7G"/>
<size key="freeformSize" width="375" height="1000"/>
<connections>
<outlet property="accountTextField" destination="HP6-ed-Nsb" id="pJc-Uh-WXE"/>
<outlet property="amountTextField" destination="llz-Zu-HbC" id="fTk-6G-fRa"/>
<outlet property="autoDebitTextField" destination="YRe-d3-yhC" id="soQ-vQ-EVY"/>
<outlet property="autodebitAccountDropDownImageView" destination="lEj-uX-aLI" id="nB2-Xh-tkR"/>
<outlet property="balanceButton" destination="FST-pR-26v" id="fjO-x9-VAl"/>
<outlet property="balanceContainerView" destination="Zoq-Ph-ipO" id="aRk-rf-pM4"/>
<outlet property="balanceLabel" destination="crF-eg-HNv" id="u6O-Xb-WhA"/>
<outlet property="bankDropDownImageView" destination="NvU-Xp-kr1" id="nDy-FO-68U"/>
<outlet property="bankDropDownTap" destination="UO0-lt-tVC" id="XXd-zY-ad4"/>
<outlet property="bankTextField" destination="w0i-OB-a1z" id="yaB-N4-zrt"/>
<outlet property="detailContainerView" destination="wV6-Ic-ufc" id="00v-E7-OYr"/>
<outlet property="getNameButton" destination="ARJ-wR-Qth" id="5Xg-8m-m3F"/>
<outlet property="mainContainerView" destination="me5-tr-dab" id="Xvk-d6-het"/>
<outlet property="mobileTextField" destination="xHy-UE-MgN" id="bpR-fu-S50"/>
<outlet property="recentHistoryButton" destination="y20-K6-Nqn" id="pU0-Zv-V4g"/>
<outlet property="recipientInContainerView" destination="sDV-rn-swX" id="wQh-gV-atm"/>
<outlet property="recipientNameTextField" destination="Zv6-JS-Obe" id="ia0-2V-981"/>
<outlet property="sendButton" destination="UYi-o5-Inc" id="OAE-Q6-Otp"/>
<outlet property="serviceFeeTextField" destination="xGB-im-tHp" id="nzH-kp-t0n"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8je-5K-XuW" userLabel="First Responder" sceneMemberID="firstResponder"/>
<tapGestureRecognizer id="UO0-lt-tVC"/>
</objects>
<point key="canvasLocation" x="847.20000000000005" y="232.08395802098951"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="Km1-NF-cGq">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="Sd9-9A-f1x" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="bin-Cc-0sW">
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="HSb-ou-7T5" kind="relationship" relationship="rootViewController" id="MNO-NP-Kpk"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="gNl-7O-RMX" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-92" y="232.53373313343329"/>
</scene>
</scenes>
<resources>
<image name="ic_review" width="28" height="39"/>
<image name="refresh" width="40" height="40"/>
</resources>
<color key="tintColor" red="0.78177064659999995" green="0.55228364470000002" blue="0.018981300289999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</document>

318
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/DomesticRemitViewController.swift

@ -0,0 +1,318 @@
//
// DomesticRemitViewController.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import RxSwift
import RxCocoa
class DomesticRemitViewController: UIViewController {
// MARK: Properties
var viewModel: DomesticRemitViewModel!
private let disposeBag = DisposeBag()
// MARK: Computed Properties
// MARK: IBOutlets
@IBOutlet private weak var mainContainerView: UIView!
@IBOutlet private weak var amountTextField: ValidationTextField!
@IBOutlet private weak var recentHistoryButton: UIButton!
@IBOutlet private weak var bankTextField: ValidationTextField!
@IBOutlet private weak var accountTextField: ValidationTextField!
@IBOutlet private weak var recipientNameTextField: ValidationTextField!
@IBOutlet private weak var mobileTextField: ValidationTextField!
@IBOutlet private weak var serviceFeeTextField: ValidationTextField!
@IBOutlet private weak var autoDebitTextField: ValidationTextField!
@IBOutlet private weak var recipientInContainerView: UIView!
@IBOutlet private weak var detailContainerView: UIStackView!
@IBOutlet private weak var getNameButton: UIButton!
@IBOutlet private weak var sendButton: UIButton!
@IBOutlet private weak var balanceButton: UIButton!
@IBOutlet private weak var balanceLabel: UILabel!
@IBOutlet private weak var autodebitAccountDropDownImageView: UIImageView!
@IBOutlet private weak var balanceContainerView: UIView!
@IBOutlet private weak var bankDropDownImageView: UIImageView!
@IBOutlet private var bankDropDownTap: UITapGestureRecognizer!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
view.endEditing(true)
}
// MARK: IBActions
}
// MARK: Other Functions
extension DomesticRemitViewController {
private func setup() {
// all setup should be done here
setBinding()
setUI()
setupNormalNavigation()
}
private func setUI() {
mainContainerView.isHidden = true
balanceContainerView.isHidden = true
detailContainerView.isHidden = true
recipientInContainerView.isHidden = true
sendButton.layer.cornerRadius = 5
getNameButton.layer.cornerRadius = 5
recentHistoryButton.layer.cornerRadius = 5
// recentHistoryButton.backgroundColor = .themeBlue
bankTextField.inputView = UIView()
bankTextField.keyboardToolbar.isHidden = true
autoDebitTextField.inputView = UIView()
autoDebitTextField.keyboardToolbar.isHidden = true
bankDropDownImageView.setDropDownImage(tintColor: .themeTextColor)
autodebitAccountDropDownImageView.setDropDownImage(tintColor: .themeTextColor)
recipientNameTextField.validCondition = {!$0.isEmpty}
recipientNameTextField.errorMessage = nil
bankTextField.validCondition = {!$0.isEmpty}
bankTextField.errorMessage = nil
autoDebitTextField.validCondition = {!$0.isEmpty}
autoDebitTextField.errorMessage = nil
accountTextField.validCondition = {!$0.isEmpty && $0.count > 9}
accountTextField.errorMessage = "Invalid bank account number"
}
private func setBinding() {
let viewWillAppear = rx.sentMessage(#selector(UIViewController.viewWillAppear(_:)))
.mapToVoid()
.asDriverOnErrorJustComplete()
let input = DomesticRemitViewModel.Input(
viewWillAppear: viewWillAppear,
showRecentHistoryTrigger: recentHistoryButton.rx.tap.asDriver(),
selectAutodebit: autoDebitTextField.rx.controlEvent(.editingDidBegin).asDriver(),
selectBankTrigger: bankTextField.rx.controlEvent(.editingDidBegin).asDriver(),
amount: amountTextField.rx.text.orEmpty.asDriver(),
account: accountTextField.rx.text.orEmpty.asDriver(),
isValidAccount: accountTextField.valid.asDriver(onErrorJustReturn: false),
mobile: mobileTextField.rx.text.orEmpty.asDriver(),
getRecipientNameTrigger: getNameButton.rx.tap.asDriver()
)
let output = viewModel.transform(input: input)
// output
output.isError
.drive(
onNext: { self.alert(type: .error, message: $0.localizedDescription) }
).disposed(by: disposeBag)
output.isProgress
.drive(
onNext: { $0 ? self.showProgressHud() : self.hideProgressHud() }
).disposed(by: disposeBag)
output.getInitialData.map { "\($0?.serviceFee?.likeCommaMoney() ?? "") KRW" }
.drive(serviceFeeTextField.rx.text)
.disposed(by: disposeBag)
output.selectedAutodebit
.drive(onNext: {
guard
let name = $0?.bankName,
let account = $0?.accountNumMasked else { return }
self.autoDebitTextField.text = "\(name) (\(account))"
self.balanceContainerView.animateHidden(isHidden: false)
self.mainContainerView.animateHidden(isHidden: false)
})
.disposed(by: disposeBag)
output.selectedBank
.drive(onNext: {
self.recipientInContainerView.animateHidden(isHidden: true)
self.bankTextField.text = $0?.bankName
self.bankTextField.setBank(with: $0?.bankCode, isShowCode: false)
self.bankTextField.sendActions(for: .editingChanged)
self.recipientNameTextField.text = ""
self.recipientNameTextField.sendActions(for: .editingChanged)
self.mobileTextField.text = ""
self.mobileTextField.sendActions(for: .editingChanged)
self.getNameButton.isHidden = false
})
.disposed(by: disposeBag)
output.selectedRecipient
.drive(onNext: {
self.accountTextField.text = $0?.account
if self.bankTextField.text != "" {
self.accountTextField.sendActions(for: .editingChanged)
}
self.getNameButton.isHidden = false
})
.disposed(by: disposeBag)
output.getRecipientName
.drive(onNext: {
guard let model = $0 else { return }
self.alertWithOkCancel(
type: .normal,
message: "Is the person who receives the remittance the name \(model.name ?? "nil")",
okTitle: "Ok",
cancelTitle: "No",
okAction: {
self.getNameButton.isHidden = true
self.recipientNameTextField.text = model.name
self.recipientNameTextField.sendActions(for: .editingChanged)
self.mobileTextField.text = model.mobile
self.mobileTextField.sendActions(for: .editingChanged)
if model.name != "" {
self.recipientInContainerView.animateHidden(isHidden: false)
} else {
self.recipientInContainerView.animateHidden(isHidden: true)
}
},
cancelAction: {self.getNameButton.isHidden = false}
)
})
.disposed(by: disposeBag)
output.getRecipientName
.map {$0?.mobile}
.drive(mobileTextField.rx.text)
.disposed(by: disposeBag)
// amount
amountTextField.rx.controlEvent(.editingChanged)
.subscribe(onNext: {
guard let text = self.amountTextField.text else { return }
self.amountTextField.text = Utility.getCommaSeperatedString(numberString: text)
})
.disposed(by: disposeBag)
amountTextField.rx.controlEvent(.editingDidBegin)
.asDriver()
.drive(onNext: {
self.amountTextField.text = self.amountTextField.text?.replacingOccurrences(
of: " KRW", with: ""
)
self.detailContainerView.animateHidden(isHidden: true)
}).disposed(by: disposeBag)
amountTextField.rx.controlEvent(.editingDidEnd)
.asDriver()
.drive(onNext: {
guard let amount = self.amountTextField.text else {
return
}
if amount != "" {
self.amountTextField.text = amount + " KRW"
self.detailContainerView.animateHidden(isHidden: false)
}
}).disposed(by: disposeBag)
bankDropDownTap.rx.event.mapToVoid().asDriverOnErrorJustComplete()
.drive(onNext: {
self.bankTextField.becomeFirstResponder()
})
.disposed(by: disposeBag)
// auto-debit
autoDebitTextField.rx.controlEvent(.editingDidBegin)
.asDriver()
.drive(onNext: {
self.mainContainerView.animateHidden(isHidden: true)
}).disposed(by: disposeBag)
// account
accountTextField.rx.controlEvent(.editingDidBegin)
.asDriver()
.drive(onNext: {
self.recipientNameTextField.text = ""
self.recipientNameTextField.sendActions(for: .editingChanged)
self.mobileTextField.text = ""
self.mobileTextField.sendActions(for: .editingChanged)
self.getNameButton.isHidden = false
self.recipientInContainerView.animateHidden(isHidden: true)
self.accountTextField.isLineHidden = false
}).disposed(by: disposeBag)
accountTextField.rx.controlEvent(.editingDidEnd)
.asDriver()
.drive(onNext: {
self.accountTextField.isLineHidden = true
}).disposed(by: disposeBag)
// mobile
mobileTextField.rx.controlEvent(.editingDidBegin)
.asDriver()
.drive(onNext: {
self.mobileTextField.isLineHidden = false
}).disposed(by: disposeBag)
mobileTextField.rx.controlEvent(.editingDidEnd)
.asDriver()
.drive(onNext: {
self.mobileTextField.isLineHidden = true
}).disposed(by: disposeBag)
// send button
Observable.combineLatest([accountTextField.valid, recipientNameTextField.valid])
.flatMap { Observable.just($0.allSatisfy {$0}) }
.bind { [weak self] in guard let `self` = self else { return }
self.sendButton.isHidden = !$0
self.sendButton.isEnabled = $0
self.sendButton.backgroundColor = $0 ? .themeRed : .lightGray
}
.disposed(by: disposeBag)
// Ok button
Observable.combineLatest([accountTextField.valid, bankTextField.valid])
.flatMap { Observable.just($0.allSatisfy {$0}) }
.bind(onNext: {
self.getNameButton.isEnabled = $0
self.getNameButton.backgroundColor = $0 ? .themeRed : .lightGray
})
.disposed(by: disposeBag)
}
}

125
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/ViewModel/DomesticRemitViewModel.swift

@ -0,0 +1,125 @@
//
// DomesticRemitViewModel.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import RxSwift
import RxCocoa
class DomesticRemitViewModel: ViewModelType {
var presenter: DomesticRemitModuleInterface?
struct Input {
let viewWillAppear: Driver<Void>
let showRecentHistoryTrigger: Driver<Void>
let selectAutodebit: Driver<Void>
let selectBankTrigger: Driver<Void>
let amount: Driver<String>
let account: Driver<String>
let isValidAccount: Driver<Bool>
let mobile: Driver<String>
let getRecipientNameTrigger: Driver<Void>
}
struct Output {
let isError: Driver<Error>
let isProgress: Driver<Bool>
let selectedAutodebit: Driver<Account?>
let selectedBank: Driver<BankInformation?>
let selectedRecipient: Driver<RecentRecipientModel?>
let getRecipientName: Driver<RecipientNameModel?>
let getInitialData: Driver<DomesticRemitModel?>
}
private let disposeBag = DisposeBag()
private let progressLinker = PublishSubject<Bool>()
private let errorLinker = PublishSubject<Error>()
private let selectedAutodebitLinker = BehaviorSubject<Account?>(value: nil)
private let selectedBankLinker = BehaviorSubject<BankInformation?>(value: nil)
private let selectedHistoryLinker = BehaviorSubject<RecentRecipientModel?>(value: nil)
private let getRecipientNameLinker = BehaviorSubject<RecipientNameModel?>(value: nil)
private let getInitialDataLinker = BehaviorSubject<DomesticRemitModel?>(value: nil)
func transform(input: Input) -> Output {
input.viewWillAppear.drive(onNext: {self.presenter?.fetchInformation()})
.disposed(by: disposeBag)
input.selectAutodebit.drive(onNext: {self.presenter?.showTablePresenter(type: .autodebit)})
.disposed(by: disposeBag)
input.selectBankTrigger.drive(onNext: {self.presenter?.showTablePresenter(type: .banks)})
.disposed(by: disposeBag)
input.showRecentHistoryTrigger.drive(onNext: {self.presenter?.showTablePresenter(type: .histories)})
.disposed(by: disposeBag)
let validateData = input.account
.withLatestFrom(selectedBankLinker.asDriverOnErrorJustComplete()) { ($0, $1)}
input.getRecipientNameTrigger
.withLatestFrom(validateData) {$1}
.withLatestFrom(input.isValidAccount) { ($0, $1) }
.drive(onNext: {
let account = $0.0
guard let bank = $0.1 else { return }
if $1 {
self.presenter?.getRecipientName(account: account, bankCode: bank.bankCode ?? "")
}
})
.disposed(by: disposeBag)
return Output(
isError: errorLinker.asDriverOnErrorJustComplete(),
isProgress: progressLinker.asDriverOnErrorJustComplete(),
selectedAutodebit: selectedAutodebitLinker.asDriverOnErrorJustComplete(),
selectedBank: selectedBankLinker.asDriverOnErrorJustComplete(),
selectedRecipient: selectedHistoryLinker.asDriverOnErrorJustComplete(),
getRecipientName: getRecipientNameLinker.asDriverOnErrorJustComplete(),
getInitialData: getInitialDataLinker.asDriverOnErrorJustComplete()
)
}
}
// MARK: DomesticRemit view interface
extension DomesticRemitViewModel: DomesticRemitViewModelInterface {
func setError(with error: Error) {
errorLinker.onNext(error)
}
func progress(isShow: Bool) {
progressLinker.onNext(isShow)
}
func setModel(with model: DomesticRemitModel) {
getInitialDataLinker.onNext(model)
}
func selectedData(with model: TablePresenterProtocol?, type: DomesticRemitPresenter.ShowType) {
switch type {
case .banks:
let model = model as? BankInformation
selectedBankLinker.onNext(model)
case .histories:
let model = model as? RecentRecipientModel
selectedBankLinker.onNext(model?.bank)
selectedHistoryLinker.onNext(model)
case .autodebit:
let model = model as? Account
selectedAutodebitLinker.onNext(model)
}
}
func setRecipientName(with model: RecipientNameModel) {
getRecipientNameLinker.onNext(model)
}
}

16
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/View/ViewModel/DomesticRemitViewModelInterface.swift

@ -0,0 +1,16 @@
//
// DomesticRemitViewModelInterface.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol DomesticRemitViewModelInterface: class {
func setError(with error: Error)
func progress(isShow: Bool)
func setModel(with model: DomesticRemitModel)
func selectedData(with model: TablePresenterProtocol?, type: DomesticRemitPresenter.ShowType)
func setRecipientName(with model: RecipientNameModel)
}

89
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/Wireframe/DomesticRemitWireframe.swift

@ -0,0 +1,89 @@
//
// DomesticRemitWireframe.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class DomesticRemitWireframe {
weak var view: UIViewController!
weak var output: DomesticRemitWireframeOutput?
}
extension DomesticRemitWireframe: DomesticRemitWireframeInput {
var storyboardName: String {return "DomesticRemit"}
func getMainView() -> UIViewController {
let service = DomesticRemitService()
let interactor = DomesticRemitInteractor(service: service)
let presenter = DomesticRemitPresenter()
let viewModel = DomesticRemitViewModel()
let viewController = viewControllerFromStoryboard(of: DomesticRemitViewController.self)
output = presenter
viewController.viewModel = viewModel
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.viewModel = viewModel
viewModel.presenter = presenter
view = viewController
return viewController
}
func open(on source: UIViewController) {
let vc = getMainView()
source.navigationController?.pushViewController(vc, animated: true)
}
func showTablePresenter(with model: [TablePresenterProtocol]?, type: DomesticRemitPresenter.ShowType) {
TablePresenterWireframe().openWith(
tag: type.rawValue,
delegate: self,
model: model,
source: view
)
}
func showRecentHistories() {
RecentHistoriesWireframe().open(delegate: self, on: view)
}
}
extension DomesticRemitWireframe: TablePresenterDelegate {
func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration {
return TablePresenterConfiguration(
presenterTitle: "Select Bank",
closeButtonTitle: "Close",
notFoundTitle: "Not Found",
searchBarPlaceHolder: "Search",
isUseSearchBar: false
)
}
func tablePresenterView(
_ viewController: TablePresenterViewController,
didSelectModel model: TablePresenterProtocol?
) {
guard let type = DomesticRemitPresenter.ShowType(rawValue: viewController.view.tag) else { return }
output?.selectedData(with: model, type: type)
}
}
extension DomesticRemitWireframe: RecentHistoriesDelegate {
func recentHistories(
_ viewController: RecentHistoriesViewController,
didSelectHistory: RecentRecipientModel
) {
output?.selectedData(with: didSelectHistory, type: .histories)
}
}

18
GME Remit/Modules/RemittanceModules/DomesticModules/DomesticRemit/User Interface/Wireframe/DomesticRemitWireframeInputOutput.swift

@ -0,0 +1,18 @@
//
// DomesticRemitWireframeInputOutput.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol DomesticRemitWireframeInput: WireframeInput {
func showTablePresenter(with model: [TablePresenterProtocol]?, type: DomesticRemitPresenter.ShowType)
func showRecentHistories()
}
protocol DomesticRemitWireframeOutput: class {
func selectedData(with model: TablePresenterProtocol?, type: DomesticRemitPresenter.ShowType)
}

40
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Interactor/RecentHistoriesInteractor.swift

@ -0,0 +1,40 @@
//
// RecentHistoriesInteractor.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class RecentHistoriesInteractor {
// MARK: Properties
weak var output: RecentHistoriesInteractorOutput?
private let service: RecentHistoriesServiceType
// MARK: Initialization
init(service: RecentHistoriesServiceType) {
self.service = service
}
}
// MARK: RecentHistories interactor input interface
extension RecentHistoriesInteractor: RecentHistoriesInteractorInput {
func fetchHistories(
from: String = "",
to: String = ""
) {
service.fetchHistories(
from: from,
to: to,
success: {self.output?.setHistories(with: $0)},
failure: {self.output?.setError(with:$0)}
)
}
}

19
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Interactor/RecentHistoriesInteractorIO.swift

@ -0,0 +1,19 @@
//
// RecentHistoriesInteractorIO.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol RecentHistoriesInteractorInput: class {
func fetchHistories(
from: String,
to: String
)
}
protocol RecentHistoriesInteractorOutput: class {
func setHistories(with model: [RecentRecipientModel])
func setError(with error: Error)
}

35
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Model/RecentRecipientModel.swift

@ -0,0 +1,35 @@
//
// RecentRecipientModel.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import ObjectMapper
struct RecentRecipientModel: Mappable {
var bank: BankInformation?
var account: String?
var name: String?
init?(map: Map) {
}
mutating func mapping(map: Map) {
bank <- map["bank"]
account <- map["RecipientAccount"]
name <- map["RecipientName"]
}
}
extension RecentRecipientModel: TablePresenterProtocol {
var cellTitle: String? {
return name
}
var cellImage: UIImage? {
return nil
}
}

73
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Service/RecentHistoriesService.swift

@ -0,0 +1,73 @@
//
// RecentHistoriesService.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class RecentHistoriesService: RecentHistoriesServiceType {
func fetchHistories(
from: String = "",
to: String = "",
success: @escaping ([RecentRecipientModel]) -> Void,
failure: @escaping (Error) -> Void
) {
// APIRouter.fetchRecentHistories(
// customerID: "",
// from: "",
// to: ""
// )
// FIXME: Test
let test = """
{
"ErrorCode": "0",
"Msg": "Success",
"Id": null,
"Extra": "",
"Extra2": "",
"Data": [
{
"bank": {
"RowId" : "15",
"BankName" : "Shin",
"BankCode" : "037"
},
"RecipientAccount": "40790204056000",
"RecipientName": "James1"
},
{
"bank": {
"RowId" : "25",
"BankName" : "Kyongnam Bank",
"BankCode" : "039"
},
"RecipientAccount": "110223458044",
"RecipientName": "James3"
},
{
"bank": {
"RowId" : "13",
"BankName" : "KEB Hana Bank",
"BankCode" : "081"
},
"RecipientAccount": "12345678901",
"RecipientName": "James2"
}
]
}
"""
let json = ResponseContainerArray<RecentRecipientModel>(JSONString: test)
success(json?.data ?? [])
}
}

16
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Application Logic/Service/RecentHistoriesServiceType.swift

@ -0,0 +1,16 @@
//
// RecentHistoriesServiceType.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol RecentHistoriesServiceType: class, ApiServiceType {
func fetchHistories(
from: String,
to: String,
success: @escaping ([RecentRecipientModel]) -> Void,
failure: @escaping (Error) -> Void
)
}

14
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/Module Interface/RecentHistoriesModuleInterface.swift

@ -0,0 +1,14 @@
//
// RecentHistoriesModuleInterface.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol RecentHistoriesModuleInterface: class {
func fetchHistories(
from: String,
to: String
)
}

44
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/Presenter/RecentHistoriesPresenter.swift

@ -0,0 +1,44 @@
//
// RecentHistoriesPresenter.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class RecentHistoriesPresenter {
// MARK: Properties
weak var viewModel: RecentHistoriesViewModelInterface?
var interactor: RecentHistoriesInteractorInput?
var wireframe: RecentHistoriesWireframeInput?
}
// MARK: RecentHistories module interface
extension RecentHistoriesPresenter: RecentHistoriesModuleInterface {
func fetchHistories(
from: String = "",
to: String = ""
) {
interactor?.fetchHistories(from: from, to: to)
}
}
// MARK: RecentHistories interactor output interface
extension RecentHistoriesPresenter: RecentHistoriesInteractorOutput {
func setHistories(with model: [RecentRecipientModel]) {
viewModel?.setHistories(with: model)
}
func setError(with error: Error) {
viewModel?.setError(with: error)
}
}
// MARK: RecentHistories wireframe output interface
extension RecentHistoriesPresenter: RecentHistoriesWireframeOutput {
}

21
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/Cell/RecentRecipientCell.swift

@ -0,0 +1,21 @@
//
// RecentRecipientCell.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class RecentRecipientCell: UITableViewCell {
@IBOutlet private weak var nameLabel: UILabel!
@IBOutlet private weak var bankLabel: UILabel!
@IBOutlet private weak var accountLabel: UILabel!
func setModel(with model: RecentRecipientModel) {
nameLabel.text = model.name
accountLabel.text = model.account
bankLabel.text = model.bank?.bankName
}
}

196
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/RecentHistories.storyboard

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="HSb-ou-7T5">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--RecentHistories-->
<scene sceneID="R60-Pu-Hpy">
<objects>
<viewController storyboardIdentifier="RecentHistoriesViewController" title="RecentHistories" modalTransitionStyle="crossDissolve" modalPresentationStyle="overFullScreen" id="HSb-ou-7T5" customClass="RecentHistoriesViewController" customModule="GME_Remit" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="9Uc-9s-KgO">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9jL-Y3-Li7">
<rect key="frame" x="0.0" y="133.5" width="375" height="533.5"/>
<subviews>
<view opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Xuy-dc-FlA">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EPv-JI-308">
<rect key="frame" x="0.0" y="0.0" width="44" height="44"/>
<color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<state key="normal" image="ic_cancel">
<color key="titleColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Recent Recipients" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gh5-V7-h0V">
<rect key="frame" x="119" y="11.5" width="137.5" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="EPv-JI-308" firstAttribute="leading" secondItem="Xuy-dc-FlA" secondAttribute="leading" id="3bL-5Z-mNf"/>
<constraint firstItem="EPv-JI-308" firstAttribute="centerY" secondItem="Xuy-dc-FlA" secondAttribute="centerY" id="O0F-7C-bJC"/>
<constraint firstAttribute="height" constant="44" id="Sw4-dj-PmZ"/>
<constraint firstItem="EPv-JI-308" firstAttribute="height" secondItem="Xuy-dc-FlA" secondAttribute="height" id="Wca-FQ-XLz"/>
<constraint firstItem="Gh5-V7-h0V" firstAttribute="centerY" secondItem="Xuy-dc-FlA" secondAttribute="centerY" id="Yaf-Bn-vCI"/>
<constraint firstItem="EPv-JI-308" firstAttribute="width" secondItem="Xuy-dc-FlA" secondAttribute="height" multiplier="1:1" id="cc8-Rz-jSQ"/>
<constraint firstItem="Gh5-V7-h0V" firstAttribute="centerX" secondItem="Xuy-dc-FlA" secondAttribute="centerX" id="kvf-d8-JT3"/>
</constraints>
</view>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="vSd-Cn-NtH">
<rect key="frame" x="0.0" y="94" width="375" height="439.5"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<view key="tableFooterView" contentMode="scaleToFill" id="Jc0-AE-AKV">
<rect key="frame" x="0.0" y="98" width="375" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Not found" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DSX-pB-voq">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="DSX-pB-voq" secondAttribute="trailing" id="DaZ-1h-pAY"/>
<constraint firstItem="DSX-pB-voq" firstAttribute="top" secondItem="Jc0-AE-AKV" secondAttribute="top" id="bGf-IH-G4v"/>
<constraint firstItem="DSX-pB-voq" firstAttribute="leading" secondItem="Jc0-AE-AKV" secondAttribute="leading" id="qQc-WR-GOE"/>
<constraint firstAttribute="bottom" secondItem="DSX-pB-voq" secondAttribute="bottom" id="yIF-Pg-Za6"/>
</constraints>
</view>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="5" indentationWidth="5" reuseIdentifier="RecentRecipientCell" rowHeight="70" id="X2M-ta-xHv" customClass="RecentRecipientCell" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="375" height="70"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" ambiguous="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="X2M-ta-xHv" id="et9-GJ-ooJ">
<rect key="frame" x="0.0" y="0.0" width="375" height="69.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="FkF-ac-dcc">
<rect key="frame" x="10" y="10" width="355" height="45"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" alignment="center" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="4lw-Z7-vab">
<rect key="frame" x="5" y="0.0" width="345" height="45"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="James Kim" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="ilt-ZQ-e17">
<rect key="frame" x="0.0" y="13.5" width="111.5" height="17.5"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="15"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Korea Development Bank(KDB)" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="9NA-kr-brd">
<rect key="frame" x="116.5" y="5" width="112" height="35"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="15"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="110223458044" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="sSB-S3-hHb">
<rect key="frame" x="233.5" y="13.5" width="111.5" height="17.5"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="15"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="4lw-Z7-vab" firstAttribute="leading" secondItem="FkF-ac-dcc" secondAttribute="leading" constant="5" id="8HL-J5-Wqa"/>
<constraint firstAttribute="trailing" secondItem="4lw-Z7-vab" secondAttribute="trailing" constant="5" id="9zs-y8-CKC"/>
<constraint firstAttribute="height" constant="45" id="Btr-jU-qPi"/>
<constraint firstAttribute="bottom" secondItem="4lw-Z7-vab" secondAttribute="bottom" id="Pwj-Nc-aar"/>
<constraint firstItem="4lw-Z7-vab" firstAttribute="top" secondItem="FkF-ac-dcc" secondAttribute="top" id="vO4-Ae-DCb"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="FkF-ac-dcc" secondAttribute="trailing" constant="10" id="TSh-jG-UJ1"/>
<constraint firstItem="FkF-ac-dcc" firstAttribute="leading" secondItem="et9-GJ-ooJ" secondAttribute="leading" constant="10" id="XEG-qZ-l5W"/>
<constraint firstItem="FkF-ac-dcc" firstAttribute="top" secondItem="et9-GJ-ooJ" secondAttribute="top" constant="10" id="dQ3-0N-ZTj"/>
<constraint firstAttribute="bottom" secondItem="FkF-ac-dcc" secondAttribute="bottom" constant="10" id="ftf-QG-zjO"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="accountLabel" destination="sSB-S3-hHb" id="HfU-EG-pNP"/>
<outlet property="bankLabel" destination="9NA-kr-brd" id="k1u-eU-s6k"/>
<outlet property="nameLabel" destination="ilt-ZQ-e17" id="cwJ-cI-NQp"/>
</connections>
</tableViewCell>
</prototypes>
</tableView>
<stackView opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ean-iy-xy9">
<rect key="frame" x="0.0" y="44" width="375" height="50"/>
<subviews>
<searchBar contentMode="redraw" searchBarStyle="minimal" placeholder="search" translatesAutoresizingMaskIntoConstraints="NO" id="vEO-cI-U7T">
<rect key="frame" x="0.0" y="0.0" width="325" height="50"/>
<textInputTraits key="textInputTraits"/>
</searchBar>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ua4-FA-oLE">
<rect key="frame" x="325" y="0.0" width="50" height="50"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="4V1-zf-HHl"/>
<constraint firstAttribute="width" constant="50" id="sWc-xp-mml"/>
</constraints>
<state key="normal" image="ic_calender"/>
</button>
</subviews>
</stackView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="vSd-Cn-NtH" firstAttribute="top" secondItem="Ean-iy-xy9" secondAttribute="bottom" id="1Xb-19-Pex"/>
<constraint firstItem="vSd-Cn-NtH" firstAttribute="leading" secondItem="9jL-Y3-Li7" secondAttribute="leading" id="4e9-7p-1hF"/>
<constraint firstAttribute="bottom" secondItem="vSd-Cn-NtH" secondAttribute="bottom" id="5uw-xa-P0A"/>
<constraint firstItem="Xuy-dc-FlA" firstAttribute="top" secondItem="9jL-Y3-Li7" secondAttribute="top" id="8BB-ZR-xGS"/>
<constraint firstAttribute="trailing" secondItem="vSd-Cn-NtH" secondAttribute="trailing" id="Aps-rw-KLW"/>
<constraint firstItem="Ean-iy-xy9" firstAttribute="leading" secondItem="9jL-Y3-Li7" secondAttribute="leading" id="CIL-AH-cfT"/>
<constraint firstItem="Ean-iy-xy9" firstAttribute="top" secondItem="Xuy-dc-FlA" secondAttribute="bottom" id="Val-z4-Y6a"/>
<constraint firstAttribute="trailing" secondItem="Xuy-dc-FlA" secondAttribute="trailing" id="Wru-8H-EHe"/>
<constraint firstAttribute="trailing" secondItem="Ean-iy-xy9" secondAttribute="trailing" id="adi-8C-sFa"/>
<constraint firstItem="Xuy-dc-FlA" firstAttribute="leading" secondItem="9jL-Y3-Li7" secondAttribute="leading" id="qbJ-S8-MQa"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.5" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="9jL-Y3-Li7" firstAttribute="height" secondItem="9Uc-9s-KgO" secondAttribute="height" multiplier="0.8:1" id="CBH-Co-zMI"/>
<constraint firstItem="9jL-Y3-Li7" firstAttribute="bottom" secondItem="9Uc-9s-KgO" secondAttribute="bottom" id="bN3-L2-s0a"/>
<constraint firstItem="9jL-Y3-Li7" firstAttribute="leading" secondItem="O1T-1R-Sun" secondAttribute="leading" id="s7T-ca-Gcf"/>
<constraint firstItem="9jL-Y3-Li7" firstAttribute="trailing" secondItem="O1T-1R-Sun" secondAttribute="trailing" id="wYT-bV-md2"/>
</constraints>
<viewLayoutGuide key="safeArea" id="O1T-1R-Sun"/>
</view>
<connections>
<outlet property="calendarButton" destination="ua4-FA-oLE" id="gUc-xa-SJP"/>
<outlet property="closeButton" destination="EPv-JI-308" id="Ymx-DI-ooD"/>
<outlet property="mainView" destination="9jL-Y3-Li7" id="rU2-JH-1ys"/>
<outlet property="notFoundLabel" destination="DSX-pB-voq" id="RA9-u9-XWm"/>
<outlet property="searchBar" destination="vEO-cI-U7T" id="TZg-36-zRf"/>
<outlet property="tableView" destination="vSd-Cn-NtH" id="yf9-1x-1U0"/>
<outlet property="titleLabel" destination="Gh5-V7-h0V" id="2ts-z8-NQ9"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8je-5K-XuW" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-92" y="232.53373313343329"/>
</scene>
</scenes>
<resources>
<image name="ic_calender" width="25" height="25"/>
<image name="ic_cancel" width="12" height="12"/>
</resources>
<color key="tintColor" red="0.78177064659999995" green="0.55228364470000002" blue="0.018981300289999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</document>

128
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/RecentHistoriesViewController.swift

@ -0,0 +1,128 @@
//
// RecentHistoriesViewController.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import RxSwift
import RxCocoa
import IQKeyboardManagerSwift
protocol RecentHistoriesDelegate: class {
func recentHistories(
_ viewController: RecentHistoriesViewController,
didSelectHistory: RecentRecipientModel
)
}
class RecentHistoriesViewController: UIViewController {
// MARK: Properties
var viewModel: RecentHistoriesViewModel!
weak var delegate: RecentHistoriesDelegate?
private let disposeBag = DisposeBag()
// MARK: Computed Properties
// MARK: IBOutlets
@IBOutlet private weak var calendarButton: UIButton!
@IBOutlet private weak var searchBar: UISearchBar!
@IBOutlet private weak var tableView: UITableView!
@IBOutlet private weak var closeButton: UIButton!
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var notFoundLabel: UILabel!
@IBOutlet private weak var mainView: UIView!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
mainView.bottomToOrigin(duration: 0.1)
IQKeyboardManager.shared.enable = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
IQKeyboardManager.shared.enable = true
view.endEditing(true)
}
// MARK: IBActions
}
// MARK: Other Functions
extension RecentHistoriesViewController {
private func setup() {
// all setup should be done here
setBinding()
mainView.layer.cornerRadius = 5
}
private func setBinding() {
let viewWillAppear = rx.sentMessage(#selector(UIViewController.viewWillAppear(_:)))
.mapToVoid()
.asDriverOnErrorJustComplete()
let input = RecentHistoriesViewModel.Input(
viewWillAppear: viewWillAppear,
filterText: searchBar.rx.text.asDriverOnErrorJustComplete(),
selectTrigger: tableView.rx.itemSelected.asDriver()
)
let output = viewModel.transform(input: input)
output.isError
.drive(
onNext: { self.alert(type: .error, message: $0.localizedDescription) }
).disposed(by: disposeBag)
output.isProgress
.drive(
onNext: { $0 ? self.showProgressHud() : self.hideProgressHud() }
).disposed(by: disposeBag)
output.histories
.map { $0.count != 0 }
.drive(self.notFoundLabel.rx.isHidden)
.disposed(by: disposeBag)
output
.histories.drive(
tableView.rx.items(cellIdentifier: "RecentRecipientCell")
) { (_, element: RecentRecipientModel, cell: RecentRecipientCell) in
cell.setModel(with: element)
}
.disposed(by: disposeBag)
output.selectedHistory
.drive(onNext: {
guard let model = $0 else { return }
self.presentingViewController?.view.endEditing(true)
self.mainView.originToBottom {
self.dismiss(animated: true) {
self.delegate?.recentHistories(self, didSelectHistory: model)
}
}
}).disposed(by: disposeBag)
closeButton.rx.tap
.bind {
self.presentingViewController?.view.endEditing(true)
self.mainView.originToBottom {
self.dismiss(animated: true)
}
}.disposed(by: disposeBag)
}
}

82
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/ViewModel/RecentHistoriesViewModel.swift

@ -0,0 +1,82 @@
//
// RecentHistoriesViewModel.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import RxSwift
import RxCocoa
class RecentHistoriesViewModel: ViewModelType {
var presenter: RecentHistoriesModuleInterface?
struct Input {
let viewWillAppear: Driver<Void>
let filterText: Driver<String?>
let selectTrigger: Driver<IndexPath>
}
struct Output {
let isError: Driver<Error>
let isProgress: Driver<Bool>
let histories: Driver<[RecentRecipientModel]>
let selectedHistory: Driver<RecentRecipientModel?>
}
private let disposeBag = DisposeBag()
private let progressLinker = PublishSubject<Bool>()
private let errorLinker = PublishSubject<Error>()
private let selectedHistoryLinker = BehaviorSubject<RecentRecipientModel?>(value: nil)
private let historiesLinker = BehaviorSubject<[RecentRecipientModel]>(value: [])
func transform(input: Input) -> Output {
let histories = Observable.combineLatest(
historiesLinker, input.filterText.asObservable()
) { histories, searchText -> [RecentRecipientModel] in
guard let searchText = searchText, searchText != "" else {
return histories
}
return histories.filter {( $0.name?.lowercased().contains(searchText.lowercased()) ?? false )}
}.asDriverOnErrorJustComplete()
input.viewWillAppear
.drive(onNext: {self.presenter?.fetchHistories(from: "", to: "")})
.disposed(by: disposeBag)
input.selectTrigger
.withLatestFrom(histories) { (indexPath, histories) -> RecentRecipientModel in
return histories[indexPath.row]
}
.drive(onNext: { [weak self] in guard let `self` = self else { return }
self.selectedHistoryLinker.onNext($0)
})
.disposed(by: disposeBag)
return Output(
isError: errorLinker.asDriverOnErrorJustComplete(),
isProgress: progressLinker.asDriverOnErrorJustComplete(),
histories: histories,
selectedHistory: selectedHistoryLinker.asDriverOnErrorJustComplete()
)
}
}
// MARK: RecentHistories view interface
extension RecentHistoriesViewModel: RecentHistoriesViewModelInterface {
func setError(with error: Error) {
errorLinker.onNext(error)
}
func progress(isShow: Bool) {
progressLinker.onNext(isShow)
}
func setHistories(with model: [RecentRecipientModel]) {
historiesLinker.onNext(model)
}
}

14
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/View/ViewModel/RecentHistoriesViewModelInterface.swift

@ -0,0 +1,14 @@
//
// RecentHistoriesViewModelInterface.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol RecentHistoriesViewModelInterface: class {
func setError(with error: Error)
func progress(isShow: Bool)
func setHistories(with model: [RecentRecipientModel])
}

50
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/Wireframe/RecentHistoriesWireframe.swift

@ -0,0 +1,50 @@
//
// RecentHistoriesWireframe.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class RecentHistoriesWireframe {
weak var view: UIViewController!
weak var output: RecentHistoriesWireframeOutput?
private var delegate: RecentHistoriesDelegate?
}
extension RecentHistoriesWireframe: RecentHistoriesWireframeInput {
var storyboardName: String {return "RecentHistories"}
func getMainView() -> UIViewController {
let service = RecentHistoriesService()
let interactor = RecentHistoriesInteractor(service: service)
let presenter = RecentHistoriesPresenter()
let viewModel = RecentHistoriesViewModel()
let viewController = viewControllerFromStoryboard(of: RecentHistoriesViewController.self)
output = presenter
viewController.viewModel = viewModel
viewController.delegate = delegate
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.viewModel = viewModel
viewModel.presenter = presenter
view = viewController
return viewController
}
func open(delegate: RecentHistoriesDelegate?, on source: UIViewController) {
self.delegate = delegate
let vc = getMainView()
source.present(vc, animated: true, completion: nil)
}
}

17
GME Remit/Modules/RemittanceModules/DomesticModules/RecentHistories/User Interface/Wireframe/RecentHistoriesWireframeInputOutput.swift

@ -0,0 +1,17 @@
//
// RecentHistoriesWireframeInputOutput.swift
// GME Remit
//
// Created by InKwon James Kim on 17/09/2019.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol RecentHistoriesWireframeInput: WireframeInput {
}
protocol RecentHistoriesWireframeOutput: class {
}

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/Application Logic/Interactor/PaymentSelectionInteractor.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Interactor/PaymentSelectionInteractor.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/Application Logic/Interactor/PaymentSelectionInteractorIO.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Interactor/PaymentSelectionInteractorIO.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/Application Logic/Service/PaymentSelectionService.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Service/PaymentSelectionService.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/Application Logic/Service/PaymentSelectionServiceType.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Application Logic/Service/PaymentSelectionServiceType.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/Module Interface/PaymentSelectionModuleInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/Module Interface/PaymentSelectionModuleInterface.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/User Interface/Presenter/PaymentSelectionPresenter.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/Presenter/PaymentSelectionPresenter.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/User Interface/View/Cells/PaymentSelectionTableViewCell.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/Cells/PaymentSelectionTableViewCell.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/User Interface/View/PaymentSelection.storyboard → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/PaymentSelection.storyboard

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/User Interface/View/PaymentSelectionViewController.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/PaymentSelectionViewController.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/User Interface/View/PaymentSelectionViewInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/View/PaymentSelectionViewInterface.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/User Interface/Wireframe/PaymentSelectionWireframe.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/Wireframe/PaymentSelectionWireframe.swift

0
GME Remit/Modules/SendMoneyModules/PaymentSelection/User Interface/Wireframe/PaymentSelectionWireframeInput.swift → GME Remit/Modules/RemittanceModules/OverseasModules/PaymentSelection/User Interface/Wireframe/PaymentSelectionWireframeInput.swift

0
GME Remit/Modules/SendMoneyModules/Resend/Application Logic/Interactor/ResendInteractor.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Interactor/ResendInteractor.swift

0
GME Remit/Modules/SendMoneyModules/Resend/Application Logic/Interactor/ResendInteractorIO.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Interactor/ResendInteractorIO.swift

0
GME Remit/Modules/SendMoneyModules/Resend/Application Logic/Service/ResendService.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Service/ResendService.swift

0
GME Remit/Modules/SendMoneyModules/Resend/Application Logic/Service/ResendServiceType.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Application Logic/Service/ResendServiceType.swift

0
GME Remit/Modules/SendMoneyModules/Resend/Module Interface/ResendModuleInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/Module Interface/ResendModuleInterface.swift

0
GME Remit/Modules/SendMoneyModules/Resend/User Interface/Presenter/ResendPresenter.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/Presenter/ResendPresenter.swift

0
GME Remit/Modules/SendMoneyModules/Resend/User Interface/View/Cell/ResendTableViewCell.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/Cell/ResendTableViewCell.swift

0
GME Remit/Modules/SendMoneyModules/Resend/User Interface/View/Resend.storyboard → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/Resend.storyboard

0
GME Remit/Modules/SendMoneyModules/Resend/User Interface/View/ResendViewController.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/ResendViewController.swift

0
GME Remit/Modules/SendMoneyModules/Resend/User Interface/View/ResendViewInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/View/ResendViewInterface.swift

0
GME Remit/Modules/SendMoneyModules/Resend/User Interface/Wireframe/ResendWireframe.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/Wireframe/ResendWireframe.swift

0
GME Remit/Modules/SendMoneyModules/Resend/User Interface/Wireframe/ResendWireframeInput.swift → GME Remit/Modules/RemittanceModules/OverseasModules/Resend/User Interface/Wireframe/ResendWireframeInput.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/Application Logic/Interactor/ResendExchangeInteractor.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Interactor/ResendExchangeInteractor.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/Application Logic/Interactor/ResendExchangeInteractorIO.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Interactor/ResendExchangeInteractorIO.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/Application Logic/Service/ResendExchangeService.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Service/ResendExchangeService.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/Application Logic/Service/ResendExchangeServiceType.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Application Logic/Service/ResendExchangeServiceType.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/Module Interface/ResendExchangeModuleInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/Module Interface/ResendExchangeModuleInterface.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/User Interface/Presenter/ResendExchangePresenter.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/Presenter/ResendExchangePresenter.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/User Interface/View/ResendExchange.storyboard → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/View/ResendExchange.storyboard

0
GME Remit/Modules/SendMoneyModules/ResendExchange/User Interface/View/ResendExchangeViewController.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/View/ResendExchangeViewController.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/User Interface/View/ResendExchangeViewInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/View/ResendExchangeViewInterface.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/User Interface/Wireframe/ResendExchangeWireframe.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/Wireframe/ResendExchangeWireframe.swift

0
GME Remit/Modules/SendMoneyModules/ResendExchange/User Interface/Wireframe/ResendExchangeWireframeInput.swift → GME Remit/Modules/RemittanceModules/OverseasModules/ResendExchange/User Interface/Wireframe/ResendExchangeWireframeInput.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/Application Logic/Interactor/SelectCouponInteractor.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Interactor/SelectCouponInteractor.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/Application Logic/Interactor/SelectCouponInteractorIO.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Interactor/SelectCouponInteractorIO.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/Application Logic/Service/SelectCouponService.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Service/SelectCouponService.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/Application Logic/Service/SelectCouponServiceType.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Application Logic/Service/SelectCouponServiceType.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/Module Interface/SelectCouponModuleInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/Module Interface/SelectCouponModuleInterface.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/User Interface/Presenter/SelectCouponPresenter.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/Presenter/SelectCouponPresenter.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/User Interface/View/Cell/CouponCell.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/Cell/CouponCell.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/User Interface/View/SelectCoupon.storyboard → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/SelectCoupon.storyboard

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/User Interface/View/SelectCouponViewController.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/SelectCouponViewController.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/User Interface/View/SelectCouponViewInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/View/SelectCouponViewInterface.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/User Interface/Wireframe/SelectCouponWireframe.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/Wireframe/SelectCouponWireframe.swift

0
GME Remit/Modules/SendMoneyModules/SelectCoupon/User Interface/Wireframe/SelectCouponWireframeInput.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectCoupon/User Interface/Wireframe/SelectCouponWireframeInput.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/Application Logic/Interactor/SelectPaymentInteractor.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Interactor/SelectPaymentInteractor.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/Application Logic/Interactor/SelectPaymentInteractorIO.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Interactor/SelectPaymentInteractorIO.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/Application Logic/Service/SelectPaymentService.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Service/SelectPaymentService.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/Application Logic/Service/SelectPaymentServiceType.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Application Logic/Service/SelectPaymentServiceType.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/Module Interface/SelectPaymentModuleInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/Module Interface/SelectPaymentModuleInterface.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/User Interface/Presenter/SelectPaymentPresenter.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/Presenter/SelectPaymentPresenter.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/User Interface/View/Cell/PaymentCell.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/Cell/PaymentCell.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/User Interface/View/SelectPayment.storyboard → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/SelectPayment.storyboard

0
GME Remit/Modules/SendMoneyModules/SelectPayment/User Interface/View/SelectPaymentViewController.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/SelectPaymentViewController.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/User Interface/View/SelectPaymentViewInterface.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/View/SelectPaymentViewInterface.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/User Interface/Wireframe/SelectPaymentWireframe.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/Wireframe/SelectPaymentWireframe.swift

0
GME Remit/Modules/SendMoneyModules/SelectPayment/User Interface/Wireframe/SelectPaymentWireframeInput.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SelectPayment/User Interface/Wireframe/SelectPaymentWireframeInput.swift

0
GME Remit/Modules/SendMoneyModules/SendMoneyCode/Application Logic/Interactor/SendMoneyCodeInteractor.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SendMoneyCode/Application Logic/Interactor/SendMoneyCodeInteractor.swift

0
GME Remit/Modules/SendMoneyModules/SendMoneyCode/Application Logic/Interactor/SendMoneyCodeInteractorIO.swift → GME Remit/Modules/RemittanceModules/OverseasModules/SendMoneyCode/Application Logic/Interactor/SendMoneyCodeInteractorIO.swift

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save