/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.application.servicefacade;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.mifos.accounts.loan.util.helpers.LoanAccountDto;
import org.mifos.accounts.savings.util.helpers.SavingsAccountDto;
import org.mifos.application.collectionsheet.business.CollectionSheetEntryCustomerAccountInstallmentDto;
import org.mifos.application.collectionsheet.business.CollectionSheetEntryDto;
import org.mifos.application.collectionsheet.business.CollectionSheetEntryGridDto;
import org.mifos.application.collectionsheet.business.CollectionSheetEntryInstallmentDto;
import org.mifos.application.collectionsheet.business.CollectionSheetEntryLoanInstallmentDto;
import org.mifos.application.collectionsheet.business.CollectionSheetEntrySavingsInstallmentDto;
import org.mifos.application.master.business.CustomValueListElementDto;
import org.mifos.application.master.business.MifosCurrency;
import org.mifos.customers.util.helpers.CustomerAccountDto;
import org.mifos.dto.domain.CustomerDto;
import org.mifos.dto.domain.OfficeDetailsDto;
import org.mifos.dto.domain.PersonnelDto;
import org.mifos.framework.util.helpers.Money;
public class CollectionSheetDtoTranslatorImpl implements CollectionSheetDtoTranslator {
@Override
public CollectionSheetEntryGridDto toLegacyDto(final CollectionSheetDto collectionSheet,
final CollectionSheetFormEnteredDataDto formEnteredDataDto, final List<CustomValueListElementDto> attendanceTypesList,
final MifosCurrency currency) {
final CollectionSheetEntryDto collectionSheetEntryViewHierarchy = createEntryViewHierarchyFromCollectionSheetData(
collectionSheet.getCollectionSheetCustomer(), currency);
final PersonnelDto loanOfficer = formEnteredDataDto.getLoanOfficer();
final OfficeDetailsDto office = formEnteredDataDto.getOffice();
final ListItem<Short> paymentType = formEnteredDataDto.getPaymentType();
final Date meetingDate = formEnteredDataDto.getMeetingDate();
final String receiptId = formEnteredDataDto.getReceiptId();
final Date receiptDate = formEnteredDataDto.getReceiptDate();
final List<ProductDto> loanProductDtos = createListOfLoanProducts(collectionSheet.getCollectionSheetCustomer());
final List<ProductDto> savingProductDtos = createListOfSavingProducts(collectionSheet
.getCollectionSheetCustomer());
final CollectionSheetEntryGridDto translatedGridDto = new CollectionSheetEntryGridDto(
collectionSheetEntryViewHierarchy, loanOfficer, office, paymentType, meetingDate, receiptId,
receiptDate, loanProductDtos, savingProductDtos, attendanceTypesList);
return translatedGridDto;
}
private List<ProductDto> createListOfSavingProducts(final List<CollectionSheetCustomerDto> collectionSheetCustomer) {
final Set<ProductDto> savingProductsSet = new HashSet<ProductDto>();
for (CollectionSheetCustomerDto collectionSheetCustomerDto : collectionSheetCustomer) {
for (CollectionSheetCustomerSavingDto saving : collectionSheetCustomerDto
.getCollectionSheetCustomerSaving()) {
ProductDto productDto = new ProductDto(saving.getProductId(), saving.getProductShortName());
savingProductsSet.add(productDto);
}
}
List<ProductDto> savingProductsOrderedByName = new ArrayList<ProductDto>(savingProductsSet);
Collections.sort(savingProductsOrderedByName, new ProductDtoComparator());
return savingProductsOrderedByName;
}
private List<ProductDto> createListOfLoanProducts(final List<CollectionSheetCustomerDto> collectionSheetCustomer) {
final Set<ProductDto> loanProductsSet = new HashSet<ProductDto>();
for (CollectionSheetCustomerDto collectionSheetCustomerDto : collectionSheetCustomer) {
for (CollectionSheetCustomerLoanDto loan : collectionSheetCustomerDto.getCollectionSheetCustomerLoan()) {
ProductDto productDto = new ProductDto(loan.getProductId(), loan.getProductShortName());
loanProductsSet.add(productDto);
}
}
List<ProductDto> loanProductsOrderedByName = new ArrayList<ProductDto>(loanProductsSet);
Collections.sort(loanProductsOrderedByName, new ProductDtoComparator());
return loanProductsOrderedByName;
}
private CollectionSheetEntryDto createEntryViewHierarchyFromCollectionSheetData(
final List<CollectionSheetCustomerDto> collectionSheetCustomerHierarchy, final MifosCurrency currency) {
final int countOfCustomers = collectionSheetCustomerHierarchy.size();
CollectionSheetEntryDto parentView = null;
for (CollectionSheetCustomerDto customer : collectionSheetCustomerHierarchy) {
final CustomerDto parentCustomerDetail = new CustomerDto(customer.getCustomerId(), customer.getName(),
customer.getParentCustomerId(), customer.getLevelId());
CollectionSheetEntryDto childView = new CollectionSheetEntryDto(parentCustomerDetail, currency);
childView.setAttendence(customer.getAttendanceId());
childView.setCountOfCustomers(countOfCustomers);
final Integer accountId = customer.getCollectionSheetCustomerAccount().getAccountId();
final Integer customerId = customer.getCustomerId();
final Short installmentId = null;
final Integer actionDateId = null;
final Date actionDate = null;
final Money miscFee = new Money(currency, customer.getCollectionSheetCustomerAccount()
.getTotalCustomerAccountCollectionFee().toString());
final Money miscFeePaid = new Money(currency, "0.0");
final Money miscPenalty = new Money(currency, "0.0");
final Money miscPenaltyPaid = new Money(currency, "0.0");
final CustomerAccountDto customerAccountDetails = new CustomerAccountDto(customer
.getCollectionSheetCustomerAccount().getAccountId(), customer.getCustomerId(), currency);
customerAccountDetails.setAccountId(customer.getCollectionSheetCustomerAccount().getAccountId());
// we only create one installment fee and set the total amount due
// in the miscFee column for now
final CollectionSheetEntryInstallmentDto installmentView = new CollectionSheetEntryCustomerAccountInstallmentDto(
accountId, customerId, installmentId, actionDateId, actionDate, miscFee, miscFeePaid, miscPenalty,
miscPenaltyPaid, currency);
final List<CollectionSheetEntryInstallmentDto> installmentViewList = java.util.Arrays
.asList(installmentView);
customerAccountDetails.setAccountActionDates(installmentViewList);
childView.setCustomerAccountDetails(customerAccountDetails);
// saving accounts
for (CollectionSheetCustomerSavingDto customerSavingDto : customer.getCollectionSheetCustomerSaving()) {
final Integer savCustomerId = customerSavingDto.getCustomerId();
final Integer savAccountId = customerSavingDto.getAccountId();
final String savingProductShortName = customerSavingDto.getProductShortName();
final Short savOfferingId = customerSavingDto.getProductId();
final Short savingsTypeId = Short.valueOf("1");
final Short recommendedAmntUnitId = customerSavingDto.getRecommendedAmountUnitId();
final SavingsAccountDto savingsAccount = new SavingsAccountDto(savAccountId, savCustomerId,
savingProductShortName, savOfferingId, savingsTypeId, recommendedAmntUnitId);
final Short savInstallmentId = null;
final Integer savActionDateId = null;
final Date savActionDate = null;
final Money savDeposit = new Money(currency, customerSavingDto.getTotalDepositAmount().toString());
final Money savDepositPaid = new Money(currency, "0.0");
final CollectionSheetEntryInstallmentDto accountTrxnDetail = new CollectionSheetEntrySavingsInstallmentDto(
savAccountId, savCustomerId, savInstallmentId, savActionDateId, savActionDate, savDeposit,
savDepositPaid);
savingsAccount.addAccountTrxnDetail(accountTrxnDetail);
childView.addSavingsAccountDetail(savingsAccount);
}
// special savings accounts to be paid individually by clients
for (CollectionSheetCustomerSavingDto clientIndividualSavingsAccount : customer
.getIndividualSavingAccounts()) {
final Integer savCustomerId = clientIndividualSavingsAccount.getCustomerId();
final Integer savAccountId = clientIndividualSavingsAccount.getAccountId();
final String savingProductShortName = clientIndividualSavingsAccount.getProductShortName();
final Short savOfferingId = clientIndividualSavingsAccount.getProductId();
final Short savingsTypeId = Short.valueOf("1");
final Short recommendedAmntUnitId = Short.valueOf("1");
final SavingsAccountDto savingsAccount = new SavingsAccountDto(savAccountId, savCustomerId,
savingProductShortName, savOfferingId, savingsTypeId, recommendedAmntUnitId);
final Short savInstallmentId = null;
final Integer savActionDateId = null;
final Date savActionDate = null;
final Money savDeposit = new Money(currency, clientIndividualSavingsAccount.getDepositDue().toString());
final Money savDepositPaid = new Money(currency, clientIndividualSavingsAccount.getDepositPaid().toString());
final CollectionSheetEntryInstallmentDto accountTrxnDetail = new CollectionSheetEntrySavingsInstallmentDto(
savAccountId, savCustomerId, savInstallmentId, savActionDateId, savActionDate, savDeposit,
savDepositPaid);
savingsAccount.addAccountTrxnDetail(accountTrxnDetail);
childView.addSavingsAccountDetail(savingsAccount);
}
// loan accounts
for (CollectionSheetCustomerLoanDto customerLoanDto : customer.getCollectionSheetCustomerLoan()) {
final Integer loanAccountId = customerLoanDto.getAccountId();
final Integer loanCustomerId = customerLoanDto.getCustomerId();
final String loanOfferingShortName = customerLoanDto.getProductShortName();
final Short loanOfferingId = customerLoanDto.getProductId();
final Short loanInstallmentId = null;
final Integer loanActionDateId = null;
final Date loanActionDate = null;
final Short loanAccountState = customerLoanDto.getAccountStateId();
final Short interestDeductedAtDisbursement = customerLoanDto.getPayInterestAtDisbursement();
final Money loanAmount = new Money(currency, customerLoanDto.getTotalDisbursement().toString());
final Money principal = new Money(currency, customerLoanDto.getTotalRepaymentDue().toString());
final LoanAccountDto loanAccount = new LoanAccountDto(loanAccountId, loanCustomerId,
loanOfferingShortName, loanOfferingId, loanAccountState, interestDeductedAtDisbursement,
loanAmount);
loanAccount.setAmountPaidAtDisbursement(customerLoanDto.getAmountDueAtDisbursement());
final CollectionSheetEntryInstallmentDto accountTrxnDetail = new CollectionSheetEntryLoanInstallmentDto(
loanAccountId, loanCustomerId, loanInstallmentId, loanActionDateId, loanActionDate, principal,
new Money(currency), new Money(currency), new Money(currency), new Money(currency), new Money(currency), new Money(currency), new Money(currency),
new Money(currency), new Money(currency), currency);
loanAccount.addTrxnDetails(Arrays.asList(accountTrxnDetail));
childView.addLoanAccountDetails(loanAccount);
}
// center-group-client hierarchy
if (parentView == null) {
parentView = childView;
} else {
addChildToAppropriateParent(parentView, childView);
}
}
return parentView;
}
private boolean addChildToAppropriateParent(final CollectionSheetEntryDto rootNode,
final CollectionSheetEntryDto childNodeToBeAdded) {
if (childNodeToBeAdded.getCustomerDetail().getParentCustomerId().equals(
rootNode.getCustomerDetail().getCustomerId())) {
rootNode.addChildNode(childNodeToBeAdded);
return true;
}
for (CollectionSheetEntryDto child : rootNode.getCollectionSheetEntryChildren()) {
if (addChildToAppropriateParent(child, childNodeToBeAdded)) {
return true;
}
}
return false;
}
}
class ProductDtoComparator implements Comparator<ProductDto> {
@Override
public int compare(final ProductDto arg0, final ProductDto arg1) {
return arg0.getShortName().compareTo(arg1.getShortName());
}
}