Package org.projectforge.humanresources

Source Code of org.projectforge.humanresources.HRPlanningDao

/////////////////////////////////////////////////////////////////////////////
//
// 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.humanresources;

import java.sql.Date;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.Validate;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.projectforge.access.OperationType;
import org.projectforge.common.DateHelper;
import org.projectforge.common.DateHolder;
import org.projectforge.core.BaseDao;
import org.projectforge.core.BaseSearchFilter;
import org.projectforge.core.DisplayHistoryEntry;
import org.projectforge.core.QueryFilter;
import org.projectforge.fibu.ProjektDO;
import org.projectforge.fibu.ProjektDao;
import org.projectforge.user.PFUserDO;
import org.projectforge.user.UserDao;
import org.projectforge.user.UserRightId;

/**
*
* @author Mario Groß (m.gross@micromata.de)
*
*/
public class HRPlanningDao extends BaseDao<HRPlanningDO>
{
  public static final UserRightId USER_RIGHT_ID = UserRightId.PM_HR_PLANNING;

  private static final Logger log = Logger.getLogger(HRPlanningDao.class);

  private static final Class< ? >[] ADDITIONAL_SEARCH_DOS = new Class[] { HRPlanningEntryDO.class};

  private ProjektDao projektDao;

  private UserDao userDao;

  protected HRPlanningDao()
  {
    super(HRPlanningDO.class);
    userRightId = USER_RIGHT_ID;
  }

  public void setProjektDao(final ProjektDao projektDao)
  {
    this.projektDao = projektDao;
  }

  public void setUserDao(final UserDao userDao)
  {
    this.userDao = userDao;
  }

  @Override
  protected String[] getAdditionalSearchFields()
  {
    return new String[] { "entries.projekt.name", "entries.projekt.kunde.name", "user.username", "user.firstname", "user.lastname"};
  }

  /**
   * @param sheet
   * @param projektId If null, then projekt will be set to null;
   */
  public void setProjekt(final HRPlanningEntryDO sheet, final Integer projektId)
  {
    final ProjektDO projekt = projektDao.getOrLoad(projektId);
    sheet.setProjekt(projekt);
  }

  /**
   * @param sheet
   * @param userId If null, then user will be set to null;
   * @see BaseDao#getOrLoad(Integer)
   */
  public void setUser(final HRPlanningDO sheet, final Integer userId)
  {
    final PFUserDO user = userDao.getOrLoad(userId);
    sheet.setUser(user);
  }

  /**
   * Does an entry with the same user and week of year already exist?
   * @param planning
   * @return If week or user id is not given, return false.
   */
  public boolean doesEntryAlreadyExist(final HRPlanningDO planning)
  {
    Validate.notNull(planning);
    return doesEntryAlreadyExist(planning.getId(), planning.getUserId(), planning.getWeek());
  }

  /**
   * Does an entry with the same user and week of year already exist?
   * @param planningId Id of the current planning or null if new.
   * @param userId
   * @param week
   * @return If week or user id is not given, return false.
   */
  @SuppressWarnings("unchecked")
  public boolean doesEntryAlreadyExist(final Integer planningId, final Integer userId, final Date week)
  {
    if (week == null || userId == null) {
      return false;
    }
    final List<HRPlanningDO> list;
    if (planningId == null) {
      // New entry
      list = getHibernateTemplate().find("from HRPlanningDO p where p.user.id = ? and p.week = ?", new Object[] { userId, week});
    } else {
      // Entry already exists. Check collision:
      list = getHibernateTemplate().find("from HRPlanningDO p where p.user.id = ? and p.week = ? and pk <> ?",
          new Object[] { userId, week, planningId});
    }
    return (CollectionUtils.isNotEmpty(list) == true);
  }

  public HRPlanningDO getEntry(final PFUserDO user, final Date week)
  {
    return getEntry(user.getId(), week);
  }

  @SuppressWarnings("unchecked")
  public HRPlanningDO getEntry(final Integer userId, final Date week)
  {
    final DateHolder date = new DateHolder(week, DateHelper.UTC, Locale.GERMANY);
    if (date.isBeginOfWeek() == false) {
      log.error("Date is not begin of week, try to change date: " + DateHelper.formatAsUTC(date.getDate()));
      date.setBeginOfWeek();
    }
    final List<HRPlanningDO> list = getHibernateTemplate().find("from HRPlanningDO p where p.user.id = ? and p.week = ?",
        new Object[] { userId, date.getSQLDate()});
    if (list == null || list.size() != 1) {
      return null;
    }
    final HRPlanningDO planning = list.get(0);
    if (accessChecker.hasLoggedInUserSelectAccess(userRightId, planning, false) == true) {
      return planning;
    } else {
      return null;
    }
  }

  @Override
  public List<HRPlanningDO> getList(final BaseSearchFilter filter)
  {
    final HRPlanningFilter myFilter = (HRPlanningFilter) filter;
    if (myFilter.getStopTime() != null) {
      final DateHolder date = new DateHolder(myFilter.getStopTime());
      date.setEndOfDay();
      myFilter.setStopTime(date.getDate());
    }
    final QueryFilter queryFilter = buildQueryFilter(myFilter);
    final List<HRPlanningDO> result = getList(queryFilter);
    if (result == null) {
      return null;
    }
    return result;
  }

  public QueryFilter buildQueryFilter(final HRPlanningFilter filter)
  {
    final QueryFilter queryFilter = new QueryFilter(filter);
    if (filter.getUserId() != null) {
      final PFUserDO user = new PFUserDO();
      user.setId(filter.getUserId());
      queryFilter.add(Restrictions.eq("user", user));
    }
    if (filter.getStartTime() != null && filter.getStopTime() != null) {
      queryFilter.add(Restrictions.between("week", filter.getStartTime(), filter.getStopTime()));
    } else if (filter.getStartTime() != null) {
      queryFilter.add(Restrictions.ge("week", filter.getStartTime()));
    } else if (filter.getStopTime() != null) {
      queryFilter.add(Restrictions.le("week", filter.getStopTime()));
    }
    if (filter.getProjektId() != null) {
      queryFilter.add(Restrictions.eq("projekt.id", filter.getProjektId()));
    }
    queryFilter.addOrder(Order.desc("week"));
    if (log.isDebugEnabled() == true) {
      log.debug(ToStringBuilder.reflectionToString(filter));
    }
    return queryFilter;
  }

  /**
   * <ul>
   * <li>Checks week date on: monday, 0:00:00.000 and if check fails then the date will be set to.</li>
   * <li>Check deleted entries and re-adds them instead of inserting a new entry, if exist.</li>
   * <ul>
   * @see org.projectforge.core.BaseDao#onSaveOrModify(org.projectforge.core.ExtendedBaseDO)
   */
  @Override
  protected void onSaveOrModify(final HRPlanningDO obj)
  {
    final DateHolder date = new DateHolder(obj.getWeek(), DateHelper.UTC, Locale.GERMANY);
    if (date.getDayOfWeek() != Calendar.MONDAY || date.getMilliSecond() != 0 || date.getMinute() != 0 || date.getHourOfDay() != 0) {
      log.error("Date is not begin of week, try to change date: " + DateHelper.formatAsUTC(date.getDate()));
      obj.setFirstDayOfWeek(date.getSQLDate());
    }
    super.onSaveOrModify(obj);
  }

  /**
   * @see org.projectforge.core.BaseDao#prepareHibernateSearch(org.projectforge.core.ExtendedBaseDO, org.projectforge.access.OperationType)
   */
  @Override
  protected void prepareHibernateSearch(final HRPlanningDO obj, final OperationType operationType)
  {
    final List<HRPlanningEntryDO> entries = obj.getEntries();
    if (entries != null) {
      for (final HRPlanningEntryDO entry : entries) {
        projektDao.initializeProjektManagerGroup(entry.getProjekt());
      }
    }
    final PFUserDO user = obj.getUser();
    if (user != null) {
      obj.setUser(userDao.getUserGroupCache().getUser(user.getId()));
    }
  }

  @Override
  public HRPlanningDO newInstance()
  {
    return new HRPlanningDO();
  }

  /**
   * Gets history entries of super and adds all history entries of the HRPlanningEntryDO childs.
   * @see org.projectforge.core.BaseDao#getDisplayHistoryEntries(org.projectforge.core.ExtendedBaseDO)
   */
  @Override
  public List<DisplayHistoryEntry> getDisplayHistoryEntries(final HRPlanningDO obj)
  {
    final List<DisplayHistoryEntry> list = super.getDisplayHistoryEntries(obj);
    if (accessChecker.hasLoggedInUserHistoryAccess(userRightId, obj, false) == false) {
      return list;
    }
    if (CollectionUtils.isNotEmpty(obj.getEntries()) == true) {
      for (final HRPlanningEntryDO position : obj.getEntries()) {
        final List<DisplayHistoryEntry> entries = internalGetDisplayHistoryEntries(position);
        for (final DisplayHistoryEntry entry : entries) {
          final String propertyName = entry.getPropertyName();
          if (propertyName != null) {
            if (position.getProjekt() != null) {
              entry.setPropertyName(position.getProjektName() + ":" + entry.getPropertyName()); // Prepend name of project
            } else {
              entry.setPropertyName(position.getStatus() + ":" + entry.getPropertyName()); // Prepend status
            }
          } else {
            if (position.getProjekt() != null) {
              entry.setPropertyName(position.getProjektName());
            } else {
              entry.setPropertyName(String.valueOf(position.getStatus()));
            }
          }
        }
        list.addAll(entries);
      }
    }
    Collections.sort(list, new Comparator<DisplayHistoryEntry>() {
      public int compare(final DisplayHistoryEntry o1, final DisplayHistoryEntry o2)
      {
        return (o2.getTimestamp().compareTo(o1.getTimestamp()));
      }
    });
    return list;
  }

  @Override
  protected Class< ? >[] getAdditionalHistorySearchDOs()
  {
    return ADDITIONAL_SEARCH_DOS;
  }

}
TOP

Related Classes of org.projectforge.humanresources.HRPlanningDao

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.