diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/model/KYCRelatedDataDTO.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/model/KYCRelatedDataDTO.java index 3d3f792e..529adca7 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/model/KYCRelatedDataDTO.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/model/KYCRelatedDataDTO.java @@ -62,7 +62,7 @@ public class KYCRelatedDataDTO { if (personalInformation == null) return false; else { - return "KR".equalsIgnoreCase(personalInformation.getNativeCountry()) ; + return "KR".equalsIgnoreCase(personalInformation.getNativeCountry()); } } @@ -248,11 +248,11 @@ public class KYCRelatedDataDTO { if (personalInformation != null) { return ( Utils.isStringNotNullOrEmpty(personalInformation.getAddress()) && - Utils.isStringNotNullOrEmpty(personalInformation.getCity()) && - Utils.isStringNotNullOrEmpty(personalInformation.getDob()) && - Utils.isStringNotNullOrEmpty(personalInformation.getEmail()) && - Utils.isStringNotNullOrEmpty(personalInformation.getFullName()) && - Utils.isStringNotNullOrEmpty(personalInformation.getGender()) + Utils.isStringNotNullOrEmpty(personalInformation.getCity()) && + Utils.isStringNotNullOrEmpty(personalInformation.getDob()) && + Utils.isStringNotNullOrEmpty(personalInformation.getEmail()) && + Utils.isStringNotNullOrEmpty(personalInformation.getFullName()) && + Utils.isStringNotNullOrEmpty(personalInformation.getGender()) ); } return false; @@ -266,7 +266,6 @@ public class KYCRelatedDataDTO { Utils.isStringNotNullOrEmpty(primaryInformation.getAnotherIDIssueDate()) || Utils.isStringNotNullOrEmpty(primaryInformation.getAnotherIDNumber()) || Utils.isStringNotNullOrEmpty(primaryInformation.getBankId()) || - Utils.isStringNotNullOrEmpty(primaryInformation.getBranchId()) || Utils.isStringNotNullOrEmpty(primaryInformation.getBankAccount()) || Utils.isStringNotNullOrEmpty(primaryInformation.getPassportNumber()) || Utils.isStringNotNullOrEmpty(primaryInformation.getPassportIssueDate()) || @@ -277,6 +276,16 @@ public class KYCRelatedDataDTO { } public boolean arePicturesAvailable() { - return pictures!=null; + return pictures != null; + } + + public void seedInitialData() { + if (primaryInformation == null) + primaryInformation = new PrimaryInformationDTO(); + + if (primaryInformation.getBranchId() == null || primaryInformation.getBranchId().length() == 0) { + if (gmeBranchList != null && gmeBranchList.size() > 0) + primaryInformation.setBranchId(gmeBranchList.get(0).getId()); + } } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java index 4ce903b2..f9d6f768 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java @@ -237,6 +237,7 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter genderList.add(new IDTextDTO("M", getStringfromStringId(R.string.male_text))); genderList.add(new IDTextDTO("F", getStringfromStringId(R.string.female_text))); data.setGenderList(genderList); + data.seedInitialData(); this.validator = new CustomerDetailViewValidator(data); boolean isCustomerKorean = validator.getKycRelatedDataDTO().isUserOfKoreanNative(); @@ -352,11 +353,8 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter args -> { boolean result = ((boolean) args[0]) && ((boolean) args[1]) && ((boolean) args[2]) && ((boolean) args[3]) && ((boolean) args[4]); - Log.d(TAG, "Form 2 valid: " + result); - customerDetailForm2Button.setValue(result); - log("Alternate ID Related Field Valid : " + ((boolean) args[3])); - log("Passport Related Field Valid : " + ((boolean) args[4])); + return result; } ); @@ -366,20 +364,22 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter private Observable setupAlternateIDRelatedFieldValidation() { return Observable.merge(this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIDNoChangeEvent().map(val -> { - log("Alternated Id No started emission: " + val); - return validator.validateAlternateIdNo(val.toString()); + boolean result = validator.validateAlternateIdNo(val.toString()); + if (validator.hasRequiredDataForAlternatIdVerificationFromServer()) + validateAlternateIDFromServer(); + return result; }), this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIDIssuedDateChangeEvent().map(val -> { - log("Alternated Id Issued Date started emission:" + val); return validator.validateAlternateIDIssuedDate(val.toString()); }), this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIDExpiryDateChangeEvent().map(val -> { - log("Alternated Id Expiry Date started emission:" + val); return validator.validateAlternateIDExpiryDate(val.toString()); }), this.view.getCustomerDetailViewContract().getForm2ViewBindings().getAlternateIdTypeChangeEvent().map(val -> { - log("Alternated Id Type started emission:" + val.getText()); - return validator.validateAlternateIdType(val); + boolean result = validator.validateAlternateIdType(val); + if (validator.hasRequiredDataForAlternatIdVerificationFromServer()) + validateAlternateIDFromServer(); + return result; }) ); } @@ -477,6 +477,8 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter if (resultCode == RESULT_OK) { validator.validatePassportImage(data); passportImageLiveData.setValue(ImageUtils.generateThumbnailFromImageFile(data.getAbsolutePath(), THUMBNAIL_HEIGHT, THUMBNAIL_WIDTH)); + view.getCustomerDetailViewContract().showForm3(); + } break; @@ -485,6 +487,8 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter if (resultCode == RESULT_OK) { validator.validateAlternateIDImage(data); alternateIDImageLiveData.setValue(ImageUtils.generateThumbnailFromImageFile(data.getAbsolutePath(), THUMBNAIL_HEIGHT, THUMBNAIL_WIDTH)); + view.getCustomerDetailViewContract().showForm3(); + } break; @@ -665,7 +669,6 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter @Override public void validatePassportNumberFromServer() { - view.getCustomerDetailViewContract().enablePassportNumberFocusChangeListener(false); compositeDisposable.add(this.gateway.validateParameters(ID_TYPE_PASSPORT, validator.getKycRelatedDataDTO().getPrimaryInformation().getPassportNumber()) .doOnSubscribe(d -> view.showProgressBar(true, getStringfromStringId(R.string.processing_request_text))) .subscribeOn(Schedulers.io()) @@ -675,6 +678,8 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter } + //Validate ID number with corresponding IdType from server after validating locally. + //So dependent data needs to be validated prior validating from server. @Override public void validateAlternateIDFromServer() { IDTypeDTO selectedIDType = validator.getKycRelatedDataDTO().getSelectedIdTYpeFromId(validator.getKycRelatedDataDTO().getPrimaryInformation().getAnotherIDType()); @@ -904,7 +909,6 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter kycRelatedDataDTO.logFormSubmissionData(); if (kycRelatedDataDTO.getPrimaryInformation().isPassportIssuedDateValid()) { customerDetailErrorLiveDataDTO.setValueToPassportIssuedDateError(null); - view.getCustomerDetailViewContract().enablePassportNumberFocusChangeListener(true); return true; } else { customerDetailErrorLiveDataDTO.setValueToPassportIssuedDateError(getStringfromStringId(R.string.empty_field_error_text)); @@ -1089,10 +1093,8 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter kycRelatedDataDTO.getPrimaryInformation().setAnotherIDNumber(alternateID); if (kycRelatedDataDTO.getPrimaryInformation().isAnotherIDNoValid()) { - boolean result = validateAlternateIDRelatedFieldData(); - if (result) - validateAlternateIDFromServer(); - return result; + return validateAlternateIDRelatedFieldData(); + } else { customerDetailErrorLiveDataDTO.setValueToAnotherIdNoError(getStringfromStringId(R.string.empty_field_error_text)); return false; @@ -1202,6 +1204,18 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter } + public boolean hasRequiredDataForAlternatIdVerificationFromServer() { + if (kycRelatedDataDTO.getPrimaryInformation() != null) { + String idNumber; + String idType; + + idNumber = kycRelatedDataDTO.getPrimaryInformation().getAnotherIDNumber(); + idType = kycRelatedDataDTO.getPrimaryInformation().getAnotherIDType(); + return idNumber != null && idNumber.length() == ID_CARD_VALID_LENGTH && idType != null && idType.length() > 0; + } + + return false; + } } private String getAnotherIdTranslatedLable(String englishLabel) { @@ -1253,7 +1267,6 @@ public class KYCV3ViewModel extends BaseViewModel implements KYCV3PresenterInter @Override public void onFailed(String message) { - new Handler().postDelayed(() -> view.hideKeyBoard(), 300); view.showPopUpMessage(message, CustomAlertDialog.AlertType.FAILED, null); } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java index c60cdfb3..08c355fe 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/view/personal/CustomerDetailFragment.java @@ -306,13 +306,27 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present private void subscribeToSubmitButtonEnable(KYCV3ViewModel kycv3ViewModel) { kycv3ViewModel.getForm1SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> btnSubmit1.setEnabled(val)); - kycv3ViewModel.getForm2SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> btnSubmit2.setEnabled(val)); - kycv3ViewModel.getForm3SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> btnSubmit3.setEnabled(val)); + kycv3ViewModel.getForm2SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> { + btnSubmit2.setEnabled(val); + if (val) + btnSubmit2.requestFocus(); + }); + kycv3ViewModel.getForm3SubmissionReadyLiveData().observe(getViewLifecycleOwner(), val -> { + btnSubmit3.setEnabled(val); + if (val) + btnSubmit3.requestFocus(); + }); } private void subscribeToCustomerRelatedData(KYCV3ViewModel kycv3ViewModel) { kycv3ViewModel.getCustomerDetailRelatedFormLiveData().observe(getViewLifecycleOwner(), val -> { + IDTextDTO selectedGmeBranch = val.getSelectedGmeBranchFromId(val.getPrimaryInformation().getBranchId()); + if (selectedGmeBranch != null) { + ed_branch.setText(selectedGmeBranch.toString()); + form2ViewBindings.branchSubject.onNext(selectedGmeBranch); + + } if (val.isPersonalInfoAvailable()) { ed_firstname.setText(val.getPersonalInformation().getFullName()); ed_email.setText(val.getPersonalInformation().getEmail()); @@ -364,12 +378,6 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present } - IDTextDTO selectedGmeBranch = val.getSelectedGmeBranchFromId(val.getPrimaryInformation().getBranchId()); - if (selectedGmeBranch != null) { - ed_branch.setText(selectedGmeBranch.toString()); - form2ViewBindings.branchSubject.onNext(selectedGmeBranch); - - } ed_referral.setText(val.getPrimaryInformation().getRefferalCode()); form2ViewBindings.passportNoIssuedDateSubject.onNext(val.getPrimaryInformation().getPassportIssueDate()); @@ -390,6 +398,7 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present }); + kycv3ViewModel.getPassportImageLiveData().observe(getViewLifecycleOwner(), bitmap -> { if (bitmap != null) { Utility.showImageFromBitmap(getActivity(), iv_passport_id, bitmap); @@ -886,7 +895,6 @@ public class CustomerDetailFragment extends BaseFragment implements KYCV3Present if (!hasFocus) { ViewModelProviders.of(getActivity()).get(KYCV3ViewModel.class).validatePassportNumberFromServer(); ed_passportId.setOnFocusChangeListener(null); - ed_passportId.clearFocus(); } }); } else {