use of org.mifos.accounts.business.AccountBO in project head by mifos.
the class WebTierAccountServiceFacade method applyHistoricalAdjustment.
@Override
public void applyHistoricalAdjustment(String globalAccountNum, Integer paymentId, String adjustmentNote, Short personnelId, AdjustedPaymentDto adjustedPaymentDto) {
try {
AccountBO accountBO = accountBusinessService.findBySystemId(globalAccountNum);
accountBO.setUserContext(getUserContext());
checkPermissionForAdjustment(accountBO);
PersonnelBO personnelBO = personnelPersistence.findPersonnelById(personnelId);
AccountPaymentEntity accountPaymentEntity = accountBO.findPaymentById(paymentId);
if (accountPaymentEntity == null) {
throw new AccountException(AccountExceptionConstants.CANNOTADJUST);
}
monthClosingServiceFacade.validateTransactionDate(accountPaymentEntity.getPaymentDate());
PaymentDto otherTransferPayment = accountPaymentEntity.getOtherTransferPaymentDto();
//flush to avoid proxy casting problems
transactionHelper.flushAndClearSession();
transactionHelper.startTransaction();
Integer newSavingsPaymentId = null;
if (otherTransferPayment != null) {
SavingsAdjustmentDto savingsAdjustment = new SavingsAdjustmentDto(otherTransferPayment.getAccountId().longValue(), (adjustedPaymentDto == null) ? 0 : Double.valueOf(adjustedPaymentDto.getAmount()), adjustmentNote, otherTransferPayment.getPaymentId(), (adjustedPaymentDto == null) ? otherTransferPayment.getPaymentDate() : new LocalDate(adjustedPaymentDto.getPaymentDate()));
PaymentDto newSavingsPayment = this.savingsServiceFacade.adjustTransaction(savingsAdjustment, true);
newSavingsPaymentId = (newSavingsPayment == null) ? null : newSavingsPayment.getPaymentId();
}
//reload after flush & clear
accountBO = accountBusinessService.findBySystemId(globalAccountNum);
accountBO.setUserContext(getUserContext());
AccountPaymentEntity adjustedPayment = null;
Integer adjustedId;
Stack<PaymentData> paymentsToBeReapplied = new Stack<PaymentData>();
Map<Integer, Stack<PaymentData>> memberPaymentsToBeReappliedMap = new HashMap<Integer, Stack<PaymentData>>();
if (accountBO.isGroupLoanAccount()) {
for (LoanBO memberAccount : ((LoanBO) accountBO).getMemberAccounts()) {
Stack<PaymentData> memberPaymentsToBeReapplied = new Stack<PaymentData>();
memberPaymentsToBeReappliedMap.put(memberAccount.getAccountId(), memberPaymentsToBeReapplied);
}
}
do {
adjustedPayment = accountBO.getLastPmntToBeAdjusted();
if (adjustedPayment == null) {
break;
}
adjustedId = adjustedPayment.getPaymentId();
if (!accountPaymentEntity.getPaymentId().equals(adjustedId)) {
PersonnelBO paymentCreator = (adjustedPayment.getCreatedByUser() == null) ? personnelBO : adjustedPayment.getCreatedByUser();
PaymentData paymentData = accountBO.createPaymentData(adjustedPayment.getAmount(), adjustedPayment.getPaymentDate(), adjustedPayment.getReceiptNumber(), adjustedPayment.getReceiptDate(), adjustedPayment.getPaymentType().getId(), paymentCreator);
paymentData.setOtherTransferPayment(adjustedPayment.getOtherTransferPayment());
paymentsToBeReapplied.push(paymentData);
// handling new Group Loan Members payments
for (AccountPaymentEntity memberAdjustedPayment : adjustedPayment.getMemberPayments()) {
PaymentData memberPaymentData = memberAdjustedPayment.getAccount().createPaymentData(memberAdjustedPayment.getAmount(), adjustedPayment.getPaymentDate(), adjustedPayment.getReceiptNumber(), adjustedPayment.getReceiptDate(), adjustedPayment.getPaymentType().getId(), paymentCreator);
memberPaymentsToBeReappliedMap.get(memberAdjustedPayment.getAccount().getAccountId()).push(memberPaymentData);
}
}
transactionHelper.flushAndClearSession();
//reload after flush & clear
accountBO = accountBusinessService.findBySystemId(globalAccountNum);
accountBO.setUserContext(getUserContext());
accountBO.adjustLastPayment(adjustmentNote, personnelBO);
legacyAccountDao.createOrUpdate(accountBO);
//adjust New Group Loan member payments
if (accountBO.isGroupLoanAccount()) {
for (LoanBO memberAccount : ((LoanBO) accountBO).getMemberAccounts()) {
AccountPaymentEntity memberPayment = memberAccount.getLastPmntToBeAdjusted();
if (memberPayment.getParentPaymentId() == null) {
continue;
}
memberAccount.setUserContext(getUserContext());
memberAccount.adjustLastPayment(adjustmentNote, personnelBO);
legacyAccountDao.createOrUpdate(memberAccount);
}
}
transactionHelper.flushSession();
} while (!accountPaymentEntity.getPaymentId().equals(adjustedId));
if (adjustedPaymentDto != null) {
//reapply adjusted payment
PersonnelBO paymentCreator = (accountPaymentEntity.getCreatedByUser() == null) ? personnelBO : accountPaymentEntity.getCreatedByUser();
Money amount = new Money(accountBO.getCurrency(), adjustedPaymentDto.getAmount());
PaymentData paymentData = accountBO.createPaymentData(amount, adjustedPaymentDto.getPaymentDate(), accountPaymentEntity.getReceiptNumber(), accountPaymentEntity.getReceiptDate(), adjustedPaymentDto.getPaymentType(), paymentCreator);
paymentData.setAdjustment(true);
//new adjusted savings payment must be tied to this payment
if (newSavingsPaymentId != null) {
AccountPaymentEntity newSvngPayment = legacyAccountDao.findPaymentById(newSavingsPaymentId);
paymentData.setOtherTransferPayment(newSvngPayment);
}
accountBO.applyPayment(paymentData);
legacyAccountDao.createOrUpdate(accountBO);
transactionHelper.flushSession();
// handling new Group Loan Members payments
if (accountBO.isGroupLoanAccount()) {
for (AdjustedPaymentDto adjustedMemberPayment : adjustedPaymentDto.getMemberPayments()) {
AccountBO memberAccount = ((LoanBO) accountBO).findMemberById(adjustedMemberPayment.getAccountId());
BigDecimal adjustedMemberPaymentAmount = BigDecimal.ZERO;
if (!StringUtils.isBlank(adjustedMemberPayment.getAmount())) {
adjustedMemberPaymentAmount = new BigDecimal(adjustedMemberPayment.getAmount());
}
Money memberAmount = new Money(memberAccount.getCurrency(), adjustedMemberPaymentAmount.toString());
PaymentData memberPaymentData = memberAccount.createPaymentData(memberAmount, adjustedPaymentDto.getPaymentDate(), accountPaymentEntity.getReceiptNumber(), accountPaymentEntity.getReceiptDate(), adjustedPaymentDto.getPaymentType(), paymentCreator);
memberPaymentData.setParentPayment(accountBO.getLastPmnt());
memberAccount.applyPayment(memberPaymentData);
legacyAccountDao.createOrUpdate(memberAccount);
}
}
}
while (!paymentsToBeReapplied.isEmpty()) {
PaymentData paymentData = paymentsToBeReapplied.pop();
//avoid lazy loading exception
if (paymentData.getOtherTransferPayment() != null) {
legacyAccountDao.updatePayment(paymentData.getOtherTransferPayment());
}
accountBO.applyPayment(paymentData);
legacyAccountDao.createOrUpdate(accountBO);
transactionHelper.flushSession();
if (accountBO.isGroupLoanAccount()) {
for (LoanBO memberAccount : ((LoanBO) accountBO).getMemberAccounts()) {
PaymentData memberPaymentData = memberPaymentsToBeReappliedMap.get(memberAccount.getAccountId()).pop();
memberPaymentData.setParentPayment(accountBO.getLastPmnt());
memberAccount.applyPayment(memberPaymentData);
legacyAccountDao.createOrUpdate(memberAccount);
}
}
}
transactionHelper.commitTransaction();
} catch (ServiceException e) {
transactionHelper.rollbackTransaction();
throw new MifosRuntimeException(e);
} catch (AccountException e) {
transactionHelper.rollbackTransaction();
throw new MifosRuntimeException(e);
} catch (PersistenceException e) {
transactionHelper.rollbackTransaction();
throw new MifosRuntimeException(e);
} catch (RuntimeException e) {
transactionHelper.rollbackTransaction();
throw new MifosRuntimeException(e);
} finally {
transactionHelper.closeSession();
}
}
use of org.mifos.accounts.business.AccountBO in project head by mifos.
the class WebTierAccountServiceFacade method getApplicableFees.
@Override
public List<ApplicableCharge> getApplicableFees(Integer accountId) {
try {
MifosUser user = (MifosUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserContext userContext = toUserContext(user);
AccountBO account = this.accountBusinessService.getAccount(accountId);
try {
personnelDao.checkAccessPermission(userContext, account.getOfficeId(), account.getCustomer().getLoanOfficerId());
} catch (AccountException e) {
throw new MifosRuntimeException(e.getMessage(), e);
}
return new AccountBusinessService().getAppllicableFees(accountId, userContext);
} catch (ServiceException e) {
throw new MifosRuntimeException(e);
}
}
use of org.mifos.accounts.business.AccountBO in project head by mifos.
the class WebTierAccountServiceFacade method isPaymentPermitted.
@Override
public boolean isPaymentPermitted(Integer accountId) {
MifosUser user = (MifosUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserContext userContext = toUserContext(user);
try {
AccountBO account = new AccountBusinessService().getAccount(accountId);
CustomerLevel customerLevel = null;
if (account.getType().equals(AccountTypes.CUSTOMER_ACCOUNT)) {
customerLevel = account.getCustomer().getLevel();
}
Short personnelId = userContext.getId();
if (account.getPersonnel() != null) {
personnelId = account.getPersonnel().getPersonnelId();
}
return ActivityMapper.getInstance().isPaymentPermittedForAccounts(account.getType(), customerLevel, userContext, account.getOffice().getOfficeId(), personnelId);
} catch (ServiceException e) {
throw new MifosRuntimeException(e);
}
}
use of org.mifos.accounts.business.AccountBO in project head by mifos.
the class WebTierAccountServiceFacade method applyAdjustment.
@Override
public void applyAdjustment(String globalAccountNum, String adjustmentNote, Short loggedInUser) {
try {
AccountBO account = accountBusinessService.findBySystemId(globalAccountNum);
AccountPaymentEntity lastPayment = account.getLastPmntToBeAdjusted();
applyHistoricalAdjustment(globalAccountNum, (lastPayment == null) ? null : lastPayment.getPaymentId(), adjustmentNote, loggedInUser, null);
} catch (ServiceException e) {
throw new MifosRuntimeException(e);
}
}
use of org.mifos.accounts.business.AccountBO in project head by mifos.
the class CustomerDaoHibernate method findGLIMLoanAccountsApplicableTo.
@SuppressWarnings("unchecked")
@Override
public List<AccountBO> findGLIMLoanAccountsApplicableTo(final Integer customerId, final Integer customerWithActiveAccount) {
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("CUSTOMER_ID", customerId);
List<LoanBO> queryResult = (List<LoanBO>) this.genericDao.executeNamedQuery("findGLIMLoanAccountsByCustomerId", queryParameters);
List<AccountBO> matchingAccounts = new ArrayList<AccountBO>();
for (LoanBO loanAccount : queryResult) {
LoanBO parentAccount = loanAccount.getParentAccount();
if (parentAccount.getCustomer().getCustomerId().equals(customerWithActiveAccount)) {
matchingAccounts.add(loanAccount);
}
}
return matchingAccounts;
}
Aggregations