package org.mifos.accounts.loan.business;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.mifos.accounts.business.AccountPaymentEntity;
import org.mifos.accounts.loan.schedule.domain.Installment;
import org.mifos.accounts.loan.schedule.domain.InstallmentPayment;
import org.mifos.accounts.loan.schedule.domain.Schedule;
import org.mifos.application.master.business.MifosCurrency;
import org.mifos.customers.personnel.business.PersonnelBO;
import org.mifos.framework.util.helpers.Money;
public class ScheduleMapper {
public Schedule mapToSchedule(Collection<LoanScheduleEntity> loanScheduleEntities, Date disbursementDate, Double dailyInterestRate, BigDecimal loanAmount) {
return new Schedule(disbursementDate, dailyInterestRate, loanAmount, mapToInstallments(loanScheduleEntities));
}
public void populateExtraInterestInLoanScheduleEntities(Schedule schedule, Map<Integer, LoanScheduleEntity> loanScheduleEntities) {
for (Installment installment : schedule.getInstallments().values()) {
LoanScheduleEntity loanScheduleEntity = loanScheduleEntities.get(installment.getId());
loanScheduleEntity.setExtraInterest(new Money(loanScheduleEntity.getCurrency(), installment.getExtraInterest()));
}
}
private List<Installment> mapToInstallments(Collection<LoanScheduleEntity> loanScheduleEntities) {
List<Installment> installments = new ArrayList<Installment>();
for (LoanScheduleEntity loanScheduleEntity : loanScheduleEntities) {
installments.add(mapToInstallment(loanScheduleEntity));
}
return installments;
}
private Installment mapToInstallment(LoanScheduleEntity loanScheduleEntity) {
Installment installment = new Installment(loanScheduleEntity.getInstallmentId().intValue(),
loanScheduleEntity.getActionDate(), loanScheduleEntity.getPrincipal().getAmount(),
loanScheduleEntity.getInterest().getAmount(), loanScheduleEntity.getExtraInterest().getAmount(),
loanScheduleEntity.getTotalFees().getAmount(), loanScheduleEntity.getMiscFee().getAmount(),
loanScheduleEntity.getPenalty().getAmount(), loanScheduleEntity.getMiscPenalty().getAmount());
if (loanScheduleEntity.isPaymentApplied()) {
installment.addPayment(getInstallmentPayment(loanScheduleEntity));
}
return installment;
}
private InstallmentPayment getInstallmentPayment(LoanScheduleEntity loanScheduleEntity) {
InstallmentPayment installmentPayment = new InstallmentPayment();
installmentPayment.setPaidDate(loanScheduleEntity.getPaymentDate());
installmentPayment.setPrincipalPaid(loanScheduleEntity.getPrincipalPaid().getAmount());
installmentPayment.setInterestPaid(loanScheduleEntity.getInterestPaid().getAmount());
installmentPayment.setExtraInterestPaid(loanScheduleEntity.getExtraInterestPaid().getAmount());
installmentPayment.setFeesPaid(loanScheduleEntity.getTotalFeesPaid().getAmount());
installmentPayment.setMiscFeesPaid(loanScheduleEntity.getMiscFeePaid().getAmount());
installmentPayment.setPenaltyPaid(loanScheduleEntity.getPenaltyPaid().getAmount());
installmentPayment.setMiscPenaltyPaid(loanScheduleEntity.getMiscPenaltyPaid().getAmount());
return installmentPayment;
}
public void populatePaymentDetails(Schedule schedule, LoanBO loanBO, Date paymentDate, PersonnelBO personnel,
AccountPaymentEntity accountPaymentEntity) {
Map<Integer, Installment> installments = schedule.getInstallments();
MifosCurrency currency = loanBO.getCurrency();
for (LoanScheduleEntity loanScheduleEntity : loanBO.getLoanScheduleEntities()) {
if (loanScheduleEntity.isNotPaid()) {
Installment installment = installments.get(Integer.valueOf(loanScheduleEntity.getInstallmentId()));
Money originalInterest = loanScheduleEntity.getInterest();
Money extraInterestPaid = new Money(currency, installment.getCurrentExtraInterestPaid());
Money interestDueTillPaid = new Money(currency, installment.getCurrentInterestPaid());
loanScheduleEntity.payComponents(installment, currency, paymentDate);
if (loanScheduleEntity.getPaymentAllocation().hasAllocation()) {
LoanTrxnDetailEntity loanTrxnDetailEntity = loanScheduleEntity.updateSummaryAndPerformanceHistory(
accountPaymentEntity, personnel, paymentDate);
loanTrxnDetailEntity.computeAndSetCalculatedInterestOnPayment(originalInterest, extraInterestPaid, interestDueTillPaid);
}
}
}
}
}