/******************************************************************************* * 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.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.hibernate.SessionFactory; import org.opensheet.client.dto.grid.AssignmentGridTemplate; import org.opensheet.server.dao.AssignmentDAO; import org.opensheet.server.security.CheckUserContext; import org.opensheet.shared.model.Assignment; import org.opensheet.shared.model.AssignmentTimeline; import org.opensheet.shared.model.Branch; 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.Repository; import org.springframework.transaction.annotation.Transactional; import com.extjs.gxt.ui.client.data.BaseModel; /**<p> This class is an implementation of interface AssignmentDAO that can be used for different operation under * "Assignment" Objects .</p> * * * @author chani * */ @Repository public class AssignmentDAOImpl implements AssignmentDAO { @Autowired private SessionFactory sessionFactory; @Autowired private CheckUserContext checkUserContext; /** Searches the specified object by their unique id. * @param the index of the search key * @return Assignment object * */ @Override @Transactional public Assignment getAssignmentById(Integer id){ Assignment assignment = (Assignment) sessionFactory.getCurrentSession(). createQuery("from Assignment a join fetch a.owner as u join fetch a.branch as b" + " where a.id=?").setInteger(0, id).uniqueResult(); return assignment; } /** Return the collection of the Assignment objects by type * @param type by type (0 - project, 1 -tender, 2 - office assignmens, 3 - out of the office tasks) * @return List<Assignment> */ @Override @Transactional @SuppressWarnings("unchecked") public List<Assignment> getAssignments(Integer type){ List<Assignment> assignments = new ArrayList<Assignment>(sessionFactory.getCurrentSession().createQuery("from Assignment a join fetch a.owner as u WHERE a.type =?"). setInteger(0, type).list()); return assignments; } /** This method used to get Assignment TreeGrid model for AssignmentTreeGrid/AssignmentTreeUserGrid * @param * type by type (0 - project, 1 -tender, 2 - office assignments, 3 - out of the office tasks) * status active/inactive Assignments * branch id if the branch * @return AssignmentGridTemplate * @see org.opensheet.client.dto.grid.AssignmentGridTemplate * */ @Override @Transactional public AssignmentGridTemplate getAssignmentDTOs(Integer type,Boolean status,Integer branch){ AssignmentGridTemplate root = new AssignmentGridTemplate("root",true,100000,"nope",false,false); for(Assignment a: getRootAssignments(type,status,branch)){ if(status == true){ if(a.getChildren().isEmpty() == true){ root.add(new AssignmentGridTemplate(a.getName(),a.getStatus(),a.getId(),a.getIndex(),false,false)); }else{ ArrayList<AssignmentGridTemplate> assignmentGridTemplate = new ArrayList<AssignmentGridTemplate>(); for(Assignment child: a.getChildren()){ if(a.getChildren().size() >=2 && child.getStatus() == true && child.getFirst() != true){ assignmentGridTemplate.add(new AssignmentGridTemplate(child.getName(),child.getStatus(),child.getId(),child.getIndex(),true,false)); } } root.add(new AssignmentGridTemplate(a.getName(), a.getStatus(),a.getId(),a.getIndex(),assignmentGridTemplate,false,true)); assignmentGridTemplate = new ArrayList<AssignmentGridTemplate>(); } }else{ if(a.getChildren().isEmpty() == true){ root.add(new AssignmentGridTemplate(a.getName(),a.getStatus(),a.getId(),a.getIndex(),false,false)); }else{ ArrayList<AssignmentGridTemplate> assignmentGridTemplate = new ArrayList<AssignmentGridTemplate>(); for(Assignment child: a.getChildren()){ if(child.getFirst() != true){ assignmentGridTemplate.add(new AssignmentGridTemplate(child.getName(),child.getStatus(),child.getId(),child.getIndex(),true,false)); } } root.add(new AssignmentGridTemplate(a.getName(),a.getStatus(),a.getId(),a.getIndex(),assignmentGridTemplate,false,true)); assignmentGridTemplate = new ArrayList<AssignmentGridTemplate>(); } } } return root; } @Override @Transactional @SuppressWarnings("unchecked") public List<Assignment> getRootAssignments(Integer type,Boolean status,Integer branch){ List<Assignment> assignments = null; if(status == true){ assignments = new ArrayList<Assignment>(sessionFactory.getCurrentSession().createQuery("from Assignment a WHERE a.status = ? AND a.type =? AND a.level=0 AND a.branch=? order by a.name"). setBoolean(0, status). setInteger(1, type).setInteger(2, branch). list()); }else if(status == false){ assignments = new ArrayList<Assignment>(sessionFactory.getCurrentSession().createQuery("from Assignment a WHERE a.type =? AND a.level=0 AND a.branch=? order by a.name"). setInteger(0, type) .setInteger(1, branch) .list()); } for(Assignment a: assignments ){ a.getChildren(); /* for sub_tasks */ for(Assignment child: a.getChildren()){ child.getOwner(); } } return assignments; } @Override @Transactional public BaseModel updateAssignmnet(Assignment assignment){ Assignment a = (Assignment) sessionFactory.getCurrentSession().get(Assignment.class, new Integer(assignment.getId())); a.setName(assignment.getName()); a.setIndex(assignment.getIndex()); a.setType(assignment.getType()); a.setNote(assignment.getNote()); if(a.getLevel() != 0){ if(assignment.getByDefault() == true && a.getParent().getByDefault() == true ){ a.setByDefault(assignment.getByDefault()); }else if(assignment.getByDefault() == false){ a.setByDefault(assignment.getByDefault()); }else{ BaseModel bm = new BaseModel(); bm.set("result", "failed"); bm.set("msg", "Parent Assignment is not Default"); return bm; } }else{ a.setByDefault(assignment.getByDefault()); a.setBranch(assignment.getBranch()); } /** set owner to A and to childs */ if(assignment.getOwner() !=null){ a.setOwner(assignment.getOwner()); if(a.getLevel() == 0 ){ for(Assignment child: a.getChildren()){ child.setOwner(a.getOwner()); } } } a.setFinished(assignment.getFinished()); a.setUpdated(new Date()); if(assignment.getStatus() == false && a.getStatus() == true){ onAssignmentStatusChange(a); } a.setStatus(assignment.getStatus()); BaseModel bm = new BaseModel(); bm.set("result", "ok"); return bm; } @Override @Transactional public void addAssignmnet(Assignment assignment){ Assignment parent = null; assignment.setFirst(false); assignment.setStarted(new Date()); assignment.setUpdated(new Date()); assignment.setStatus(true); AssignmentTimeline timeline = new AssignmentTimeline(); timeline.setAssignment(assignment); timeline.setHour(null); timeline.setDate(new Date()); timeline.setUser(checkUserContext.getUser(SecurityContextHolder.getContext())); assignment.setTimeline(timeline); if(assignment.getLevel() != 0 ){ parent = (Assignment) sessionFactory.getCurrentSession().get(Assignment.class, new Integer(assignment.getParent().getId())); assignment.setParent(parent); assignment.setOwner(parent.getOwner()); assignment.setBranch(parent.getBranch()); assignment.setType(parent.getType()); sessionFactory.getCurrentSession().save(assignment); sessionFactory.getCurrentSession().saveOrUpdate(timeline); }else{ assignment.setParent(null); sessionFactory.getCurrentSession().save(assignment); sessionFactory.getCurrentSession().saveOrUpdate(timeline); Assignment child = new Assignment(); child.setName(assignment.getName() + " " + "default child"); child.setIndex(assignment.getIndex() + " " + "default index"); child.setOwner(assignment.getOwner()); child.setBranch(assignment.getBranch()); child.setByDefault(assignment.getByDefault()); child.setStarted(new Date()); child.setUpdated(new Date()); child.setFinished(assignment.getFinished()); child.setStatus(true); child.setType(assignment.getType()); child.setLevel(assignment.getLevel() +1); child.setFirst(true); child.setParent(assignment); AssignmentTimeline childTimeline = new AssignmentTimeline(); childTimeline.setAssignment(child); childTimeline.setHour(null); childTimeline.setDate(new Date()); childTimeline.setUser(checkUserContext.getUser(SecurityContextHolder.getContext())); child.setTimeline(childTimeline); sessionFactory.getCurrentSession().save(child); sessionFactory.getCurrentSession().saveOrUpdate(childTimeline); List<Assignment> childrenList = new LinkedList<Assignment>(); childrenList.add(child); assignment.setChildren(childrenList); sessionFactory.getCurrentSession().save(assignment); sessionFactory.getCurrentSession().saveOrUpdate(timeline); } } /** * Does this Assignment has a Children? * * @param assignemnt * @return */ public Boolean hasChildren(Assignment assignment){ if(assignment.getChildren().size() > 1) { return true; }else{ return false; } } @Override @Transactional public void changeStatusAssignment(String id) throws NumberFormatException { Integer index = Integer.parseInt(id); Assignment a = (Assignment) getAssignmentById(index); if(a.getStatus() == true){ a.setStatus(false); List<User> users = new ArrayList<User>(); a.setUsers(users); for(Assignment asub: a.getChildren()){ asub.setUsers(users); sessionFactory.getCurrentSession().save(asub); } }else if(a.getStatus() == false){ a.setStatus(true); } sessionFactory.getCurrentSession().save(a); } @Override @Transactional public Assignment getAssignemntsDefaultTask(Assignment assignment){ Assignment defaultTask = (Assignment) sessionFactory.getCurrentSession().createQuery("from Assignment a WHERE a.parent = ? AND a.first = ?") .setInteger(0, assignment.getId()) .setBoolean(1, true) .uniqueResult(); return defaultTask; } @Transactional private void onAssignmentStatusChange(Assignment assignment){ List<User> users = new ArrayList<User>(); assignment.setUsers(users); for(Assignment a: assignment.getChildren()){ a.setUsers(users); sessionFactory.getCurrentSession().saveOrUpdate(a); } sessionFactory.getCurrentSession().saveOrUpdate(assignment); // sessionFactory.getCurrentSession().flush(); } @Override @Transactional public Integer getSumHourAssignment(Assignment assignment) { Long currentTimelinesAssignmentSummLong = null; if(assignment.getLevel() == 0){ currentTimelinesAssignmentSummLong = (Long) sessionFactory.getCurrentSession().createQuery("SELECT SUM(h.hour) FROM Hour h where h.assignment=? ") .setInteger(0, assignment.getId()) .uniqueResult(); }else{ currentTimelinesAssignmentSummLong = (Long) sessionFactory.getCurrentSession().createQuery("SELECT SUM(h.hour) FROM Hour h where h.task=? ") .setInteger(0, assignment.getId()) .uniqueResult(); } if(currentTimelinesAssignmentSummLong != null){ return (Integer ) currentTimelinesAssignmentSummLong.intValue(); } return 0; } @Override @Transactional @SuppressWarnings("unchecked") public List<Assignment> getDefaultAssignment() { List<Assignment> assignments = (ArrayList<Assignment>) sessionFactory.getCurrentSession().createQuery("from Assignment a where a.status=1 and a.byDefault=1").list(); return assignments; } @SuppressWarnings("unchecked") @Override @Transactional public Map<Assignment, List<Assignment>> getAssignmentByDepartment(Department department) { List<Assignment> temp = (ArrayList<Assignment>) sessionFactory.getCurrentSession() .createQuery("select d.assignments from Department d where d.id=? ").setInteger(0, department.getId()).list(); List<Assignment> list = new ArrayList<Assignment>(); for(Assignment a: temp){ if(a.getStatus() == true && a.getFirst() !=true){ list.add(a); } } Map<Assignment, List<Assignment>> map = new HashMap<Assignment, List<Assignment>>(); for(Assignment a: list){ if(a.getLevel() == 0){ if(!map.containsKey(a)){ List<Assignment> l = new ArrayList<Assignment>(); map.put(a,l); } }else{ if(map.containsKey(a.getParent())){ map.get(a.getParent()).add(a); }else{ List<Assignment> l = new ArrayList<Assignment>(); l.add(a); map.put(a.getParent(),l); } } } return map; } @Override @Transactional public void setDepartment(Assignment assignment,List<Department> departments) { assignment.setDepartments(departments); sessionFactory.getCurrentSession().save(assignment); } @SuppressWarnings("unchecked") @Override @Transactional public List<Assignment> getAssignmentByBranch(Branch branch) { List<Assignment> result = (ArrayList<Assignment>) sessionFactory.getCurrentSession() .createQuery("from Assignment a where a.branch=? ").setInteger(0, branch.getId()).list(); return result; } @Override @Transactional @SuppressWarnings("unchecked") public List<Assignment> getAssignmentByBranchAndByType(Branch branch,Integer type) { StringBuilder sb = new StringBuilder(); sb.append("from Assignment a where a.level=0"); if(branch != null && branch.getId() != 9999999) sb.append(" and a.branch="+branch.getId()); if(type !=null && type != 9999999) sb.append(" and a.type="+type); sb.append(" order by a.name"); List<Assignment> result = (ArrayList<Assignment>) sessionFactory.getCurrentSession() .createQuery(sb.toString()) .list(); return result; } @Override @Transactional public List<Department> getDepartmentsByBranch(Assignment assignment,Branch branch) { List<Department> deps = assignment.getDepartments(); List<Department> result = assignment.getDepartments(); if(branch.getId() == 9999999){ return deps; } for(Department d: deps){ if(d.getBranch() == branch){ result.add(d); } } return result; } }