/*
* 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.accounts.fees.persistence;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.mifos.accounts.fees.business.CategoryTypeEntity;
import org.mifos.accounts.fees.business.FeeBO;
import org.mifos.accounts.fees.business.FeeFormulaEntity;
import org.mifos.accounts.fees.business.FeeFrequencyTypeEntity;
import org.mifos.accounts.fees.business.FeePaymentEntity;
import org.mifos.accounts.fees.business.FeeStatusEntity;
import org.mifos.accounts.fees.business.RateFeeBO;
import org.mifos.accounts.fees.util.helpers.FeeCategory;
import org.mifos.accounts.fees.util.helpers.FeeFormula;
import org.mifos.accounts.fees.util.helpers.FeeFrequencyType;
import org.mifos.accounts.fees.util.helpers.FeePayment;
import org.mifos.accounts.fees.util.helpers.FeeStatus;
import org.mifos.accounts.savings.persistence.GenericDao;
import org.mifos.application.NamedQueryConstants;
import org.mifos.application.master.business.MasterDataEntity;
import org.mifos.core.MifosRuntimeException;
import org.mifos.dto.domain.FeeDto;
import org.mifos.framework.hibernate.helper.StaticHibernateUtil;
import org.springframework.beans.factory.annotation.Autowired;
public class FeeDaoHibernate implements FeeDao {
private final GenericDao genericDao;
@Autowired
public FeeDaoHibernate(GenericDao genericDao) {
this.genericDao = genericDao;
}
@Override
public FeeBO findById(Short feeId) {
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("feeId", feeId);
return (FeeBO) this.genericDao.executeUniqueResultNamedQuery("findFeeById", queryParameters);
}
@Override
public FeeDto findDtoById(Short feeId) {
Session session = StaticHibernateUtil.getSessionTL();
Criteria criteriaQuery = session.createCriteria(FeeBO.class);
criteriaQuery.add(Restrictions.eq("id", feeId));
criteriaQuery.setFetchMode("lookUpValue", FetchMode.JOIN);
criteriaQuery.setFetchMode("categoryType", FetchMode.JOIN);
criteriaQuery.setFetchMode("feeStatus", FetchMode.JOIN);
criteriaQuery.setFetchMode("feeFrequency", FetchMode.JOIN);
FeeBO fee = (FeeBO) criteriaQuery.uniqueResult();
return fee.toDto();
}
@Override
public void save(FeeBO fee) {
this.genericDao.createOrUpdate(fee);
}
@SuppressWarnings("unchecked")
@Override
public List<FeeDto> retrieveAllProductFees() {
List<FeeBO> allProductFees = (List<FeeBO>) this.genericDao.executeNamedQuery("retrieveProductFees", null);
return assembleFeeDto(allProductFees);
}
@Override
@SuppressWarnings("unchecked")
public List<Short> getUpdatedFeesForCustomer() {
return (List<Short>) genericDao.executeNamedQuery("retrieveUpdatedFeesApplicableToCustomers", null);
}
@SuppressWarnings("unchecked")
@Override
public List<FeeDto> retrieveAllCustomerFees() {
List<FeeBO> allCustomerFees = (List<FeeBO>) this.genericDao.executeNamedQuery("retrieveCustomerFees", null);
return assembleFeeDto(allCustomerFees);
}
@Override
@SuppressWarnings("unchecked")
public List<FeeBO> getAllAppllicableFeeForLoanCreation() {
HashMap<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("active", FeeStatus.ACTIVE.getValue());
queryParameters.put("category", FeeCategory.LOAN.getValue());
return (List<FeeBO>) genericDao.executeNamedQuery(NamedQueryConstants.GET_ALL_APPLICABLE_FEE_FOR_LOAN_CREATION, queryParameters);
}
private List<FeeDto> assembleFeeDto(List<FeeBO> allProductFees) {
List<FeeDto> fees = new ArrayList<FeeDto>();
for (FeeBO fee : allProductFees) {
fees.add(fee.toDto());
}
return fees;
}
@Override
public List<CategoryTypeEntity> doRetrieveFeeCategories() {
return doFetchListOfMasterDataFor(CategoryTypeEntity.class);
}
@Override
public List<FeeFormulaEntity> retrieveFeeFormulae() {
return doFetchListOfMasterDataFor(FeeFormulaEntity.class);
}
@Override
public List<FeeFrequencyTypeEntity> retrieveFeeFrequencies() {
return doFetchListOfMasterDataFor(FeeFrequencyTypeEntity.class);
}
@Override
public List<FeePaymentEntity> retrieveFeePayments() {
return doFetchListOfMasterDataFor(FeePaymentEntity.class);
}
@Override
public List<FeeStatusEntity> retrieveFeeStatuses() {
return doFetchListOfMasterDataFor(FeeStatusEntity.class);
}
@SuppressWarnings("unchecked")
private <T extends MasterDataEntity> List<T> doFetchListOfMasterDataFor(Class<T> type) {
Session session = StaticHibernateUtil.getSessionTL();
List<T> masterEntities = session.createQuery("from " + type.getName()).list();
for (MasterDataEntity masterData : masterEntities) {
Hibernate.initialize(masterData.getNames());
}
return masterEntities;
}
@Override
public FeeFrequencyTypeEntity findFeeFrequencyEntityByType(FeeFrequencyType feeFrequencyType) {
return retrieveMasterEntity(FeeFrequencyTypeEntity.class, feeFrequencyType.getValue());
}
@Override
public CategoryTypeEntity findFeeCategoryTypeEntityByType(FeeCategory categoryType) {
return retrieveMasterEntity(CategoryTypeEntity.class, categoryType.getValue());
}
@Override
public FeeFormulaEntity findFeeFormulaEntityByType(FeeFormula feeFormula) {
return retrieveMasterEntity(FeeFormulaEntity.class, feeFormula.getValue());
}
@Override
public FeePaymentEntity findFeePaymentEntityByType(FeePayment feePayment) {
return retrieveMasterEntity(FeePaymentEntity.class, feePayment.getValue());
}
@SuppressWarnings("unchecked")
private <T extends MasterDataEntity> T retrieveMasterEntity(final Class<T> entityType, final Short entityId) {
Session session = StaticHibernateUtil.getSessionTL();
Criteria criteriaQuery = session.createCriteria(entityType);
criteriaQuery.add(Restrictions.eq("id", entityId));
criteriaQuery.setFetchMode("lookUpValue", FetchMode.JOIN);
return (T) criteriaQuery.uniqueResult();
}
@Override
public <T> T initializeAndUnproxy(T var) {
return genericDao.initializeAndUnproxy(var);
}
@Override
public void remove(FeeBO fee, boolean isInProducts, boolean isFeeInUsedLoan, boolean remove) throws Exception {
if (isInProducts && !isFeeInUsedLoan) {
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("FEEID", fee.getFeeId());
this.genericDao.executeNamedQueryDelete("deleteFeeFromPrdOfferingFees", queryParameters);
if (remove) {
this.genericDao.delete(fee);
}
}
else if (isInProducts && isFeeInUsedLoan && !remove) {
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("FEEID", fee.getFeeId());
this.genericDao.executeNamedQueryDelete("deleteFeeFromPrdOfferingFees", queryParameters);
this.genericDao.executeNamedQueryDelete("deleteFeeFromAccountFeesAndTrhxHistoryAndOriginalFeeSchedule",
queryParameters);
}
else if (!isInProducts && !isFeeInUsedLoan && remove) {
this.genericDao.delete(fee);
}
else {
throw new MifosRuntimeException();
}
}
@Override
public Short findFeeAppliedToLoan(Short feeId) {
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("FEEID", feeId);
return (Short) this.genericDao.executeUniqueResultNamedQuery("findFeeAppliedToLoan", queryParameters);
}
@Override
public Short findFeeInSchedule(Short feeId) {
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("FEEID", feeId);
return (Short) this.genericDao.executeUniqueResultNamedQuery("findFeeInSchedule", queryParameters);
}
@SuppressWarnings("unchecked")
@Override
public List<Short> getAllUsedLoansWithAttachedFee() {
return (List<Short>) this.genericDao.executeNamedQuery("getAllUsedLoansWithAttachedFee", null);
}
@Override
public RateFeeBO findRateFeeById(Short feeId){
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("feeId", feeId);
return (RateFeeBO) this.genericDao.executeUniqueResultNamedQuery("findRateFeeById", queryParameters);
}
}