NTP-11198 | Handling for KYC Rejection (#13530)

This commit is contained in:
Varun Jain
2024-11-18 17:44:50 +05:30
committed by GitHub
parent ee23447d73
commit c0f34ff1b7
8 changed files with 106 additions and 2 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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
)

View File

@@ -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))

View File

@@ -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 =

View File

@@ -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()
}

View File

@@ -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,

View File

@@ -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