/*
* 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.ui.core.controller;
import java.math.BigDecimal;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.mifos.dto.domain.GLCodeDto;
import org.mifos.dto.domain.ProductDetailsDto;
import org.mifos.dto.domain.SavingsProductDto;
import org.mifos.dto.screen.ListElement;
import org.mifos.dto.screen.SavingsProductFormDto;
@SuppressWarnings("PMD")
public class SavingsProductFormBeanAssembler {
private GeneralProductBeanAssembler productBeanAssembler = new GeneralProductBeanAssembler();
public SavingsProductFormBean assembleReferenceData(SavingsProductFormDto referenceData) {
SavingsProductFormBean formBean = new SavingsProductFormBean();
GeneralProductBean productDetails = productBeanAssembler.assembleFromRefData(referenceData);
formBean.setGeneralDetails(productDetails);
// assembler for accounting section
populatePrincipalGlCodesDropdown(referenceData, formBean);
populateInterestGlCodesDropdown(referenceData, formBean);
populateDepositTypesDropdown(referenceData, formBean);
populateAppliesToDropdown(referenceData, formBean);
populateInterestBalanceDropdown(referenceData, formBean);
populateFrequencyPeriodDropdown(referenceData, formBean);
return formBean;
}
private void populateFrequencyPeriodDropdown(SavingsProductFormDto referenceData, SavingsProductFormBean formBean) {
Map<String, String> frequencyPeriods = new LinkedHashMap<String, String>();
for (ListElement option : referenceData.getInterestTimePeriodTypes()) {
frequencyPeriods.put(option.getId().toString(), option.getName());
}
formBean.setFrequencyPeriodOptions(frequencyPeriods);
}
private void populateInterestBalanceDropdown(SavingsProductFormDto referenceData, SavingsProductFormBean formBean) {
Map<String, String> interestBalanceTypes = new LinkedHashMap<String, String>();
for (ListElement option : referenceData.getInterestBalanceTypes()) {
interestBalanceTypes.put(option.getId().toString(), option.getName());
}
formBean.setInterestCaluclationOptions(interestBalanceTypes);
}
private void populateAppliesToDropdown(SavingsProductFormDto referenceData, SavingsProductFormBean formBean) {
Map<String, String> groupSavingsApproachOptions = new LinkedHashMap<String, String>();
for (ListElement option : referenceData.getDespositAmountAppliesTo()) {
groupSavingsApproachOptions.put(option.getId().toString(), option.getName());
}
formBean.setGroupSavingsApproachOptions(groupSavingsApproachOptions);
}
private void populateDepositTypesDropdown(SavingsProductFormDto referenceData, SavingsProductFormBean formBean) {
Map<String, String> depositTypes = new LinkedHashMap<String, String>();
for (ListElement option : referenceData.getDepositTypes()) {
depositTypes.put(option.getId().toString(), option.getName());
}
formBean.setDepositTypeOptions(depositTypes);
}
private void populatePrincipalGlCodesDropdown(SavingsProductFormDto referenceData, SavingsProductFormBean formBean) {
Map<String, GLCodeDto> principalGeneralLedgerOptions = new LinkedHashMap<String, GLCodeDto>();
for (ListElement glCode : referenceData.getPrincipalGlCodes()) {
GLCodeDto codeDto = new GLCodeDto();
codeDto.setGlcode(glCode.getName());
codeDto.setGlname(glCode.getGlname());
principalGeneralLedgerOptions.put(glCode.getId().toString(), codeDto);
}
formBean.setPrincipalGeneralLedgerOptions(principalGeneralLedgerOptions);
}
private void populateInterestGlCodesDropdown(SavingsProductFormDto referenceData, SavingsProductFormBean formBean) {
Map<String, GLCodeDto> interestGeneralLedgerOptions = new LinkedHashMap<String, GLCodeDto>();
for (ListElement glCode : referenceData.getInterestGlCodes()) {
GLCodeDto codeDto = new GLCodeDto();
codeDto.setGlcode(glCode.getName());
codeDto.setGlname(glCode.getGlname());
interestGeneralLedgerOptions.put(glCode.getId().toString(), codeDto);
}
formBean.setInterestGeneralLedgerOptions(interestGeneralLedgerOptions);
}
public SavingsProductDto assembleSavingsProductRequest(SavingsProductFormBean formBean) {
Integer category = Integer.valueOf(formBean.getGeneralDetails().getSelectedCategory());
Integer applicableFor = Integer.valueOf(formBean.getGeneralDetails().getSelectedApplicableFor());
DateTime startDate = new DateTime().withDate(Integer.valueOf(formBean.getGeneralDetails().getStartDateYear()), formBean.getGeneralDetails().getStartDateMonth(), formBean.getGeneralDetails().getStartDateDay());
DateTime endDate = null;
if (StringUtils.isNotBlank(formBean.getGeneralDetails().getEndDateYear())) {
endDate = new DateTime().withDate(Integer.valueOf(formBean.getGeneralDetails().getEndDateYear()), formBean.getGeneralDetails().getEndDateMonth(), formBean.getGeneralDetails().getEndDateDay());
}
ProductDetailsDto productDetails = new ProductDetailsDto(formBean.getGeneralDetails().getName(),
formBean.getGeneralDetails().getShortName(), formBean.getGeneralDetails().getDescription(),
category, startDate, endDate, applicableFor);
productDetails.setId(formBean.getGeneralDetails().getId());
if (StringUtils.isNotBlank(formBean.getGeneralDetails().getSelectedStatus())) {
Integer status = Integer.valueOf(formBean.getGeneralDetails().getSelectedStatus());
productDetails.setStatus(status);
}
Integer depositType = Integer.valueOf(formBean.getSelectedDepositType());
Integer groupSavingsType = null;
if (StringUtils.isNotBlank(formBean.getSelectedGroupSavingsApproach())) {
groupSavingsType = Integer.valueOf(formBean.getSelectedGroupSavingsApproach());
}
Double amountForDeposit = formBean.getAmountForDeposit();
Double maxWithdrawal = formBean.getMaxWithdrawalAmount();
BigDecimal interestRate = formBean.getInterestRate();
Integer interestCalculationType = Integer.valueOf(formBean.getSelectedInterestCalculation());
Integer interestCalculationFrequencyPeriod = Integer.valueOf(formBean.getSelectedFequencyPeriod());
BigDecimal minBalanceForInterestCalculation = BigDecimal.valueOf(Double.valueOf(formBean.getMinBalanceRequiredForInterestCalculation()));
Integer interestGlCode = Integer.parseInt(formBean.getSelectedInterestGlCode());
Integer depositGlCode = Integer.parseInt(formBean.getSelectedPrincipalGlCode());
return new SavingsProductDto(productDetails, formBean.isGroupSavingAccount(),
depositType, groupSavingsType, amountForDeposit, maxWithdrawal,
interestRate, interestCalculationType, formBean.getInterestCalculationFrequency(), interestCalculationFrequencyPeriod,
formBean.getInterestPostingMonthlyFrequency(), minBalanceForInterestCalculation, depositGlCode, interestGlCode, formBean.getIsDaily());
}
public void setProductBeanAssembler(GeneralProductBeanAssembler productBeanAssembler) {
this.productBeanAssembler = productBeanAssembler;
}
}