NTP-11198 | Handling for KYC Rejection (#13530)
This commit is contained in:
@@ -22,6 +22,7 @@ import androidx.fragment.app.viewModels
|
||||
import com.google.android.gms.auth.api.phone.SmsRetriever
|
||||
import com.navi.amc.R
|
||||
import com.navi.amc.common.activity.CheckerActivity
|
||||
import com.navi.amc.common.model.KycValidationData
|
||||
import com.navi.amc.common.model.OtpGenerateData
|
||||
import com.navi.amc.common.model.OtpResponseData
|
||||
import com.navi.amc.common.model.OtpVerificationBody
|
||||
@@ -35,6 +36,7 @@ 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.utils.AmcAnalytics
|
||||
import com.navi.amc.utils.AmcAnalytics.ISIN
|
||||
import com.navi.amc.utils.Constant
|
||||
import com.navi.amc.utils.Constant.AMOUNT
|
||||
import com.navi.amc.utils.Constant.API_CALL_MULTI_CLICK_THRESOLD_DUR
|
||||
@@ -54,6 +56,7 @@ import com.navi.amc.utils.Constant.OTP_FLOW_TYPE_SIP_AUTOPAY
|
||||
import com.navi.amc.utils.Constant.OTP_FLOW_TYPE_SIP_MANUAL
|
||||
import com.navi.amc.utils.Constant.OTP_FLOW_TYPE_SIP_PURCHASE
|
||||
import com.navi.amc.utils.Constant.PAYMENT
|
||||
import com.navi.amc.utils.Constant.PAYMENT_MODE
|
||||
import com.navi.amc.utils.Constant.REDEMPTION_ORDER_ID
|
||||
import com.navi.amc.utils.Constant.REQUEST_CONFIG
|
||||
import com.navi.amc.utils.Constant.SECONDS_PER_MINUTE
|
||||
@@ -77,13 +80,16 @@ import com.navi.base.utils.orTrue
|
||||
import com.navi.common.customview.BoxInputGroup.Companion.OTP_LENGTH_4
|
||||
import com.navi.common.listeners.FragmentInterchangeListener
|
||||
import com.navi.common.listeners.HeaderInteractionListener
|
||||
import com.navi.common.model.ModuleNameV2
|
||||
import com.navi.common.receiver.OtpReceiveListener
|
||||
import com.navi.common.receiver.SmsAutoReadReceiver
|
||||
import com.navi.common.ui.fragment.NewActionErrorFragment
|
||||
import com.navi.common.utils.Constants
|
||||
import com.navi.common.utils.Constants.FLOW_TYPE
|
||||
import com.navi.common.utils.Constants.MILLISECONDS_PER_SECOND
|
||||
import com.navi.common.utils.RETRY
|
||||
import com.navi.common.utils.getErrorData
|
||||
import com.navi.common.utils.observeNullable
|
||||
import com.navi.common.utils.registerReceiverWithVersionCheck
|
||||
import com.navi.design.R as DesignR
|
||||
import com.navi.design.utils.getNaviDrawable
|
||||
@@ -125,7 +131,7 @@ class OtpFragment : AmcBaseFragment(), View.OnClickListener {
|
||||
activity?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
|
||||
initData()
|
||||
fetchData()
|
||||
generateOtp(false)
|
||||
validateKyc()
|
||||
}
|
||||
|
||||
override fun setContainerView(viewStub: ViewStub) {
|
||||
@@ -221,6 +227,22 @@ class OtpFragment : AmcBaseFragment(), View.OnClickListener {
|
||||
binding.otpLayout.visibility = View.VISIBLE
|
||||
startCountDownTimer()
|
||||
}
|
||||
|
||||
viewModel.validateKycResponse.observeNullable(viewLifecycleOwner) { validateKycResponse ->
|
||||
hideLoader()
|
||||
validateKycResponse?.bottomSheetData?.let { bottomSheetData ->
|
||||
val fragment =
|
||||
NewActionErrorFragment.getInstance(
|
||||
error = bottomSheetData,
|
||||
action = null,
|
||||
cancelable = true,
|
||||
sourceScreenName = screenName,
|
||||
moduleName = ModuleNameV2.AMC.name
|
||||
)
|
||||
safelyShowBottomSheet(fragment, NewActionErrorFragment.TAG)
|
||||
} ?: generateOtp(false)
|
||||
}
|
||||
|
||||
viewModel.generateOtpResponse.observe(viewLifecycleOwner) {
|
||||
hideLoader()
|
||||
binding.otpLayout.clear()
|
||||
@@ -686,6 +708,22 @@ class OtpFragment : AmcBaseFragment(), View.OnClickListener {
|
||||
)
|
||||
}
|
||||
|
||||
private fun validateKyc() {
|
||||
viewModel.validateKyc(
|
||||
kycValidationData =
|
||||
KycValidationData(
|
||||
flowType = arguments?.getString(OTP_FLOW_TYPE),
|
||||
isin = arguments?.getString(ISIN),
|
||||
amount = arguments?.getString(AMOUNT),
|
||||
frequency = arguments?.getString(FREQUENCY),
|
||||
sipDate = arguments?.getString(SIP_DATE),
|
||||
sipReferenceId = arguments?.getString(SIP_REFERENCE_ID),
|
||||
paymentMode = arguments?.getString(PAYMENT_MODE),
|
||||
redemptionOrderId = arguments?.getString(REDEMPTION_ORDER_ID)?.toInt()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun hideResendOtpOnCallUiState() {
|
||||
binding.resendOtpTv.visibility = View.GONE
|
||||
binding.countdownTv.visibility = View.VISIBLE
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2024 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.amc.common.model
|
||||
|
||||
import android.os.Parcelable
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@Parcelize
|
||||
data class KycValidationData(
|
||||
@SerializedName("isin") var isin: String? = null,
|
||||
@SerializedName("amount") val amount: String? = null,
|
||||
@SerializedName("sipReferenceId") val sipReferenceId: String? = null,
|
||||
@SerializedName("frequency") val frequency: String? = null,
|
||||
@SerializedName("sipDate") val sipDate: String? = null,
|
||||
@SerializedName("flowType") val flowType: String? = null,
|
||||
@SerializedName("paymentMode") val paymentMode: String? = null,
|
||||
@SerializedName("redemptionOrderId") var redemptionOrderId: Int? = null
|
||||
) : Parcelable
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
*
|
||||
* * Copyright © 2024 by Navi Technologies Limited
|
||||
* * All rights reserved. Strictly confidential
|
||||
*
|
||||
*/
|
||||
|
||||
package com.navi.amc.common.model
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import com.navi.common.network.models.GenericErrorResponse
|
||||
|
||||
data class KycValidationResponse(
|
||||
@SerializedName("bottomSheetData") val bottomSheetData: GenericErrorResponse? = null
|
||||
)
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
package com.navi.amc.common.repo
|
||||
|
||||
import com.navi.amc.common.model.KycValidationData
|
||||
import com.navi.amc.common.model.OtpGenerateData
|
||||
import com.navi.amc.common.model.OtpVerificationBody
|
||||
import com.navi.amc.fundbuy.models.PaymentOrder
|
||||
@@ -23,6 +24,9 @@ class OTPRepository @Inject constructor(private val retrofitService: RetrofitSer
|
||||
suspend fun getOtpDetails(flowType: String, isin: String?, isNewTransaction: Boolean) =
|
||||
apiResponseCallback(retrofitService.otpDetails(flowType, isin, isNewTransaction))
|
||||
|
||||
suspend fun validateKyc(kycValidationData: KycValidationData) =
|
||||
apiResponseCallback(retrofitService.validateKyc(kycValidationData))
|
||||
|
||||
suspend fun generateOtp(otpGenerateData: OtpGenerateData) =
|
||||
apiResponseCallback(retrofitService.generateOtp(otpGenerateData))
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@ import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.navi.amc.common.model.AdditionalDataAsyncResponse
|
||||
import com.navi.amc.common.model.KycValidationData
|
||||
import com.navi.amc.common.model.KycValidationResponse
|
||||
import com.navi.amc.common.model.NextCtaResponse
|
||||
import com.navi.amc.common.model.OtpGenerateData
|
||||
import com.navi.amc.common.model.OtpGenerateResponse
|
||||
@@ -70,6 +72,10 @@ class OTPVM @Inject constructor(private val repository: OTPRepository) : BaseAmc
|
||||
val sipCreateResponse: LiveData<AdditionalDataAsyncResponse<NextCtaResponse>?>
|
||||
get() = _sipCreateResponse
|
||||
|
||||
private val _validateKycResponse = SingleLiveEvent<KycValidationResponse?>()
|
||||
val validateKycResponse: SingleLiveEvent<KycValidationResponse?>
|
||||
get() = _validateKycResponse
|
||||
|
||||
var sipReferenceId = EMPTY
|
||||
|
||||
fun fetchScreenData(flowType: String, isin: String? = null, isNewTransaction: Boolean) {
|
||||
@@ -83,6 +89,17 @@ class OTPVM @Inject constructor(private val repository: OTPRepository) : BaseAmc
|
||||
}
|
||||
}
|
||||
|
||||
fun validateKyc(kycValidationData: KycValidationData) {
|
||||
viewModelScope.launch {
|
||||
val response = repository.validateKyc(kycValidationData)
|
||||
if (response.error == null && response.errors.isNullOrEmpty()) {
|
||||
_validateKycResponse.value = response.data
|
||||
} else {
|
||||
_validateKycResponse.value = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun generateOtp(otpGenerateData: OtpGenerateData, flowType: String, isResendOtp: Boolean) {
|
||||
viewModelScope.launch {
|
||||
val response =
|
||||
|
||||
@@ -75,6 +75,7 @@ class AutoPaySetupFragmentV2 : AmcBaseFragment() {
|
||||
override fun setContainerView(viewStub: ViewStub) {
|
||||
viewStub.layoutResource = R.layout.auto_pay_setup_layout
|
||||
binding = DataBindingUtil.getBinding(viewStub.inflate())!!
|
||||
initError(viewModel)
|
||||
initObservers()
|
||||
}
|
||||
|
||||
|
||||
@@ -277,6 +277,11 @@ interface RetrofitService {
|
||||
@Query("isNewTransaction") isNewTransaction: Boolean?
|
||||
): Response<GenericResponse<OtpResponse>>
|
||||
|
||||
@POST("/validation/validate-request")
|
||||
suspend fun validateKyc(
|
||||
@Body kycValidationData: KycValidationData
|
||||
): Response<GenericResponse<KycValidationResponse>>
|
||||
|
||||
@GET("/orders/{orderId}")
|
||||
suspend fun fetchOrderStatusDetails(
|
||||
@Path("orderId") orderId: String,
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
android:id="@+id/primary_button_start_icon"
|
||||
android:layout_width="@dimen/dp_24"
|
||||
android:layout_height="@dimen/dp_24"
|
||||
android:layout_marginEnd="@dimen/dp_4"
|
||||
android:layout_marginEnd="@dimen/dp_8"
|
||||
android:visibility="gone" />
|
||||
|
||||
<com.navi.design.textview.NaviTextView
|
||||
|
||||
Reference in New Issue
Block a user