@@ -274,9 +274,16 @@ private LoanApplicationTerms assembleLoanApplicationTermsFrom(final JsonElement
274
274
* If user has not passed the first repayments date then then derive the same based on loan type.
275
275
*/
276
276
if (calculatedRepaymentsStartingFromDate == null ) {
277
+ LocalDate tmpCalculatedRepaymentsStartingFromDate = deriveFirstRepaymentDate (loanType , repaymentEvery , expectedDisbursementDate ,
278
+ repaymentPeriodFrequencyType , 0 , calendar , submittedOnDate , repaymentStartDateType );
277
279
calculatedRepaymentsStartingFromDate = deriveFirstRepaymentDate (loanType , repaymentEvery , expectedDisbursementDate ,
278
280
repaymentPeriodFrequencyType , loanProduct .getMinimumDaysBetweenDisbursalAndFirstRepayment (), calendar , submittedOnDate ,
279
281
repaymentStartDateType );
282
+ // If calculated repayment start date does not match due to minimum days between disbursal and first
283
+ // repayment rule, we set repaymentsStartingFromDate (which will be used as seed date later)
284
+ if (!tmpCalculatedRepaymentsStartingFromDate .equals (calculatedRepaymentsStartingFromDate )) {
285
+ repaymentsStartingFromDate = calculatedRepaymentsStartingFromDate ;
286
+ }
280
287
}
281
288
282
289
/*
@@ -1102,39 +1109,26 @@ private LocalDate deriveFirstRepaymentDate(final AccountType loanType, final Int
1102
1109
final RepaymentStartDateType repaymentStartDateType ) {
1103
1110
LocalDate derivedFirstRepayment = null ;
1104
1111
1105
- final LocalDate dateBasedOnMinimumDaysBetweenDisbursalAndFirstRepayment = RepaymentStartDateType . DISBURSEMENT_DATE . equals (
1106
- repaymentStartDateType ) ? expectedDisbursementDate .plusDays (minimumDaysBetweenDisbursalAndFirstRepayment ) : submittedOnDate ;
1107
-
1112
+ final LocalDate dateBasedOnMinimumDaysBetweenDisbursalAndFirstRepayment = expectedDisbursementDate
1113
+ .plusDays (minimumDaysBetweenDisbursalAndFirstRepayment );
1114
+ final LocalDate seedDate = repaymentStartDateType . isDisbursementDate () ? expectedDisbursementDate : submittedOnDate ;
1108
1115
if (calendar != null ) {
1109
- derivedFirstRepayment = deriveFirstRepaymentDateForLoans (repaymentEvery , expectedDisbursementDate , expectedDisbursementDate ,
1110
- repaymentPeriodFrequencyType , minimumDaysBetweenDisbursalAndFirstRepayment , calendar , submittedOnDate ,
1111
- repaymentStartDateType );
1116
+ derivedFirstRepayment = deriveFirstRepaymentDateForLoans (repaymentEvery , expectedDisbursementDate , seedDate ,
1117
+ repaymentPeriodFrequencyType , minimumDaysBetweenDisbursalAndFirstRepayment , calendar , submittedOnDate );
1112
1118
} else { // Individual or group account, or JLG not linked to a meeting
1113
1119
LocalDate dateBasedOnRepaymentFrequency ;
1114
1120
// Derive the first repayment date as greater date among
1115
1121
// (disbursement date + plus frequency) or
1116
1122
// (disbursement date + minimum between disbursal and first
1117
1123
// repayment )
1118
1124
if (repaymentPeriodFrequencyType .isDaily ()) {
1119
- dateBasedOnRepaymentFrequency = RepaymentStartDateType .DISBURSEMENT_DATE .equals (repaymentStartDateType )
1120
- ? expectedDisbursementDate .plusDays (repaymentEvery )
1121
- : submittedOnDate .plusDays (repaymentEvery );
1122
-
1125
+ dateBasedOnRepaymentFrequency = seedDate .plusDays (repaymentEvery );
1123
1126
} else if (repaymentPeriodFrequencyType .isWeekly ()) {
1124
- dateBasedOnRepaymentFrequency = RepaymentStartDateType .DISBURSEMENT_DATE .equals (repaymentStartDateType )
1125
- ? expectedDisbursementDate .plusWeeks (repaymentEvery )
1126
- : submittedOnDate .plusWeeks (repaymentEvery );
1127
-
1127
+ dateBasedOnRepaymentFrequency = seedDate .plusWeeks (repaymentEvery );
1128
1128
} else if (repaymentPeriodFrequencyType .isMonthly ()) {
1129
- dateBasedOnRepaymentFrequency = RepaymentStartDateType .DISBURSEMENT_DATE .equals (repaymentStartDateType )
1130
- ? expectedDisbursementDate .plusMonths (repaymentEvery )
1131
- : submittedOnDate .plusMonths (repaymentEvery );
1132
-
1129
+ dateBasedOnRepaymentFrequency = seedDate .plusMonths (repaymentEvery );
1133
1130
} else { // yearly loan
1134
- dateBasedOnRepaymentFrequency = RepaymentStartDateType .DISBURSEMENT_DATE .equals (repaymentStartDateType )
1135
- ? expectedDisbursementDate .plusYears (repaymentEvery )
1136
- : submittedOnDate .plusYears (repaymentEvery );
1137
-
1131
+ dateBasedOnRepaymentFrequency = seedDate .plusYears (repaymentEvery );
1138
1132
}
1139
1133
derivedFirstRepayment = DateUtils .isAfter (dateBasedOnRepaymentFrequency ,
1140
1134
dateBasedOnMinimumDaysBetweenDisbursalAndFirstRepayment ) ? dateBasedOnRepaymentFrequency
@@ -1146,20 +1140,16 @@ private LocalDate deriveFirstRepaymentDate(final AccountType loanType, final Int
1146
1140
1147
1141
private LocalDate deriveFirstRepaymentDateForLoans (final Integer repaymentEvery , final LocalDate expectedDisbursementDate ,
1148
1142
final LocalDate refernceDateForCalculatingFirstRepaymentDate , final PeriodFrequencyType repaymentPeriodFrequencyType ,
1149
- final Integer minimumDaysBetweenDisbursalAndFirstRepayment , final Calendar calendar , final LocalDate submittedOnDate ,
1150
- final RepaymentStartDateType repaymentStartDateType ) {
1143
+ final Integer minimumDaysBetweenDisbursalAndFirstRepayment , final Calendar calendar , final LocalDate submittedOnDate ) {
1151
1144
boolean isMeetingSkipOnFirstDayOfMonth = configurationDomainService .isSkippingMeetingOnFirstDayOfMonthEnabled ();
1152
1145
int numberOfDays = configurationDomainService .retreivePeroidInNumberOfDaysForSkipMeetingDate ().intValue ();
1153
1146
final String frequency = CalendarUtils .getMeetingFrequencyFromPeriodFrequencyType (repaymentPeriodFrequencyType );
1154
1147
final LocalDate derivedFirstRepayment = CalendarUtils .getFirstRepaymentMeetingDate (calendar ,
1155
1148
refernceDateForCalculatingFirstRepaymentDate , repaymentEvery , frequency , isMeetingSkipOnFirstDayOfMonth , numberOfDays );
1156
- final LocalDate minimumFirstRepaymentDate = RepaymentStartDateType .DISBURSEMENT_DATE .equals (repaymentStartDateType )
1157
- ? expectedDisbursementDate .plusDays (minimumDaysBetweenDisbursalAndFirstRepayment )
1158
- : submittedOnDate ;
1149
+ final LocalDate minimumFirstRepaymentDate = expectedDisbursementDate .plusDays (minimumDaysBetweenDisbursalAndFirstRepayment );
1159
1150
return DateUtils .isBefore (minimumFirstRepaymentDate , derivedFirstRepayment ) ? derivedFirstRepayment
1160
1151
: deriveFirstRepaymentDateForLoans (repaymentEvery , expectedDisbursementDate , derivedFirstRepayment ,
1161
- repaymentPeriodFrequencyType , minimumDaysBetweenDisbursalAndFirstRepayment , calendar , submittedOnDate ,
1162
- repaymentStartDateType );
1152
+ repaymentPeriodFrequencyType , minimumDaysBetweenDisbursalAndFirstRepayment , calendar , submittedOnDate );
1163
1153
}
1164
1154
1165
1155
private void validateMinimumDaysBetweenDisbursalAndFirstRepayment (final LocalDate disbursalDate , final LocalDate firstRepaymentDate ,
0 commit comments