package org.mifos.application.importexport.servicefacade;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import org.mifos.application.admin.servicefacade.PersonnelServiceFacade;
import org.mifos.application.importexport.xls.XlsLoansAccountImporter;
import org.mifos.application.importexport.xls.XlsSavingsAccountImporter;
import org.mifos.application.servicefacade.LoanAccountServiceFacade;
import org.mifos.application.servicefacade.SavingsServiceFacade;
import org.mifos.clientportfolio.loan.service.DailySchedule;
import org.mifos.clientportfolio.loan.service.MonthlyOnDayOfMonthSchedule;
import org.mifos.clientportfolio.loan.service.MonthlyOnWeekOfMonthSchedule;
import org.mifos.clientportfolio.loan.service.RecurringSchedule;
import org.mifos.clientportfolio.loan.service.WeeklySchedule;
import org.mifos.clientportfolio.newloan.applicationservice.CreateLoanAccount;
import org.mifos.dto.domain.CreateAccountFeeDto;
import org.mifos.dto.domain.CreateAccountPenaltyDto;
import org.mifos.dto.domain.ImportedLoanDetail;
import org.mifos.dto.domain.ImportedSavingDetail;
import org.mifos.dto.domain.MeetingDto;
import org.mifos.dto.domain.OpeningBalanceSavingsAccount;
import org.mifos.dto.domain.ParsedLoansDto;
import org.mifos.dto.domain.ParsedSavingsDto;
import org.mifos.dto.screen.LoanCreationLoanDetailsDto;
import org.mifos.platform.questionnaire.service.QuestionGroupDetail;
import org.springframework.beans.factory.annotation.Autowired;
public class ImportLoansSavingsFacadeWebTier implements
ImportLoansSavingsFacade {
private XlsLoansAccountImporter xlsLoansAccount;
private PersonnelServiceFacade personelServiceFacade;
private LoanAccountServiceFacade loanAccountServiceFacade;
private XlsSavingsAccountImporter xlsSavingsAccount;
private SavingsServiceFacade savingServiceFacade;
@Autowired
public ImportLoansSavingsFacadeWebTier(XlsLoansAccountImporter xlsLoansAccount, PersonnelServiceFacade personelServiceFacade,
LoanAccountServiceFacade loanAccountServiceFacade, XlsSavingsAccountImporter xlsSavingsAccount, SavingsServiceFacade savingServiceFacade) {
this.xlsLoansAccount=xlsLoansAccount;
this.personelServiceFacade=personelServiceFacade;
this.loanAccountServiceFacade=loanAccountServiceFacade;
this.xlsSavingsAccount = xlsSavingsAccount;
this.savingServiceFacade = savingServiceFacade;
}
@Override
public ParsedLoansDto parseImportLoans(InputStream stream) {
xlsLoansAccount.setLocale(personelServiceFacade.getUserPreferredLocale());
ParsedLoansDto plDto=xlsLoansAccount.parse(stream);
return plDto;
}
@Override
public ParsedLoansDto saveLoans(ParsedLoansDto parsedLoansDto) {
List<CreateAccountFeeDto> defaultAccountFees=new ArrayList<CreateAccountFeeDto>();
List<QuestionGroupDetail> questionGroupDetails=new ArrayList<QuestionGroupDetail>();
List<CreateAccountPenaltyDto> defaultPenalties=new ArrayList<CreateAccountPenaltyDto>();
for (ImportedLoanDetail detail : parsedLoansDto.getSuccessfullyParsedRows()) {
LoanCreationLoanDetailsDto lcldd=loanAccountServiceFacade.retrieveLoanDetailsForLoanAccountCreation(
detail.getCustomerId(), detail.getPrdOfferingId(), false);
RecurringSchedule recurringSchedule = null;
MeetingDto meetingDto = lcldd.getCustomerMeetingDetail();
int meetingEvery = (lcldd.isRepaymentIndependentOfMeetingEnabled()) ? lcldd.getLoanOfferingMeetingDetail()
.getMeetingDetailsDto().getEvery() : meetingDto.getMeetingDetailsDto().getEvery();
int loanRecurrenceTypeId = (lcldd.isRepaymentIndependentOfMeetingEnabled()) ? lcldd
.getLoanOfferingMeetingDetail().getMeetingDetailsDto().getRecurrenceTypeId() : meetingDto
.getMeetingDetailsDto().getRecurrenceTypeId();
if (loanRecurrenceTypeId == 1) {
recurringSchedule = new WeeklySchedule(meetingEvery, meetingDto.getMeetingDetailsDto()
.getRecurrenceDetails().getDayOfWeek());
} else if (loanRecurrenceTypeId == 2) {
if (meetingDto.getMeetingDetailsDto().getRecurrenceDetails().getWeekOfMonth().equals(0)) {
recurringSchedule = new MonthlyOnDayOfMonthSchedule(meetingEvery, meetingDto.getMeetingDetailsDto()
.getRecurrenceDetails().getDayNumber());
} else {
recurringSchedule = new MonthlyOnWeekOfMonthSchedule(meetingEvery, meetingDto
.getMeetingDetailsDto().getRecurrenceDetails().getWeekOfMonth(), meetingDto
.getMeetingDetailsDto().getRecurrenceDetails().getDayOfWeek());
}
} else if (loanRecurrenceTypeId == 3) {
recurringSchedule = new DailySchedule(meetingEvery);
}
CreateLoanAccount cla=new CreateLoanAccount(detail.getCustomerId(), new Integer(detail.getPrdOfferingId()),
new Integer(detail.getStatus()), detail.getLoanAmount(), lcldd.getMinLoanAmount(), lcldd.getMaxLoanAmount(),
detail.getInterestRate().doubleValue(), new LocalDate(detail.getDisbursalDate().getTime()), null, detail.getNumberOfInstallments(),
lcldd.getMinNumberOfInstallments(), lcldd.getMaxNumberOfInstallments(),
detail.getGracePeriod(), detail.getSourceOfFundId(), detail.getLoanPurposeId(),
detail.getCollateralTypeId(), detail.getCollateralNotes(), detail.getExternalId(),
lcldd.isRepaymentIndependentOfMeetingEnabled(), recurringSchedule, defaultAccountFees, defaultPenalties);
cla.setPredefinedAccountNumber(detail.getAccountNumber());
cla.setFlagId(detail.getFlag());
this.loanAccountServiceFacade.createLoan(cla, questionGroupDetails, null);
}
return null;
}
@Override
public ParsedLoansDto createLoansDtoFromSingleError(String error) {
List<ImportedLoanDetail> parsedRows = new ArrayList<ImportedLoanDetail>();
List<String> parseErrors = new ArrayList<String>();
parseErrors.add(error);
return new ParsedLoansDto(parseErrors, parsedRows);
}
@Override
public ParsedSavingsDto parseImportSavings(InputStream stream) {
xlsSavingsAccount.setLocale(personelServiceFacade.getUserPreferredLocale());
ParsedSavingsDto savingDto=xlsSavingsAccount.parse(stream);
return savingDto;
}
@Override
public ParsedSavingsDto saveSavings(ParsedSavingsDto parsedSavingsDto) {
for(ImportedSavingDetail detail : parsedSavingsDto.getSuccessfullyParsedRows()){
OpeningBalanceSavingsAccount openingBalanceSavingsAccount =
new OpeningBalanceSavingsAccount(detail.getCustomerId(),
detail.getPrdOfferingId(), detail.getStatus(), detail.getSavingsAmount().toString(),
detail.getSavingsBalance().toString(), detail.getDate(), detail.getAccountNumber());
String savingsId = savingServiceFacade.createSavingsAccount(openingBalanceSavingsAccount);
}
return null;
}
@Override
public ParsedSavingsDto createSavingsDtoFromSingleError(String error) {
List<ImportedSavingDetail> parsedRows = new ArrayList<ImportedSavingDetail>();
List<String> parseErrors = new ArrayList<String>();
parseErrors.add(error);
return new ParsedSavingsDto(parseErrors, parsedRows);
}
}