FINERACT-2081: Rework Loan Account data

This commit is contained in:
Adam Saghy
2024-08-15 13:19:01 +02:00
parent 22b10d933b
commit 2a445a5862
11 changed files with 239 additions and 902 deletions
@@ -22,14 +22,10 @@ import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Collection; import java.util.Collection;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Data;
import lombok.Setter;
import lombok.ToString;
@Data
@AllArgsConstructor @AllArgsConstructor
@ToString
@Getter
@Setter
public final class CollectionData { public final class CollectionData {
private BigDecimal availableDisbursementAmount; private BigDecimal availableDisbursementAmount;
@@ -18,108 +18,58 @@
*/ */
package org.apache.fineract.portfolio.loanaccount.data; package org.apache.fineract.portfolio.loanaccount.data;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import lombok.Getter; import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor; import lombok.Data;
import org.apache.fineract.organisation.monetary.data.CurrencyData; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/** /**
* Immutable data object represent the important time-line events of a loan application and loan. * Data object represent the important time-line events of a loan application and loan.
*/ */
@Getter @Data
@RequiredArgsConstructor @Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class LoanApplicationTimelineData { public class LoanApplicationTimelineData {
private final LocalDate submittedOnDate; private LocalDate submittedOnDate;
private final String submittedByUsername; private String submittedByUsername;
private final String submittedByFirstname; private String submittedByFirstname;
private final String submittedByLastname; private String submittedByLastname;
private final LocalDate rejectedOnDate; private LocalDate rejectedOnDate;
private final String rejectedByUsername; private String rejectedByUsername;
private final String rejectedByFirstname; private String rejectedByFirstname;
private final String rejectedByLastname; private String rejectedByLastname;
private final LocalDate withdrawnOnDate; private LocalDate withdrawnOnDate;
private final String withdrawnByUsername; private String withdrawnByUsername;
private final String withdrawnByFirstname; private String withdrawnByFirstname;
private final String withdrawnByLastname; private String withdrawnByLastname;
private final LocalDate approvedOnDate; private LocalDate approvedOnDate;
private final String approvedByUsername; private String approvedByUsername;
private final String approvedByFirstname; private String approvedByFirstname;
private final String approvedByLastname; private String approvedByLastname;
private final LocalDate expectedDisbursementDate; private LocalDate expectedDisbursementDate;
private final LocalDate actualDisbursementDate; private LocalDate actualDisbursementDate;
private final String disbursedByUsername; private String disbursedByUsername;
private final String disbursedByFirstname; private String disbursedByFirstname;
private final String disbursedByLastname; private String disbursedByLastname;
private final LocalDate closedOnDate; private LocalDate closedOnDate;
private final String closedByUsername; private String closedByUsername;
private final String closedByFirstname; private String closedByFirstname;
private final String closedByLastname; private String closedByLastname;
private final LocalDate actualMaturityDate; private LocalDate actualMaturityDate;
private final LocalDate expectedMaturityDate; private LocalDate expectedMaturityDate;
private final LocalDate writeOffOnDate; private LocalDate writeOffOnDate;
private final String writeOffByUsername; private String writeOffByUsername;
private final String writeOffByFirstname; private String writeOffByFirstname;
private final String writeOffByLastname; private String writeOffByLastname;
private final LocalDate chargedOffOnDate; private LocalDate chargedOffOnDate;
private final String chargedOffByUsername; private String chargedOffByUsername;
private final String chargedOffByFirstname; private String chargedOffByFirstname;
private final String chargedOffByLastname; private String chargedOffByLastname;
public static LoanApplicationTimelineData templateDefault(final LocalDate expectedDisbursementDate) {
final LocalDate submittedOnDate = null;
final String submittedByUsername = null;
final String submittedByFirstname = null;
final String submittedByLastname = null;
final LocalDate rejectedOnDate = null;
final String rejectedByUsername = null;
final String rejectedByFirstname = null;
final String rejectedByLastname = null;
final LocalDate withdrawnOnDate = null;
final String withdrawnByUsername = null;
final String withdrawnByFirstname = null;
final String withdrawnByLastname = null;
final LocalDate approvedOnDate = null;
final String approvedByUsername = null;
final String approvedByFirstname = null;
final String approvedByLastname = null;
final LocalDate actualDisbursementDate = null;
final String disbursedByUsername = null;
final String disbursedByFirstname = null;
final String disbursedByLastname = null;
final LocalDate closedOnDate = null;
final String closedByUsername = null;
final String closedByFirstname = null;
final String closedByLastname = null;
final LocalDate expectedMaturityDate = null;
final LocalDate writeOffOnDate = null;
final String writeOffByUsername = null;
final String writeOffByFirstname = null;
final String writeOffByLastname = null;
final LocalDate chargedOffOnDate = null;
final String chargedOffByUsername = null;
final String chargedOffByFirstname = null;
final String chargedOffByLastname = null;
final LocalDate actualMaturityDate = null;
return new LoanApplicationTimelineData(submittedOnDate, submittedByUsername, submittedByFirstname, submittedByLastname,
rejectedOnDate, rejectedByUsername, rejectedByFirstname, rejectedByLastname, withdrawnOnDate, withdrawnByUsername,
withdrawnByFirstname, withdrawnByLastname, approvedOnDate, approvedByUsername, approvedByFirstname, approvedByLastname,
expectedDisbursementDate, actualDisbursementDate, disbursedByUsername, disbursedByFirstname, disbursedByLastname,
closedOnDate, closedByUsername, closedByFirstname, closedByLastname, actualMaturityDate, expectedMaturityDate,
writeOffOnDate, writeOffByUsername, writeOffByFirstname, writeOffByLastname, chargedOffOnDate, chargedOffByUsername,
chargedOffByFirstname, chargedOffByLastname);
}
public RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData(final CurrencyData currency, final BigDecimal principal,
final BigDecimal approvedPrincipal, final BigDecimal inArrearsTolerance, final BigDecimal totalFeeChargesAtDisbursement) {
return new RepaymentScheduleRelatedLoanData(this.expectedDisbursementDate, this.actualDisbursementDate, currency, principal,
inArrearsTolerance, totalFeeChargesAtDisbursement);
}
public LocalDate getDisbursementDate() { public LocalDate getDisbursementDate() {
LocalDate disbursementDate = this.expectedDisbursementDate; LocalDate disbursementDate = this.expectedDisbursementDate;
@@ -18,31 +18,35 @@
*/ */
package org.apache.fineract.portfolio.loanaccount.data; package org.apache.fineract.portfolio.loanaccount.data;
import lombok.Getter; import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.infrastructure.core.data.EnumOptionData;
import org.apache.fineract.portfolio.calendar.data.CalendarData; import org.apache.fineract.portfolio.calendar.data.CalendarData;
@Getter @Data
@NoArgsConstructor
@Accessors(chain = true)
public class LoanInterestRecalculationData { public class LoanInterestRecalculationData {
private final Long id; private Long id;
private final Long loanId; private Long loanId;
private final EnumOptionData interestRecalculationCompoundingType; private EnumOptionData interestRecalculationCompoundingType;
private final EnumOptionData rescheduleStrategyType; private EnumOptionData rescheduleStrategyType;
private final CalendarData calendarData; private CalendarData calendarData;
private final EnumOptionData recalculationRestFrequencyType; private EnumOptionData recalculationRestFrequencyType;
private final Integer recalculationRestFrequencyInterval; private Integer recalculationRestFrequencyInterval;
private final EnumOptionData recalculationRestFrequencyNthDay; private EnumOptionData recalculationRestFrequencyNthDay;
private final EnumOptionData recalculationRestFrequencyWeekday; private EnumOptionData recalculationRestFrequencyWeekday;
private final Integer recalculationRestFrequencyOnDay; private Integer recalculationRestFrequencyOnDay;
private final EnumOptionData recalculationCompoundingFrequencyType; private EnumOptionData recalculationCompoundingFrequencyType;
private final Integer recalculationCompoundingFrequencyInterval; private Integer recalculationCompoundingFrequencyInterval;
private final EnumOptionData recalculationCompoundingFrequencyNthDay; private EnumOptionData recalculationCompoundingFrequencyNthDay;
private final EnumOptionData recalculationCompoundingFrequencyWeekday; private EnumOptionData recalculationCompoundingFrequencyWeekday;
private final Integer recalculationCompoundingFrequencyOnDay; private Integer recalculationCompoundingFrequencyOnDay;
private final Boolean isCompoundingToBePostedAsTransaction; private Boolean isCompoundingToBePostedAsTransaction;
private final CalendarData compoundingCalendarData; private CalendarData compoundingCalendarData;
private final Boolean allowCompoundingOnEod; private Boolean allowCompoundingOnEod;
public LoanInterestRecalculationData(final Long id, final Long loanId, final EnumOptionData interestRecalculationCompoundingType, public LoanInterestRecalculationData(final Long id, final Long loanId, final EnumOptionData interestRecalculationCompoundingType,
final EnumOptionData rescheduleStrategyType, final CalendarData calendarData, final EnumOptionData rescheduleStrategyType, final CalendarData calendarData,
@@ -73,17 +77,8 @@ public class LoanInterestRecalculationData {
this.allowCompoundingOnEod = allowCompoundingOnEod; this.allowCompoundingOnEod = allowCompoundingOnEod;
} }
public static LoanInterestRecalculationData withCalendarData(final LoanInterestRecalculationData recalculationData, public LoanInterestRecalculationData withCalendarData(final CalendarData calendarData, CalendarData compoundingCalendarData) {
final CalendarData calendarData, CalendarData compoundingCalendarData) { return this.setCalendarData(calendarData).setCompoundingCalendarData(compoundingCalendarData);
return new LoanInterestRecalculationData(recalculationData.id, recalculationData.loanId,
recalculationData.interestRecalculationCompoundingType, recalculationData.rescheduleStrategyType, calendarData,
recalculationData.recalculationRestFrequencyType, recalculationData.recalculationRestFrequencyInterval,
recalculationData.recalculationRestFrequencyNthDay, recalculationData.recalculationRestFrequencyWeekday,
recalculationData.recalculationRestFrequencyOnDay, compoundingCalendarData,
recalculationData.recalculationCompoundingFrequencyType, recalculationData.recalculationCompoundingFrequencyInterval,
recalculationData.recalculationCompoundingFrequencyNthDay, recalculationData.recalculationCompoundingFrequencyWeekday,
recalculationData.recalculationCompoundingFrequencyOnDay, recalculationData.isCompoundingToBePostedAsTransaction,
recalculationData.allowCompoundingOnEod);
} }
} }
@@ -147,7 +147,7 @@ public class GuarantorWorkbookPopulator extends AbstractWorkbookPopulator {
dateCellStyle.setDataFormat(df); dateCellStyle.setDataFormat(df);
int rowIndex = 1; int rowIndex = 1;
Row row; Row row;
Collections.sort(loans, LoanAccountData.ClientNameComparator); loans.sort(LoanAccountData.LOAN_ACCOUNT_DATA_COMPARATOR_BY_CLIENT_NAME);
for (LoanAccountData loan : loans) { for (LoanAccountData loan : loans) {
if (addGuarantorSheet.getRow(rowIndex) == null) { if (addGuarantorSheet.getRow(rowIndex) == null) {
row = addGuarantorSheet.createRow(rowIndex++); row = addGuarantorSheet.createRow(rowIndex++);
@@ -37,4 +37,6 @@ public interface GroupReadPlatformService {
Collection<GroupGeneralData> retrieveGroupsForLookup(Long officeId); Collection<GroupGeneralData> retrieveGroupsForLookup(Long officeId);
GroupGeneralData retrieveGroupWithClosureReasons(); GroupGeneralData retrieveGroupWithClosureReasons();
GroupGeneralData retrieveGroupAndMembersDetails(Long groupId);
} }
@@ -43,10 +43,13 @@ import org.apache.fineract.organisation.office.data.OfficeData;
import org.apache.fineract.organisation.office.service.OfficeReadPlatformService; import org.apache.fineract.organisation.office.service.OfficeReadPlatformService;
import org.apache.fineract.organisation.staff.data.StaffData; import org.apache.fineract.organisation.staff.data.StaffData;
import org.apache.fineract.organisation.staff.service.StaffReadPlatformService; import org.apache.fineract.organisation.staff.service.StaffReadPlatformService;
import org.apache.fineract.portfolio.calendar.data.CalendarData;
import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.data.ClientData;
import org.apache.fineract.portfolio.client.service.ClientReadPlatformService;
import org.apache.fineract.portfolio.group.api.GroupingTypesApiConstants; import org.apache.fineract.portfolio.group.api.GroupingTypesApiConstants;
import org.apache.fineract.portfolio.group.data.CenterData; import org.apache.fineract.portfolio.group.data.CenterData;
import org.apache.fineract.portfolio.group.data.GroupGeneralData; import org.apache.fineract.portfolio.group.data.GroupGeneralData;
import org.apache.fineract.portfolio.group.data.GroupRoleData;
import org.apache.fineract.portfolio.group.domain.GroupTypes; import org.apache.fineract.portfolio.group.domain.GroupTypes;
import org.apache.fineract.portfolio.group.exception.GroupNotFoundException; import org.apache.fineract.portfolio.group.exception.GroupNotFoundException;
import org.apache.fineract.useradministration.domain.AppUser; import org.apache.fineract.useradministration.domain.AppUser;
@@ -74,6 +77,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
private final DatabaseSpecificSQLGenerator sqlGenerator; private final DatabaseSpecificSQLGenerator sqlGenerator;
private final PaginationParametersDataValidator paginationParametersDataValidator; private final PaginationParametersDataValidator paginationParametersDataValidator;
private final ColumnValidator columnValidator; private final ColumnValidator columnValidator;
private final ClientReadPlatformService clientReadPlatformService;
@Override @Override
public GroupGeneralData retrieveTemplate(final Long officeId, final boolean isCenterGroup, final boolean staffInSelectedOfficeOnly) { public GroupGeneralData retrieveTemplate(final Long officeId, final boolean isCenterGroup, final boolean staffInSelectedOfficeOnly) {
@@ -246,6 +250,23 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
return GroupGeneralData.withClosureReasons(closureReasons); return GroupGeneralData.withClosureReasons(closureReasons);
} }
@Override
public GroupGeneralData retrieveGroupAndMembersDetails(Long groupId) {
GroupGeneralData groupAccount = retrieveOne(groupId);
// get group associations
final Collection<ClientData> membersOfGroup = clientReadPlatformService.retrieveActiveClientMembersOfGroup(groupId);
if (!CollectionUtils.isEmpty(membersOfGroup)) {
final Collection<ClientData> activeClientMembers = null;
final Collection<CalendarData> calendarsData = null;
final CalendarData collectionMeetingCalendar = null;
final Collection<GroupRoleData> groupRoles = null;
groupAccount = GroupGeneralData.withAssocations(groupAccount, membersOfGroup, activeClientMembers, groupRoles, calendarsData,
collectionMeetingCalendar);
}
return groupAccount;
}
private static final class GroupLookupDataMapper implements RowMapper<GroupGeneralData> { private static final class GroupLookupDataMapper implements RowMapper<GroupGeneralData> {
public static final String G_ID_AS_ID_G_ACCOUNT_NO_AS_ACCOUNT_NO_G_DISPLAY_NAME_AS_DISPLAY_NAME_FROM_M_GROUP_G_WHERE_G_LEVEL_ID_2 = "g.id as id, g.account_no as accountNo, g.display_name as displayName from m_group g where g.level_id = 2 "; public static final String G_ID_AS_ID_G_ACCOUNT_NO_AS_ACCOUNT_NO_G_DISPLAY_NAME_AS_DISPLAY_NAME_FROM_M_GROUP_G_WHERE_G_LEVEL_ID_2 = "g.id as id, g.account_no as accountNo, g.display_name as displayName from m_group g where g.level_id = 2 ";
@@ -114,10 +114,11 @@ public class GroupConfiguration {
OfficeReadPlatformService officeReadPlatformService, StaffReadPlatformService staffReadPlatformService, OfficeReadPlatformService officeReadPlatformService, StaffReadPlatformService staffReadPlatformService,
CenterReadPlatformService centerReadPlatformService, CodeValueReadPlatformService codeValueReadPlatformService, CenterReadPlatformService centerReadPlatformService, CodeValueReadPlatformService codeValueReadPlatformService,
PaginationHelper paginationHelper, DatabaseSpecificSQLGenerator sqlGenerator, PaginationHelper paginationHelper, DatabaseSpecificSQLGenerator sqlGenerator,
PaginationParametersDataValidator paginationParametersDataValidator, ColumnValidator columnValidator) { PaginationParametersDataValidator paginationParametersDataValidator, ColumnValidator columnValidator,
ClientReadPlatformService clientReadPlatformService) {
return new GroupReadPlatformServiceImpl(jdbcTemplate, context, officeReadPlatformService, staffReadPlatformService, return new GroupReadPlatformServiceImpl(jdbcTemplate, context, officeReadPlatformService, staffReadPlatformService,
centerReadPlatformService, codeValueReadPlatformService, paginationHelper, sqlGenerator, paginationParametersDataValidator, centerReadPlatformService, codeValueReadPlatformService, paginationHelper, sqlGenerator, paginationParametersDataValidator,
columnValidator); columnValidator, clientReadPlatformService);
} }
@Bean @Bean
@@ -47,6 +47,7 @@ import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo; import jakarta.ws.rs.core.UriInfo;
import java.io.InputStream; import java.io.InputStream;
import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@@ -78,6 +79,7 @@ import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSeria
import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
import org.apache.fineract.infrastructure.core.service.CommandParameterUtil; import org.apache.fineract.infrastructure.core.service.CommandParameterUtil;
import org.apache.fineract.infrastructure.core.service.DateUtils;
import org.apache.fineract.infrastructure.core.service.ExternalIdFactory; import org.apache.fineract.infrastructure.core.service.ExternalIdFactory;
import org.apache.fineract.infrastructure.core.service.Page; import org.apache.fineract.infrastructure.core.service.Page;
import org.apache.fineract.infrastructure.core.service.SearchParameters; import org.apache.fineract.infrastructure.core.service.SearchParameters;
@@ -104,6 +106,7 @@ import org.apache.fineract.portfolio.charge.data.ChargeData;
import org.apache.fineract.portfolio.charge.domain.ChargeTimeType; import org.apache.fineract.portfolio.charge.domain.ChargeTimeType;
import org.apache.fineract.portfolio.charge.service.ChargeReadPlatformService; import org.apache.fineract.portfolio.charge.service.ChargeReadPlatformService;
import org.apache.fineract.portfolio.client.data.ClientData; import org.apache.fineract.portfolio.client.data.ClientData;
import org.apache.fineract.portfolio.client.service.ClientReadPlatformService;
import org.apache.fineract.portfolio.collateralmanagement.data.LoanCollateralResponseData; import org.apache.fineract.portfolio.collateralmanagement.data.LoanCollateralResponseData;
import org.apache.fineract.portfolio.collateralmanagement.service.LoanCollateralManagementReadPlatformService; import org.apache.fineract.portfolio.collateralmanagement.service.LoanCollateralManagementReadPlatformService;
import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType; import org.apache.fineract.portfolio.common.domain.PeriodFrequencyType;
@@ -283,6 +286,7 @@ public class LoansApiResource {
private final DelinquencyReadPlatformService delinquencyReadPlatformService; private final DelinquencyReadPlatformService delinquencyReadPlatformService;
private final SqlValidator sqlValidator; private final SqlValidator sqlValidator;
private final LoanSummaryBalancesRepository loanSummaryBalancesRepository; private final LoanSummaryBalancesRepository loanSummaryBalancesRepository;
private final ClientReadPlatformService clientReadPlatformService;
/* /*
* This template API is used for loan approval, ideally this should be invoked on loan that are pending for * This template API is used for loan approval, ideally this should be invoked on loan that are pending for
@@ -326,10 +330,11 @@ public class LoansApiResource {
final Collection<LoanProductData> productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup(onlyActive); final Collection<LoanProductData> productOptions = this.loanProductReadPlatformService.retrieveAllLoanProductsForLookup(onlyActive);
// options // options
Collection<StaffData> allowedLoanOfficers = null; Collection<StaffData> allowedLoanOfficers;
Collection<CodeValueData> loanCollateralOptions = null; Collection<CodeValueData> loanCollateralOptions;
Collection<CalendarData> calendarOptions = null; Collection<CalendarData> calendarOptions = null;
LoanAccountData newLoanAccount = null; LoanAccountData newLoanAccount = new LoanAccountData();
LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate();
Long officeId = null; Long officeId = null;
Collection<PortfolioAccountData> accountLinkingOptions = null; Collection<PortfolioAccountData> accountLinkingOptions = null;
boolean isRatesEnabled = this.configurationDomainService.isSubRatesEnabled(); boolean isRatesEnabled = this.configurationDomainService.isSubRatesEnabled();
@@ -343,66 +348,54 @@ public class LoansApiResource {
throw new LoanTemplateTypeRequiredException(errorMsg); throw new LoanTemplateTypeRequiredException(errorMsg);
} else if (templateType.equals("collateral")) { } else if (templateType.equals("collateral")) {
loanCollateralOptions = this.codeValueReadPlatformService.retrieveCodeValuesByCode("LoanCollateral"); loanCollateralOptions = this.codeValueReadPlatformService.retrieveCodeValuesByCode("LoanCollateral");
newLoanAccount = LoanAccountData.collateralTemplate(loanCollateralOptions); newLoanAccount = newLoanAccount.setLoanCollateralOptions(loanCollateralOptions);
} else { } else {
// for JLG loan both client and group details are required // for JLG loan both client and group details are required
if (templateType.equals("individual") || templateType.equals("jlg")) { switch (templateType) {
case "individual", "jlg" -> {
if (clientId == null) { if (clientId != null) {
newLoanAccount = newLoanAccount == null ? LoanAccountData.collateralTemplate(null) : newLoanAccount; final ClientData clientData = this.clientReadPlatformService.retrieveOne(clientId);
} else { officeId = clientData.getOfficeId();
final LoanAccountData loanAccountClientDetails = this.loanReadPlatformService.retrieveClientDetailsTemplate(clientId); newLoanAccount = newLoanAccount.withClientData(clientData).withExpectedDisbursementDate(expectedDisbursementDate);
}
officeId = loanAccountClientDetails.getClientOfficeId(); // if it's JLG loan add group details
if (templateType.equals("jlg")) {
if (officeId == null && loanAccountClientDetails.getGroup() != null) { final GroupGeneralData groupData = this.groupReadPlatformService.retrieveOne(groupId);
officeId = loanAccountClientDetails.getGroup().getOfficeId(); newLoanAccount = newLoanAccount.setGroup(groupData);
calendarOptions = this.loanReadPlatformService.retrieveCalendars(groupId);
} }
newLoanAccount = newLoanAccount == null ? loanAccountClientDetails
: LoanAccountData.populateClientDefaults(newLoanAccount, loanAccountClientDetails);
} }
case "group" -> {
// if it's JLG loan add group details final GroupGeneralData groupData = this.groupReadPlatformService.retrieveOne(groupId);
if (templateType.equals("jlg")) { officeId = groupData.getOfficeId();
final GroupGeneralData group = this.groupReadPlatformService.retrieveOne(groupId);
newLoanAccount = LoanAccountData.associateGroup(newLoanAccount, group);
calendarOptions = this.loanReadPlatformService.retrieveCalendars(groupId); calendarOptions = this.loanReadPlatformService.retrieveCalendars(groupId);
newLoanAccount = newLoanAccount.setGroup(groupData).withExpectedDisbursementDate(expectedDisbursementDate);
accountLinkingOptions = getAccountLinkingOptions(newLoanAccount, clientId, groupId);
} }
case "jlgbulk" -> {
} else if (templateType.equals("group")) { // get group details along with members in that group
final GroupGeneralData groupData = this.groupReadPlatformService.retrieveGroupAndMembersDetails(groupId);
final LoanAccountData loanAccountGroupData = this.loanReadPlatformService.retrieveGroupDetailsTemplate(groupId); officeId = groupData.getOfficeId();
officeId = loanAccountGroupData.getGroup() != null ? loanAccountGroupData.getGroup().getOfficeId() : null; calendarOptions = this.loanReadPlatformService.retrieveCalendars(groupId);
calendarOptions = this.loanReadPlatformService.retrieveCalendars(groupId); newLoanAccount = newLoanAccount.setGroup(groupData).withExpectedDisbursementDate(expectedDisbursementDate);
newLoanAccount = newLoanAccount == null ? loanAccountGroupData if (productId != null) {
: LoanAccountData.populateGroupDefaults(newLoanAccount, loanAccountGroupData); Map<Long, Integer> memberLoanCycle = new HashMap<>();
accountLinkingOptions = getAccountLinkingOptions(newLoanAccount, clientId, groupId); Collection<ClientData> members = groupData.clientMembers();
accountLinkingOptions = new ArrayList<>();
} else if (templateType.equals("jlgbulk")) { if (members != null) {
// get group details along with members in that group for (ClientData clientData : members) {
final LoanAccountData loanAccountGroupData = this.loanReadPlatformService.retrieveGroupAndMembersDetailsTemplate(groupId); Integer loanCounter = this.loanReadPlatformService.retriveLoanCounter(clientData.getId(), productId);
officeId = loanAccountGroupData.getGroup() != null ? loanAccountGroupData.getGroup().getOfficeId() : null; memberLoanCycle.put(clientData.getId(), loanCounter);
calendarOptions = this.loanReadPlatformService.retrieveCalendars(groupId); accountLinkingOptions.addAll(getAccountLinkingOptions(newLoanAccount, clientData.getId(), groupId));
newLoanAccount = newLoanAccount == null ? loanAccountGroupData }
: LoanAccountData.populateGroupDefaults(newLoanAccount, loanAccountGroupData);
if (productId != null) {
Map<Long, Integer> memberLoanCycle = new HashMap<>();
Collection<ClientData> members = loanAccountGroupData.getGroup().clientMembers();
accountLinkingOptions = new ArrayList<>();
if (members != null) {
for (ClientData clientData : members) {
Integer loanCounter = this.loanReadPlatformService.retriveLoanCounter(clientData.getId(), productId);
memberLoanCycle.put(clientData.getId(), loanCounter);
accountLinkingOptions.addAll(getAccountLinkingOptions(newLoanAccount, clientData.getId(), groupId));
} }
newLoanAccount = newLoanAccount.associateMemberVariations(memberLoanCycle);
} }
newLoanAccount = LoanAccountData.associateMemberVariations(newLoanAccount, memberLoanCycle);
} }
default -> {
} else { final String errorMsg = "Loan template type '" + templateType + "' is not supported";
final String errorMsg = "Loan template type '" + templateType + "' is not supported"; throw new NotSupportedLoanTemplateTypeException(errorMsg, templateType);
throw new NotSupportedLoanTemplateTypeException(errorMsg, templateType); }
} }
allowedLoanOfficers = this.loanReadPlatformService.retrieveAllowedLoanOfficers(officeId, staffInSelectedOfficeOnly); allowedLoanOfficers = this.loanReadPlatformService.retrieveAllowedLoanOfficers(officeId, staffInSelectedOfficeOnly);
@@ -413,7 +406,7 @@ public class LoansApiResource {
// add product options, allowed loan officers and calendar options // add product options, allowed loan officers and calendar options
// (calendar options will be null in individual loan) // (calendar options will be null in individual loan)
newLoanAccount = LoanAccountData.associationsAndTemplate(newLoanAccount, productOptions, allowedLoanOfficers, calendarOptions, newLoanAccount = newLoanAccount.associationsAndTemplate(productOptions, allowedLoanOfficers, calendarOptions,
accountLinkingOptions, isRatesEnabled); accountLinkingOptions, isRatesEnabled);
} }
final List<DatatableData> datatableTemplates = this.entityDatatableChecksReadService.retrieveTemplates(StatusEnum.CREATE.getValue(), final List<DatatableData> datatableTemplates = this.entityDatatableChecksReadService.retrieveTemplates(StatusEnum.CREATE.getValue(),
@@ -880,8 +873,7 @@ public class LoansApiResource {
if (!CollectionUtils.isEmpty(interestRecalculationCompoundingCalendarDatas)) { if (!CollectionUtils.isEmpty(interestRecalculationCompoundingCalendarDatas)) {
compoundingCalendarData = interestRecalculationCompoundingCalendarDatas.iterator().next(); compoundingCalendarData = interestRecalculationCompoundingCalendarDatas.iterator().next();
} }
loanBasicDetails = LoanAccountData.withInterestRecalculationCalendarData(loanBasicDetails, calendarData, loanBasicDetails = loanBasicDetails.withInterestRecalculationCalendarData(calendarData, compoundingCalendarData);
compoundingCalendarData);
} }
if (loanBasicDetails.getRepaymentFrequencyType() != null if (loanBasicDetails.getRepaymentFrequencyType() != null
&& loanBasicDetails.getRepaymentFrequencyType().getId().intValue() == PeriodFrequencyType.MONTHS.getValue()) { && loanBasicDetails.getRepaymentFrequencyType().getId().intValue() == PeriodFrequencyType.MONTHS.getValue()) {
@@ -892,7 +884,7 @@ public class LoansApiResource {
calendarData = loanCalendarDatas.iterator().next(); calendarData = loanCalendarDatas.iterator().next();
} }
if (calendarData != null) { if (calendarData != null) {
loanBasicDetails = LoanAccountData.withLoanCalendarData(loanBasicDetails, calendarData); loanBasicDetails = loanBasicDetails.setMeeting(calendarData);
} }
} }
Collection<InterestRatePeriodData> interestRatesPeriods = this.loanReadPlatformService Collection<InterestRatePeriodData> interestRatesPeriods = this.loanReadPlatformService
@@ -952,10 +944,11 @@ public class LoansApiResource {
if (associationParameters.contains(DataTableApiConstant.repaymentScheduleAssociateParamName)) { if (associationParameters.contains(DataTableApiConstant.repaymentScheduleAssociateParamName)) {
mandatoryResponseParameters.add(DataTableApiConstant.repaymentScheduleAssociateParamName); mandatoryResponseParameters.add(DataTableApiConstant.repaymentScheduleAssociateParamName);
final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = loanBasicDetails.getTimeline() final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData(
.repaymentScheduleRelatedData(loanBasicDetails.getCurrency(), loanBasicDetails.getPrincipal(), loanBasicDetails.getTimeline().getExpectedDisbursementDate(),
loanBasicDetails.getApprovedPrincipal(), loanBasicDetails.getInArrearsTolerance(), loanBasicDetails.getTimeline().getActualDisbursementDate(), loanBasicDetails.getCurrency(),
loanBasicDetails.getFeeChargesAtDisbursementCharged()); loanBasicDetails.getPrincipal(), loanBasicDetails.getInArrearsTolerance(),
loanBasicDetails.getFeeChargesAtDisbursementCharged());
repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(resolvedLoanId, repaymentScheduleRelatedData, repaymentSchedule = this.loanReadPlatformService.retrieveRepaymentSchedule(resolvedLoanId, repaymentScheduleRelatedData,
disbursementData, loanBasicDetails.isInterestRecalculationEnabled(), disbursementData, loanBasicDetails.isInterestRecalculationEnabled(),
LoanScheduleType.fromEnumOptionData(loanBasicDetails.getLoanScheduleType())); LoanScheduleType.fromEnumOptionData(loanBasicDetails.getLoanScheduleType()));
@@ -973,7 +966,7 @@ public class LoansApiResource {
LoanScheduleData loanScheduleData = this.loanScheduleHistoryReadPlatformService.retrieveRepaymentArchiveSchedule( LoanScheduleData loanScheduleData = this.loanScheduleHistoryReadPlatformService.retrieveRepaymentArchiveSchedule(
resolvedLoanId, repaymentScheduleRelatedData, disbursementData, resolvedLoanId, repaymentScheduleRelatedData, disbursementData,
LoanScheduleType.fromEnumOptionData(loanBasicDetails.getLoanScheduleType())); LoanScheduleType.fromEnumOptionData(loanBasicDetails.getLoanScheduleType()));
loanBasicDetails = LoanAccountData.withOriginalSchedule(loanBasicDetails, loanScheduleData); loanBasicDetails = loanBasicDetails.setOriginalSchedule(loanScheduleData);
} }
} }
@@ -1118,8 +1111,8 @@ public class LoansApiResource {
LoanApiConstants.LOAN_SUMMARY_TRANSACTION_TYPES))); LoanApiConstants.LOAN_SUMMARY_TRANSACTION_TYPES)));
} }
final LoanAccountData loanAccount = LoanAccountData.associationsAndTemplate(loanBasicDetails, repaymentSchedule, loanRepayments, final LoanAccountData loanAccount = loanBasicDetails.associationsAndTemplate(repaymentSchedule, loanRepayments, charges,
charges, loanCollateralManagementData, guarantors, meeting, productOptions, loanTermFrequencyTypeOptions, loanCollateralManagementData, guarantors, meeting, productOptions, loanTermFrequencyTypeOptions,
repaymentFrequencyTypeOptions, repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDayOfWeekTypeOptions, repaymentFrequencyTypeOptions, repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDayOfWeekTypeOptions,
repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, repaymentStrategyOptions, interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions,
interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, allowedLoanOfficers, loanPurposeOptions, interestCalculationPeriodTypeOptions, fundOptions, chargeOptions, chargeTemplate, allowedLoanOfficers, loanPurposeOptions,
@@ -42,6 +42,7 @@ import org.apache.fineract.portfolio.accountdetails.data.LoanAccountSummaryData;
import org.apache.fineract.portfolio.calendar.data.CalendarData; import org.apache.fineract.portfolio.calendar.data.CalendarData;
import org.apache.fineract.portfolio.charge.data.ChargeData; import org.apache.fineract.portfolio.charge.data.ChargeData;
import org.apache.fineract.portfolio.charge.util.ConvertChargeDataToSpecificChargeData; import org.apache.fineract.portfolio.charge.util.ConvertChargeDataToSpecificChargeData;
import org.apache.fineract.portfolio.client.data.ClientData;
import org.apache.fineract.portfolio.delinquency.data.DelinquencyRangeData; import org.apache.fineract.portfolio.delinquency.data.DelinquencyRangeData;
import org.apache.fineract.portfolio.floatingrates.data.InterestRatePeriodData; import org.apache.fineract.portfolio.floatingrates.data.InterestRatePeriodData;
import org.apache.fineract.portfolio.fund.data.FundData; import org.apache.fineract.portfolio.fund.data.FundData;
@@ -230,7 +231,7 @@ public class LoanAccountData {
private Integer minimumGap; private Integer minimumGap;
private Integer maximumGap; private Integer maximumGap;
private List<DatatableData> datatables = null; private List<DatatableData> datatables;
// TODO: avoid prefix "is" // TODO: avoid prefix "is"
private Boolean isEqualAmortization; private Boolean isEqualAmortization;
private BigDecimal fixedPrincipalPercentagePerInstallment; private BigDecimal fixedPrincipalPercentagePerInstallment;
@@ -316,176 +317,23 @@ public class LoanAccountData {
.setFixedLength(fixedLength); .setFixedLength(fixedLength);
} }
/** public LoanAccountData withClientData(final ClientData clientData) {
* Used to produce a {@link LoanAccountData} with only collateral options for now. return this.setClientId(clientData.getId()) //
*/ .setClientAccountNo(clientData.getAccountNo()) //
public static LoanAccountData collateralTemplate(final Collection<CodeValueData> loanCollateralOptions) { .setClientName(clientData.getDisplayName()) //
.setClientOfficeId(clientData.getOfficeId()) //
return new LoanAccountData().setIsVariableInstallmentsAllowed(false).setDelinquent(CollectionData.template()) .setClientExternalId(clientData.getExternalId()); //
.setLoanCollateralOptions(loanCollateralOptions);
} }
/** public LoanAccountData withExpectedDisbursementDate(final LocalDate expectedDisbursementDate) {
* Used to produce a {@link LoanAccountData} with only client information defaulted. if (getTimeline() == null) {
*/ setTimeline(new LoanApplicationTimelineData());
public static LoanAccountData clientDefaults(final Long clientId, final String clientAccountNo, final String clientName, }
final Long clientOfficeId, final ExternalId clientExternalId, final LocalDate expectedDisbursementDate) { this.getTimeline().setExpectedDisbursementDate(expectedDisbursementDate);
return this.setExpectedDisbursementDate(expectedDisbursementDate);
return new LoanAccountData().setTimeline(LoanApplicationTimelineData.templateDefault(expectedDisbursementDate))
.setIsVariableInstallmentsAllowed(false).setDelinquent(CollectionData.template()).setClientId(clientId)
.setClientAccountNo(clientAccountNo).setClientName(clientName).setClientOfficeId(clientOfficeId)
.setClientExternalId(clientExternalId).setExpectedDisbursementDate(expectedDisbursementDate);
} }
public static LoanAccountData populateClientDefaults(final LoanAccountData acc, final LoanAccountData clientAcc) { public LoanAccountData withProductData(final LoanProductData product, final Integer loanCycleNumber) {
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId)
.setClientId(clientAcc.clientId).setClientAccountNo(clientAcc.clientAccountNo).setClientName(clientAcc.clientName)
.setClientOfficeId(clientAcc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(acc.group)
.setLoanType(acc.loanType).setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType)
.setRepaymentFrequencyNthDayType(acc.repaymentFrequencyNthDayType)
.setRepaymentFrequencyDayOfWeekType(acc.repaymentFrequencyDayOfWeekType).setFixedLength(acc.fixedLength)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(clientAcc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(acc.repaymentSchedule)
.setTransactions(acc.transactions).setCharges(acc.charges).setCollateral(acc.collateral).setGuarantors(acc.guarantors)
.setMeeting(acc.meeting).setProductOptions(acc.productOptions).setTermFrequencyTypeOptions(acc.termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(acc.repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(acc.repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(acc.repaymentFrequencyDaysOfWeekTypeOptions)
.setTransactionProcessingStrategyOptions(acc.transactionProcessingStrategyOptions)
.setInterestRateFrequencyTypeOptions(acc.interestRateFrequencyTypeOptions)
.setAmortizationTypeOptions(acc.amortizationTypeOptions).setInterestTypeOptions(acc.interestTypeOptions)
.setInterestCalculationPeriodTypeOptions(acc.interestCalculationPeriodTypeOptions).setFundOptions(acc.fundOptions)
.setChargeOptions(acc.chargeOptions).setLoanOfficerOptions(acc.loanOfficerOptions)
.setLoanPurposeOptions(acc.loanPurposeOptions).setLoanCollateralOptions(acc.loanCollateralOptions)
.setCalendarOptions(acc.calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(acc.notes)
.setAccountLinkingOptions(acc.accountLinkingOptions).setLinkedAccount(acc.linkedAccount)
.setDisbursementDetails(acc.disbursementDetails).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setEmiAmountVariations(acc.emiAmountVariations)
.setMemberVariations(acc.memberVariations).setProduct(acc.product).setInArrears(acc.inArrears)
.setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setOverdueCharges(acc.overdueCharges).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled)
.setInterestRecalculationData(acc.interestRecalculationData).setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement).setPaidInAdvance(acc.paidInAdvance)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed)
.setMinimumGap(acc.minimumGap).setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment).setDelinquent(acc.delinquent)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff)
.setLoanScheduleType(acc.loanScheduleType).setLoanScheduleProcessingType(acc.loanScheduleProcessingType)
.setLoanScheduleTypeOptions(acc.loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(acc.loanScheduleProcessingTypeOptions);
}
/**
* Used to produce a {@link LoanAccountData} with only group information defaulted.
*/
public static LoanAccountData groupDefaults(final GroupGeneralData group, final LocalDate expectedDisbursementDate) {
return new LoanAccountData().setTimeline(LoanApplicationTimelineData.templateDefault(expectedDisbursementDate))
.setIsVariableInstallmentsAllowed(false).setDelinquent(CollectionData.template()).setGroup(group)
.setExpectedDisbursementDate(expectedDisbursementDate);
}
public static LoanAccountData populateGroupDefaults(final LoanAccountData acc, final LoanAccountData groupAcc) {
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId)
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName)
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(groupAcc.group)
.setLoanType(acc.loanType).setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType)
.setRepaymentFrequencyNthDayType(acc.repaymentFrequencyNthDayType)
.setRepaymentFrequencyDayOfWeekType(acc.repaymentFrequencyDayOfWeekType).setFixedLength(acc.fixedLength)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(groupAcc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(acc.repaymentSchedule)
.setTransactions(acc.transactions).setCharges(acc.charges).setCollateral(acc.collateral).setGuarantors(acc.guarantors)
.setMeeting(acc.meeting).setProductOptions(acc.productOptions).setTermFrequencyTypeOptions(acc.termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(acc.repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(acc.repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(acc.repaymentFrequencyDaysOfWeekTypeOptions)
.setTransactionProcessingStrategyOptions(acc.transactionProcessingStrategyOptions)
.setInterestRateFrequencyTypeOptions(acc.interestRateFrequencyTypeOptions)
.setAmortizationTypeOptions(acc.amortizationTypeOptions).setInterestTypeOptions(acc.interestTypeOptions)
.setInterestCalculationPeriodTypeOptions(acc.interestCalculationPeriodTypeOptions).setFundOptions(acc.fundOptions)
.setChargeOptions(acc.chargeOptions).setLoanOfficerOptions(acc.loanOfficerOptions)
.setLoanPurposeOptions(acc.loanPurposeOptions).setLoanCollateralOptions(acc.loanCollateralOptions)
.setCalendarOptions(acc.calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(acc.notes)
.setAccountLinkingOptions(acc.accountLinkingOptions).setLinkedAccount(acc.linkedAccount)
.setDisbursementDetails(acc.disbursementDetails).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setEmiAmountVariations(acc.emiAmountVariations)
.setMemberVariations(acc.memberVariations).setProduct(acc.product).setInArrears(acc.inArrears)
.setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setOverdueCharges(acc.overdueCharges).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled)
.setInterestRecalculationData(acc.interestRecalculationData).setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement).setPaidInAdvance(acc.paidInAdvance)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed)
.setMinimumGap(acc.minimumGap).setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment).setDelinquent(acc.delinquent)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff)
.setLoanScheduleType(acc.loanScheduleType).setLoanScheduleProcessingType(acc.loanScheduleProcessingType)
.setLoanScheduleTypeOptions(acc.loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(acc.loanScheduleProcessingTypeOptions);
}
public static LoanAccountData loanProductWithTemplateDefaults(final LoanProductData product,
final Collection<EnumOptionData> termFrequencyTypeOptions, final Collection<EnumOptionData> repaymentFrequencyTypeOptions,
final Collection<EnumOptionData> repaymentFrequencyNthDayTypeOptions,
final Collection<EnumOptionData> repaymentFrequencyDayOfWeekTypeOptions,
final Collection<TransactionProcessingStrategyData> repaymentStrategyOptions,
final Collection<EnumOptionData> interestRateFrequencyTypeOptions, final Collection<EnumOptionData> amortizationTypeOptions,
final Collection<EnumOptionData> interestTypeOptions, final Collection<EnumOptionData> interestCalculationPeriodTypeOptions,
final Collection<FundData> fundOptions, final Collection<ChargeData> chargeOptions,
final Collection<CodeValueData> loanPurposeOptions, final Collection<CodeValueData> loanCollateralOptions,
final Integer loanCycleNumber, final Collection<LoanAccountSummaryData> clientActiveLoanOptions,
final List<EnumOptionData> loanScheduleTypeOptions, final List<EnumOptionData> loanScheduleProcessingTypeOptions) {
final EnumOptionData termPeriodFrequencyType = product.getRepaymentFrequencyType(); final EnumOptionData termPeriodFrequencyType = product.getRepaymentFrequencyType();
@@ -538,8 +386,7 @@ public class LoanAccountData {
numberOfRepayments = product.getNumberOfRepayments(); numberOfRepayments = product.getNumberOfRepayments();
} }
return new LoanAccountData().setProductId(product.getId()).setLoanProductName(product.getName()) return this.setProductId(product.getId()).setLoanProductName(product.getName()).setLoanProductDescription(product.getDescription())
.setLoanProductDescription(product.getDescription())
.setLoanProductLinkedToFloatingRate(product.isLinkedToFloatingInterestRates()).setFundId(product.getFundId()) .setLoanProductLinkedToFloatingRate(product.isLinkedToFloatingInterestRates()).setFundId(product.getFundId())
.setFundName(product.getFundName()).setCurrency(product.getCurrency()).setProposedPrincipal(proposedPrincipal) .setFundName(product.getFundName()).setCurrency(product.getCurrency()).setProposedPrincipal(proposedPrincipal)
.setPrincipal(principal).setApprovedPrincipal(principal).setNetDisbursalAmount(netDisbursalAmount) .setPrincipal(principal).setApprovedPrincipal(principal).setNetDisbursalAmount(netDisbursalAmount)
@@ -557,15 +404,7 @@ public class LoanAccountData {
.setRecurringMoratoriumOnPrincipalPeriods(product.getRecurringMoratoriumOnPrincipalPeriods()) .setRecurringMoratoriumOnPrincipalPeriods(product.getRecurringMoratoriumOnPrincipalPeriods())
.setGraceOnInterestPayment(product.getGraceOnInterestPayment()) .setGraceOnInterestPayment(product.getGraceOnInterestPayment())
.setGraceOnInterestCharged(product.getGraceOnInterestCharged()).setCharges(charges) .setGraceOnInterestCharged(product.getGraceOnInterestCharged()).setCharges(charges)
.setTermFrequencyTypeOptions(termFrequencyTypeOptions).setRepaymentFrequencyTypeOptions(repaymentFrequencyTypeOptions) .setMultiDisburseLoan(product.getMultiDisburseLoan()).setCanDefineInstallmentAmount(product.isCanDefineInstallmentAmount())
.setRepaymentFrequencyDaysOfWeekTypeOptions(repaymentFrequencyDayOfWeekTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(repaymentFrequencyNthDayTypeOptions)
.setTransactionProcessingStrategyOptions(repaymentStrategyOptions)
.setInterestRateFrequencyTypeOptions(interestRateFrequencyTypeOptions).setAmortizationTypeOptions(amortizationTypeOptions)
.setInterestTypeOptions(interestTypeOptions).setInterestCalculationPeriodTypeOptions(interestCalculationPeriodTypeOptions)
.setFundOptions(fundOptions).setChargeOptions(chargeOptions).setLoanPurposeOptions(loanPurposeOptions)
.setLoanCollateralOptions(loanCollateralOptions).setMultiDisburseLoan(product.getMultiDisburseLoan())
.setCanDefineInstallmentAmount(product.isCanDefineInstallmentAmount())
.setMaxOutstandingLoanBalance(product.getOutstandingLoanBalance()).setProduct(product) .setMaxOutstandingLoanBalance(product.getOutstandingLoanBalance()).setProduct(product)
.setGraceOnArrearsAgeing(product.getGraceOnArrearsAgeing()).setOverdueCharges(product.overdueFeeCharges()) .setGraceOnArrearsAgeing(product.getGraceOnArrearsAgeing()).setOverdueCharges(product.overdueFeeCharges())
.setDaysInMonthType(product.getDaysInMonthType()).setDaysInYearType(product.getDaysInYearType()) .setDaysInMonthType(product.getDaysInMonthType()).setDaysInYearType(product.getDaysInYearType())
@@ -573,79 +412,10 @@ public class LoanAccountData {
.setInterestRecalculationData(product.toLoanInterestRecalculationData()) .setInterestRecalculationData(product.toLoanInterestRecalculationData())
.setIsVariableInstallmentsAllowed(product.isAllowVariableInstallments()).setMinimumGap(product.getMinimumGap()) .setIsVariableInstallmentsAllowed(product.isAllowVariableInstallments()).setMinimumGap(product.getMinimumGap())
.setMaximumGap(product.getMaximumGap()).setTopup(product.isCanUseForTopup()) .setMaximumGap(product.getMaximumGap()).setTopup(product.isCanUseForTopup())
.setClientActiveLoanOptions(clientActiveLoanOptions).setIsEqualAmortization(product.isEqualAmortization()) .setIsEqualAmortization(product.isEqualAmortization())
.setFixedPrincipalPercentagePerInstallment(product.getFixedPrincipalPercentagePerInstallment()) .setFixedPrincipalPercentagePerInstallment(product.getFixedPrincipalPercentagePerInstallment())
.setDelinquent(CollectionData.template()).setDisallowExpectedDisbursements(product.getDisallowExpectedDisbursements()) .setDelinquent(CollectionData.template()).setDisallowExpectedDisbursements(product.getDisallowExpectedDisbursements())
.setLoanScheduleType(product.getLoanScheduleType()).setLoanScheduleProcessingType(product.getLoanScheduleProcessingType()) .setLoanScheduleType(product.getLoanScheduleType()).setLoanScheduleProcessingType(product.getLoanScheduleProcessingType());
.setLoanScheduleTypeOptions(loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(loanScheduleProcessingTypeOptions);
}
public static LoanAccountData populateLoanProductDefaults(final LoanAccountData acc, final LoanProductData product) {
final Integer termFrequency = product.getNumberOfRepayments() * product.getRepaymentEvery();
final EnumOptionData termPeriodFrequencyType = product.getRepaymentFrequencyType();
final Collection<LoanChargeData> charges = new ArrayList<LoanChargeData>();
for (final ChargeData charge : product.charges()) {
charges.add(ConvertChargeDataToSpecificChargeData.toLoanChargeData(charge));
}
BigDecimal netDisbursalAmount = product.getPrincipal();
if (!charges.isEmpty()) {
for (LoanChargeData charge : charges) {
netDisbursalAmount = netDisbursalAmount.subtract(charge.getAmount());
}
}
final CollectionData delinquent = CollectionData.template();
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId)
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName)
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(acc.group)
.setLoanType(acc.loanType).setId(product.getId()).setLoanProductName(product.getName())
.setLoanProductDescription(product.getDescription())
.setLoanProductLinkedToFloatingRate(product.isLinkedToFloatingInterestRates()).setFundId(product.getFundId())
.setFundName(product.getFundName()).setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName)
.setLoanOfficerId(acc.loanOfficerId).setLoanOfficerName(acc.loanOfficerName).setCurrency(product.getCurrency())
.setPrincipal(product.getPrincipal()).setPrincipal(product.getPrincipal()).setPrincipal(product.getPrincipal())
.setNetDisbursalAmount(netDisbursalAmount).setTotalOverpaid(acc.totalOverpaid)
.setInArrearsTolerance(product.getInArrearsTolerance()).setTermFrequency(termFrequency)
.setTermPeriodFrequencyType(termPeriodFrequencyType).setNumberOfRepayments(product.getNumberOfRepayments())
.setRepaymentEvery(product.getRepaymentEvery()).setRepaymentFrequencyType(product.getRepaymentFrequencyType())
.setTransactionProcessingStrategyCode(product.getTransactionProcessingStrategyCode())
.setTransactionProcessingStrategyName(product.getTransactionProcessingStrategyName())
.setAmortizationType(product.getAmortizationType()).setInterestRatePerPeriod(product.getInterestRatePerPeriod())
.setInterestRateFrequencyType(product.getInterestRateFrequencyType()).setAnnualInterestRate(product.getAnnualInterestRate())
.setInterestType(product.getInterestType()).setFloatingInterestRate(product.isFloatingInterestRateCalculationAllowed())
.setInterestRateDifferential(product.getDefaultDifferentialLendingRate())
.setInterestCalculationPeriodType(product.getInterestCalculationPeriodType())
.setAllowPartialPeriodInterestCalculation(product.isAllowPartialPeriodInterestCalculation())
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate)
.setGraceOnPrincipalPayment(product.getGraceOnPrincipalPayment())
.setRecurringMoratoriumOnPrincipalPeriods(product.getRecurringMoratoriumOnPrincipalPeriods())
.setGraceOnInterestPayment(product.getGraceOnInterestPayment())
.setGraceOnInterestCharged(product.getGraceOnInterestCharged()).setInterestChargedFromDate(acc.interestChargedFromDate)
.setTimeline(acc.timeline).setSummary(acc.summary).setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged)
.setCharges(charges).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting).setLoanCounter(acc.loanCounter)
.setLoanProductCounter(acc.loanProductCounter).setAccountLinkingOptions(acc.accountLinkingOptions)
.setLinkedAccount(acc.linkedAccount).setDisbursementDetails(acc.disbursementDetails)
.setMultiDisburseLoan(product.getMultiDisburseLoan()).setCanDefineInstallmentAmount(product.isCanDefineInstallmentAmount())
.setFixedEmiAmount(acc.fixedEmiAmount).setMaxOutstandingLoanBalance(product.getOutstandingLoanBalance())
.setEmiAmountVariations(acc.emiAmountVariations).setMemberVariations(acc.memberVariations).setProduct(product)
.setInArrears(acc.inArrears).setGraceOnArrearsAgeing(product.getGraceOnArrearsAgeing())
.setOverdueCharges(product.overdueFeeCharges()).setIsNPA(acc.isNPA).setDaysInMonthType(product.getDaysInMonthType())
.setDaysInYearType(product.getDaysInYearType()).setInterestRecalculationEnabled(product.isInterestRecalculationEnabled())
.setInterestRecalculationData(product.toLoanInterestRecalculationData()).setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(product.isAllowVariableInstallments())
.setMinimumGap(product.getMinimumGap()).setMaximumGap(product.getMaximumGap()).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(product.isEqualAmortization()).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(product.getFixedPrincipalPercentagePerInstallment()).setDelinquent(delinquent)
.setDisallowExpectedDisbursements(product.getDisallowExpectedDisbursements()).setFraud(acc.fraud)
.setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff).setLoanScheduleType(acc.getLoanScheduleType())
.setLoanScheduleProcessingType(acc.getLoanScheduleProcessingType()).setFixedLength(product.getFixedLength());
} }
/* /*
@@ -732,7 +502,7 @@ public class LoanAccountData {
/* /*
* Used to combine the associations and template data on top of exist loan account data * Used to combine the associations and template data on top of exist loan account data
*/ */
public static LoanAccountData associationsAndTemplate(final LoanAccountData acc, final LoanScheduleData repaymentSchedule, public LoanAccountData associationsAndTemplate(final LoanScheduleData repaymentSchedule,
final Collection<LoanTransactionData> transactions, final Collection<LoanChargeData> charges, final Collection<LoanTransactionData> transactions, final Collection<LoanChargeData> charges,
final Collection<LoanCollateralManagementData> collateral, final Collection<GuarantorData> guarantors, final Collection<LoanCollateralManagementData> collateral, final Collection<GuarantorData> guarantors,
final CalendarData calendarData, final Collection<LoanProductData> productOptions, final CalendarData calendarData, final Collection<LoanProductData> productOptions,
@@ -755,34 +525,8 @@ public class LoanAccountData {
// TODO: why are these variables 'calendarData', 'chargeTemplate' never used (see original private constructor) // TODO: why are these variables 'calendarData', 'chargeTemplate' never used (see original private constructor)
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId) return this.setRepaymentSchedule(repaymentSchedule).setTransactions(transactions).setCharges(charges).setCollateral(collateral)
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName) .setGuarantors(guarantors).setProductOptions(productOptions).setTermFrequencyTypeOptions(termFrequencyTypeOptions)
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(acc.group)
.setLoanType(acc.loanType).setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType).setFixedLength(acc.fixedLength)
.setRepaymentFrequencyNthDayType(acc.repaymentFrequencyNthDayType)
.setRepaymentFrequencyDayOfWeekType(acc.repaymentFrequencyDayOfWeekType)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(acc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(repaymentSchedule)
.setTransactions(transactions).setCharges(charges).setCollateral(collateral).setGuarantors(guarantors)
.setProductOptions(productOptions).setTermFrequencyTypeOptions(termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(repaymentFrequencyTypeOptions) .setRepaymentFrequencyTypeOptions(repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(repaymentFrequencyNthDayTypeOptions) .setRepaymentFrequencyNthDayTypeOptions(repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(repaymentFrequencyDayOfWeekTypeOptions) .setRepaymentFrequencyDaysOfWeekTypeOptions(repaymentFrequencyDayOfWeekTypeOptions)
@@ -792,128 +536,38 @@ public class LoanAccountData {
.setFundOptions(fundOptions).setChargeOptions(chargeOptions).setLoanOfficerOptions(loanOfficerOptions) .setFundOptions(fundOptions).setChargeOptions(chargeOptions).setLoanOfficerOptions(loanOfficerOptions)
.setLoanPurposeOptions(loanPurposeOptions).setLoanCollateralOptions(loanCollateralOptions) .setLoanPurposeOptions(loanPurposeOptions).setLoanCollateralOptions(loanCollateralOptions)
// .setMeeting(calendarData) // .setMeeting(calendarData)
.setCalendarOptions(calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting) .setCalendarOptions(calendarOptions).setNotes(notes).setAccountLinkingOptions(accountLinkingOptions)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(notes) .setLinkedAccount(linkedAccount).setDisbursementDetails(disbursementDetails).setEmiAmountVariations(emiAmountVariations)
.setAccountLinkingOptions(accountLinkingOptions).setLinkedAccount(linkedAccount).setDisbursementDetails(disbursementDetails) .setOverdueCharges(overdueCharges).setPaidInAdvance(paidInAdvance).setInterestRatesPeriods(interestRatesPeriods)
.setEmiAmountVariations(emiAmountVariations).setOverdueCharges(overdueCharges).setPaidInAdvance(paidInAdvance) .setClientActiveLoanOptions(clientActiveLoanOptions).setRates(rates).setIsRatesEnabled(isRatesEnabled)
.setInterestRatesPeriods(interestRatesPeriods).setClientActiveLoanOptions(clientActiveLoanOptions).setRates(rates) .setDelinquent(delinquent).setLoanScheduleTypeOptions(loanScheduleTypeOptions)
.setIsRatesEnabled(isRatesEnabled).setDelinquent(delinquent).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setMemberVariations(acc.memberVariations)
.setProduct(acc.product).setInArrears(acc.inArrears).setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled)
.setInterestRecalculationData(acc.interestRecalculationData).setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement)
.setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed).setMinimumGap(acc.minimumGap)
.setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus).setCanUseForTopup(acc.canUseForTopup).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setLastClosedBusinessDate(acc.getLastClosedBusinessDate()).setOverpaidOnDate(acc.overpaidOnDate)
.setChargedOff(acc.chargedOff).setEnableDownPayment(acc.enableDownPayment)
.setDisbursedAmountPercentageForDownPayment(acc.disbursedAmountPercentageForDownPayment)
.setEnableAutoRepaymentForDownPayment(acc.enableAutoRepaymentForDownPayment)
.setEnableInstallmentLevelDelinquency(acc.enableInstallmentLevelDelinquency).setLoanScheduleType(acc.loanScheduleType)
.setLoanScheduleProcessingType(acc.loanScheduleProcessingType).setLoanScheduleTypeOptions(loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(loanScheduleProcessingTypeOptions); .setLoanScheduleProcessingTypeOptions(loanScheduleProcessingTypeOptions);
} }
public static LoanAccountData associationsAndTemplate(final LoanAccountData acc, final Collection<LoanProductData> productOptions, public LoanAccountData associationsAndTemplate(final Collection<LoanProductData> productOptions,
final Collection<StaffData> allowedLoanOfficers, final Collection<CalendarData> calendarOptions, final Collection<StaffData> allowedLoanOfficers, final Collection<CalendarData> calendarOptions,
final Collection<PortfolioAccountData> accountLinkingOptions, final Boolean isRatesEnabled) { final Collection<PortfolioAccountData> accountLinkingOptions, final Boolean isRatesEnabled) {
return this.setProductOptions(productOptions) //
return associationsAndTemplate(acc, acc.repaymentSchedule, acc.transactions, acc.charges, acc.collateral, acc.guarantors, .setLoanOfficerOptions(allowedLoanOfficers) //
acc.meeting, productOptions, acc.termFrequencyTypeOptions, acc.repaymentFrequencyTypeOptions, .setCalendarOptions(calendarOptions) //
acc.repaymentFrequencyNthDayTypeOptions, acc.repaymentFrequencyDaysOfWeekTypeOptions, .setAccountLinkingOptions(accountLinkingOptions) //
acc.transactionProcessingStrategyOptions, acc.interestRateFrequencyTypeOptions, acc.amortizationTypeOptions, .setIsRatesEnabled(isRatesEnabled); //
acc.interestTypeOptions, acc.interestCalculationPeriodTypeOptions, acc.fundOptions, acc.chargeOptions, null,
allowedLoanOfficers, acc.loanPurposeOptions, acc.loanCollateralOptions, calendarOptions, acc.notes, accountLinkingOptions,
acc.linkedAccount, acc.disbursementDetails, acc.emiAmountVariations, acc.overdueCharges, acc.paidInAdvance,
acc.interestRatesPeriods, acc.clientActiveLoanOptions, acc.rates, isRatesEnabled, acc.delinquent,
acc.loanScheduleTypeOptions, acc.loanScheduleProcessingTypeOptions);
} }
public static LoanAccountData associateGroup(final LoanAccountData acc, final GroupGeneralData group) { public LoanAccountData associateMemberVariations(final Map<Long, Integer> memberLoanCycle) {
final Map<Long, LoanBorrowerCycleData> memberVariations = new HashMap<>();
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId)
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName)
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(group).setLoanType(acc.loanType)
.setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType)
.setRepaymentFrequencyNthDayType(acc.repaymentFrequencyNthDayType)
.setRepaymentFrequencyDayOfWeekType(acc.repaymentFrequencyDayOfWeekType).setFixedLength(acc.fixedLength)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(acc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(acc.repaymentSchedule)
.setTransactions(acc.transactions).setCharges(acc.charges).setCollateral(acc.collateral).setGuarantors(acc.guarantors)
.setMeeting(acc.meeting).setProductOptions(acc.productOptions).setTermFrequencyTypeOptions(acc.termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(acc.repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(acc.repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(acc.repaymentFrequencyDaysOfWeekTypeOptions)
.setTransactionProcessingStrategyOptions(acc.transactionProcessingStrategyOptions)
.setInterestRateFrequencyTypeOptions(acc.interestRateFrequencyTypeOptions)
.setAmortizationTypeOptions(acc.amortizationTypeOptions).setInterestTypeOptions(acc.interestTypeOptions)
.setInterestCalculationPeriodTypeOptions(acc.interestCalculationPeriodTypeOptions).setFundOptions(acc.fundOptions)
.setChargeOptions(acc.chargeOptions).setLoanOfficerOptions(acc.loanOfficerOptions)
.setLoanPurposeOptions(acc.loanPurposeOptions).setLoanCollateralOptions(acc.loanCollateralOptions)
.setCalendarOptions(acc.calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(acc.notes)
.setAccountLinkingOptions(acc.accountLinkingOptions).setLinkedAccount(acc.linkedAccount)
.setDisbursementDetails(acc.disbursementDetails).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setEmiAmountVariations(acc.emiAmountVariations)
.setMemberVariations(acc.memberVariations).setProduct(acc.product).setInArrears(acc.inArrears)
.setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setOverdueCharges(acc.overdueCharges).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled)
.setInterestRecalculationData(acc.interestRecalculationData).setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement).setPaidInAdvance(acc.paidInAdvance)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed)
.setMinimumGap(acc.minimumGap).setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment).setDelinquent(acc.delinquent)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff)
.setEnableInstallmentLevelDelinquency(acc.enableInstallmentLevelDelinquency).setLoanScheduleType(acc.loanScheduleType)
.setLoanScheduleProcessingType(acc.loanScheduleProcessingType).setLoanScheduleTypeOptions(acc.loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(acc.loanScheduleProcessingTypeOptions);
}
public static LoanAccountData associateMemberVariations(final LoanAccountData acc, final Map<Long, Integer> memberLoanCycle) {
final Map<Long, LoanBorrowerCycleData> memberVariations = new HashMap<Long, LoanBorrowerCycleData>();
for (Map.Entry<Long, Integer> mapEntry : memberLoanCycle.entrySet()) { for (Map.Entry<Long, Integer> mapEntry : memberLoanCycle.entrySet()) {
BigDecimal principal = null; BigDecimal principal = null;
BigDecimal interestRatePerPeriod = null; BigDecimal interestRatePerPeriod = null;
Integer numberOfRepayments = null; Integer numberOfRepayments = null;
Long clientId = mapEntry.getKey(); Long clientId = mapEntry.getKey();
Integer loanCycleNumber = mapEntry.getValue(); Integer loanCycleNumber = mapEntry.getValue();
if (acc.product.isUseBorrowerCycle() && loanCycleNumber != null && loanCycleNumber > 0) { if (product.isUseBorrowerCycle() && loanCycleNumber != null && loanCycleNumber > 0) {
Collection<LoanProductBorrowerCycleVariationData> principalVariationsForBorrowerCycle = acc.product Collection<LoanProductBorrowerCycleVariationData> principalVariationsForBorrowerCycle = product
.getPrincipalVariationsForBorrowerCycle(); .getPrincipalVariationsForBorrowerCycle();
Collection<LoanProductBorrowerCycleVariationData> interestForVariationsForBorrowerCycle = acc.product Collection<LoanProductBorrowerCycleVariationData> interestForVariationsForBorrowerCycle = product
.getInterestRateVariationsForBorrowerCycle(); .getInterestRateVariationsForBorrowerCycle();
Collection<LoanProductBorrowerCycleVariationData> repaymentVariationsForBorrowerCycle = acc.product Collection<LoanProductBorrowerCycleVariationData> repaymentVariationsForBorrowerCycle = product
.getNumberOfRepaymentVariationsForBorrowerCycle(); .getNumberOfRepaymentVariationsForBorrowerCycle();
principal = fetchLoanCycleDefaultValue(principalVariationsForBorrowerCycle, loanCycleNumber); principal = fetchLoanCycleDefaultValue(principalVariationsForBorrowerCycle, loanCycleNumber);
interestRatePerPeriod = fetchLoanCycleDefaultValue(interestForVariationsForBorrowerCycle, loanCycleNumber); interestRatePerPeriod = fetchLoanCycleDefaultValue(interestForVariationsForBorrowerCycle, loanCycleNumber);
@@ -923,276 +577,33 @@ public class LoanAccountData {
} }
} }
if (principal == null) { if (principal == null) {
principal = acc.product.getPrincipal(); principal = product.getPrincipal();
} }
if (interestRatePerPeriod == null) { if (interestRatePerPeriod == null) {
interestRatePerPeriod = acc.product.getInterestRatePerPeriod(); interestRatePerPeriod = product.getInterestRatePerPeriod();
} }
if (numberOfRepayments == null) { if (numberOfRepayments == null) {
numberOfRepayments = acc.product.getNumberOfRepayments(); numberOfRepayments = product.getNumberOfRepayments();
} }
final Integer termFrequency = numberOfRepayments * acc.product.getRepaymentEvery(); final Integer termFrequency = numberOfRepayments * product.getRepaymentEvery();
LoanBorrowerCycleData borrowerCycleData = new LoanBorrowerCycleData(principal, interestRatePerPeriod, numberOfRepayments, LoanBorrowerCycleData borrowerCycleData = new LoanBorrowerCycleData(principal, interestRatePerPeriod, numberOfRepayments,
termFrequency); termFrequency);
memberVariations.put(clientId, borrowerCycleData); memberVariations.put(clientId, borrowerCycleData);
} }
return this.setMemberVariations(memberVariations);
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId)
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName)
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(acc.group)
.setLoanType(acc.loanType).setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType)
.setRepaymentFrequencyNthDayType(acc.repaymentFrequencyNthDayType).setFixedLength(acc.fixedLength)
.setRepaymentFrequencyDayOfWeekType(acc.repaymentFrequencyDayOfWeekType)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(acc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(acc.repaymentSchedule)
.setTransactions(acc.transactions).setCharges(acc.charges).setCollateral(acc.collateral).setGuarantors(acc.guarantors)
.setMeeting(acc.meeting).setProductOptions(acc.productOptions).setTermFrequencyTypeOptions(acc.termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(acc.repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(acc.repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(acc.repaymentFrequencyDaysOfWeekTypeOptions)
.setTransactionProcessingStrategyOptions(acc.transactionProcessingStrategyOptions)
.setInterestRateFrequencyTypeOptions(acc.interestRateFrequencyTypeOptions)
.setAmortizationTypeOptions(acc.amortizationTypeOptions).setInterestTypeOptions(acc.interestTypeOptions)
.setInterestCalculationPeriodTypeOptions(acc.interestCalculationPeriodTypeOptions).setFundOptions(acc.fundOptions)
.setChargeOptions(acc.chargeOptions).setLoanOfficerOptions(acc.loanOfficerOptions)
.setLoanPurposeOptions(acc.loanPurposeOptions).setLoanCollateralOptions(acc.loanCollateralOptions)
.setCalendarOptions(acc.calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(acc.notes)
.setAccountLinkingOptions(acc.accountLinkingOptions).setLinkedAccount(acc.linkedAccount)
.setDisbursementDetails(acc.disbursementDetails).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setEmiAmountVariations(acc.emiAmountVariations)
.setMemberVariations(memberVariations).setProduct(acc.product).setInArrears(acc.inArrears)
.setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setOverdueCharges(acc.overdueCharges).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled)
.setInterestRecalculationData(acc.interestRecalculationData).setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement).setPaidInAdvance(acc.paidInAdvance)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed)
.setMinimumGap(acc.minimumGap).setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment).setDelinquent(acc.delinquent)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff)
.setEnableInstallmentLevelDelinquency(acc.enableInstallmentLevelDelinquency).setLoanScheduleType(acc.loanScheduleType)
.setLoanScheduleProcessingType(acc.loanScheduleProcessingType).setLoanScheduleTypeOptions(acc.loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(acc.loanScheduleProcessingTypeOptions);
} }
public static LoanAccountData withInterestRecalculationCalendarData(final LoanAccountData acc, final CalendarData calendarData, public LoanAccountData withInterestRecalculationCalendarData(final CalendarData calendarData,
final CalendarData compoundingCalendarData) { final CalendarData compoundingCalendarData) {
if (interestRecalculationData == null) {
final LoanInterestRecalculationData interestRecalculationData = LoanInterestRecalculationData interestRecalculationData = new LoanInterestRecalculationData();
.withCalendarData(acc.interestRecalculationData, calendarData, compoundingCalendarData); }
final LoanInterestRecalculationData newInterestRecalculationData = interestRecalculationData.withCalendarData(calendarData,
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId) compoundingCalendarData);
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName) return this.setInterestRecalculationData(newInterestRecalculationData);
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(acc.group)
.setLoanType(acc.loanType).setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType)
.setRepaymentFrequencyNthDayType(acc.repaymentFrequencyNthDayType)
.setRepaymentFrequencyDayOfWeekType(acc.repaymentFrequencyDayOfWeekType).setFixedLength(acc.fixedLength)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(acc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(acc.repaymentSchedule)
.setTransactions(acc.transactions).setCharges(acc.charges).setCollateral(acc.collateral).setGuarantors(acc.guarantors)
.setMeeting(acc.meeting).setProductOptions(acc.productOptions).setTermFrequencyTypeOptions(acc.termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(acc.repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(acc.repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(acc.repaymentFrequencyDaysOfWeekTypeOptions)
.setTransactionProcessingStrategyOptions(acc.transactionProcessingStrategyOptions)
.setInterestRateFrequencyTypeOptions(acc.interestRateFrequencyTypeOptions)
.setAmortizationTypeOptions(acc.amortizationTypeOptions).setInterestTypeOptions(acc.interestTypeOptions)
.setInterestCalculationPeriodTypeOptions(acc.interestCalculationPeriodTypeOptions).setFundOptions(acc.fundOptions)
.setChargeOptions(acc.chargeOptions).setLoanOfficerOptions(acc.loanOfficerOptions)
.setLoanPurposeOptions(acc.loanPurposeOptions).setLoanCollateralOptions(acc.loanCollateralOptions)
.setCalendarOptions(acc.calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(acc.notes)
.setAccountLinkingOptions(acc.accountLinkingOptions).setLinkedAccount(acc.linkedAccount)
.setDisbursementDetails(acc.disbursementDetails).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setEmiAmountVariations(acc.emiAmountVariations)
.setMemberVariations(acc.memberVariations).setProduct(acc.product).setInArrears(acc.inArrears)
.setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setOverdueCharges(acc.overdueCharges).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled).setInterestRecalculationData(interestRecalculationData)
.setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement).setPaidInAdvance(acc.paidInAdvance)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed)
.setMinimumGap(acc.minimumGap).setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment).setDelinquent(acc.delinquent)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff)
.setEnableInstallmentLevelDelinquency(acc.enableInstallmentLevelDelinquency).setLoanScheduleType(acc.loanScheduleType)
.setLoanScheduleProcessingType(acc.loanScheduleProcessingType).setLoanScheduleTypeOptions(acc.loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(acc.loanScheduleProcessingTypeOptions);
} }
public static LoanAccountData withLoanCalendarData(final LoanAccountData acc, final CalendarData calendarData) { public static final Comparator<LoanAccountData> LOAN_ACCOUNT_DATA_COMPARATOR_BY_CLIENT_NAME = (loan1, loan2) -> {
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId)
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName)
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(acc.group)
.setLoanType(acc.loanType).setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType).setMeeting(calendarData)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(acc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(acc.repaymentSchedule)
.setTransactions(acc.transactions).setCharges(acc.charges).setCollateral(acc.collateral).setGuarantors(acc.guarantors)
.setMeeting(acc.meeting).setProductOptions(acc.productOptions).setTermFrequencyTypeOptions(acc.termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(acc.repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(acc.repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(acc.repaymentFrequencyDaysOfWeekTypeOptions).setFixedLength(acc.fixedLength)
.setTransactionProcessingStrategyOptions(acc.transactionProcessingStrategyOptions)
.setInterestRateFrequencyTypeOptions(acc.interestRateFrequencyTypeOptions)
.setAmortizationTypeOptions(acc.amortizationTypeOptions).setInterestTypeOptions(acc.interestTypeOptions)
.setInterestCalculationPeriodTypeOptions(acc.interestCalculationPeriodTypeOptions).setFundOptions(acc.fundOptions)
.setChargeOptions(acc.chargeOptions).setLoanOfficerOptions(acc.loanOfficerOptions)
.setLoanPurposeOptions(acc.loanPurposeOptions).setLoanCollateralOptions(acc.loanCollateralOptions)
.setCalendarOptions(acc.calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(acc.notes)
.setAccountLinkingOptions(acc.accountLinkingOptions).setLinkedAccount(acc.linkedAccount)
.setDisbursementDetails(acc.disbursementDetails).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setEmiAmountVariations(acc.emiAmountVariations)
.setMemberVariations(acc.memberVariations).setProduct(acc.product).setInArrears(acc.inArrears)
.setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setOverdueCharges(acc.overdueCharges).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled)
.setInterestRecalculationData(acc.interestRecalculationData).setOriginalSchedule(acc.originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement).setPaidInAdvance(acc.paidInAdvance)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed)
.setMinimumGap(acc.minimumGap).setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment).setDelinquent(acc.delinquent)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff)
.setEnableInstallmentLevelDelinquency(acc.enableInstallmentLevelDelinquency).setLoanScheduleType(acc.loanScheduleType)
.setLoanScheduleProcessingType(acc.loanScheduleProcessingType).setLoanScheduleTypeOptions(acc.loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(acc.loanScheduleProcessingTypeOptions);
}
public static LoanAccountData withOriginalSchedule(final LoanAccountData acc, final LoanScheduleData originalSchedule) {
return new LoanAccountData().setId(acc.id).setAccountNo(acc.accountNo).setStatus(acc.status).setExternalId(acc.externalId)
.setClientId(acc.clientId).setClientAccountNo(acc.clientAccountNo).setClientName(acc.clientName)
.setClientOfficeId(acc.clientOfficeId).setClientExternalId(acc.clientExternalId).setGroup(acc.group)
.setLoanType(acc.loanType).setLoanProductId(acc.loanProductId).setLoanProductName(acc.loanProductName)
.setLoanProductDescription(acc.loanProductDescription)
.setLoanProductLinkedToFloatingRate(acc.isLoanProductLinkedToFloatingRate).setFundId(acc.fundId).setFundName(acc.fundName)
.setLoanPurposeId(acc.loanPurposeId).setLoanPurposeName(acc.loanPurposeName).setLoanOfficerId(acc.loanOfficerId)
.setLoanOfficerName(acc.loanOfficerName).setCurrency(acc.currency).setProposedPrincipal(acc.proposedPrincipal)
.setPrincipal(acc.principal).setApprovedPrincipal(acc.approvedPrincipal).setNetDisbursalAmount(acc.netDisbursalAmount)
.setTotalOverpaid(acc.totalOverpaid).setInArrearsTolerance(acc.inArrearsTolerance).setTermFrequency(acc.termFrequency)
.setTermPeriodFrequencyType(acc.termPeriodFrequencyType).setNumberOfRepayments(acc.numberOfRepayments)
.setRepaymentEvery(acc.repaymentEvery).setRepaymentFrequencyType(acc.repaymentFrequencyType)
.setRepaymentFrequencyNthDayType(acc.repaymentFrequencyNthDayType)
.setRepaymentFrequencyDayOfWeekType(acc.repaymentFrequencyDayOfWeekType).setFixedLength(acc.fixedLength)
.setTransactionProcessingStrategyCode(acc.transactionProcessingStrategyCode)
.setTransactionProcessingStrategyName(acc.transactionProcessingStrategyName).setAmortizationType(acc.amortizationType)
.setInterestRatePerPeriod(acc.interestRatePerPeriod).setInterestRateFrequencyType(acc.interestRateFrequencyType)
.setAnnualInterestRate(acc.annualInterestRate).setInterestType(acc.interestType)
.setFloatingInterestRate(acc.isFloatingInterestRate).setInterestRateDifferential(acc.interestRateDifferential)
.setInterestCalculationPeriodType(acc.interestCalculationPeriodType)
.setAllowPartialPeriodInterestCalculation(acc.allowPartialPeriodInterestCalculation)
.setExpectedFirstRepaymentOnDate(acc.expectedFirstRepaymentOnDate).setGraceOnPrincipalPayment(acc.graceOnPrincipalPayment)
.setRecurringMoratoriumOnPrincipalPeriods(acc.recurringMoratoriumOnPrincipalPeriods)
.setGraceOnInterestPayment(acc.graceOnInterestPayment).setGraceOnInterestCharged(acc.graceOnInterestCharged)
.setInterestChargedFromDate(acc.interestChargedFromDate).setTimeline(acc.timeline).setSummary(acc.summary)
.setFeeChargesAtDisbursementCharged(acc.feeChargesAtDisbursementCharged).setRepaymentSchedule(acc.repaymentSchedule)
.setTransactions(acc.transactions).setCharges(acc.charges).setCollateral(acc.collateral).setGuarantors(acc.guarantors)
.setMeeting(acc.meeting).setProductOptions(acc.productOptions).setTermFrequencyTypeOptions(acc.termFrequencyTypeOptions)
.setRepaymentFrequencyTypeOptions(acc.repaymentFrequencyTypeOptions)
.setRepaymentFrequencyNthDayTypeOptions(acc.repaymentFrequencyNthDayTypeOptions)
.setRepaymentFrequencyDaysOfWeekTypeOptions(acc.repaymentFrequencyDaysOfWeekTypeOptions)
.setTransactionProcessingStrategyOptions(acc.transactionProcessingStrategyOptions)
.setInterestRateFrequencyTypeOptions(acc.interestRateFrequencyTypeOptions)
.setAmortizationTypeOptions(acc.amortizationTypeOptions).setInterestTypeOptions(acc.interestTypeOptions)
.setInterestCalculationPeriodTypeOptions(acc.interestCalculationPeriodTypeOptions).setFundOptions(acc.fundOptions)
.setChargeOptions(acc.chargeOptions).setLoanOfficerOptions(acc.loanOfficerOptions)
.setLoanPurposeOptions(acc.loanPurposeOptions).setLoanCollateralOptions(acc.loanCollateralOptions)
.setCalendarOptions(acc.calendarOptions).setSyncDisbursementWithMeeting(acc.syncDisbursementWithMeeting)
.setLoanCounter(acc.loanCounter).setLoanProductCounter(acc.loanProductCounter).setNotes(acc.notes)
.setAccountLinkingOptions(acc.accountLinkingOptions).setLinkedAccount(acc.linkedAccount)
.setDisbursementDetails(acc.disbursementDetails).setMultiDisburseLoan(acc.multiDisburseLoan)
.setCanDefineInstallmentAmount(acc.canDefineInstallmentAmount).setFixedEmiAmount(acc.fixedEmiAmount)
.setMaxOutstandingLoanBalance(acc.maxOutstandingLoanBalance).setEmiAmountVariations(acc.emiAmountVariations)
.setMemberVariations(acc.memberVariations).setProduct(acc.product).setInArrears(acc.inArrears)
.setGraceOnArrearsAgeing(acc.graceOnArrearsAgeing).setOverdueCharges(acc.overdueCharges).setIsNPA(acc.isNPA)
.setDaysInMonthType(acc.daysInMonthType).setDaysInYearType(acc.daysInYearType)
.setInterestRecalculationEnabled(acc.isInterestRecalculationEnabled)
.setInterestRecalculationData(acc.interestRecalculationData).setOriginalSchedule(originalSchedule)
.setCreateStandingInstructionAtDisbursement(acc.createStandingInstructionAtDisbursement).setPaidInAdvance(acc.paidInAdvance)
.setInterestRatesPeriods(acc.interestRatesPeriods).setIsVariableInstallmentsAllowed(acc.isVariableInstallmentsAllowed)
.setMinimumGap(acc.minimumGap).setMaximumGap(acc.maximumGap).setSubStatus(acc.subStatus)
.setCanUseForTopup(acc.canUseForTopup).setClientActiveLoanOptions(acc.clientActiveLoanOptions).setTopup(acc.isTopup)
.setClosureLoanId(acc.closureLoanId).setClosureLoanAccountNo(acc.closureLoanAccountNo).setTopupAmount(acc.topupAmount)
.setIsEqualAmortization(acc.isEqualAmortization).setRates(acc.rates).setIsRatesEnabled(acc.isRatesEnabled)
.setFixedPrincipalPercentagePerInstallment(acc.fixedPrincipalPercentagePerInstallment).setDelinquent(acc.delinquent)
.setDelinquencyRange(acc.delinquencyRange).setDisallowExpectedDisbursements(acc.disallowExpectedDisbursements)
.setFraud(acc.fraud).setOverpaidOnDate(acc.overpaidOnDate).setChargedOff(acc.chargedOff)
.setEnableInstallmentLevelDelinquency(acc.enableInstallmentLevelDelinquency).setLoanScheduleType(acc.loanScheduleType)
.setLoanScheduleProcessingType(acc.loanScheduleProcessingType).setLoanScheduleTypeOptions(acc.loanScheduleTypeOptions)
.setLoanScheduleProcessingTypeOptions(acc.loanScheduleProcessingTypeOptions);
}
public static final Comparator<LoanAccountData> ClientNameComparator = (loan1, loan2) -> {
String clientOfLoan1 = loan1.getClientName().toUpperCase(Locale.ENGLISH); String clientOfLoan1 = loan1.getClientName().toUpperCase(Locale.ENGLISH);
String clientOfLoan2 = loan2.getClientName().toUpperCase(Locale.ENGLISH); String clientOfLoan2 = loan2.getClientName().toUpperCase(Locale.ENGLISH);
return clientOfLoan1.compareTo(clientOfLoan2); return clientOfLoan1.compareTo(clientOfLoan2);
@@ -74,12 +74,6 @@ public interface LoanReadPlatformService {
LoanAccountData retrieveLoanProductDetailsTemplate(Long productId, Long clientId, Long groupId); LoanAccountData retrieveLoanProductDetailsTemplate(Long productId, Long clientId, Long groupId);
LoanAccountData retrieveClientDetailsTemplate(Long clientId);
LoanAccountData retrieveGroupDetailsTemplate(Long groupId);
LoanAccountData retrieveGroupAndMembersDetailsTemplate(Long groupId);
Collection<CalendarData> retrieveCalendars(Long groupId); Collection<CalendarData> retrieveCalendars(Long groupId);
Page<LoanAccountData> retrieveAll(SearchParameters searchParameters); Page<LoanAccountData> retrieveAll(SearchParameters searchParameters);
@@ -235,9 +235,10 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
@Override @Override
public LoanAccountData fetchRepaymentScheduleData(LoanAccountData accountData) { public LoanAccountData fetchRepaymentScheduleData(LoanAccountData accountData) {
final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = accountData.getTimeline().repaymentScheduleRelatedData( final RepaymentScheduleRelatedLoanData repaymentScheduleRelatedData = new RepaymentScheduleRelatedLoanData(
accountData.getCurrency(), accountData.getPrincipal(), accountData.getApprovedPrincipal(), accountData.getTimeline().getExpectedDisbursementDate(), accountData.getTimeline().getActualDisbursementDate(),
accountData.getInArrearsTolerance(), accountData.getFeeChargesAtDisbursementCharged()); accountData.getCurrency(), accountData.getPrincipal(), accountData.getInArrearsTolerance(),
accountData.getFeeChargesAtDisbursementCharged());
final Collection<DisbursementData> disbursementData = retrieveLoanDisbursementDetails(accountData.getId()); final Collection<DisbursementData> disbursementData = retrieveLoanDisbursementDetails(accountData.getId());
final LoanScheduleData repaymentSchedule = retrieveRepaymentSchedule(accountData.getId(), repaymentScheduleRelatedData, final LoanScheduleData repaymentSchedule = retrieveRepaymentSchedule(accountData.getId(), repaymentScheduleRelatedData,
@@ -384,15 +385,15 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
final ClientData clientAccount = this.clientReadPlatformService.retrieveOne(clientId); final ClientData clientAccount = this.clientReadPlatformService.retrieveOne(clientId);
final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate();
LoanAccountData loanTemplateDetails = LoanAccountData.clientDefaults(clientAccount.getId(), clientAccount.getAccountNo(), LoanAccountData loanDetails = new LoanAccountData().withClientData(clientAccount)
clientAccount.getDisplayName(), clientAccount.getOfficeId(), clientAccount.getExternalId(), expectedDisbursementDate); .setExpectedDisbursementDate(expectedDisbursementDate);
if (productId != null) { if (productId != null) {
final LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); final LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId);
loanTemplateDetails = LoanAccountData.populateLoanProductDefaults(loanTemplateDetails, selectedProduct); loanDetails = loanDetails.withProductData(selectedProduct, null);
} }
return loanTemplateDetails; return loanDetails;
} }
@Override @Override
@@ -402,11 +403,11 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
final GroupGeneralData groupAccount = this.groupReadPlatformService.retrieveOne(groupId); final GroupGeneralData groupAccount = this.groupReadPlatformService.retrieveOne(groupId);
final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate();
LoanAccountData loanDetails = LoanAccountData.groupDefaults(groupAccount, expectedDisbursementDate); LoanAccountData loanDetails = new LoanAccountData().setGroup(groupAccount).withExpectedDisbursementDate(expectedDisbursementDate);
if (productId != null) { if (productId != null) {
final LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); final LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId);
loanDetails = LoanAccountData.populateLoanProductDefaults(loanDetails, selectedProduct); loanDetails = loanDetails.withProductData(selectedProduct, null);
} }
return loanDetails; return loanDetails;
@@ -430,11 +431,11 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
} }
final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate();
LoanAccountData loanDetails = LoanAccountData.groupDefaults(groupAccount, expectedDisbursementDate); LoanAccountData loanDetails = new LoanAccountData().setGroup(groupAccount).withExpectedDisbursementDate(expectedDisbursementDate);
if (productId != null) { if (productId != null) {
final LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId); final LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(productId);
loanDetails = LoanAccountData.populateLoanProductDefaults(loanDetails, selectedProduct); loanDetails = loanDetails.withProductData(selectedProduct, null);
} }
return loanDetails; return loanDetails;
@@ -1521,7 +1522,7 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
.retrieveLoanAmortizationTypeOptions(); .retrieveLoanAmortizationTypeOptions();
Collection<EnumOptionData> interestTypeOptions = null; Collection<EnumOptionData> interestTypeOptions = null;
if (loanProduct.isLinkedToFloatingInterestRates()) { if (loanProduct.isLinkedToFloatingInterestRates()) {
interestTypeOptions = Arrays.asList(interestType(InterestMethod.DECLINING_BALANCE)); interestTypeOptions = List.of(interestType(InterestMethod.DECLINING_BALANCE));
} else { } else {
interestTypeOptions = this.loanDropdownReadPlatformService.retrieveLoanInterestTypeOptions(); interestTypeOptions = this.loanDropdownReadPlatformService.retrieveLoanInterestTypeOptions();
} }
@@ -1558,50 +1559,23 @@ public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, Loa
activeLoanOptions = this.accountDetailsReadPlatformService.retrieveGroupActiveLoanAccountSummary(groupId); activeLoanOptions = this.accountDetailsReadPlatformService.retrieveGroupActiveLoanAccountSummary(groupId);
} }
return LoanAccountData.loanProductWithTemplateDefaults(loanProduct, loanTermFrequencyTypeOptions, repaymentFrequencyTypeOptions, return new LoanAccountData().withProductData(loanProduct, loanCycleCounter) //
repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDaysOfWeekTypeOptions, repaymentStrategyOptions, .setTermFrequencyTypeOptions(loanTermFrequencyTypeOptions) //
interestRateFrequencyTypeOptions, amortizationTypeOptions, interestTypeOptions, interestCalculationPeriodTypeOptions, .setRepaymentFrequencyTypeOptions(repaymentFrequencyTypeOptions) //
fundOptions, chargeOptions, loanPurposeOptions, loanCollateralOptions, loanCycleCounter, activeLoanOptions, .setRepaymentFrequencyNthDayTypeOptions(repaymentFrequencyNthDayTypeOptions) //
LoanScheduleType.getValuesAsEnumOptionDataList(), LoanScheduleProcessingType.getValuesAsEnumOptionDataList()); .setRepaymentFrequencyDaysOfWeekTypeOptions(repaymentFrequencyDaysOfWeekTypeOptions) //
} .setTransactionProcessingStrategyOptions(repaymentStrategyOptions) //
.setInterestRateFrequencyTypeOptions(interestRateFrequencyTypeOptions) //
@Override .setAmortizationTypeOptions(amortizationTypeOptions) //
public LoanAccountData retrieveClientDetailsTemplate(final Long clientId) { .setInterestTypeOptions(interestTypeOptions) //
.setInterestCalculationPeriodTypeOptions(interestCalculationPeriodTypeOptions) //
this.context.authenticatedUser(); .setFundOptions(fundOptions) //
.setChargeOptions(chargeOptions) //
final ClientData clientAccount = this.clientReadPlatformService.retrieveOne(clientId); .setLoanPurposeOptions(loanPurposeOptions) //
final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate(); .setLoanCollateralOptions(loanCollateralOptions) //
.setClientActiveLoanOptions(activeLoanOptions) //
return LoanAccountData.clientDefaults(clientAccount.getId(), clientAccount.getAccountNo(), clientAccount.getDisplayName(), .setLoanScheduleTypeOptions(LoanScheduleType.getValuesAsEnumOptionDataList()) //
clientAccount.getOfficeId(), clientAccount.getExternalId(), expectedDisbursementDate); .setLoanScheduleProcessingTypeOptions(LoanScheduleProcessingType.getValuesAsEnumOptionDataList()); //
}
@Override
public LoanAccountData retrieveGroupDetailsTemplate(final Long groupId) {
this.context.authenticatedUser();
final GroupGeneralData groupAccount = this.groupReadPlatformService.retrieveOne(groupId);
final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate();
return LoanAccountData.groupDefaults(groupAccount, expectedDisbursementDate);
}
@Override
public LoanAccountData retrieveGroupAndMembersDetailsTemplate(final Long groupId) {
GroupGeneralData groupAccount = this.groupReadPlatformService.retrieveOne(groupId);
final LocalDate expectedDisbursementDate = DateUtils.getBusinessLocalDate();
// get group associations
final Collection<ClientData> membersOfGroup = this.clientReadPlatformService.retrieveActiveClientMembersOfGroup(groupId);
if (!CollectionUtils.isEmpty(membersOfGroup)) {
final Collection<ClientData> activeClientMembers = null;
final Collection<CalendarData> calendarsData = null;
final CalendarData collectionMeetingCalendar = null;
final Collection<GroupRoleData> groupRoles = null;
groupAccount = GroupGeneralData.withAssocations(groupAccount, membersOfGroup, activeClientMembers, groupRoles, calendarsData,
collectionMeetingCalendar);
}
return LoanAccountData.groupDefaults(groupAccount, expectedDisbursementDate);
} }
@Override @Override