You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

397 lines
16 KiB

//
// InboundReceiptViewController.swift
// GME Remit
//
// Created by InKwon James Kim on 2019/11/14.
//Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import RxSwift
import RxCocoa
enum ReceiptDetailType {
case inBound, reedem
}
class InboundReceiptViewController: UIViewController {
// MARK: Properties
var presenter: InboundReceiptPresenter!
var receiptType: ReceiptDetailType = .inBound
var password: String = ""{
didSet{
if password != ""{
self.presenter.redeem(password: self.password)
}
}
}
private let disposeBag = DisposeBag()
// MARK: Computed Properties
// MARK: IBOutlets
@IBOutlet weak var contactNoView: UIView!
@IBOutlet weak var transactionDateView: UIView!
@IBOutlet weak var senderView: UIView!
@IBOutlet weak var receiverView: UIView!
@IBOutlet weak var addressView: UIView!
@IBOutlet weak var mobileNoView: UIView!
@IBOutlet weak var payoutAgentView: UIView!
@IBOutlet weak var bankNameView: UIView!
@IBOutlet weak var bankAccountView: UIView!
@IBOutlet weak var totalReceivedAmountView: UIView!
@IBOutlet weak var totalSentAmountView: UIView!
@IBOutlet weak var serviceFeeView: UIView!
@IBOutlet weak var exRateView: UIView!
@IBOutlet private weak var statusTitleLabel: UILabel!
@IBOutlet private weak var senderCountryImageView: UIImageView!
@IBOutlet private weak var senderCountryNameLabel: UILabel!
@IBOutlet private weak var receiveBankImageView: UIImageView!
@IBOutlet private weak var receiverCountryNameLabel: UILabel!
@IBOutlet private weak var messageContainerView: UIStackView!
@IBOutlet private weak var messageTitleLabel: UILabel!
@IBOutlet private weak var bankNameLabel: UILabel!
@IBOutlet private weak var bankAccountLabel: UILabel!
@IBOutlet private weak var senderToGMEProcess: UIView!
@IBOutlet private weak var gmeToReceiverProcess: UIView!
@IBOutlet private weak var controlTitleLabel: UILabel!
@IBOutlet private weak var controlContentLabel: UILabel!
@IBOutlet private weak var transactionDateTitleLabel: UILabel!
@IBOutlet private weak var transactionDateContentLabel: UILabel!
@IBOutlet private weak var senderNameTitleLabel: UILabel!
@IBOutlet private weak var senderNameContentLabel: UILabel!
@IBOutlet private weak var receiverNameTitleLabel: UILabel!
@IBOutlet private weak var receiverNameContentLabel: UILabel!
@IBOutlet private weak var addressTitleLabel: UILabel!
@IBOutlet private weak var addressContentLabel: UILabel!
@IBOutlet private weak var mobileTitleLabel: UILabel!
@IBOutlet private weak var mobileContentLabel: UILabel!
@IBOutlet private weak var payOutAgentTitleLabel: UILabel!
@IBOutlet private weak var payOutAgentContentLabel: UILabel!
@IBOutlet private weak var bankTitleLabel: UILabel!
@IBOutlet private weak var bankContentLabel: UILabel!
@IBOutlet private weak var bankAccountTitleLabel: UILabel!
@IBOutlet private weak var bankAccountContentLabel: UILabel!
@IBOutlet private weak var amountTitleLabel: UILabel!
@IBOutlet private weak var amountContentsLabel: UILabel!
@IBOutlet private weak var totalSentAmountTitleLabel: UILabel!
@IBOutlet private weak var totalSentAmountContentLabel: UILabel!
@IBOutlet private weak var serviceFeeTitleLabel: UILabel!
@IBOutlet private weak var serviceFeeContentLabel: UILabel!
@IBOutlet private weak var exRateTitleLabel: UILabel!
@IBOutlet private weak var exRateContentLabel: UILabel!
@IBOutlet private weak var cancelButton: UIButton!
@IBOutlet private weak var registerButton: UIButton!
@IBOutlet weak var reedemButton: UIButton!
@IBOutlet private weak var bankMessageContainerView: UIStackView!
@IBOutlet private weak var buttonContainerView: UIStackView!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
//In case of Inbound following are shown
self.contactNoView.isHidden = !(self.receiptType == .inBound)
self.senderView.isHidden = !(self.receiptType == .inBound)
self.bankNameView.isHidden = !(self.receiptType == .inBound)
self.bankAccountView.isHidden = !(self.receiptType == .inBound)
self.totalReceivedAmountView.isHidden = !(self.receiptType == .inBound)
self.cancelButton.isHidden = !(self.receiptType == .inBound)
self.registerButton.isHidden = !(self.receiptType == .inBound)
self.bankNameLabel.isHidden = !(self.receiptType == .inBound)
self.bankAccountLabel.isHidden = !(self.receiptType == .inBound)
//In case of Redeem following are shown
self.receiverView.isHidden = !(self.receiptType == .reedem)
self.addressView.isHidden = !(self.receiptType == .reedem)
self.payoutAgentView.isHidden = true//!(self.receiptType == .reedem)
self.totalSentAmountView.isHidden = !(self.receiptType == .reedem)
self.exRateView.isHidden = !(self.receiptType == .reedem)
setup()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
title = (self.receiptType == .inBound) ? "inbound_receipt_text".localized() : "redeem_cash_pickup_text".localized()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
title = ""
}
// MARK: IBActions
@IBAction func redeem(_ sender: Any) {
if let isUseBiometric = KeyChain.shared.get(key: .biometricAuth), isUseBiometric == "1" {
let biometricAuthenticationWireframe = BiometricAuthenticationWireframe()
biometricAuthenticationWireframe.openWithDelegate(on: self, delegate: self)
} else {
showSecureKeyPad()
}
}
private func showSecureKeyPad() {
self.openPasswordInput { (value) in
self.password = value
}
}
}
// MARK: Other Functions
extension InboundReceiptViewController {
private func setup() {
setUI()
setBinding()
}
private func setUI() {
messageContainerView.isHidden = true
senderToGMEProcess.layer.cornerRadius = 2
gmeToReceiverProcess.layer.cornerRadius = 2
senderToGMEProcess.isHidden = true
gmeToReceiverProcess.isHidden = true
registerButton.isHidden = true
cancelButton.isHidden = true
reedemButton.isHidden = true
if self.receiptType == .inBound{
receiverCountryNameLabel.text = GMEDB.shared.user.string(.fullName)
}else{
receiverCountryNameLabel.text = "Mongolia"
}
registerButton.titleLabel?.minimumScaleFactor = 0.5
registerButton.titleLabel?.adjustsFontSizeToFitWidth = true
registerButton.titleLabel?.numberOfLines = 2
registerButton.titleLabel?.textAlignment = .center
registerButton.layer.cornerRadius = 5
DispatchQueue.main.async {[weak self] in
self?.controlTitleLabel.text = "control_no_text".localized()
self?.transactionDateTitleLabel.text = "transaction_date_text".localized()
self?.senderNameTitleLabel.text = "sender_name_text".localized()
self?.mobileTitleLabel.text = "mobile_number_text".localized()
self?.bankTitleLabel.text = "bank_text".localized()
self?.bankAccountTitleLabel.text = "account_text".localized()
self?.amountTitleLabel.text = "received_amount_text".localized()
self?.serviceFeeTitleLabel.text = "service_fee_text".localized()
self?.registerButton.setTitle("register_account_text".localized(), for: .normal)
self?.cancelButton.setTitle("cancel_text".localized(), for: .normal)
self?.receiverNameTitleLabel.text = "receiver_text".localized()
self?.addressTitleLabel.text = "address_text".localized()
self?.payOutAgentTitleLabel.text = "payout_agent_text".localized()
self?.totalSentAmountTitleLabel.text = "total_sent_amount_text".localized()
self?.exRateTitleLabel.text = "ex_rate_text".localized()
self?.reedemButton.setTitle("redeem_text".localized(), for: .normal)
}
}
private func setBinding() {
let viewWillAppear = rx.sentMessage(#selector(UIViewController.viewWillAppear(_:)))
.mapToVoid()
.asDriverOnErrorJustComplete()
let input = InboundReceiptPresenter.Input(
viewWillAppear: viewWillAppear,
register: registerButton.rx.tap.asDriverOnErrorJustComplete(),
cancel: cancelButton.rx.tap.asDriverOnErrorJustComplete()
)
let output = presenter.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.model.map {$0.senderCountryName}.drive(senderCountryNameLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.controlNumber}.drive(controlContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.tranDate}.drive(transactionDateContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.senderName}.drive(senderNameContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.receiverName}.drive(receiverNameContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.receiverAddress}.drive(addressContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.receiverMobile}.drive(mobileContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.payOutMode}.drive(payOutAgentContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.bankName}.drive(bankContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.bankName}.drive(bankNameLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.accountNo}.drive(bankAccountContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.accountNo}.drive(bankAccountLabel.rx.text).disposed(by: disposeBag)
output.model
.map {$0.receivedAmount?.decimalToCurrency(as: .krw, isFront: false)}
.drive(amountContentsLabel.rx.text).disposed(by: disposeBag)
output.model
.map {$0.receivedAmount?.decimalToCurrency(as: .krw, isFront: false)}
.drive(totalSentAmountContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {$0.serviceFee?.decimalToCurrency(as: .krw, isFront: false)}
.drive(serviceFeeContentLabel.rx.text).disposed(by: disposeBag)
output.model
.map {($0.exrate ?? "0").decimalToCurrency(as: .krw, isFront: false)}
.drive(exRateContentLabel.rx.text).disposed(by: disposeBag)
output.model.map {(self.receiptType == .inBound) ? BankEnum(rawValue: $0.bankCode ?? "")?.ciImage : CountryEnum.mn.flag}
.drive(receiveBankImageView.rx.image).disposed(by: disposeBag)
output.model.map {($0.isAccountReg ?? true) && self.receiptType == .reedem}
.drive(bankMessageContainerView.rx.isHidden).disposed(by: disposeBag)
output.model.map {CountryEnum(rawValue: $0.senderCountryCode?.lowercased() ?? "")?.flag}
.drive(senderCountryImageView.rx.image).disposed(by: disposeBag)
Driver.combineLatest(output.model.map { $0.isAccountReg ?? true}, output.model.map { $0.controlNumber }, output.status)
.drive(onNext: {[weak self] (isRegister, controlNumber, status)in
switch status {
case .processing:
let message = isRegister ?
"transaction_will_be_processed_text".localized() : "you_have_to_register_text".localized()
self?.messageContainerView.isHidden = false
self?.messageTitleLabel.text = message
self?.statusTitleLabel.text = "transfer_processing_text".localized()
self?.senderToGMEProcess.isHidden = false
self?.gmeToReceiverProcess.isHidden = true
self?.registerButton.isHidden = isRegister
self?.cancelButton.isHidden = isRegister
case .paid:
self?.statusTitleLabel.text = "transfer_success_text".localized()
self?.senderToGMEProcess.isHidden = false
self?.gmeToReceiverProcess.isHidden = false
self?.messageContainerView.isHidden = true
case .cancel:
self?.statusTitleLabel.text = "transfer_canceled_text".localized()
self?.senderToGMEProcess.isHidden = true
self?.gmeToReceiverProcess.isHidden = true
self?.messageContainerView.isHidden = true
case .unpaid:
self?.statusTitleLabel.text = "transfer_pending_text".localized()
self?.senderToGMEProcess.isHidden = (self?.receiptType != .reedem)
self?.gmeToReceiverProcess.isHidden = (self?.receiptType != .reedem)
self?.messageContainerView.isHidden = (self?.receiptType != .reedem)
self?.messageTitleLabel.text = "control_number_text".localized() + " \(controlNumber ?? "")"
self?.reedemButton.isHidden = (self?.receiptType != .reedem)
}
}
).disposed(by: disposeBag)
}
}
// MARK: - BiometricAuthenticationViewControllerDelegate
extension InboundReceiptViewController: BiometricAuthenticationViewControllerDelegate {
func viewController(
_ viewController: BiometricAuthenticationViewController,
didFailWithError error: BiometricAuthenticationError, errorMessage: String?) {
print("BiometricAuthenticationWireframe Error: \(errorMessage ?? "")")
viewController.dismiss(animated: true) {
switch error {
case .userFallback:
self.showSecureKeyPad()
case .authenticationFailed, .userCancel, .biometryNotAvailable,
.biometryNotEnrolled, .biometryLockout, .notBeConfigured:
self.alert(type: .error, message: error.message)
}
}
}
func doSelectLocalAuthenticationPolicy(
_ viewController: BiometricAuthenticationViewController
) -> BiometricAuthenticationPolicy {
return .deviceOwnerAuthenticationWithBiometrics
}
func didComplete(_ viewController: BiometricAuthenticationViewController) {
viewController.dismiss(animated: true) {
guard let encryptedPW = KeyChain.shared.get(key: .password) else {
MainWireframe.logoutWarningAlert(message: "To use biometrics authentication you have to login again.")
return
}
self.password = encryptedPW
}
}
func viewController(
_ viewController: BiometricAuthenticationViewController,
informationTitleLabel titleLabel: UILabel,
authenticationButton button: UIButton
) {
titleLabel.text = "use_biometric_authentication_text".localized()
button.setTitle("verify_account_button_text".localized(), for: .normal)
}
}
// MARK: InboundReceiptViewInterface
extension InboundReceiptViewController: InboundReceiptViewInterface {
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func show(error: String) {
self.alert(type: .error, message: error)
}
func show(message: String) {
self.alertWithOk(
type: .success,
message: message,
title: "success_text".localized(),
okTitle: "Ok"
) {
self.navigationController?.popToRootViewController(animated: true)
}
}
}