9898
9999@ Component ("loanTransactionValidator" )
100100@ AllArgsConstructor
101- public final class LoanTransactionValidatorImpl implements LoanTransactionValidator {
101+ public class LoanTransactionValidatorImpl implements LoanTransactionValidator {
102102
103103 private final FromJsonHelper fromApiJsonHelper ;
104104 private final LoanApplicationValidator fromApiJsonDeserializer ;
@@ -245,7 +245,7 @@ public void validateDisbursement(JsonCommand command, boolean isAccountTransfer,
245245 });
246246 }
247247
248- private void validateDisbursementWithPostDatedChecks (final String json , final Long loanId ) {
248+ protected void validateDisbursementWithPostDatedChecks (final String json , final Long loanId ) {
249249 final JsonElement jsonElement = this .fromApiJsonHelper .parse (json );
250250 final List <ApiParameterError > dataValidationErrors = new ArrayList <>();
251251 final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder (dataValidationErrors ).resource ("loan.disbursement" );
@@ -291,7 +291,7 @@ private void validateDisbursementWithPostDatedChecks(final String json, final Lo
291291 }
292292 }
293293
294- private void validateDisbursementDateWithMeetingDate (final LocalDate actualDisbursementDate , final CalendarInstance calendarInstance ,
294+ protected void validateDisbursementDateWithMeetingDate (final LocalDate actualDisbursementDate , final CalendarInstance calendarInstance ,
295295 Boolean isSkipRepaymentOnFirstMonth , Integer numberOfDays ) {
296296 if (null != calendarInstance ) {
297297 final Calendar calendar = calendarInstance .getCalendar ();
@@ -334,9 +334,7 @@ public void validateTransaction(final String json) {
334334 throw new InvalidJsonException ();
335335 }
336336
337- final Set <String > transactionParameters = new HashSet <>(Arrays .asList ("transactionDate" , "transactionAmount" , "externalId" , "note" ,
338- "locale" , "dateFormat" , "paymentTypeId" , "accountNumber" , "checkNumber" , "routingCode" , "receiptNumber" , "bankNumber" ,
339- LoanApiConstants .REVERSAL_EXTERNAL_ID_PARAMNAME ));
337+ final Set <String > transactionParameters = getTransactionParametersForEdit ();
340338
341339 final Type typeOfMap = new TypeToken <Map <String , Object >>() {}.getType ();
342340 this .fromApiJsonHelper .checkForUnsupportedParameters (typeOfMap , json , transactionParameters );
@@ -363,6 +361,12 @@ public void validateTransaction(final String json) {
363361 throwExceptionIfValidationWarningsExist (dataValidationErrors );
364362 }
365363
364+ protected HashSet <String > getTransactionParametersForEdit () {
365+ return new HashSet <>(Arrays .asList ("transactionDate" , "transactionAmount" , "externalId" , "note" , "locale" , "dateFormat" ,
366+ "paymentTypeId" , "accountNumber" , "checkNumber" , "routingCode" , "receiptNumber" , "bankNumber" ,
367+ LoanApiConstants .REVERSAL_EXTERNAL_ID_PARAMNAME ));
368+ }
369+
366370 @ Override
367371 public void validateChargebackTransaction (final String json ) {
368372
@@ -405,8 +409,7 @@ public void validateTransactionWithNoAmount(final String json) {
405409 throw new InvalidJsonException ();
406410 }
407411
408- final Set <String > disbursementParameters = new HashSet <>(
409- Arrays .asList ("transactionDate" , "note" , "locale" , "dateFormat" , "writeoffReasonId" , "externalId" ));
412+ final Set <String > disbursementParameters = getNoAmountTransactionParameters ();
410413
411414 final Type typeOfMap = new TypeToken <Map <String , Object >>() {}.getType ();
412415 this .fromApiJsonHelper .checkForUnsupportedParameters (typeOfMap , json , disbursementParameters );
@@ -427,6 +430,10 @@ public void validateTransactionWithNoAmount(final String json) {
427430 throwExceptionIfValidationWarningsExist (dataValidationErrors );
428431 }
429432
433+ protected Set <String > getNoAmountTransactionParameters () {
434+ return new HashSet <>(Arrays .asList ("transactionDate" , "note" , "locale" , "dateFormat" , "writeoffReasonId" , "externalId" ));
435+ }
436+
430437 @ Override
431438 public void validateChargeOffTransaction (final String json ) {
432439 if (StringUtils .isBlank (json )) {
@@ -659,7 +666,7 @@ public void validateLoanGroupIsActive(final Loan loan) {
659666 }
660667 }
661668
662- private void validateLoanHasNoLaterChargeRefundTransactionToReverseOrCreateATransaction (Loan loan , LocalDate transactionDate ,
669+ protected void validateLoanHasNoLaterChargeRefundTransactionToReverseOrCreateATransaction (Loan loan , LocalDate transactionDate ,
663670 String reversedOrCreated ) {
664671 for (LoanTransaction txn : loan .getLoanTransactions ()) {
665672 if (txn .isChargeRefund () && DateUtils .isBefore (transactionDate , txn .getTransactionDate ())) {
@@ -671,7 +678,7 @@ private void validateLoanHasNoLaterChargeRefundTransactionToReverseOrCreateATran
671678 }
672679 }
673680
674- private void validateLoanDisbursementIsBeforeTransactionDate (final Loan loan , final LocalDate transactionDate ) {
681+ protected void validateLoanDisbursementIsBeforeTransactionDate (final Loan loan , final LocalDate transactionDate ) {
675682 if (DateUtils .isBefore (transactionDate , loan .getDisbursementDate ())) {
676683 final String errorMessage = "The transaction date cannot be before the loan disbursement date: "
677684 + loan .getDisbursementDate ().toString ();
@@ -680,22 +687,22 @@ private void validateLoanDisbursementIsBeforeTransactionDate(final Loan loan, fi
680687 }
681688 }
682689
683- private void validateTransactionShouldNotBeInTheFuture (final LocalDate transactionDate ) {
690+ protected void validateTransactionShouldNotBeInTheFuture (final LocalDate transactionDate ) {
684691 if (DateUtils .isDateInTheFuture (transactionDate )) {
685692 final String errorMessage = "The transaction date cannot be in the future." ;
686693 throw new InvalidLoanStateTransitionException ("transaction" , "cannot.be.a.future.date" , errorMessage , transactionDate );
687694 }
688695 }
689696
690- private void validateLoanHasCurrency (final Loan loan ) {
697+ protected void validateLoanHasCurrency (final Loan loan ) {
691698 MonetaryCurrency currency = loan .getCurrency ();
692699 final ApplicationCurrency defaultApplicationCurrency = this .applicationCurrencyRepository .findOneByCode (currency .getCode ());
693700 if (defaultApplicationCurrency == null ) {
694701 throw new CurrencyNotFoundException (currency .getCode ());
695702 }
696703 }
697704
698- private void validateClientOfficeJoiningDateIsBeforeTransactionDate (Loan loan , LocalDate transactionDate ) {
705+ protected void validateClientOfficeJoiningDateIsBeforeTransactionDate (Loan loan , LocalDate transactionDate ) {
699706 if (loan .getClient () != null && loan .getClient ().getOfficeJoiningDate () != null ) {
700707 final LocalDate clientOfficeJoiningDate = loan .getClient ().getOfficeJoiningDate ();
701708 if (DateUtils .isBefore (transactionDate , clientOfficeJoiningDate )) {
@@ -759,7 +766,7 @@ public void validateRepaymentDateIsOnHoliday(final LocalDate repaymentDate, fina
759766 }
760767 }
761768
762- private void validateTransactionAmountNotExceedThresholdForMultiDisburseLoan (Loan loan ) {
769+ protected void validateTransactionAmountNotExceedThresholdForMultiDisburseLoan (Loan loan ) {
763770 if (loan .getLoanProduct ().isMultiDisburseLoan ()) {
764771 BigDecimal totalDisbursed = loan .getDisbursedAmount ();
765772 BigDecimal totalPrincipalAdjusted = loan .getSummary ().getTotalPrincipalAdjustments ();
@@ -830,7 +837,7 @@ public void validateRefund(final Loan loan, LoanTransactionType loanTransactionT
830837 validateTransactionAmountNotExceedThresholdForMultiDisburseLoan (loan );
831838 }
832839
833- private void validateRepaymentTypeTransactionNotBeforeAChargeRefund (final Loan loan , final LoanTransactionType loanTransactionType ,
840+ protected void validateRepaymentTypeTransactionNotBeforeAChargeRefund (final Loan loan , final LoanTransactionType loanTransactionType ,
834841 final LocalDate transactionDate ) {
835842 if (loanTransactionType .isRepaymentType () && !loanTransactionType .isChargeRefund ()) {
836843 for (LoanTransaction txn : loan .getLoanTransactions ()) {
@@ -931,7 +938,7 @@ public void validateActivityNotBeforeClientOrGroupTransferDate(final Loan loan,
931938 return totalCollateral ;
932939 }
933940
934- private static @ NonNull Set <String > getDisbursementParameters (boolean isAccountTransfer ) {
941+ protected @ NonNull Set <String > getDisbursementParameters (boolean isAccountTransfer ) {
935942 Set <String > disbursementParameters ;
936943
937944 if (isAccountTransfer ) {
@@ -952,9 +959,7 @@ private void validatePaymentTransaction(String json) {
952959 throw new InvalidJsonException ();
953960 }
954961
955- final Set <String > transactionParameters = new HashSet <>(Arrays .asList ("transactionDate" , "transactionAmount" , "externalId" , "note" ,
956- "locale" , "dateFormat" , "paymentTypeId" , "accountNumber" , "checkNumber" , "routingCode" , "receiptNumber" , "bankNumber" ,
957- "loanId" , "numberOfRepayments" , "interestRefundCalculation" ));
962+ final Set <String > transactionParameters = getRepaymentParameters ();
958963
959964 final Type typeOfMap = new TypeToken <Map <String , Object >>() {}.getType ();
960965 this .fromApiJsonHelper .checkForUnsupportedParameters (typeOfMap , json , transactionParameters );
@@ -976,6 +981,12 @@ private void validatePaymentTransaction(String json) {
976981 throwExceptionIfValidationWarningsExist (dataValidationErrors );
977982 }
978983
984+ protected Set <String > getRepaymentParameters () {
985+ return new HashSet <>(Arrays .asList ("transactionDate" , "transactionAmount" , "externalId" , "note" , "locale" , "dateFormat" ,
986+ "paymentTypeId" , "accountNumber" , "checkNumber" , "routingCode" , "receiptNumber" , "bankNumber" , "loanId" ,
987+ "numberOfRepayments" , "interestRefundCalculation" ));
988+ }
989+
979990 @ Override
980991 public void validatePaymentDetails (final DataValidatorBuilder baseDataValidator , final JsonElement element ) {
981992 // Validate all string payment detail fields for max length
0 commit comments