// // SendMoneyExchangeRateViewController.swift // GMERemittance // // Created by gme_2 on 28/08/2018. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import Hero class SendMoneyExchangeRateCurrencyViewModel { var countryCode: String? var currency: String? } extension SendMoneyExchangeRateCurrencyViewModel: TablePresenterProtocol { var cellTitle: String? { return currency } var cellImage: UIImage? { return CountryInfo().getFlag(for: countryCode ?? "") } } enum ActionBehaviour { case calculate case `continue` } protocol SelectCouponDelegate: class { func selectBoxView( _ viewController: SelectCouponViewController, didSelectModel model: CouponBoxModel? ) } class SendMoneyExchangeRateViewController: UIViewController { private enum DiscountType: String { case percent = "1" case value = "2" } // MARK: IBOutlets @IBOutlet private weak var exchangeBackground1: UIView! @IBOutlet private weak var exchangeBackground2: UIView! @IBOutlet private weak var dropDownImageView: UIImageView! @IBOutlet private weak var backgroundViewCountryLabel1: UIView! @IBOutlet private weak var backgroundViewCountryLabel2: UIView! @IBOutlet private weak var countryListStackView: UIStackView! @IBOutlet private weak var countryCodeLabel: UILabel! @IBOutlet private weak var countryFlagImage: UIImageView! @IBOutlet private weak var continueButton: UIButton! @IBOutlet private weak var senderTextField: GMENumberTextField! @IBOutlet private weak var reciepientTextField: GMENumberTextField! @IBOutlet private weak var transferFeeInfoLabel: UILabel! @IBOutlet weak var appliedCouponStackView: UIStackView! @IBOutlet weak var appliedCouponFee: UILabel! @IBOutlet private weak var exchangeRateLabel: UILabel! @IBOutlet private weak var youSendTitleLabel: UILabel! @IBOutlet private weak var recipientGetsTitleLabel: UILabel! @IBOutlet private weak var couponBackgroundView: UIView! @IBOutlet private weak var couponNameTitleLabel: UILabel! @IBOutlet private weak var couponNameLabel: UILabel! @IBOutlet private weak var couponDropDownImageView: UIImageView! @IBOutlet private weak var realSenderView: UIView! @IBOutlet private weak var realSenderTitleLabel: UILabel! @IBOutlet private weak var realSenderLabel: UILabel! @IBOutlet weak var couponDetailView: UIStackView! @IBOutlet weak var calculatedInfoView: UIView! @IBOutlet weak var serviceChargeView: UIStackView! @IBOutlet weak var exchangeRateView: UIStackView! @IBOutlet weak var couponListFetch: UIView! @IBOutlet weak var couponListShow: UIStackView! // MARK: Properties var presenter: SendMoneyExchangeRateModuleInterface? var requestModel: SendMoneyRequestModel? weak var actionDelegate: SendMoneyExchangeRateActionDelegate? weak var selectedCouponDelegate: SelectCouponDelegate? var reciepient: Recipient? var netServiceFee: String? var couponSchemeId: String? private var applyDefaultCoupon: CouponBoxModel? private lazy var countryListTapGuesture: UITapGestureRecognizer = UITapGestureRecognizer() private lazy var couponListTapGesture: UITapGestureRecognizer = UITapGestureRecognizer() private var plainSendingAmount: String? private var action: ActionBehaviour? { didSet { if let action = self.action { switch action { case .calculate: continueButton.setTitle("calculate_text".localized(), for: .normal) case .continue: continueButton.setTitle("continue_text".localized(), for: .normal) } } } } private var couponInfo: [CouponBoxModel]? { didSet { if couponInfo?.count ?? 0 > 0 { let defaultApplyCoupon = couponInfo?.sorted(by: { (couponModel1, couponModel2) -> Bool in guard let date1 = couponModel1.expireDate else { return true } guard let date2 = couponModel2.expireDate else { return false } return date1 > date2 }) applyDefaultCoupon = defaultApplyCoupon?.first } } } private var selectCoupon: CouponBoxModel? private var transferFeeCharge: ExchangeRateModel? private var currencyInfoViewModel: [SendMoneyExchangeRateCurrencyViewModel]? { didSet { selectedCurrencyViewModel = currencyInfoViewModel?.first } } private var exchangeRateModel: SendMoneyExchangeRateModel? { didSet { guard let model = exchangeRateModel else { self.showExchangeRateInfomation(isHidden: true) return } reciepientTextField.text = Utility.getCommaSeperatedStringWithDecimal( numberString: model.recipientAmount ?? "" ) senderTextField.text = Utility.getCommaSeperatedStringWithDecimal( numberString: model.senderAmount ?? "" ) let serviceCharge = model.transferFee?.likeCommaMoney() ?? model.transferFee ?? "0.00" let transferFee = serviceCharge != "0.00" ? "-\(serviceCharge)" : "\(serviceCharge)" transferFeeInfoLabel.text = "\(transferFee) (\("transfer_fee_included_text".localized()))" exchangeRateLabel.text = "\(model.exchangeRate ?? "") (\("current_exchange_rate_text".localized()))" setCoupon() self.showExchangeRateInfomation(isHidden: false) action = .continue } } private var calcBy = "" private var isFirst = true private var currencies: [String]? { didSet { let models: [SendMoneyExchangeRateCurrencyViewModel] = (currencies ?? []).map {[weak self] in guard let `self` = self else { return SendMoneyExchangeRateCurrencyViewModel() } let viewmodel = SendMoneyExchangeRateCurrencyViewModel() viewmodel.countryCode = self.reciepient?.countryCode ?? "" viewmodel.currency = $0 return viewmodel } currencyInfoViewModel = models } } var selectedCurrencyViewModel: SendMoneyExchangeRateCurrencyViewModel? { didSet { setCurrencyLabel(currency: selectedCurrencyViewModel?.currency ?? "") action = .calculate } } weak var hudDelegate: HUDStatusDelegate? // MARK: VC's Life cycle override func viewDidLoad() { super.viewDidLoad() setup() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) configureViews() action = ActionBehaviour.calculate senderTextField.receiverNativeCountry = reciepient?.countryCode ?? "" reciepientTextField.receiverNativeCountry = reciepient?.countryCode ?? "" presenter?.fetchCoupons() sendingAmountChanged() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if isFirst { self.senderTextField.becomeFirstResponder() self.isFirst = false } if couponNameLabel.text == "" { couponNameLabel.text = "\(couponInfo?.count ?? 0)" } else { } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) view.endEditing(true) } // MARK: IBActions @IBAction private func continueButton(_ sender: UIButton) { view.endEditing(true) if let action = self.action { switch action { case .calculate: calculate() case .continue: goToVerification() } } } // MARK: Other Functions private func setup() { // all setup should be done here realSenderView.isHidden = true backgroundViewCountryLabel2.hero.id = reciepient?.receiverID backgroundViewCountryLabel2.hero.modifiers = [.translate()] setupTargets() action = .calculate senderTextField.delegate = self reciepientTextField.delegate = self calcBy = "c" [backgroundViewCountryLabel1, backgroundViewCountryLabel2].forEach { $0?.layer.cornerRadius = 5 } [exchangeBackground1, exchangeBackground2, couponBackgroundView].forEach { $0?.layer.borderWidth = 1 $0?.layer.borderColor = UIColor.themeSeparate.cgColor // UIColor.init(hex: "#E0E0E0").cgColor $0?.layer.cornerRadius = 5 } configureLanguage() continueButton.layer.cornerRadius = 5 continueButton.backgroundColor = .themeRed continueButton.titleLabel?.font = .sanfrancisco(.medium, size: 18) senderTextField.textColor = .themeRed reciepientTextField.textColor = .themeRed realSenderLabel.textColor = .themeRed backgroundViewCountryLabel1.backgroundColor = .themeBlue backgroundViewCountryLabel2.backgroundColor = .themeBlue } private func showExchangeRateInfomation(isHidden flag: Bool) { calculatedInfoView.isHidden = flag calculatedInfoView.alpha = flag ? 0.0 : 1.0 if !flag { self.serviceChargeView.isHidden = false self.exchangeRateView.isHidden = false self.couponBackgroundView.isHidden = false let animator = UIViewPropertyAnimator(duration: 0.3, curve: .easeIn) { self.serviceChargeView.alpha = 1.0 } animator.addCompletion { _ in let subAnimator = UIViewPropertyAnimator(duration: 0.3, curve: .easeIn) { self.exchangeRateView.alpha = 1.0 } subAnimator.addCompletion { _ in let subSubAnimator = UIViewPropertyAnimator(duration: 0.2, curve: .easeIn) { self.couponBackgroundView.alpha = 1.0 } subSubAnimator.startAnimation() } subAnimator.startAnimation() } animator.startAnimation() } else { serviceChargeView.isHidden = true serviceChargeView.alpha = 0.0 exchangeRateView.isHidden = true exchangeRateView.alpha = 0.0 couponBackgroundView.isHidden = true couponBackgroundView.alpha = 0.0 } } private func setCoupon() { guard let selectedCoupon = applyDefaultCoupon, // selectedCoupon.couponType == "1", let schemeId = selectedCoupon.schemeId, schemeId != "", let discountType = selectedCoupon.discountType, let type = DiscountType(rawValue: discountType), var discountValue = Double(selectedCoupon.discountValue ?? ""), let senderMoney = Double(senderTextField?.text?.stringRemovingComma() ?? ""), let serviceFee = Double(exchangeRateModel?.transferFee?.stringRemovingComma() ?? "") else { resetCouponandAppliedMoney() return } realSenderView.isHidden = false couponSchemeId = schemeId switch type { case .percent: discountValue = serviceFee * (discountValue / 100) couponNameLabel.text = "Service Discount \(selectedCoupon.discountValue ?? "0")%" case .value: couponNameLabel.text = "Service Discount \(selectedCoupon.discountValue ?? "0") KRW" } netServiceFee = "\(serviceFee - discountValue)".likeCommaMoney() realSenderLabel.text = "\(senderMoney - discountValue)".likeCommaMoney() } private func configureLanguage() { youSendTitleLabel.text = "you_send_text".localized() recipientGetsTitleLabel.text = "recepient_gets_text".localized() continueButton.setTitle("calculate_text".localized(), for: .normal) } private func setCountryFlag(countryCode: String) { let countryEnum = CountryEnum(rawValue: countryCode.lowercased()) countryFlagImage.image = countryEnum?.flag } private func setCurrencyLabel(currency: String) { countryCodeLabel.text = currency.uppercased() } private func setupTargets() { let tapGuesture = UITapGestureRecognizer(target: self, action: #selector(showCountryList(_:))) countryListTapGuesture = tapGuesture countryListStackView.addGestureRecognizer(countryListTapGuesture) let couponTapGuesture = UITapGestureRecognizer(target: self, action: #selector(showCouponList(_:))) couponListTapGesture = couponTapGuesture couponListShow.addGestureRecognizer(couponListTapGesture) reciepientTextField.addTarget( self, action: #selector(textChanged(sender:)), for: UIControl.Event.editingChanged ) senderTextField.addTarget( self, action: #selector(textChanged(sender:)), for: UIControl.Event.editingChanged ) } @objc private func showCountryList(_ sender: UITapGestureRecognizer) { TablePresenterWireframe().openWith( delegate: self, model: currencyInfoViewModel, source: self ) } @objc private func showCouponList(_ sender: UITapGestureRecognizer) { SelectCouponWireframe().openSelectCoupon( didSelect: selectCoupon, with: couponInfo, delegate: self, in: self ) } private func configureViews() { exchangeRateModel = nil let dropDownImage = #imageLiteral(resourceName: "dropdown_white").withRenderingMode(UIImage.RenderingMode.alwaysTemplate) let image = dropDownImage dropDownImageView.image = image dropDownImageView.tintColor = UIColor.white setCountryFlag(countryCode: reciepient?.countryCode ?? "") let deliveryMethod = requestModel?.paymemtMode if (deliveryMethod?.bankRequired ?? "false").lowercased() == "true" { currencies = requestModel?.bank?.payCurrency ?? [] } else { currencies = deliveryMethod?.payCurrency ?? [] } couponBackgroundView.isHidden = true couponBackgroundView.alpha = 0 couponDropDownImageView.image = dropDownImage couponDropDownImageView.tintColor = .themeBlue } private func calculate( senderAmt: String?, senderCurrency: String? = "KRW", recieverAmt: String?, recieverCurrency: String?, recieverCountryName: String?, recieverCountryId: String?, paymentMethod: String?, paymentMethodId: String?, calcBy: String?, senderCountryId: String? = "118", payoutPartner: String?, userId: String?, bankId: String? ) { presenter?.calculate( senderAmt: senderAmt, senderCurrency: senderCurrency, recieverAmt: recieverAmt, recieverCurrency: recieverCurrency, recieverCountryName: recieverCountryName, recieverCountryId: recieverCountryId, paymentMethod: paymentMethod, paymentMethodId: paymentMethodId, calcBy: calcBy, senderCountryId: senderCountryId, payoutPartner: payoutPartner, userId: userId, bankId: bankId ) } @objc private func textChanged(sender: UITextField) { action = .calculate sendingAmountChanged() switch sender { case senderTextField: reciepientTextField.text = "" calcBy = "c" senderTextField.text = Utility.getCommaSeperatedString(numberString: senderTextField.text!) resetCouponandAppliedMoney() case reciepientTextField: senderTextField.text = "" calcBy = "p" reciepientTextField.text = Utility.getCommaSeperatedString(numberString: reciepientTextField.text!) resetCouponandAppliedMoney() default: break } } private func resetCouponandAppliedMoney() { netServiceFee = nil couponNameLabel.text = "\(couponInfo?.count ?? 0)" couponNameTitleLabel.text = "coupon_text".localized() realSenderView.isHidden = true } private func sendingAmountChanged() { selectCoupon = nil couponNameLabel.font = .sanfrancisco(.medium, size: 13) if couponNameLabel.text == "\(couponInfo?.count ?? 0)" { //selectCoupon?.couponType == "1" { couponNameTitleLabel.text = "coupon_text".localized() } realSenderTitleLabel.text = "applied_amount_text".localized() } private func calculate() { let senderAmount = senderTextField.text! let reciepientAmount = reciepientTextField.text! calculateExchangeRate(senderAmount: senderAmount, reciepientAmount: reciepientAmount, calcBy: calcBy) } private func goToVerification() { exchangeRateModel?.calcBy = calcBy exchangeRateModel?.reciepientCurrency = selectedCurrencyViewModel?.currency ?? "" exchangeRateModel?.autodebitSendingAmount = getPlainNumbers(number: senderTextField.text!) checkIfCouponIsApplied() actionDelegate?.calculated(model: exchangeRateModel) actionDelegate?.continueToVerificationAction() } private func checkIfCouponIsApplied() { guard let serviceFee = netServiceFee else { exchangeRateModel?.discountedServiceFee = exchangeRateModel?.transferFee exchangeRateModel?.schemeId = nil return } exchangeRateModel?.discountedServiceFee = "\(serviceFee).00" exchangeRateModel?.schemeId = couponSchemeId } private func getPlainNumbers(number: String) -> String { return number.stringRemovingComma() } private func calculateExchangeRate(senderAmount: String, reciepientAmount: String, calcBy: String) { let senderAmount = senderAmount.stringRemovingComma() // send sAmt amount let reciepientAmount = reciepientAmount.stringRemovingComma() let recipientCurrency = selectedCurrencyViewModel?.currency let reciepientCountryId = reciepient?.countryID let paymentMethod = requestModel?.autoDebitAccount?.type ?? "" let paymentMethodId = requestModel?.paymemtMode?.id let payoutPartner = requestModel?.paymemtMode?.payoutPartner let myUsername = Utility.getMyUserName() let bankId = requestModel?.bank?.id //bank id if selected bank let reciepientCountryName = reciepient?.country calculate( senderAmt: senderAmount, recieverAmt: reciepientAmount, recieverCurrency: recipientCurrency, recieverCountryName: reciepientCountryName, recieverCountryId: reciepientCountryId, paymentMethod: paymentMethod, paymentMethodId: paymentMethodId, calcBy: calcBy, payoutPartner: payoutPartner, userId: myUsername, bankId: bankId ) } } // MARK: SendMoneyExchangeRateViewInterface extension SendMoneyExchangeRateViewController: SendMoneyExchangeRateViewInterface { func show(model: SendMoneyExchangeRateModel) { exchangeRateModel = model } func show(error: String) { showExchangeRateInfomation(isHidden: true) alert(type: .error, message: error) } func showLoading() { hudDelegate?.showLoading() } func hideLoading() { hudDelegate?.hideLoading() } func setCouponModel(with model: [CouponBoxModel]?) { let filterCoupon = model?.filter({ (coupon) -> Bool in return (coupon.couponType?.contains("1") ?? false) }) // couponInfo = model couponInfo = filterCoupon } func setError(with error: Error) { alert(message: error.localizedDescription) } } extension SendMoneyExchangeRateViewController { override func didMove(toParent parent: UIViewController?) { self.viewWillAppear(true) if senderTextField.text != "" || reciepientTextField.text != "" { calculate() } } } // MARK: - SelectCouponViewDelegate extension SendMoneyExchangeRateViewController: SelectCouponViewDelegate { func viewController(_ viewController: SelectCouponViewController, didSelect coupon: CouponBoxModel?) { selectCoupon = coupon guard let selectedCoupon = coupon, // selectedCoupon.couponType == "1", let schemeId = selectedCoupon.schemeId, schemeId != "", let discountType = selectedCoupon.discountType, let type = DiscountType(rawValue: discountType), var discountValue = Double(selectedCoupon.discountValue ?? ""), let senderMoney = Double(senderTextField?.text?.stringRemovingComma() ?? ""), let serviceFee = Double(exchangeRateModel?.transferFee?.stringRemovingComma() ?? "") else { resetCouponandAppliedMoney() return } realSenderView.isHidden = false couponSchemeId = schemeId switch type { case .percent: discountValue = serviceFee * (discountValue / 100) couponNameLabel.text = "Service Discount \(selectedCoupon.discountValue ?? "0")%" case .value: couponNameLabel.text = "Service Discount \(selectedCoupon.discountValue ?? "0") KRW" } netServiceFee = "\(serviceFee - discountValue)".likeCommaMoney() realSenderLabel.text = "\(senderMoney - discountValue)".likeCommaMoney() } } // MARK: - UITextFieldDelegate extension SendMoneyExchangeRateViewController: UITextFieldDelegate { func textFieldDidEndEditing(_ textField: UITextField) { switch textField { case senderTextField, reciepientTextField: if senderTextField.text != "" || reciepientTextField.text != "" { calculate() } default: break } } } // MARK: - TablePresenterDelegate extension SendMoneyExchangeRateViewController: TablePresenterDelegate { func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration { return TablePresenterConfiguration( presenterTitle: "search_currency_text".localized(), closeButtonTitle: "cancel_text".localized(), notFoundTitle: "no_result_found_text".localized(), searchBarPlaceHolder: "search_currency_text".localized() ) } func tablePresenterView( _ viewController: TablePresenterViewController, didSelectModel model: TablePresenterProtocol? ) { selectedCurrencyViewModel = (model as? SendMoneyExchangeRateCurrencyViewModel) ?? selectedCurrencyViewModel calcBy.lowercased() == "c" ? (reciepientTextField.text = "") : (senderTextField.text = "") } }