/******************************************************************************* * Copyright (c) 2012 Dmitry Tikhomirov. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Dmitry Tikhomirov - initial API and implementation ******************************************************************************/ package org.opensheet.server.dao.impl; import java.util.Date; import java.util.List; import org.hibernate.SessionFactory; import org.opensheet.client.exceptions.ParentTimelineIsNullException; import org.opensheet.client.exceptions.ParentTimelineTooSmallException; import org.opensheet.server.dao.DepartmentDAO; import org.opensheet.server.dao.TimelineDAO; import org.opensheet.shared.model.Assignment; import org.opensheet.shared.model.AssignmentDepartmentTimeline; import org.opensheet.shared.model.AssignmentTimeline; import org.opensheet.shared.model.AssignmentUserDetail; import org.opensheet.shared.model.Department; import org.opensheet.shared.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository public class TimelineDAOImpl implements TimelineDAO { @Autowired private SessionFactory sessionFactory; @Autowired private DepartmentDAO departmentDAO; @Override public Assignment getAssignmentTimeline(Assignment assignment){ return null; } @Override public Assignment setAssignmentTimeline(Assignment assignment, AssignmentTimeline assignmentTimeline) { return null; } @Override @Transactional public AssignmentDepartmentTimeline getAssignmentDepartmentTimeline( Assignment assignment, Department department) { AssignmentDepartmentTimeline assignmentDepartmentTimeline = (AssignmentDepartmentTimeline) sessionFactory.getCurrentSession().createQuery("FROM AssignmentDepartmentTimeline adt" + " where adt.assignment=? and adt.department=?").setEntity(0, assignment) .setEntity(1, department) .uniqueResult(); return assignmentDepartmentTimeline; } @Override @Transactional public Integer getAssignmentDepartmentTimelineSumByAssignment(Assignment assignment) { Long sum = (Long) sessionFactory.getCurrentSession().createQuery("SELECT SUM(adt.hour) FROM AssignmentDepartmentTimeline adt where adt.assignment=? ") .setEntity(0, assignment) .uniqueResult(); if(sum == null){ return 0; } return sum.intValue(); } @Override @Transactional public AssignmentUserDetail getAssignmentUserDetail(Assignment assignment, User user) { AssignmentUserDetail assignmentUserDetail = (AssignmentUserDetail) sessionFactory .getCurrentSession().createQuery("from AssignmentUserDetail as aud where" + " aud.assignment=? and aud.user=? ").setEntity(0, assignment) .setEntity(1, user) .uniqueResult(); return assignmentUserDetail; } @Override @Transactional public void setAssignmentUserDetail(AssignmentUserDetail assignmentUserDetail) { sessionFactory.getCurrentSession().saveOrUpdate(assignmentUserDetail); } @Override @Transactional public void setUserAssignmentTimeline(Assignment assignment, User user, Integer timeline) throws ParentTimelineIsNullException, ParentTimelineTooSmallException { Department department = user.getDepartment(); AssignmentDepartmentTimeline assignmentDepartmentTimeline= this.getAssignmentDepartmentTimeline(assignment, department); Integer currentAssignmentTimeline = 0; if(assignmentDepartmentTimeline == null){ throw new ParentTimelineIsNullException("Assignment/Department Timeline is not set"); } Integer timelineMax = assignmentDepartmentTimeline.getHour(); List<User> users = departmentDAO.getUserByAssignmentAndByDepartment(assignment, department); for(User u: users) { if(u != user){ AssignmentUserDetail aud = getAssignmentUserDetail(assignment, u); if(aud != null) currentAssignmentTimeline = currentAssignmentTimeline+ aud.getTimeline(); } } if(timelineMax < (currentAssignmentTimeline + timeline)){ throw new ParentTimelineTooSmallException("You r trying to allocate too large timeline"); }else{ AssignmentUserDetail details = getAssignmentUserDetail(assignment, user); if(details == null){ details = new AssignmentUserDetail(); details.setAssignment(assignment); details.setUser(user); details.setStarted(new Date()); details.setRate(0); } details.setTimeline(timeline); details.setUpdated(new Date()); sessionFactory.getCurrentSession().saveOrUpdate(details); } } @Override @Transactional public void setUserAssignmentRate(Assignment assignment, User user,Integer rate) { AssignmentUserDetail details = getAssignmentUserDetail(assignment, user); if(details == null){ details = new AssignmentUserDetail(); details.setAssignment(assignment); details.setUser(user); details.setStarted(new Date()); details.setTimeline(0); } details.setRate(rate); details.setUpdated(new Date()); sessionFactory.getCurrentSession().saveOrUpdate(details); } @Override @Transactional public void setUserAssignmentTimelineAndRate(User user,Assignment assignment, Integer timeline, Integer rate) { AssignmentUserDetail details = getAssignmentUserDetail(assignment, user); if(details == null){ details = new AssignmentUserDetail(); details.setAssignment(assignment); details.setUser(user); details.setStarted(new Date()); } details.setRate(rate); details.setTimeline(timeline); details.setUpdated(new Date()); sessionFactory.getCurrentSession().saveOrUpdate(details); } }