// // KycInteractor.swift // GMERemittance // // Created by gme_2 on 12/09/2018. //Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import Foundation import FirebaseInstanceID class KycInteractor { // MARK: Properties weak var output: KycInteractorOutput? private let service: KycServiceType struct StringConstants { // personal let firstNameError = "kyc_first_name_error".localized() let genderError = "kyc_gender_error".localized() let emailError = "invalid email".localized() let nativeCountryError = "kyc_native_country_error".localized() let addressError = "kyc_address_error".localized() let occupationError = "kyc_occupation_error".localized() let provinceError = "kyc_province_error".localized() let mobileNumberError = "kyc_mobile_invalid_number_error".localized() // security let bankError = "kyc_bank_name_error".localized() let accountNumberError = "kyc_account_number_error".localized() let verificationIdError = "kyc_verification_id_error".localized() let verificationIdNumberError = "kyc_verification_no_error".localized() let sourceofFundError = "kyc_source_of_fund_error".localized() let issueDateError = "document_issue_date_error_text".localized() let expiryDateError = "document_expiry_date_error_text".localized() } // MARK: Initialization init(service: KycServiceType) { self.service = service } // MARK: Converting entities // form 1 func _validate(model: KycForm1Model?) -> (isValid: Bool, errorsDick: [String: String]) { var errorsDick: [String: String] = [:] var sucks = true // isValid = true let formDick = [ KycForm1FieldKeys.firstName: model?.firstName, KycForm1FieldKeys.gender: model?.gender, KycForm1FieldKeys.email: model?.email, KycForm1FieldKeys.nativeCountry: model?.nativeCountry, KycForm1FieldKeys.country: model?.country, KycForm1FieldKeys.occupation: model?.occupation, KycForm1FieldKeys.province: model?.province, KycForm1FieldKeys.mobileNumber: model?.mobile ] formDick.forEach({ if ($0.value ?? "").isEmpty { sucks = false // isValid = false errorsDick[$0.key] = "Please enter a valid \($0.key)" if ($0.key == KycForm1FieldKeys.gender) || ($0.key == KycForm1FieldKeys.nativeCountry) || ($0.key == KycForm1FieldKeys.province) || ($0.key == KycForm1FieldKeys.occupation) { errorsDick[$0.key] = "Please select \($0.key)" } } }) if let value = model?.firstName, value.isEmpty { sucks = false errorsDick[KycForm1FieldKeys.firstName] = StringConstants().firstNameError } if let value = model?.gender, value.isEmpty { sucks = false errorsDick[KycForm1FieldKeys.gender] = StringConstants().genderError } if let value = model?.nativeCountry, value.isEmpty { sucks = false errorsDick[KycForm1FieldKeys.nativeCountry] = StringConstants().nativeCountryError } if let value = model?.country, value.isEmpty { sucks = false errorsDick[KycForm1FieldKeys.country] = StringConstants().addressError } if let value = model?.occupation, value.isEmpty { sucks = false errorsDick[KycForm1FieldKeys.occupation] = StringConstants().occupationError } if let value = model?.province, value.isEmpty { sucks = false errorsDick[KycForm1FieldKeys.province] = StringConstants().provinceError } if let email = model?.email, email.isEmpty { if !Utility.isValidEmail(email: email){ sucks = false errorsDick[KycForm1FieldKeys.email] = StringConstants().emailError } } if let mobileNo = model?.mobile, mobileNo.isEmpty , mobileNo.count != AppConstants.maxKoreanMobileNoLength { sucks = false errorsDick[KycForm1FieldKeys.mobileNumber] = StringConstants().mobileNumberError } let result = (sucks, errorsDick) // (isValid, errorsDick) return result // self.output?.show(result1: result) } // form 2 func _validate(model: KycForm2Model?) -> (isValid: Bool, errorsDick: [String: String]) { var errorsDick: [String: String] = [:] var sucks = true // isValid = true let shoulValidateExpiryDate = model?.checkExpiryDate ?? false let shoulValidateIssueDate = model?.checkIssueDate ?? false var cardType: KycVerificationIdType? let alienAndNationalCardNumberLenght = 14 let formDick = [ KycForm2FieldKeys.bank: model?.bank, KycForm2FieldKeys.accountNumber: model?.accountNumber, KycForm2FieldKeys.verificationId: model?.verificationId, KycForm2FieldKeys.verificationIdNumber: model?.verificationIdNumber, KycForm2FieldKeys.expiryDate: model?.expiryDate, KycForm2FieldKeys.sourceOfFund: model?.sourceOfFund, KycForm2FieldKeys.issueDate: model?.issueDate ] formDick.forEach({ if ($0.value ?? "").isEmpty { if $0.key == KycForm2FieldKeys.issueDate { if shoulValidateIssueDate { sucks = false // isValid = false errorsDick[$0.key] = StringConstants().issueDateError } }else if ( $0.key == KycForm2FieldKeys.expiryDate) { if shoulValidateExpiryDate { sucks = false // isValid = false errorsDick[$0.key] = StringConstants().expiryDateError } }else if $0.key == KycForm2FieldKeys.bank { sucks = false // isValid = false errorsDick[$0.key] = StringConstants().bankError }else if $0.key == KycForm2FieldKeys.verificationId { sucks = false // isValid = false errorsDick[$0.key] = StringConstants().verificationIdError }else if $0.key == KycForm2FieldKeys.sourceOfFund { sucks = false // isValid = false errorsDick[$0.key] = StringConstants().sourceofFundError }else if $0.key == KycForm2FieldKeys.accountNumber { sucks = false // isValid = false errorsDick[$0.key] = StringConstants().accountNumberError }else if $0.key == KycForm2FieldKeys.verificationIdNumber { sucks = false // isValid = false errorsDick[$0.key] = StringConstants().verificationIdNumberError } if $0.key == KycForm2FieldKeys.verificationId { sucks = false if let id = KycVerificationIdType.init(rawValue: $0.value ?? "") { switch id { case .alieanCard: if let count = $0.value?.count, count != 0, count != alienAndNationalCardNumberLenght { errorsDick[$0.key] = "Please enter a 14 digit Alien Registration Card" }else { errorsDick[$0.key] = "Please enter a 14 digit Alien Registration Card" } case .nationalIdCard: if let count = $0.value?.count, count != 0, count != alienAndNationalCardNumberLenght { errorsDick[$0.key] = "Please enter a 14 digit National ID" } case .passport: break } } } } }) let result = (sucks, errorsDick) // (isValid, errorsDick) return result // self.output?.show(result2: result) } // form 3 func _validate(model: KycForm3Model?) -> (isValid: Bool, errorsDick: [String: String]) { var errorsDick: [String: String] = [:] var sucks = true // isValid = true let formDick = [ KycForm3FieldKeys.selfieImage: model?.selfieImage, KycForm3FieldKeys.frontImage: model?.frontImage, KycForm3FieldKeys.backImage: model?.backImage, KycForm3FieldKeys.passbookImage: model?.passbookImage ] formDick.forEach({ if $0.value == nil { sucks = false // isValid = false errorsDick[$0.key] = "\($0.key) filed is required" } }) let result = (sucks, errorsDick) // (isValid, errorsDick) return result // self.output?.show(result3: result) } private func getImageParams(model: KYCRequestModel) -> [String: Data] { var images: [String: Data] = [:] let model = model.kycForm3 // selfie if let image = model?.selfieImage { if let data = getCompressedImage(image: image) { images["selfieUrl"] = data } } // front if let image = model?.frontImage { if let data = getCompressedImage(image: image) { images["regIdcardFrontUrl"] = data } } // back if let image = model?.backImage { if let data = getCompressedImage(image: image) { images["regIdcardBackUrl"] = data } } // passbookImage if let image = model?.passbookImage { if let data = getCompressedImage(image: image) { images["passbookUrl"] = data } } // passportImage if let image = model?.passportImage { if let data = getCompressedImage(image: image) { images["passportUrl"] = data } } return images } private func getCompressedImage(image: UIImage) -> Data? { return UIImageJPEGRepresentation(image, 0.6) } private func getParams(model: KYCRequestModel) -> [String: String] { let defaults = UserDefaults.standard let userName = defaults.string(forKey: UserKeys.userId) ?? "" let gender = model.kycForm1?.gender ?? "" var _gender = "" if gender.lowercased() == "Male".lowercased() { _gender = "M" } if gender.lowercased() == "Female".lowercased() { _gender = "F" } if gender.lowercased() == "other".lowercased() { _gender = "O" } let param: [String: String] = [ "userId": userName, "mobileNumber": model.kycForm1?.mobile ?? "", "email": model.kycForm1?.email ?? "", "gender": _gender, "nativeCountry": model.kycForm1?.nativeCountry ?? "", "ProvinceId": model.kycForm1?.province ?? "", "occupation": model.kycForm1?.occupation ?? "", "referralCode": model.kycForm1?.referralCode ?? "", "primaryBankName": model.kycForm2?.bank ?? "", "primaryAccountNumber": model.kycForm2?.accountNumber ?? "", "verificationIdType": model.kycForm2?.verificationId ?? "", "verificationIdNumber": model.kycForm2?.verificationIdNumber ?? "", "expiryDate": model.kycForm2?.expiryDate ?? "", "issueDate": model.kycForm2?.issueDate ?? "", "sourceOfFund": model.kycForm2?.sourceOfFund ?? "", "firstName": model.kycForm1?.firstName ?? "", "middleName": model.kycForm1?.middleName ?? "", "lastName": model.kycForm1?.lastName ?? "", "address": model.kycForm1?.country ?? "" ] return param } } // MARK: Kyc interactor input interface extension KycInteractor: KycInteractorInput { private func getFcmToken() -> String? { let token = InstanceID.instanceID().token() return token } func validate(model: KYCRequestModel) { let result1 = self._validate(model: model.kycForm1) let result2 = self._validate(model: model.kycForm2) let result3 = self._validate(model: model.kycForm3) let shouldSubmit = result1.isValid && result2.isValid && result3.isValid // let shouldSubmit = result3.isValid if shouldSubmit { /// call api here. let params = self.getParams(model: model) let images = self.getImageParams(model: model) self.service.submit(param: params, images: images, success: { (response) in // print(response?.firstName) // Todo: After success what? // show message from api let userId = Utility.getMyUserName() var param = ["userId" : userId] param["uuid"] = Utility.getUUid() ?? "" param["appVersion"] = Utility.getAppVersion() param["phoneBrand"] = Utility.getPhoneBrand() param["phoneOs"] = Utility.getPhoneOs() param["fcmId"] = self.getFcmToken() param["osVersion"] = Utility.getOsVersion() self.service.fetchUserInfo(param: param, success: { (user) in Utility.save(user: user) UserDefaults.standard.set(true, forKey: UserKeys.kyc) self.output?.submitSuccess() }, failure: { (error) in }) }) { (error) in self.output?.show(error: error) } }else { self.output?.show(result1: result1) self.output?.show(result2: result2) self.output?.show(result3: result3) } } }