/*******************************************************************************
* 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;
import java.util.Date;
import org.hibernate.SessionFactory;
import org.opensheet.client.exceptions.ParentTimelineIsNullException;
import org.opensheet.client.exceptions.ParentTimelineTooSmallException;
import org.opensheet.client.exceptions.TimelineSmallerWhanSumChildException;
import org.opensheet.client.services.TimelineService;
import org.opensheet.server.dao.AssignmentDAO;
import org.opensheet.server.dao.DepartmentDAO;
import org.opensheet.server.dao.HourDAO;
import org.opensheet.server.dao.StatDAO;
import org.opensheet.server.dao.TimelineDAO;
import org.opensheet.server.dao.UserDAO;
import org.opensheet.server.security.CheckUserContext;
import org.opensheet.shared.model.Assignment;
import org.opensheet.shared.model.AssignmentDepartmentTimeline;
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.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**TODO: rewrite class. move to DAO
*
*
* @author chani
*
*/
@Service("TimelineService")
public class TimelineServiceImpl extends RemoteServiceServlet implements TimelineService{
private static final long serialVersionUID = 1L;
@Autowired private AssignmentDAO assignmentDAO;
@Autowired private DepartmentDAO departmentDAO;
@Autowired private UserDAO userDAO;
@Autowired private TimelineDAO timelineDAO;
@Autowired private StatDAO statDAO;
@Autowired private HourDAO hourDAO;
@Autowired private SessionFactory sessionFactory;
@Autowired private CheckUserContext checkUserContext;
@Override
@Transactional
public Integer getAssignmentTimeline(Integer assignmentId) {
return assignmentDAO.getAssignmentById(assignmentId).getTimeline().getHour();
}
@Override
@Transactional
public BaseModel setAssignmentTimeline(Integer assignmentId, Integer timeline,Boolean allocate) throws ParentTimelineTooSmallException, ParentTimelineIsNullException, TimelineSmallerWhanSumChildException {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
Integer timelineSumm = 0;
if(assignment.getLevel() == 0){
for(Assignment a: assignment.getChildren()){
if(a.getTimeline().getHour() !=null){
timelineSumm = timelineSumm + a.getTimeline().getHour();
}
}
if(timeline < timelineSumm)
{
throw new TimelineSmallerWhanSumChildException("Timeline of Assignemnt is smaller whan Sum of subassignment's timeline. Shrink them first!" + "Root timeline :" + timeline + ", subassignemnt's timeline sum :" + timelineSumm);
}
}else{
for(Assignment a: assignment.getParent().getChildren()){
if(a.getTimeline().getHour() != null){
if(!a.equals(assignment)){
timelineSumm = timelineSumm + a.getTimeline().getHour();
}
}
}
timelineSumm = timelineSumm + timeline;
if(timelineSumm > assignment.getParent().getTimeline().getHour()){
if(allocate == true){
assignment.getTimeline().setHour(timeline);
assignment.getTimeline().setDate(new Date());
assignment.getTimeline().setUser(checkUserContext.getUser(SecurityContextHolder.getContext()));
sessionFactory.getCurrentSession().saveOrUpdate(assignment);
Assignment parent = assignment.getParent();
parent.getTimeline().setHour(timelineSumm);
parent.getTimeline().setDate(new Date());
parent.getTimeline().setUser(checkUserContext.getUser(SecurityContextHolder.getContext()));
sessionFactory.getCurrentSession().saveOrUpdate(parent);
BaseModel bm = new BaseModel();
bm.set("type", "success");
bm.set("string", "OK");
return bm;
}else{
throw new ParentTimelineTooSmallException("Unables allocate timeline for " + assignment.getName() + " coz sum is bigger than parent's timeline.<br> Details: new timeline = " + timeline + ", but Sum = " + timelineSumm + ".");
}
}else if(assignment.getParent().getTimeline().getHour() == null){
throw new ParentTimelineIsNullException("PARENT TIMELINE is Null, allocate " + assignment.getParent().getName() + " timeline ");
}
}
assignment.getTimeline().setHour(timeline);
assignment.getTimeline().setDate(new Date());
assignment.getTimeline().setUser(checkUserContext.getUser(SecurityContextHolder.getContext()));
sessionFactory.getCurrentSession().saveOrUpdate(assignment);
BaseModel bm = new BaseModel();
bm.set("type", "success");
bm.set("string", "OK");
return bm;
}
@Override
@Transactional
public Integer getAssignmentDepartmentTimeline(Integer assignmentId, Integer departmentId) {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
Department department = departmentDAO.getDepartmentById(departmentId);
AssignmentDepartmentTimeline assignmentDepartmentTimeline = timelineDAO.getAssignmentDepartmentTimeline(assignment, department);
if(assignmentDepartmentTimeline == null){
return 0;
}else{
return assignmentDepartmentTimeline.getHour();
}
}
@Override
@Transactional
public BaseModel setAssignmentDepartmentTimeline(Integer assignmentId,Integer departmentId, Integer timeline, Boolean allocate) throws ParentTimelineIsNullException, ParentTimelineTooSmallException {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
Department department = departmentDAO.getDepartmentById(departmentId);
AssignmentDepartmentTimeline assignmentDepartmentTimeline = timelineDAO.getAssignmentDepartmentTimeline(assignment, department);
if(assignmentDepartmentTimeline == null){
assignmentDepartmentTimeline = new AssignmentDepartmentTimeline();
assignmentDepartmentTimeline.setAssignment(assignment);
assignmentDepartmentTimeline.setDepartment(department);
assignmentDepartmentTimeline.setDate(new Date());
assignmentDepartmentTimeline.setHour(0);
assignmentDepartmentTimeline.setUser(checkUserContext.getUser(SecurityContextHolder.getContext()));
}
Integer currentDepartmentTimeline = assignmentDepartmentTimeline.getHour();
Integer maxTimeline = 0;
Integer sumOfAllocatedTimelinesForCurrentDep=0;
if(assignment.getLevel() == 0){
if(assignment.getTimeline().getHour() == null){
throw new ParentTimelineIsNullException("Please set Timeline to " + assignment.getName() + " first");
}else{
maxTimeline = assignment.getTimeline().getHour();
Integer currentTimelinesSum = timelineDAO.getAssignmentDepartmentTimelineSumByAssignment( assignment);
if(currentTimelinesSum !=null){
if((currentTimelinesSum-currentDepartmentTimeline+timeline) > maxTimeline){
throw new ParentTimelineTooSmallException("You trying to allocate too much hours! Expand `" + assignment.getName() + "` hours first");
}else{
assignmentDepartmentTimeline.setDate(new Date());
assignmentDepartmentTimeline.setHour(timeline);
assignmentDepartmentTimeline.setUser(checkUserContext.getUser(SecurityContextHolder.getContext()));
sessionFactory.getCurrentSession().saveOrUpdate(assignmentDepartmentTimeline);
BaseModel answer = new BaseModel();
answer.set("type", "ok");
return answer;
}
}else{
if(timeline > maxTimeline){
throw new ParentTimelineTooSmallException("You trying to allocate too much hours! Expand `" + assignment.getName() + "` hours first");
}else{
assignmentDepartmentTimeline.setDate(new Date());
assignmentDepartmentTimeline.setHour(timeline);
assignmentDepartmentTimeline.setUser(checkUserContext.getUser(SecurityContextHolder.getContext()));
sessionFactory.getCurrentSession().saveOrUpdate(assignmentDepartmentTimeline);
BaseModel answer = new BaseModel();
answer.set("type", "ok");
return answer;
}
}
}
}else{
for(Assignment a: assignment.getParent().getChildren()){
if(getAssignmentDepartmentTimeline(a.getId(),departmentId) !=null)
sumOfAllocatedTimelinesForCurrentDep += getAssignmentDepartmentTimeline(a.getId(),departmentId);
}
//получаем сумму тс любого отделя для этой подзадачи
Integer currentTimelinesAssignmentSum = timelineDAO.getAssignmentDepartmentTimelineSumByAssignment( assignment);
// проверяем что сумма тс этого отдела для подпроектов меньше или равна назначеной тс для этого отдела родительсктго проекта
if((sumOfAllocatedTimelinesForCurrentDep-currentDepartmentTimeline+timeline) > getAssignmentDepartmentTimeline(assignment.getParent().getId(),departmentId)
|| (currentTimelinesAssignmentSum-currentDepartmentTimeline+timeline) > assignment.getTimeline().getHour()
){
throw new ParentTimelineTooSmallException("You trying to allocate too much hours! Expand Timeline of " + department.getName() + " for `" + assignment.getName() + "` first");
}else{
assignmentDepartmentTimeline.setDate(new Date());
assignmentDepartmentTimeline.setHour(timeline);
assignmentDepartmentTimeline.setUser(checkUserContext.getUser(SecurityContextHolder.getContext()));
sessionFactory.getCurrentSession().saveOrUpdate(assignmentDepartmentTimeline);
BaseModel answer = new BaseModel();
answer.set("type", "ok");
return answer;
}
}
}
@Override
@Transactional
public BaseModel getAssignmentDepartmentDetail(Integer assignmentId,Integer departmentId) {
BaseModel baseModel = new BaseModel();
baseModel.set("timeline", getAssignmentDepartmentTimeline(assignmentId,departmentId));
baseModel.set("sum", statDAO.getAssignmentDepartmentSum(assignmentId, departmentId));
return baseModel;
}
@Override
@Transactional
public void setUserAssignmentTimeline(Integer userId,Integer assignmentId, Integer timeline) throws ParentTimelineIsNullException, ParentTimelineTooSmallException {
User user = userDAO.getUser(userId);
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
timelineDAO.setUserAssignmentTimeline(assignment, user, timeline);
}
@Override
@Transactional
public void setUserAssignmentRate(Integer userId,Integer assignmentId, Integer rate) {
User user = userDAO.getUser(userId);
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
timelineDAO.setUserAssignmentRate(assignment, user, rate);
}
@Override
public void setUserAssignmentTimelineAndRate(Integer userId,
Integer assignmentId, Integer timeline, Integer rate) {
User user = userDAO.getUser(userId);
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
timelineDAO.setUserAssignmentTimelineAndRate(user,assignment, timeline,rate);
}
@Override
@Transactional
public Integer getUserInternalRate(Integer userId) {
User user = userDAO.getUser(userId);
return user.getUserRate().getInternalRate();
}
@Override
public void recalculateInternalRate(Integer userId, Integer rate,
Date start, Date end) {
hourDAO.recalculateInternalRate(userId, rate, start, end);
}
}