/*
* 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.penalties.persistence;
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.penalties.business.PenaltyBO;
import org.mifos.accounts.penalties.business.PenaltyCategoryEntity;
import org.mifos.accounts.penalties.business.PenaltyFormulaEntity;
import org.mifos.accounts.penalties.business.PenaltyFrequencyEntity;
import org.mifos.accounts.penalties.business.PenaltyPeriodEntity;
import org.mifos.accounts.penalties.business.PenaltyStatusEntity;
import org.mifos.accounts.penalties.util.helpers.PenaltyCategory;
import org.mifos.accounts.penalties.util.helpers.PenaltyFormula;
import org.mifos.accounts.penalties.util.helpers.PenaltyFrequency;
import org.mifos.accounts.penalties.util.helpers.PenaltyPeriod;
import org.mifos.accounts.penalties.util.helpers.PenaltyStatus;
import org.mifos.accounts.savings.persistence.GenericDao;
import org.mifos.application.NamedQueryConstants;
import org.mifos.application.master.business.MasterDataEntity;
import org.mifos.framework.hibernate.helper.StaticHibernateUtil;
import org.springframework.beans.factory.annotation.Autowired;
public class PenaltyDaoHibernate implements PenaltyDao {
private GenericDao genericDao;
@Autowired
public PenaltyDaoHibernate(GenericDao genericDao) {
this.genericDao = genericDao;
}
@Override
public PenaltyBO findPenaltyById(int penaltyId) {
Map<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("id", (short)penaltyId);
return (PenaltyBO) this.genericDao.executeUniqueResultNamedQuery(NamedQueryConstants.GET_PENALTY_BY_ID, queryParameters);
}
@Override
public List<PenaltyBO> findAllLoanPenalties() {
return (List<PenaltyBO>) this.genericDao.executeNamedQuery(NamedQueryConstants.GET_LOAN_PENALTIES, null);
}
@Override
public List<PenaltyBO> findAllSavingPenalties() {
return (List<PenaltyBO>) this.genericDao.executeNamedQuery(NamedQueryConstants.GET_SAVING_PENALTIES, null);
}
@Override
public PenaltyPeriodEntity findPenaltyPeriodEntityByType(PenaltyPeriod penaltyPeriod) {
return retrieveMasterEntity(PenaltyPeriodEntity.class, penaltyPeriod.getValue());
}
@Override
public PenaltyFormulaEntity findPenaltyFormulaEntityByType(PenaltyFormula penaltyFormula) {
return retrieveMasterEntity(PenaltyFormulaEntity.class, penaltyFormula.getValue());
}
@Override
public void save(PenaltyBO penaltyBO) {
this.genericDao.createOrUpdate(penaltyBO);
}
@Override
public PenaltyFrequencyEntity findPenaltyFrequencyEntityByType(PenaltyFrequency penaltyFrequency) {
return retrieveMasterEntity(PenaltyFrequencyEntity.class, penaltyFrequency.getValue());
}
@Override
public PenaltyCategoryEntity findPenaltyCategoryEntityByType(PenaltyCategory penaltyCategory) {
return retrieveMasterEntity(PenaltyCategoryEntity.class, penaltyCategory.getValue());
}
@Override
public PenaltyStatusEntity findPenaltyStatusEntityByType(PenaltyStatus penaltyStatus) {
return retrieveMasterEntity(PenaltyStatusEntity.class, penaltyStatus.getValue());
}
@Override
public List<PenaltyCategoryEntity> getPenaltiesCategories() {
return doFetchListOfMasterDataFor(PenaltyCategoryEntity.class);
}
@Override
public List<PenaltyPeriodEntity> getPenaltiesPeriods() {
return doFetchListOfMasterDataFor(PenaltyPeriodEntity.class);
}
@Override
public List<PenaltyFormulaEntity> getPenaltiesFormulas() {
return doFetchListOfMasterDataFor(PenaltyFormulaEntity.class);
}
@Override
public List<PenaltyFrequencyEntity> getPenaltiesFrequencies() {
return doFetchListOfMasterDataFor(PenaltyFrequencyEntity.class);
}
@Override
public List<PenaltyStatusEntity> getPenaltiesStatuses() {
return doFetchListOfMasterDataFor(PenaltyStatusEntity.class);
}
@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();
}
@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 List<PenaltyBO> getAllAppllicablePenaltyForLoanCreation() {
HashMap<String, Object> queryParameters = new HashMap<String, Object>();
queryParameters.put("active", PenaltyStatus.ACTIVE.getValue());
queryParameters.put("category", PenaltyCategory.LOAN.getValue());
return (List<PenaltyBO>) genericDao.executeNamedQuery(NamedQueryConstants.GET_ALL_APPLICABLE_PENALTY_FOR_LOAN_CREATION, queryParameters);
}
}