/*******************************************************************************
* 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.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.opensheet.client.dto.UserDTO;
import org.opensheet.client.dto.grid.AssignmentGridTemplate;
import org.opensheet.client.dto.grid.HourFolder;
import org.opensheet.client.exceptions.EditDateIsOverException;
import org.opensheet.client.exceptions.PermissionDeniedException;
import org.opensheet.client.services.HourService;
import org.opensheet.server.dao.AssignmentDAO;
import org.opensheet.server.dao.AssignmentUserDAO;
import org.opensheet.server.dao.DepartmentDAO;
import org.opensheet.server.dao.HolidaysDAO;
import org.opensheet.server.dao.HourDAO;
import org.opensheet.server.dao.SettingsDAO;
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.Hour;
import org.opensheet.shared.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.extjs.gxt.ui.client.data.BaseTreeModel;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@Service("HourService")
public class HourServiceImpl extends RemoteServiceServlet implements
HourService {
/**
*
*/
private static final long serialVersionUID = 2478861970876403071L;
@Autowired
private HolidaysDAO holidays;
@Autowired
private HourDAO hourDAO;
@Autowired
private AssignmentDAO assignmentDAO;
@Autowired
private AssignmentUserDAO assignmentUserDAO;
@Autowired
private UserDAO userDAO;
@Autowired
private DepartmentDAO departmentDAO;
@Autowired
private SettingsDAO settingsDAO;
@SuppressWarnings({ "deprecation" })
@Override
@Transactional
public BaseTreeModel getHours(UserDTO userDTO, Date date) {
Map<Assignment, List<Assignment>> map = null;
HashMap<Boolean, Date> timeSheetInputMode = settingsDAO
.getTimeSheetInputMode();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
HashMap<Integer, Boolean> getHolidaysMap = holidays.getHolidays(cal);
User user = (User) userDAO.getUser(userDTO.getId()); // sessionFactory.getCurrentSession().get(User.class,
// new
// Integer(userDTO.getId()));
User userContext = (User) userDAO.whoIam(); // sessionFactory.getCurrentSession().get(User.class,
// customUser.getId());
if (!userContext.getPermission().getAdmin() == true) {
if (!user.equals(userContext)) {
if (userContext.getPermission().getDm() == true) {
List<User> departmentManagerUsers = departmentDAO
.getDepartmentManagerUsers(userContext);
if (!departmentManagerUsers.contains(user)) {
return null;
}
}
}
}
HourFolder root = new HourFolder("root");
if (userContext.getPermission().getAdmin() == true) {
map = assignmentUserDAO.getMergedAssignmentsByUser(user, cal);
} else if (date.getMonth() == new Date().getMonth()
&& date.getYear() == new Date().getYear()) {
map = assignmentUserDAO.getMergedAssignmentsByUser(user, cal);// .getSheetAssignmentByUser(user,cal);
} else if (timeSheetInputMode.containsKey(true)
&& (new Date().getMonth() - date.getMonth()) == 1) {
int results = timeSheetInputMode.get(true).compareTo(date);
if (results < 0) {
map = assignmentUserDAO.getSheetAssignmentByUser(user, cal);
} else {
map = assignmentUserDAO.getMergedAssignmentsByUser(user, cal);
}
} else {
map = assignmentUserDAO.getSheetAssignmentByUser(user, cal);
}
map = sortByValue(map);
Iterator<Assignment> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
Assignment a = (Assignment) iterator.next();
List<BaseTreeModel> bmt = new ArrayList<BaseTreeModel>(map.size());
if (map.get(a).size() > 1) {
for (Assignment as : map.get(a)) {
bmt.add(new HourFolder(as.getName(), as.getId(), as
.getType(), hourDAO.getHours(user, as, cal)));
}
} else if (map.get(a).size() == 1) {
Assignment as = map.get(a).get(0);
if (as.getFirst() != true) {
bmt.add(new HourFolder(as.getName(), as.getId(), as
.getType(), hourDAO.getHours(user, as, cal)));
}
}
root.add((HourFolder) new HourFolder(a.getName(), a.getId(), a
.getType(), hourDAO.getHours(user, a, cal), bmt));
}
List<Hour> hoursSummList = hourDAO.getHoursSumm(user, cal);
List<Hour> overtimeList = new ArrayList<Hour>(hoursSummList.size());
for (Hour h : hoursSummList) {
if (getHolidaysMap.get(h.getDate().getDate())) {
Hour temp = new Hour();
temp.setHour(h.getHour());
temp.setDate(h.getDate());
overtimeList.add(temp);
} else if (h.getHour() > 8) {
Hour temp = new Hour();
temp.setHour(h.getHour() - 8);
temp.setDate(h.getDate());
overtimeList.add(temp);
}
}
root.add((HourFolder) new HourFolder("Overtime", 909999998, 4,
overtimeList));
root.add((HourFolder) new HourFolder("Result", 909999999, 5,
hoursSummList));
return root;
}
@Override
public HashMap<Integer, Boolean> getHolidays(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return holidays.getHolidays(cal);
}
@SuppressWarnings("deprecation")
@Override
@Transactional
public void setOrUpdateHour(UserDTO userDTO, Date date, Integer oldValue,
Integer newValue, Integer assignmentId)
throws EditDateIsOverException, PermissionDeniedException {
User user = userDAO.getUser(userDTO.getId());
Calendar cal = Calendar.getInstance();
cal.setTime(date);
HashMap<Boolean, Date> timeSheetInputMode = settingsDAO
.getTimeSheetInputMode();
User thisUser = userDAO.whoIam();
if (thisUser.getPermission().getAdmin() == true) {
hourDAO.setOrUpdateHour(user, cal, oldValue, newValue, assignmentId);
} else if (timeSheetInputMode.containsKey(true)
&& user.equals(thisUser)) {
Date borderDate = timeSheetInputMode.get(true);
if (date.getMonth() == new Date().getMonth()
&& date.getYear() == new Date().getYear()) {
hourDAO.setOrUpdateHour(user, cal, oldValue, newValue,
assignmentId);
} else if (date.getMonth() <= borderDate.getMonth()
&& date.getYear() <= borderDate.getYear()) {
hourDAO.setOrUpdateHour(user, cal, oldValue, newValue,
assignmentId);
} else {
throw new EditDateIsOverException(
"You can Add/Edit data coz border date is gone : "
+ borderDate);
}
} else if (user.equals(thisUser)
&& date.getMonth() == new Date().getMonth()
&& date.getYear() == new Date().getYear()) {
hourDAO.setOrUpdateHour(user, cal, oldValue, newValue, assignmentId);
} else {
throw new PermissionDeniedException("Permission Denied");
}
}
@Override
public BaseTreeModel getHours(Integer assignmentId, Integer departmentId) {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
Department department = departmentDAO.getDepartmentById(departmentId);
BaseTreeModel root = new BaseTreeModel();
root.set("name", "root");
root.set("id", 99999999);
Random randomGenerator = new Random();
Map<User, List<Hour>> map = hourDAO.getHours(assignment, department);
for (Map.Entry<User, List<Hour>> m : map.entrySet()) {
List<Hour> list = m.getValue();
Hour rootHour = list.get(0);
BaseTreeModel b = new BaseTreeModel();
b.set("name", m.getKey().getFullName());
b.set("id", randomGenerator.nextInt(100000));
b.set("assignment", rootHour.getAssignment().getName());
b.set("hour", rootHour.getHour());
b.set("inratesum", rootHour.getInratesum());
b.set("extratesum", rootHour.getExtratesum());
list.remove(0);
if (assignment.getLevel() == 0) {
for (Hour h : list) {
// if(!h.getAssignment().getFirst()){
BaseTreeModel child = new BaseTreeModel();
child.set("name", m.getKey().getFullName());
child.set("id", randomGenerator.nextInt(100000));
child.set("assignment", h.getAssignment().getName());
child.set("hour", h.getHour());
child.set("inratesum", h.getInratesum());
child.set("extratesum", h.getExtratesum());
b.add(child);
// }
}
}
root.add(b);
}
return root;
}
@Override
public String getNote(Integer user, Integer assignment, Date date) {
return hourDAO.getNote(user, assignment, date);
}
@Override
public void setNote(Integer user, Integer assignment, Date date, String note) {
hourDAO.setNote(user, assignment, date, note);
}
@Override
public BaseTreeModel getHours(Integer assignmentId, Integer departmentId,
Date starting, Date finishing) {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
Department department = departmentDAO.getDepartmentById(departmentId);
BaseTreeModel root = new BaseTreeModel();
root.set("name", "root");
root.set("id", 99999999);
Random randomGenerator = new Random();
Map<User, List<Hour>> map = hourDAO.getHours(assignment, department,
starting, finishing);
for (Map.Entry<User, List<Hour>> m : map.entrySet()) {
List<Hour> list = m.getValue();
Hour rootHour = list.get(0);
BaseTreeModel b = new BaseTreeModel();
b.set("name", m.getKey().getFullName());
b.set("id", randomGenerator.nextInt(100000));
b.set("assignment", rootHour.getAssignment().getName());
b.set("hour", rootHour.getHour());
b.set("inratesum", rootHour.getInratesum());
b.set("extratesum", rootHour.getExtratesum());
list.remove(0);
if (assignment.getLevel() == 0) {
for (Hour h : list) {
BaseTreeModel child = new BaseTreeModel();
child.set("name", " ");
child.set("id", randomGenerator.nextInt(100000));
child.set("assignment", h.getAssignment().getName());
child.set("hour", h.getHour());
child.set("inratesum", h.getInratesum());
child.set("extratesum", h.getExtratesum());
b.add(child);
}
}
root.add(b);
}
return root;
}
static Map<Assignment, List<Assignment>> sortByValue(
Map<Assignment, List<Assignment>> map) {
List<Assignment> list = new LinkedList<Assignment>(map.keySet());
Collections.sort(list, new Comparator<Assignment>() {
public int compare(Assignment o1, Assignment o2) {
if (o1.getType() == o2.getType()) {
return o1.getName().compareTo(o2.getName());
}
return o1.getType().compareTo(o2.getType());
}
});
Map<Assignment, List<Assignment>> result = new LinkedHashMap<Assignment, List<Assignment>>();
for (Iterator<Assignment> it = list.iterator(); it.hasNext();) {
Assignment entry = (Assignment) it.next();
List<Assignment> assignments = map.get(entry);
Collections.sort(assignments, Comparators.ComparatorAssignmentName);
result.put(entry, map.get(entry));
}
return result;
}
@Secured({ "ROLE_ADMIN" })
@Override
public AssignmentGridTemplate getHoursByUserAndByAssignmentOnPeriod(
Integer userId, Date start, Date end) {
return hourDAO
.getHoursByUserAndByAssignmentOnPeriod(userId, start, end);
}
}