diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/NaviPaymentAnalytics.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/NaviPaymentAnalytics.kt index 9aaebe6e79..8679bd3332 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/NaviPaymentAnalytics.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/NaviPaymentAnalytics.kt @@ -26,6 +26,7 @@ import com.navi.payment.nativepayment.presentation.reducer.ImageSource import com.navi.payment.nativepayment.utils.NaviPaymentErrorConfig import com.navi.payment.nativepayment.viewmodel.ScanCardResult import com.navi.payment.paymentscreen.model.ErrorReason +import com.navi.payment.paymentscreen.model.NaviUpiTransactionInfo import com.navi.payment.utils.putIfNotNullAndNotEmpty import com.navi.payment.utils.usecases.CardValidator import com.navi.payment.utils.usecases.ExpiryDateValidator @@ -822,7 +823,10 @@ class NaviPaymentAnalytics private constructor() { payload?.optString("bankErrorMessage", EMPTY), ) putIfNotNullAndNotEmpty("juspayOrderId", payload?.optString("orderId", EMPTY)) - put("response", response.toString()) + put( + "response", + if (response.toString().contains("card")) "cardTxn" else response.toString(), + ) } NaviTrackEvent.trackEventOnClickStream( eventName = "NaviPMT_Juspay_ProcessSdkResponse", @@ -833,7 +837,11 @@ class NaviPaymentAnalytics private constructor() { fun onJuspaySdkLogs(log: String, logPayload: String) { NaviTrackEvent.trackEventOnClickStream( eventName = "NaviPMT_Juspay_SdkLogs", - eventValues = mapOf("log" to log, "log_payload" to logPayload), + eventValues = + mapOf( + "log" to log, + "log_payload" to if (logPayload.contains("card")) "cardTxn" else logPayload, + ), ) } } @@ -1984,6 +1992,47 @@ class NaviPaymentAnalytics private constructor() { } inner class SendMoneyErrorBottomSheet { + fun onSendMoneyError( + code: String, + localError: ErrorMessage? = null, + networkError: GenericErrorResponse? = null, + naviUpiTransactionInfo: NaviUpiTransactionInfo, + sourceDestination: String, + ) { + val eventAttributes = buildMap { + put("error_code", code) + put("local_error", localError.toString()) + put("network_error", networkError.toString()) + put("navi_upi_transaction_info", naviUpiTransactionInfo.toString()) + put("source_destination", sourceDestination) + } + NaviTrackEvent.trackEventOnClickStream( + eventName = "NaviPMT_SendMoneyErrorBottomSheet_ErrorReceivedDuringSendMoney", + eventValues = eventAttributes, + ) + } + + fun sendMoneyFailedRetryBottomSheetTriggered( + screenName: String, + errorCode: String, + isRetryExperienceEnabled: String, + upiRequestId: String, + isAmountReadOnly: Boolean = true, + baseAttributes: Map = emptyMap(), + ) { + val eventAttributes = buildMap { + put("error_code", errorCode) + put("upi_request_id", upiRequestId) + put("is_amount_read_only", isAmountReadOnly.toString()) + put("is_retry_experience_enabled", isRetryExperienceEnabled) + putAll(baseAttributes) + } + NaviTrackEvent.trackEventOnClickStream( + eventName = "NaviPMT_${screenName}_SendMoneyFailedRetryBottomSheetTriggered", + eventValues = eventAttributes, + ) + } + fun bottomSheetShown( screenName: String, errorCode: String, @@ -2000,7 +2049,7 @@ class NaviPaymentAnalytics private constructor() { putAll(baseAttributes) } NaviTrackEvent.trackEventOnClickStream( - eventName = "NaviPMT_${screenName}_SendMoneyErrorBottomSheet_Shown", + eventName = "NaviPMT_${screenName}_SendMoneyErrorBottomSheetShown", eventValues = eventAttributes, ) } diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt index c8ad6e303e..a673e041ad 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/screens/MPSScreen.kt @@ -759,6 +759,7 @@ fun MPSScreen( ) onBackClick(PaymentCancelSource.ERROR_CANCEL_BTN_CLICKED) }, + showPayButtonLoader = showPayNowLoader, onPayViaOtherMethodsClicked = { sendMoneyErrorAnalytics.onPayViaOtherMethodsClicked( screenName = @@ -789,6 +790,16 @@ fun MPSScreen( ) onResetUpiPinClick() }, + onPayButtonClick = { + sendMoneyErrorAnalytics.onPayButtonClicked( + screenName = + NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName, + isRetryExperienceEnabled = true, + selectedBankAccountId = selectedBankAccount?.accountId.orEmpty(), + baseAttributes = mpsViewModel.getAnalyticsParams(), + ) + mpsViewModel.startPayAmount() + }, ) } } diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt index c969e651ce..55830ef090 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/MPSViewModel.kt @@ -384,11 +384,18 @@ constructor( sendMoneyErrorAnalytics.bottomSheetShown( screenName = NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName, errorCode = errorCode, - isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.toString(), + isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(), baseAttributes = getAnalyticsParams(), upiRequestId = event.response.data?.upiRequestId.orEmpty(), ) if (shouldShowPaymentRetryExperienceBottomSheet(errorBucket = errorBucket)) { + sendMoneyErrorAnalytics.sendMoneyFailedRetryBottomSheetTriggered( + screenName = NaviPaymentAnalyticScreenName.MINI_PAYMENT_SCREEN.screenName, + errorCode = errorCode, + isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(), + baseAttributes = getAnalyticsParams(), + upiRequestId = event.response.data?.upiRequestId.orEmpty(), + ) updateBottomSheetUIState( showBottomSheet = true, bottomSheetUIState = diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt index 705fa7ed41..069c65cf13 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/NPSViewModel.kt @@ -348,6 +348,13 @@ constructor( ) if (shouldShowPaymentRetryExperienceBottomSheet(errorBucket = errorBucket)) { delay(SCREEN_TRANSITION_DURATION_IN_MILLIS.toLong()) + sendMoneyErrorAnalytics.sendMoneyFailedRetryBottomSheetTriggered( + screenName = NaviPaymentAnalyticScreenName.FULL_PAYMENT_SCREEN.screenName, + errorCode = errorCode, + isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.toString(), + baseAttributes = getAnalyticsParams(), + upiRequestId = event.response.data?.upiRequestId.orEmpty(), + ) updateBottomSheetUIState( showBottomSheet = true, bottomSheetStateChange = true, diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/OneClickCheckoutViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/OneClickCheckoutViewModel.kt index cfcce3ebb3..8536b2573c 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/OneClickCheckoutViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/OneClickCheckoutViewModel.kt @@ -67,10 +67,12 @@ import com.navi.payment.utils.Constants.COINS_AMOUNT import com.navi.payment.utils.Constants.COINS_CURRENCY import com.navi.payment.utils.Constants.COINS_VALUE import com.navi.payment.utils.Constants.IS_AMOUNT_READ_ONLY +import com.navi.payment.utils.Constants.SCREEN_TRANSITION_DURATION_IN_MILLIS import com.navi.payment.utils.getPMSMetricInfo import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest @@ -153,11 +155,21 @@ constructor( screenName = NaviPaymentAnalyticScreenName.ONE_CLICK_CHECKOUT_SCREEN.screenName, errorCode = errorCode, isAmountReadOnly = isAmountReadOnly, - isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.toString(), + isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(), baseAttributes = getAnalyticsParams(), upiRequestId = event.response.data?.upiRequestId.orEmpty(), ) if (shouldShowPaymentRetryExperienceBottomSheet(errorBucket = errorBucket)) { + delay(SCREEN_TRANSITION_DURATION_IN_MILLIS.toLong()) + sendMoneyErrorAnalytics.sendMoneyFailedRetryBottomSheetTriggered( + screenName = + NaviPaymentAnalyticScreenName.ONE_CLICK_CHECKOUT_SCREEN.screenName, + errorCode = errorCode, + isAmountReadOnly = isAmountReadOnly, + isRetryExperienceEnabled = isPaymentRetryExperienceEnabled.value.toString(), + baseAttributes = getAnalyticsParams(), + upiRequestId = event.response.data?.upiRequestId.orEmpty(), + ) updateBottomSheetUIState( showBottomSheet = true, bottomSheetUIState = diff --git a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/TransactionPollingViewModel.kt b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/TransactionPollingViewModel.kt index a0bc4ca262..e2c05fb7ad 100644 --- a/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/TransactionPollingViewModel.kt +++ b/android/navi-payment/src/main/java/com/navi/payment/nativepayment/viewmodel/TransactionPollingViewModel.kt @@ -35,6 +35,7 @@ import com.navi.pay.utils.isAccountIdOfTypeUpiLite import com.navi.payment.model.common.SignalPaymentData import com.navi.payment.model.paymentmethod.Amount import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName +import com.navi.payment.nativepayment.NaviPaymentAnalytics import com.navi.payment.nativepayment.common.usecase.TransactionStatusUseCase import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.ERROR_RESPONSE @@ -134,6 +135,7 @@ constructor( val paymentTransactionStatus = _paymentTransactionStatus.asStateFlow() private val pollingStartTime = System.currentTimeMillis() + private val naviPaymentAnalytics = NaviPaymentAnalytics.INSTANCE.SendMoneyErrorBottomSheet() init { if (naviUpiTransactionInfo.isNull()) pollTransactionStatus() else executeSendMoney() @@ -221,6 +223,14 @@ constructor( .orEmpty(), ) + val errorCode = sendMoneyResponse.errors?.firstOrNull()?.code.orEmpty() + naviPaymentAnalytics.onSendMoneyError( + code = errorCode, + localError = sendMoneyResponse.error, + networkError = sendMoneyResponse.errors?.firstOrNull(), + naviUpiTransactionInfo = naviUpiTransactionInfo, + sourceDestination = sourceDestination, + ) eventHandler .get() .postSendMoneyErrorEvent(