/*******************************************************************************
* 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.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.opensheet.server.dao.AssignmentDAO;
import org.opensheet.server.dao.AssignmentUserDAO;
import org.opensheet.server.dao.DepartmentDAO;
import org.opensheet.server.dao.UserDAO;
import org.opensheet.server.utils.Comparators;
import org.opensheet.shared.model.Assignment;
import org.opensheet.shared.model.Department;
import org.opensheet.shared.model.User;
import org.opensheet.shared.model.BaseModel.UserBaseModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
public class AssignmentUserDAOImpl implements AssignmentUserDAO{
@Autowired
private UserDAO userDAO;
@Autowired
private DepartmentDAO departmentDAO;
@Autowired
private AssignmentDAO assignmentDAO;
@Autowired
private SessionFactory sessionFactory;
/**
*
* parameters:
* status:
* true for users in assignment
* false for users outside assignment
*/
@Override
@Transactional
public List<User> getAssignmentUsers(Assignment a,Boolean assigned){
List<User> assignedUsers;
List<User> result = null;
List<User> allActiveUsers = null;
Assignment assignment = (Assignment) sessionFactory.getCurrentSession().get(Assignment.class, new Integer(a.getId()));
assignedUsers = new ArrayList<User>(assignment.getUsers());
if(assignment.getLevel() == 1){
allActiveUsers = new ArrayList<User>(assignment.getParent().getUsers());
}
if(assigned == true){
return assignedUsers;
}else{
if(assignment.getLevel() == 0) {
allActiveUsers = userDAO.listUser("1");
}
allActiveUsers.removeAll(assignedUsers);
result = allActiveUsers;
}
return result;
}
@Override
@Transactional
public void updateAssignmentUsers(List<UserBaseModel> users,Assignment a,Department d){
if(a.getId() != null && d.getId() != null){
List<User> updatedUsers = new ArrayList<User>();
Assignment assignment = (Assignment) sessionFactory.getCurrentSession().get(Assignment.class, new Integer(a.getId()));
Department department = (Department) sessionFactory.getCurrentSession().get(Department.class, new Integer(d.getId()));
for(UserBaseModel u: users){
updatedUsers.add(new User(u.getId()));
}
List<User> assignmentUsers = assignment.getUsers();
List<User> oldUser = getAssignmentUsersByDepartment(assignment,department);
assignmentUsers.removeAll(oldUser);
assignmentUsers.addAll(updatedUsers);
assignment.setUsers(assignmentUsers);
}
}
/**TODO: fix this
*
*
*/
@Override
@SuppressWarnings("unchecked")
@Transactional
public List<User> getAssignmentUsersByDepartment(Assignment assignment, Department department) {
List<User> users = (List<User>) sessionFactory.getCurrentSession().createQuery(
"select a.users from Assignment a where a.id=:assignmentId")
// .setInteger("departmentId", department.getId())
.setInteger("assignmentId", assignment.getId())
.list();
List<User> answer = new ArrayList<User>();
for(User u: users){
if(u.getDepartment().getId() == department.getId()){
answer.add(u);
}
}
Collections.sort(answer,Comparators.ComparatorUserName);
return answer;
}
@Override
@Transactional
public List<User> getAssignmentUsersByDepartment(Assignment a,Department d,Boolean assigned){
Assignment assignment = assignmentDAO.getAssignmentById(a.getId());
Department department = departmentDAO.getDepartmentById(d.getId());
List<User> indaClub = getAssignmentUsersByDepartment(assignment,department);
if(assigned == true){
return indaClub;
}else{
if(assignment.getLevel() == 0){
List<User> departmentUsers = userDAO.getUsersByBranchAndByDepartment("1", department.getBranch().getId(), department.getId());
departmentUsers.removeAll(indaClub);
return departmentUsers;
}else{
List<User> departmentUsers = getAssignmentUsersByDepartment(assignment.getParent(),department);
departmentUsers.removeAll(indaClub);
return departmentUsers;
}
}
}
@Override
@Transactional
public Map<Assignment, List<Assignment>> getAssignedAssignmentByUser(User user) {
Map<Assignment, List<Assignment>> map = new HashMap<Assignment, List<Assignment>>();
for(Assignment a: user.getAssignments()){
if(a.hasParent()){
if(map.containsKey(a.getParent())){
List<Assignment> l = map.get(a.getParent());
l.add(a);
map.put(a.getParent(),l);
}else{
List<Assignment> l = new ArrayList<Assignment>();
l.add(a);
map.put(a.getParent(), l);
}
}else{
if(!map.containsKey(a)){
List<Assignment> l = new ArrayList<Assignment>();
map.put(a, l);
}
}
}
return map;
}
@SuppressWarnings("unchecked")
@Override
@Transactional
public Map<Assignment, List<Assignment>> getSheetAssignmentByUser(User user, Calendar cal) {
List<Assignment> listA = (ArrayList<Assignment>) sessionFactory.getCurrentSession().createQuery("select distinct h.assignment from Hour h where h.user =? and year(h.date)=? and month(h.date)=?")
.setInteger(0, user.getId())
.setInteger(1, cal.get(Calendar.YEAR))
.setInteger(2, cal.get(Calendar.MONTH)+1)
.list();
//List<Assignment> listT = (ArrayList<Assignment>) sessionFactory.getCurrentSession().createQuery("select distinct h.task from Hour h where h.user =? and h.task.level=1 and h.task.first=0 and year(h.date)=? and month(h.date)=?")
List<Assignment> listT = (ArrayList<Assignment>) sessionFactory.getCurrentSession().createQuery("select distinct h.task from Hour h where h.user =? and h.task.level=1 and year(h.date)=? and month(h.date)=?")
.setInteger(0, user.getId())
.setInteger(1, cal.get(Calendar.YEAR))
.setInteger(2, cal.get(Calendar.MONTH)+1)
.list();
Map<Assignment, List<Assignment>> map = new HashMap<Assignment, List<Assignment>>();
for(Assignment a: listA){
List<Assignment> l = new ArrayList<Assignment>();
map.put(a, l);
}
for(Assignment a: listT){
if(map.containsKey(a.getParent())){
List<Assignment> l = map.get(a.getParent());
l.add(a);
map.put(a.getParent(),l);
}
}
return map;
}
@SuppressWarnings("rawtypes")
@Override
public Map<Assignment, List<Assignment>> getMergedAssignmentsByUser(User user, Calendar cal) {
HashMap<Assignment, List<Assignment>> mapsheet = (HashMap<Assignment, List<Assignment>>) getSheetAssignmentByUser(user, cal);
HashMap<Assignment, List<Assignment>> mapassigned = (HashMap<Assignment, List<Assignment>>) getAssignedAssignmentByUser(user);
@SuppressWarnings("unchecked")
HashMap<Assignment, List<Assignment>> map = (HashMap<Assignment, List<Assignment>>) mapsheet.clone();
Iterator iterator = mapassigned.keySet().iterator();
while(iterator.hasNext()){
Assignment a = (Assignment) iterator.next();
if(mapsheet.containsKey(a)){
List<Assignment> listSheet = mapsheet.get(a);
List<Assignment> listAssigned = mapassigned.get(a);
for(Assignment as: listAssigned){
if(!listSheet.contains(as)){
listSheet.add(as);
map.put(a, listSheet);
}
}
}else{
List<Assignment> l = mapassigned.get(a);
map.put(a,l);
}
}
return map;
}
/*TODO Fix silly query
*
* (non-Javadoc)
* @see org.opensheet.server.dao.AssignmentUserDAO#getDiffAssignmentsByUser(org.opensheet.shared.model.User, java.util.Calendar)
*/
@Override
@Transactional
public List<Assignment> getDiffAssignmentsByUser(User user, Calendar cal) {
Map<Assignment, List<Assignment>> mapSheet = this.getSheetAssignmentByUser(user, cal);
Map<Assignment, List<Assignment>> mapAssign = this.getAssignedAssignmentByUser(user);
/*
for(Map.Entry<Assignment, List<Assignment>> kv: mapSheet.entrySet()){
System.out.println("> " + kv.getKey().getName());
for(Assignment a: kv.getValue()){
System.out.println("> " + a.getName());
}
}
for(Map.Entry<Assignment, List<Assignment>> kv: mapAssign.entrySet()){
System.out.println("* " + kv.getKey().getName());
for(Assignment a: kv.getValue()){
System.out.println("* " + a.getName());
}
}
*/
List<Assignment> result = new ArrayList<Assignment>();
for(Map.Entry<Assignment, List<Assignment>> kv: mapSheet.entrySet()){
Assignment a = kv.getKey();
if(mapAssign.containsKey(a)){
if(kv.getValue().size() >0){
List<Assignment> assigned = mapAssign.get(a);
for(Assignment sub: kv.getValue()){
if(!assigned.contains(sub)){
result.add(sub);
}
}
}
}else{
result.add(a);
}
}
/*
List<Assignment> assigned = mapAssign.get(a);
List<Assignment> insheet = mapSheet.get(a);
if(assigned.size() != 0){
for(Assignment asheet: insheet){
if(!assigned.contains(asheet)){
listAssignmentsFromSheet.add(asheet);
}
}
}else{
for(Assignment asheet: insheet){
listAssignmentsFromSheet.add(asheet);
}
}
}else{
List<Assignment> l = mapSheet.get(a);
if(!l.isEmpty()){
for(Assignment as: l)
listAssignmentsFromSheet.add(as);
}
listAssignmentsFromSheet.add(a);
}
}
*/
return result;
}
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<Assignment> getProjectManagerAssignments(User user) {
List<Assignment> assignments = null;
if(user.getPermission().getAdmin() == true){
assignments = (ArrayList<Assignment>) sessionFactory.getCurrentSession().createQuery("from Assignment a where a.level=0").list();
}else{
assignments = (ArrayList<Assignment>) sessionFactory.getCurrentSession().createQuery("from Assignment a where a.level=0 and a.owner = ?").setInteger(0,user.getId()).list();
}
return assignments;
}
@Override
@Transactional
public void setAssignmentToUser(List<Assignment> assignments,User user) {
if(assignments.size() != 0 && user !=null){
List<Assignment> assignedAssignmentToUser = user.getAssignments();
if(assignedAssignmentToUser.size() == 0){
user.setAssignments(assignments);
sessionFactory.getCurrentSession().saveOrUpdate(user);
}else{
for(Assignment a: assignments){
if(!assignedAssignmentToUser.contains(a)){
assignedAssignmentToUser.add(a);
}
}
user.setAssignments(assignedAssignmentToUser);
sessionFactory.getCurrentSession().saveOrUpdate(user);
}
}
}
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<User> getAssignmentUsers(Assignment assignment) {
List<User> result = new ArrayList<User>();
List<User> users = sessionFactory.getCurrentSession()
.createQuery("select a.users from Assignment a where a=?")
.setEntity(0, assignment)
.list();
for(User u: users){
if(u.getStatus() == true){
result.add(userDAO.getUser(u.getId()));
}
}
return result;
}
}