///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.fibu.kost; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.projectforge.core.BaseDao; import org.projectforge.core.BaseSearchFilter; import org.projectforge.core.QueryFilter; import org.projectforge.core.UserException; import org.projectforge.fibu.ProjektDO; import org.projectforge.fibu.ProjektDao; import org.projectforge.fibu.ProjektStatus; import org.projectforge.user.UserRightId; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Transactional(readOnly = true, propagation = Propagation.SUPPORTS, isolation = Isolation.REPEATABLE_READ) public class Kost2Dao extends BaseDao<Kost2DO> { public static final UserRightId USER_RIGHT_ID = UserRightId.FIBU_COST_UNIT; private static final String[] ADDITIONAL_SEARCH_FIELDS = new String[] { "projekt.name", "projekt.kunde.name", "nummer"}; private ProjektDao projektDao; private Kost2ArtDao kost2ArtDao; private KostCache kostCache; public Kost2Dao() { super(Kost2DO.class); userRightId = USER_RIGHT_ID; } public void setProjektDao(final ProjektDao projektDao) { this.projektDao = projektDao; } public void setKost2ArtDao(final Kost2ArtDao kost2ArtDao) { this.kost2ArtDao = kost2ArtDao; } public void setKostCache(final KostCache kostCache) { this.kostCache = kostCache; } @Override protected String[] getAdditionalSearchFields() { return ADDITIONAL_SEARCH_FIELDS; } /** * @param kost2 * @param projektId If null, then projekt will be set to null; * @see BaseDao#getOrLoad(Integer) */ public void setProjekt(final Kost2DO kost2, final Integer projektId) { final ProjektDO projekt = projektDao.getOrLoad(projektId); if (projekt != null) { kost2.setProjekt(projekt); kost2.setNummernkreis(projekt.getNummernkreis()); kost2.setBereich(projekt.getBereich()); kost2.setTeilbereich(projekt.getNummer()); } } /** * @param kost2 * @param kost2ArtId If null, then kost2Art will be set to null; * @see BaseDao#getOrLoad(Integer) */ public void setKost2Art(final Kost2DO kost2, final Integer kost2ArtId) { final Kost2ArtDO kost2Art = kost2ArtDao.getOrLoad(kost2ArtId); kost2.setKost2Art(kost2Art); } /** * @param kostString Format ######## or #.###.##.## is supported. * @see #getKost2(int, int, int, int) */ @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) public Kost2DO getKost2(final String kostString) { final int[] kost = KostHelper.parseKostString(kostString); if (kost == null) { return null; } return getKost2(kost[0], kost[1], kost[2], kost[3]); } @SuppressWarnings("unchecked") public Kost2DO getKost2(final int nummernkreis, final int bereich, final int teilbereich, final int kost2Art) { final List<Kost2DO> list = getHibernateTemplate().find( "from Kost2DO k where k.nummernkreis=? and k.bereich=? and k.teilbereich=? and k.kost2Art.id=?", new Object[] { nummernkreis, bereich, teilbereich, kost2Art}); if (CollectionUtils.isEmpty(list) == true) { return null; } return list.get(0); } @SuppressWarnings("unchecked") public List<Kost2DO> getActiveKost2(final int nummernkreis, final int bereich, final int teilbereich) { final List<Kost2DO> list = getHibernateTemplate() .find( "from Kost2DO k where k.nummernkreis=? and k.bereich=? and k.teilbereich=? and (k.kostentraegerStatus='ACTIVE' or k.kostentraegerStatus is null) order by k.kost2Art.id", new Object[] { nummernkreis, bereich, teilbereich}); if (CollectionUtils.isEmpty(list) == true) { return null; } return list; } /** * @param projekt * @see #getActiveKost2(int, int, int) */ public List<Kost2DO> getActiveKost2(final ProjektDO projekt) { if (projekt == null) { return null; } return getActiveKost2(projekt.getNummernkreis(), projekt.getBereich(), projekt.getTeilbereich()); } @Override @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) public List<Kost2DO> getList(final BaseSearchFilter filter) { final KostFilter myFilter; if (filter instanceof KostFilter) { myFilter = (KostFilter) filter; } else { myFilter = new KostFilter(filter); } final QueryFilter queryFilter = new QueryFilter(myFilter); queryFilter.createAlias("kost2Art", "art"); if (myFilter.isActive() == true) { queryFilter.add(Restrictions.eq("kostentraegerStatus", KostentraegerStatus.ACTIVE)); } else if (myFilter.isNonActive() == true) { queryFilter.add(Restrictions.eq("kostentraegerStatus", KostentraegerStatus.NONACTIVE)); } else if (myFilter.isEnded() == true) { queryFilter.add(Restrictions.eq("kostentraegerStatus", KostentraegerStatus.ENDED)); } else if (myFilter.isNotEnded() == true) { queryFilter.add(Restrictions.or(Restrictions.ne("kostentraegerStatus", ProjektStatus.ENDED), Restrictions.isNull("kostentraegerStatus"))); } queryFilter.addOrder(Order.asc("nummernkreis")).addOrder(Order.asc("bereich")).addOrder(Order.asc("teilbereich")).addOrder( Order.asc("art.id")); return getList(queryFilter); } @SuppressWarnings("unchecked") @Override protected void onSaveOrModify(final Kost2DO obj) { if (obj.getProjektId() != null) { // Projekt ist gegeben. Dann müssen auch die Ziffern stimmen: final ProjektDO projekt = projektDao.getById(obj.getProjektId()); // Bei Neuanlage ist Projekt nicht wirklich gebunden. if (projekt.getNummernkreis() != obj.getNummernkreis() || projekt.getBereich() != obj.getBereich() || projekt.getNummer() != obj.getTeilbereich()) { throw new UserException("Inkonsistenz bei Kost2: " + obj.getNummernkreis() + "." + obj.getBereich() + "." + obj.getTeilbereich() + " != " + projekt.getNummernkreis() + "." + projekt.getBereich() + "." + projekt.getNummer() + " (Projekt)"); } } else if (obj.getNummernkreis() == 4 || obj.getNummernkreis() == 5) { throw new UserException("fibu.kost2.error.projektNeededForNummernkreis"); } List<Kost2DO> list = null; final String sql = "from Kost2DO k where k.nummernkreis = ? and k.bereich = ? and k.teilbereich = ? and k.kost2Art.id = ?"; if (obj.getId() == null) { // New kost entry list = getHibernateTemplate().find(sql, new Object[] { obj.getNummernkreis(), obj.getBereich(), obj.getTeilbereich(), obj.getKost2ArtId()}); } else { // kost entry already exists. Check maybe changed: list = getHibernateTemplate().find(sql + " and pk <> ?", new Object[] { obj.getNummernkreis(), obj.getBereich(), obj.getTeilbereich(), obj.getKost2ArtId(), obj.getId()}); } if (CollectionUtils.isNotEmpty(list) == true) { throw new UserException("fibu.kost.error.collision"); } } @Override protected void afterSaveOrModify(final Kost2DO kost2) { super.afterSaveOrModify(kost2); kostCache.updateKost2(kost2); } @Override public Kost2DO newInstance() { return new Kost2DO(); } }