package org.mifos.application.util.helpers;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.mifos.accounts.loan.business.service.OriginalScheduleInfoDto;
import org.mifos.accounts.loan.util.helpers.RepaymentScheduleInstallment;
import org.mifos.dto.domain.RepaymentScheduleInstallmentDto;
import org.mifos.framework.util.helpers.DateUtils;
import org.mifos.framework.util.helpers.Money;
public class OriginalScheduleInfoHelper {
public static OriginalScheduleInfoDto domainScheduletoBusinessDto(org.mifos.dto.domain.OriginalScheduleInfoDto domainSchedule) throws ParseException {
return new OriginalScheduleInfoDto(domainSchedule.getLoanAmount(), domainSchedule.getDisbursementDate(),
generateRepaymentScheduleInstallmentFromDto(domainSchedule.getOriginalLoanScheduleInstallments()));
}
public static org.mifos.dto.domain.OriginalScheduleInfoDto businessScheduleToDomainDto(OriginalScheduleInfoDto originalBusinessSchedule) {
return new org.mifos.dto.domain.OriginalScheduleInfoDto(originalBusinessSchedule.getLoanAmount(), originalBusinessSchedule.getDisbursementDate(),
generateRepaymentScheduleInstallmentToDto(originalBusinessSchedule.getOriginalLoanScheduleInstallment()));
}
public static List<RepaymentScheduleInstallment> generateRepaymentScheduleInstallmentFromDto(List<RepaymentScheduleInstallmentDto> repaymentScheduleDto) throws ParseException {
List<RepaymentScheduleInstallment> repaymentScheduleInstallment = new ArrayList<RepaymentScheduleInstallment>();
for (RepaymentScheduleInstallmentDto element : repaymentScheduleDto) {
repaymentScheduleInstallment.add(new RepaymentScheduleInstallment(element.getInstallment(), DateUtils.parseDate(element.getDueDate()), stringToMony(element.getPrincipal()),
stringToMony(element.getInterest()), stringToMony(element.getFees()), stringToMony(element.getMiscFees()), stringToMony(element.getMiscPenalty())));
}
return repaymentScheduleInstallment;
}
private static Money stringToMony(String amount){
return new Money(Money.getDefaultCurrency(), amount);
}
public static List<RepaymentScheduleInstallmentDto> generateRepaymentScheduleInstallmentToDto(List<RepaymentScheduleInstallment> repaymentScheduleInstallment) {
List<RepaymentScheduleInstallmentDto> repaymentDto = new ArrayList<RepaymentScheduleInstallmentDto>();
for (RepaymentScheduleInstallment instalment : repaymentScheduleInstallment) {
repaymentDto.add(new RepaymentScheduleInstallmentDto(instalment.getInstallment(), instalment.getPrincipal().toString(),
instalment.getInterest().toString(), instalment.getFees().toString(), instalment.getMiscFees().toString(),
instalment.getFeesWithMiscFee().toString(), instalment.getMiscPenalty().toString(), instalment.getTotal(), instalment.getDueDate()));
}
return repaymentDto;
}
public static OriginalScheduleInfoDto sumRepaymentSchedule(List<OriginalScheduleInfoDto> originalScheduleInfoDtos) {
Money sumAmount = new Money(Money.getDefaultCurrency(), new Double(0.0));
Date disburseDate = null;
List<RepaymentScheduleInstallment> newRepayments = new ArrayList<RepaymentScheduleInstallment>();
RepaymentScheduleInstallment sumRepayment = new RepaymentScheduleInstallment();
for (OriginalScheduleInfoDto dto : originalScheduleInfoDtos) {
sumRepayment = sumRepayment.init();
Money dtoAmount = new Money(Money.getDefaultCurrency(), new Double(dto.getLoanAmount()));
sumAmount = sumAmount.add(dtoAmount);
for (RepaymentScheduleInstallment scheduleInstallment : dto.getOriginalLoanScheduleInstallment()) {
sumRepayment.setFees(sumRepayment.getFees().add(scheduleInstallment.getFees()));
sumRepayment.setMiscFees(sumRepayment.getMiscFees().add(scheduleInstallment.getMiscFees()));
sumRepayment.setMiscPenalty(sumRepayment.getMiscPenalty().add(scheduleInstallment.getMiscPenalty()));
sumRepayment.setPrincipal(sumRepayment.getPrincipal().add(scheduleInstallment.getPrincipal()));
sumRepayment.setInterest(sumRepayment.getInterest().add(scheduleInstallment.getInterest()));
sumRepayment.setTotalAndTotalValue(sumRepayment.getTotalValue().add(scheduleInstallment.getTotalValue()));
sumRepayment.setDueDate(scheduleInstallment.getDueDate());
}
newRepayments.add(sumRepayment);
if (null == disburseDate) {
disburseDate = dto.getDisbursementDate();
}
}
return new OriginalScheduleInfoDto(sumAmount.toString(), disburseDate, newRepayments);
}
}