NTP-42965 || Shrihari | Razorpay to Turbo-checkout migration (#15149)

Co-authored-by: Aman S <aman.s@navi.com>
This commit is contained in:
A Shrihari Raju
2025-02-26 20:03:29 +05:30
committed by GitHub
parent 30dd70052c
commit c508ccbc87
4 changed files with 157 additions and 3 deletions

View File

@@ -45,6 +45,7 @@ import com.navi.amc.utils.AmcAnalytics.AMC_BTN_CSAT_PLAYSTORE_BSHEET_END
import com.navi.amc.utils.AmcAnalytics.AMC_INIT_CSAT_PLAYSTORE_BSHEET
import com.navi.amc.utils.AmcAnalytics.AMC_PAYMENT_TOKEN_RECEIVED
import com.navi.amc.utils.AmcAnalytics.AMC_RECEIVED_NULL_POST_PAYMENT_DATA
import com.navi.amc.utils.AmcAnalytics.ISIN
import com.navi.amc.utils.AmcAnalytics.ORDER_STATUS_SCREEN
import com.navi.amc.utils.AmcAnalytics.SCREEN_NAME
import com.navi.amc.utils.Constant
@@ -55,6 +56,7 @@ import com.navi.amc.utils.Constant.CARD_SHIMMER_ANIMATION_DELAY
import com.navi.amc.utils.Constant.DATA
import com.navi.amc.utils.Constant.DATA_SOURCE
import com.navi.amc.utils.Constant.DISMISS
import com.navi.amc.utils.Constant.FLOW_TYPE_SIP_PURCHASE
import com.navi.amc.utils.Constant.FUND_ID
import com.navi.amc.utils.Constant.GET_SIP_SUMMARY_BOTTOMSHEET
import com.navi.amc.utils.Constant.HELP_BOTTOMSHEET
@@ -69,6 +71,7 @@ import com.navi.amc.utils.Constant.PAYMENT_TIMESTAMP
import com.navi.amc.utils.Constant.REQUEST_CONFIG
import com.navi.amc.utils.Constant.SHOW_BOTTOMSHEET
import com.navi.amc.utils.Constant.SIP_REFERENCE_ID
import com.navi.amc.utils.Constant.SOURCE_TYPE
import com.navi.amc.utils.Constant.THOUSAND
import com.navi.amc.utils.Constant.THREE
import com.navi.amc.utils.Constant.TRANSACTION_ID
@@ -76,6 +79,7 @@ import com.navi.amc.utils.Constant.TURBO_CHECKOUT_FLOW
import com.navi.amc.utils.Constant.WHITE
import com.navi.amc.utils.SubPageStatusType
import com.navi.amc.utils.TempStorageHelper
import com.navi.amc.utils.bundleToMap
import com.navi.amc.utils.getBottomSheet
import com.navi.amc.utils.getPaymentSyncFlowStatusCta
import com.navi.amc.utils.orValue
@@ -131,10 +135,13 @@ import com.navi.naviwidgets.models.response.CsatWidget
import com.navi.naviwidgets.utils.LottieEnums
import com.navi.naviwidgets.widgets.InfoWithTimerWidgetLayout.Companion.COLOR_WHITE
import com.navi.payment.listener.PaymentListener
import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.model.initiatesdk.PaymentPrefetchMethodRequest
import com.navi.payment.nativepayment.sharedviewmodel.NaviCheckoutViewModel
import com.navi.payment.utils.PaymentAnalytics
import com.navi.payment.utils.PaymentAnalytics.IS_TOKEN_VALID
import com.navi.payment.utils.PaymentAnalytics.SYNC
import com.navi.payment.utils.PaymentSource
import com.navi.paymentclients.viewmodel.base.PaymentManager
import com.navi.rr.scratchcard.model.GratificationStatus
import com.navi.rr.scratchcard.model.ScratchCardBackData
@@ -156,6 +163,7 @@ class OrderStatusFragment :
private lateinit var binding: OrderStatusLayoutBinding
private val viewModel by viewModels<OrderStatusViewModel>()
private val paymentVM: PaymentManager by activityViewModels()
private val naviCheckoutViewModel by activityViewModels<NaviCheckoutViewModel>()
private val paymentSharedVM: PaymentSharedVM by activityViewModels()
private val scratchCardSharedVm: ScratchCardSharedVm by activityViewModels()
private var sipReferenceId: String? = null
@@ -425,7 +433,48 @@ class OrderStatusFragment :
it?.tokenDetails?.naviSdkToken.isNotNullAndNotEmpty().toString(),
),
)
if (it?.syncFlow.orFalse()) {
if (it?.isTurboCheckoutFlow.orFalse()) {
it?.tokenDetails
?.naviSdkToken
?.takeIf { token -> token.isNotNullAndNotEmpty() }
?.let { token ->
val paymentSdkInitParams =
PaymentSdkInitParams(
token = token,
requestId = it.tokenDetails?.transactionId.orEmpty(),
mintToken = false,
paymentPreFetchMethodRequest =
PaymentPrefetchMethodRequest(
callSdkExitOnBack = false,
previousScreenName = PaymentSource.AMC.name,
),
paymentSource = PaymentSource.AMC.name,
)
paymentSharedVM.paymentFlowType = FLOW_TYPE_SIP_PURCHASE
val bundle =
Bundle().apply {
putAll(arguments)
putString(SOURCE_TYPE, PAYMENT)
putString(
TRANSACTION_ID,
viewModel.paymentInitiateData.value?.tokenDetails?.transactionId,
)
putParcelable(
REQUEST_CONFIG,
viewModel.paymentInitiateData.value?.requestConfig,
)
putString(
ORDER_ID,
viewModel.paymentInitiateData.value?.tokenDetails?.naviOrderId,
)
}
paymentSharedVM.paymentArgsDataMap = bundleToMap(bundle)
naviCheckoutViewModel.initiatePayment(paymentSdkInitParams)
}
} else if (it?.syncFlow.orFalse()) {
paymentSharedVM.isSyncFlow = true
if (it?.tokenDetails?.naviSdkToken.isNotNullAndNotEmpty()) {
paymentSharedVM.syncFlowPaymentInitStartTime = System.currentTimeMillis()
@@ -998,7 +1047,17 @@ class OrderStatusFragment :
val isSipSummaryUrl = action.url.orEmpty().endsWith(GET_SIP_SUMMARY_BOTTOMSHEET, true)
if (isRetry && !isOtpUrl) {
showLoader()
buyFlowVM.apply {
fundName = arguments?.getString(ORDER_HEADER_TITLE).orEmpty()
fundId = action.parameters?.firstOrNull { it.key == ISIN }?.value.orEmpty()
}
arguments?.apply {
putString(
AMOUNT,
action.parameters?.firstOrNull { it.key == AMOUNT }?.value.orEmpty(),
)
putString(ORDER_HEADER_SUBTITLE, arguments?.getString(ORDER_HEADER_SUBTITLE))
}
viewModel.postSameOrderPayment(
PaymentOrder(orderId = arguments?.getString(ORDER_ID), paymentMode = paymentMode)
)

View File

@@ -23,20 +23,25 @@ import com.navi.amc.common.viewmodel.PaymentSharedVM
import com.navi.amc.databinding.PaymentSummaryLayoutBinding
import com.navi.amc.fundbuy.models.PaymentOrder
import com.navi.amc.fundbuy.models.PaymentPostData
import com.navi.amc.fundbuy.models.SipDetailsData
import com.navi.amc.fundbuy.models.SipDetailsResponse
import com.navi.amc.fundbuy.models.SubItemData
import com.navi.amc.fundbuy.viewmodel.PaymentSummaryViewModel
import com.navi.amc.utils.*
import com.navi.amc.utils.AmcAnalytics.ISIN
import com.navi.amc.utils.Constant.AMOUNT
import com.navi.amc.utils.Constant.FLOW_TYPE_SIP_PURCHASE
import com.navi.amc.utils.Constant.LUMPSUM
import com.navi.amc.utils.Constant.ORDER_HEADER_SUBTITLE
import com.navi.amc.utils.Constant.ORDER_HEADER_TITLE
import com.navi.amc.utils.Constant.ORDER_ID
import com.navi.amc.utils.Constant.PAYMENT
import com.navi.amc.utils.Constant.PAYMENT_MODE
import com.navi.amc.utils.Constant.REQUEST_CONFIG
import com.navi.amc.utils.Constant.RETRY_PAYMENT
import com.navi.amc.utils.Constant.SIP
import com.navi.amc.utils.Constant.SIP_REFERENCE_ID
import com.navi.amc.utils.Constant.SOURCE_TYPE
import com.navi.amc.utils.Constant.TRANSACTION_ID
import com.navi.amc.utils.Constant.TYPE
import com.navi.amc.utils.SubPageStatusType.PAYMENT_INIT_SUMMARY
@@ -54,7 +59,11 @@ import com.navi.design.utils.*
import com.navi.naviwidgets.extensions.showWhenDataIsAvailable
import com.navi.naviwidgets.utils.getGradientDrawable
import com.navi.payment.listener.PaymentListener
import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.model.initiatesdk.PaymentPrefetchMethodRequest
import com.navi.payment.nativepayment.sharedviewmodel.NaviCheckoutViewModel
import com.navi.payment.utils.PaymentAnalytics
import com.navi.payment.utils.PaymentSource
import com.navi.paymentclients.viewmodel.base.PaymentManager
import dagger.hilt.android.AndroidEntryPoint
import java.math.BigDecimal
@@ -64,6 +73,7 @@ class PaymentSummaryFragment : AmcBaseFragment() {
private lateinit var binding: PaymentSummaryLayoutBinding
private val viewModel by viewModels<PaymentSummaryViewModel>()
private val paymentVM: PaymentManager by activityViewModels()
private val naviCheckoutViewModel by activityViewModels<NaviCheckoutViewModel>()
private val paymentSharedVM: PaymentSharedVM by activityViewModels()
override val screenName: String
get() = PAYMENT_INIT_SUMMARY
@@ -295,7 +305,48 @@ class PaymentSummaryFragment : AmcBaseFragment() {
),
)
}
if (it?.syncFlow.orFalse()) {
if (it?.isTurboCheckoutFlow.orFalse()) {
it?.tokenDetails
?.naviSdkToken
?.takeIf { token -> token.isNotNullAndNotEmpty() }
?.let { token ->
val paymentSdkInitParams =
PaymentSdkInitParams(
token = token,
requestId = it.tokenDetails?.transactionId.orEmpty(),
mintToken = false,
paymentPreFetchMethodRequest =
PaymentPrefetchMethodRequest(
callSdkExitOnBack = false,
previousScreenName = PaymentSource.AMC.name,
),
paymentSource = PaymentSource.AMC.name,
)
paymentSharedVM.paymentFlowType = FLOW_TYPE_SIP_PURCHASE
val bundle =
Bundle().apply {
putAll(arguments)
putString(SOURCE_TYPE, PAYMENT)
putString(
TRANSACTION_ID,
viewModel.paymentInitiateData.value?.tokenDetails?.transactionId,
)
putParcelable(
REQUEST_CONFIG,
viewModel.paymentInitiateData.value?.requestConfig,
)
putString(
ORDER_ID,
viewModel.paymentInitiateData.value?.tokenDetails?.naviOrderId,
)
}
paymentSharedVM.paymentArgsDataMap = bundleToMap(bundle)
naviCheckoutViewModel.initiatePayment(paymentSdkInitParams)
}
} else if (it?.syncFlow.orFalse()) {
paymentSharedVM.isSyncFlow = true
if (it?.tokenDetails?.naviSdkToken.isNotNullAndNotEmpty()) {
paymentSharedVM.syncFlowPaymentInitStartTime = System.currentTimeMillis()
@@ -367,8 +418,30 @@ class PaymentSummaryFragment : AmcBaseFragment() {
safelyShowBottomSheet(it, key)
}
}
} else if (arguments?.getString(TYPE)?.contains(SIP).orFalse()) { // get cta from backend
buyFlowVM.apply {
fundName = arguments?.getString(ORDER_HEADER_TITLE).orEmpty()
fundId = arguments?.getString(ISIN)
}
val sipDetailsData =
SipDetailsData(
sipReferenceId = arguments?.getString(SIP_REFERENCE_ID),
amount = arguments?.getString(AMOUNT),
scheme = arguments?.getString(ISIN),
)
arguments?.apply {
putString(AMOUNT, arguments?.getString(AMOUNT)) // formatted amount from backend
putString(
ORDER_HEADER_SUBTITLE,
arguments?.getString(TYPE),
) // order header subtitle get from backend cta params
}
viewModel.initiateSipPayment(sipDetailsData)
} else {
if (handleOtpNavigation(footer.nextCta).not()) {
// not getting used to check
showLoader()
if (arguments?.getString(RETRY_PAYMENT).toBoolean().orFalse()) {
viewModel.postSameOrderPayment(
@@ -387,6 +460,7 @@ class PaymentSummaryFragment : AmcBaseFragment() {
screenName = screenName,
)
} else if (arguments?.getString(TYPE)?.contains(SIP).orFalse()) {
// will be deprecated
viewModel.initiateSipPayment(
SipDetailsResponse(
amount = arguments?.getString(AMOUNT),

View File

@@ -12,6 +12,7 @@ import com.navi.amc.common.model.NextCtaResponse
import com.navi.amc.fundbuy.models.PaymentOrder
import com.navi.amc.fundbuy.models.PaymentPostData
import com.navi.amc.fundbuy.models.PaymentSummaryScreen
import com.navi.amc.fundbuy.models.SipDetailsData
import com.navi.amc.fundbuy.models.SipDetailsResponse
import com.navi.amc.network.retrofit.RetrofitService
import com.navi.amc.utils.getAmcMetricInfo
@@ -42,12 +43,19 @@ class PaymentSummaryRepository @Inject constructor(private val retrofitService:
metricInfo = metricInfo,
)
// razorpay only
suspend fun postSipPaymentDetails(details: SipDetailsResponse) =
apiResponseCallback(
response = retrofitService.postSipPayment(details),
metricInfo = getAmcMetricInfo(),
)
suspend fun initiateSipPayment(sipDetails: SipDetailsData) =
apiResponseCallback(
retrofitService.initiateSipPayment(sipDetails),
metricInfo = getAmcMetricInfo(),
)
suspend fun postSameOrderPayment(details: PaymentOrder) =
apiResponseCallback(
response = retrofitService.postSameOrderPayment(details),

View File

@@ -15,6 +15,7 @@ import com.navi.amc.common.model.NextCtaResponse
import com.navi.amc.fundbuy.models.PaymentOrder
import com.navi.amc.fundbuy.models.PaymentPostData
import com.navi.amc.fundbuy.models.PaymentSummaryScreen
import com.navi.amc.fundbuy.models.SipDetailsData
import com.navi.amc.fundbuy.models.SipDetailsResponse
import com.navi.amc.fundbuy.repository.PaymentSummaryRepository
import com.navi.amc.utils.getAmcMetricInfo
@@ -74,6 +75,7 @@ constructor(private val repository: PaymentSummaryRepository) : BaseVM() {
}
}
// remove this later
fun initiateSipPayment(details: SipDetailsResponse) {
viewModelScope.launch {
val response = repository.postSipPaymentDetails(details)
@@ -85,6 +87,17 @@ constructor(private val repository: PaymentSummaryRepository) : BaseVM() {
}
}
fun initiateSipPayment(sipDetailsData: SipDetailsData) {
viewModelScope.launch {
val response = repository.initiateSipPayment(sipDetailsData)
if (response.error == null && response.errors.isNullOrEmpty()) {
_paymentInitiateData.value = updateCheckerResponse(response.data)
} else {
setErrorData(response.errors, response.error)
}
}
}
fun postSameOrderPayment(details: PaymentOrder) {
viewModelScope.launch {
val response = repository.postSameOrderPayment(details)