in fineract-provider/src/main/java/org/apache/fineract/portfolio/transfer/service/TransferWritePlatformServiceJpaRepositoryImpl.java [360:473]
private void handleClientTransferLifecycleEvent(final Client client, final Office destinationOffice,
final TransferEventType transferEventType, final JsonCommand jsonCommand) {
/** Get destination loan officer if exists **/
Staff staff = null;
Group destinationGroup = null;
final Long staffId = jsonCommand.longValueOfParameterNamed(TransferApiConstants.newStaffIdParamName);
final Long destinationGroupId = jsonCommand.longValueOfParameterNamed(TransferApiConstants.destinationGroupIdParamName);
final LocalDate transferDate = jsonCommand.localDateValueOfParameterNamed(TransferApiConstants.transferDate);
if (staffId != null) {
staff = this.staffRepositoryWrapper.findByOfficeHierarchyWithNotFoundDetection(staffId, destinationOffice.getHierarchy());
}
if (transferEventType.isAcceptance() && destinationGroupId != null) {
destinationGroup = this.groupRepository.findByOfficeWithNotFoundDetection(destinationGroupId, destinationOffice);
}
/*** Handle Active Loans ***/
if (this.loanRepositoryWrapper.doNonClosedLoanAccountsExistForClient(client.getId())) {
// get each individual loan for the client
for (final Loan loan : this.loanRepositoryWrapper.findLoanByClientId(client.getId())) {
/**
* We need to create transactions etc only for loans which are disbursed and not yet closed
**/
if (loan.isDisbursed() && !loan.isClosed()) {
switch (transferEventType) {
case ACCEPTANCE:
this.loanWritePlatformService.acceptLoanTransfer(loan, loan.getLastUserTransactionDate(), destinationOffice,
staff);
break;
case PROPOSAL:
this.loanWritePlatformService.initiateLoanTransfer(loan, transferDate);
break;
case REJECTION:
this.loanWritePlatformService.rejectLoanTransfer(loan);
break;
case WITHDRAWAL:
this.loanWritePlatformService.withdrawLoanTransfer(loan, loan.getLastUserTransactionDate());
}
}
}
}
/*** Handle Active Savings (Currently throw and exception) ***/
if (this.savingsAccountRepositoryWrapper.doNonClosedSavingAccountsExistForClient(client.getId())) {
// get each individual saving account for the client
for (final SavingsAccount savingsAccount : this.savingsAccountRepositoryWrapper.findSavingAccountByClientId(client.getId())) {
if (savingsAccount.isActivated() && !savingsAccount.isClosed()) {
switch (transferEventType) {
case ACCEPTANCE:
this.savingsAccountWritePlatformService.acceptSavingsTransfer(savingsAccount,
savingsAccount.retrieveLastTransactionDate(), destinationOffice, staff);
break;
case PROPOSAL:
this.savingsAccountWritePlatformService.initiateSavingsTransfer(savingsAccount, transferDate);
break;
case REJECTION:
this.savingsAccountWritePlatformService.rejectSavingsTransfer(savingsAccount);
break;
case WITHDRAWAL:
this.savingsAccountWritePlatformService.withdrawSavingsTransfer(savingsAccount,
savingsAccount.retrieveLastTransactionDate());
}
}
}
}
switch (transferEventType) {
case ACCEPTANCE:
client.setStatus(ClientStatus.ACTIVE.getValue());
client.updateTransferToOffice(null);
client.updateOffice(destinationOffice);
client.updateOfficeJoiningDate(client.getProposedTransferDate());
client.updateProposedTransferDate(null);
if (client.getGroups().size() == 1) {
if (destinationGroup == null) {
throw new TransferNotSupportedException(TransferNotSupportedReason.CLIENT_DESTINATION_GROUP_NOT_SPECIFIED,
client.getId());
} else if (!destinationGroup.isActive()) {
throw new GroupNotActiveException(destinationGroup.getId());
}
transferClientBetweenGroups(client.getGroups().iterator().next(), client, destinationGroup, true, staff);
} else if (client.getGroups().size() == 0 && destinationGroup != null) {
client.getGroups().add(destinationGroup);
client.updateStaff(destinationGroup.getStaff());
if (staff != null) {
client.updateStaff(staff);
}
} else if (destinationGroup == null) {
/** for individual with no groups **/
if (staff != null) {
client.updateStaff(staff);
}
}
break;
case PROPOSAL:
client.setStatus(ClientStatus.TRANSFER_IN_PROGRESS.getValue());
client.updateTransferToOffice(destinationOffice);
client.updateProposedTransferDate(transferDate);
break;
case REJECTION:
client.setStatus(ClientStatus.TRANSFER_ON_HOLD.getValue());
client.updateTransferToOffice(null);
client.updateProposedTransferDate(null);
break;
case WITHDRAWAL:
client.setStatus(ClientStatus.ACTIVE.getValue());
client.updateTransferToOffice(null);
client.updateProposedTransferDate(null);
}
this.noteWritePlatformService.createAndPersistClientNote(client, jsonCommand);
this.clientTransferDetailsRepositoryWrapper
.save(ClientTransferDetails.instance(client.getId(), client.getOffice().getId(), destinationOffice.getId(), transferDate,
transferEventType.getValue(), DateUtils.getBusinessLocalDate(), this.context.authenticatedUser().getId()));
}