diff --git a/YandexCheckoutPayments/Private/Modules/BankCardDataInput/MaskedBankCardDataInputModuleIO.swift b/YandexCheckoutPayments/Private/Modules/BankCardDataInput/MaskedBankCardDataInputModuleIO.swift index e745112e..45330ff5 100644 --- a/YandexCheckoutPayments/Private/Modules/BankCardDataInput/MaskedBankCardDataInputModuleIO.swift +++ b/YandexCheckoutPayments/Private/Modules/BankCardDataInput/MaskedBankCardDataInputModuleIO.swift @@ -3,6 +3,7 @@ struct MaskedBankCardDataInputModuleInputData { let testModeSettings: TestModeSettings? let isLoggingEnabled: Bool let analyticsEvent: AnalyticsEvent? + let tokenizeScheme: AnalyticsEvent.TokenizeScheme? } protocol MaskedBankCardDataInputModuleOutput: class { diff --git a/YandexCheckoutPayments/Private/Modules/BankCardDataInput/Presenter/MaskedBankCardDataInputPresenter.swift b/YandexCheckoutPayments/Private/Modules/BankCardDataInput/Presenter/MaskedBankCardDataInputPresenter.swift index 67308f00..7188d15a 100644 --- a/YandexCheckoutPayments/Private/Modules/BankCardDataInput/Presenter/MaskedBankCardDataInputPresenter.swift +++ b/YandexCheckoutPayments/Private/Modules/BankCardDataInput/Presenter/MaskedBankCardDataInputPresenter.swift @@ -159,7 +159,8 @@ extension MaskedBankCardDataInputPresenter: BankCardDataInputModuleInput { DispatchQueue.global().async { [weak self] in guard let interactor = self?.interactor else { return } let (authType, _) = interactor.makeTypeAnalyticsParameters() - interactor.trackEvent(.screenError(authType: authType, scheme: .linkedCard)) + let scheme = self?.inputData.tokenizeScheme + interactor.trackEvent(.screenError(authType: authType, scheme: scheme)) } } } diff --git a/YandexCheckoutPayments/Private/Modules/BankCardRepeat/BankCardRepeatInteractorIO.swift b/YandexCheckoutPayments/Private/Modules/BankCardRepeat/BankCardRepeatInteractorIO.swift index 5b17571c..d6a50af9 100644 --- a/YandexCheckoutPayments/Private/Modules/BankCardRepeat/BankCardRepeatInteractorIO.swift +++ b/YandexCheckoutPayments/Private/Modules/BankCardRepeat/BankCardRepeatInteractorIO.swift @@ -1,6 +1,6 @@ import YandexCheckoutPaymentsApi -protocol BankCardRepeatInteractorInput: class { +protocol BankCardRepeatInteractorInput: AnalyticsTrackable { func fetchPaymentMethod(paymentMethodId: String) func tokenize(amount: MonetaryAmount, confirmation: Confirmation, diff --git a/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Interactor/BankCardRepeatInteractor.swift b/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Interactor/BankCardRepeatInteractor.swift index 2b7db21b..0132f2be 100644 --- a/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Interactor/BankCardRepeatInteractor.swift +++ b/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Interactor/BankCardRepeatInteractor.swift @@ -12,13 +12,16 @@ final class BankCardRepeatInteractor { private let clientApplicationKey: String private let paymentService: PaymentProcessing + private let analyticsService: AnalyticsProcessing init(clientApplicationKey: String, - paymentService: PaymentProcessing) { + paymentService: PaymentProcessing, + analyticsService: AnalyticsProcessing) { ThreatMetrixService.configure() self.clientApplicationKey = clientApplicationKey self.paymentService = paymentService + self.analyticsService = analyticsService } } @@ -66,6 +69,10 @@ extension BankCardRepeatInteractor: BankCardRepeatInteractorInput { let tmxSessionIdWithError = tmxSessionId.recover(on: .global(), mapError) tmxSessionIdWithError.fail(output.didFailTokenize) } + + func trackEvent(_ event: AnalyticsEvent) { + analyticsService.trackEvent(event) + } } // MARK: - Private global helpers diff --git a/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Presenter/BankCardRepeatPresenter.swift b/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Presenter/BankCardRepeatPresenter.swift index 8c13bd0a..3d1940e4 100644 --- a/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Presenter/BankCardRepeatPresenter.swift +++ b/YandexCheckoutPayments/Private/Modules/BankCardRepeat/Presenter/BankCardRepeatPresenter.swift @@ -36,7 +36,7 @@ extension BankCardRepeatPresenter: TokenizationViewOutput { private func presentContract() { let viewModel = PaymentMethodViewModelFactory.makePaymentMethodViewModel(.bankCard) - let tokenizeScheme = TokenizeSchemeFactory.makeTokenizeScheme(.bankCard) + let tokenizeScheme = AnalyticsEvent.TokenizeScheme.recurringCard let moduleInputData = ContractModuleInputData( shopName: inputData.shopName, @@ -78,7 +78,8 @@ extension BankCardRepeatPresenter: BankCardRepeatInteractorOutput { cardMask: cardMask, testModeSettings: inputData.testModeSettings, isLoggingEnabled: inputData.isLoggingEnabled, - analyticsEvent: nil + analyticsEvent: .screenRecurringCardForm, + tokenizeScheme: .recurringCard ) DispatchQueue.main.async { [weak self] in @@ -119,6 +120,11 @@ extension BankCardRepeatPresenter: BankCardRepeatInteractorOutput { } private func showError(_ error: Error) { + let authType = AnalyticsEvent.AuthType.withoutAuth + let scheme = AnalyticsEvent.TokenizeScheme.recurringCard + let event = AnalyticsEvent.screenError(authType: authType, scheme: scheme) + interactor.trackEvent(event) + let message = makeMessage(error) contractModuleInput?.hideActivity() contractModuleInput?.showPlaceholder(message: message) diff --git a/YandexCheckoutPayments/Private/Modules/Tokenization/Presenter/TokenizationPresenter.swift b/YandexCheckoutPayments/Private/Modules/Tokenization/Presenter/TokenizationPresenter.swift index f43df3fb..92f7ba55 100644 --- a/YandexCheckoutPayments/Private/Modules/Tokenization/Presenter/TokenizationPresenter.swift +++ b/YandexCheckoutPayments/Private/Modules/Tokenization/Presenter/TokenizationPresenter.swift @@ -174,7 +174,8 @@ extension TokenizationPresenter: TokenizationStrategyOutput { cardMask: paymentOption.cardMask, testModeSettings: inputData.testModeSettings, isLoggingEnabled: inputData.isLoggingEnabled, - analyticsEvent: .screenLinkedCardForm + analyticsEvent: .screenLinkedCardForm, + tokenizeScheme: .linkedCard ) DispatchQueue.main.async { [weak self] in guard let self = self else { return } diff --git a/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsEvent.swift b/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsEvent.swift index 1742dc57..87c6ae8b 100644 --- a/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsEvent.swift +++ b/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsEvent.swift @@ -20,6 +20,9 @@ enum AnalyticsEvent { /// The opening pages 3DS. case screen3ds + /// Open Bank Card screen with screen recurring + case screenRecurringCardForm + // MARK: - Actions /// Create a payment token with the payment method selected. @@ -66,6 +69,7 @@ enum AnalyticsEvent { case bankCard = "bank-card" case smsSbol = "sms-sbol" case applePay = "apple-pay" + case recurringCard = "recurring-card" var key: String { return Key.tokenizeScheme.rawValue diff --git a/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsService.swift b/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsService.swift index 93393327..18b1d431 100644 --- a/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsService.swift +++ b/YandexCheckoutPayments/Private/Services/Analytics/AnalyticsService.swift @@ -55,6 +55,8 @@ final class AnalyticsService: AnalyticsProcessing { eventName = EventKey.screenError.rawValue case .screen3ds: eventName = EventKey.screen3ds.rawValue + case .screenRecurringCardForm: + eventName = EventKey.screenRecurringCardForm.rawValue case .actionTokenize: eventName = EventKey.actionTokenize.rawValue case .actionYaLoginAuthorization: @@ -107,6 +109,9 @@ final class AnalyticsService: AnalyticsProcessing { case .screen3ds: parameters = nil + case .screenRecurringCardForm: + parameters = nil + case .actionTokenize(let scheme, let authType, let tokenType): parameters = [ scheme.key: scheme.rawValue, @@ -147,6 +152,7 @@ final class AnalyticsService: AnalyticsProcessing { case screenBankCardForm case screenError case screen3ds + case screenRecurringCardForm case actionTokenize case actionYaLoginAuthorization case actionPaymentAuthorization diff --git a/YandexCheckoutPayments/Public/TokenizationAssembly.swift b/YandexCheckoutPayments/Public/TokenizationAssembly.swift index 755cafe8..f5126cbb 100644 --- a/YandexCheckoutPayments/Public/TokenizationAssembly.swift +++ b/YandexCheckoutPayments/Public/TokenizationAssembly.swift @@ -30,9 +30,13 @@ public enum TokenizationAssembly { testModeSettings: inputData.testModeSettings, isLoggingEnabled: inputData.isLoggingEnabled) + let analyticsService = AnalyticsProcessingAssembly + .makeAnalyticsService(isLoggingEnabled: inputData.isLoggingEnabled) + let interactor = BankCardRepeatInteractor( clientApplicationKey: inputData.clientApplicationKey, - paymentService: paymentService + paymentService: paymentService, + analyticsService: analyticsService ) let router = TokenizationRouter()