/*******************************************************************************
* 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.List;
import java.util.Map;
import org.apache.commons.collections.map.LinkedMap;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.opensheet.server.dao.DepartmentDAO;
import org.opensheet.server.dao.ReportDAO;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.google.gwt.user.client.rpc.core.java.util.Collections;
@Repository
public class ReportDAOImpl implements ReportDAO{
@Autowired
private DepartmentDAO departmentDAO;
@Autowired
private SessionFactory sessionFactory;
Logger logger = LoggerFactory.getLogger(ReportDAOImpl.class);
@Override
@Transactional
public Map<Department, List<Assignment>> getAssignmentsByDepartmentAndByType(
Integer branch, Integer typeId) {
Map<Department, List<Assignment>> answer = new HashMap<Department, List<Assignment>>();
List<Department> departments = departmentDAO.listDepartmentByBranch("1", branch);
for(Department department: departments){
List<Assignment> assignments = department.getAssignments();
for(Assignment assignment: assignments){
if(assignment.getType() == typeId && assignment.getStatus() == true){
Hibernate.initialize(assignment.getOwner());
if(answer.containsKey(department)){
answer.get(department).add(assignment);
}else{
List<Assignment> list = new ArrayList<Assignment>();
list.add(assignment);
answer.put(department,list);
}
}
}
}
return answer;
}
@SuppressWarnings("unchecked")
@Override
@Transactional
public Map<String,List<Hour>> getHourAndUsernameAndAssignmentnameByDepartmentOnPeriod(
Department department, Date started, Date finished) {
Map<String,List<Hour>> result = new LinkedMap();
List<Object[]> list = (List<Object[]>) sessionFactory.getCurrentSession()
.createQuery("select sum(h.hour),h.user.secondName,h.user.firstName,h.assignment.name," +
"sum(h.inratesum),sum(h.extratesum),h.branch.name,h.department.name,h.assignment.id, " +
"h.user.id from Hour h" +
" where h.date >= ? and h.date <= ? and h.department.id=? group by h.user,h.assignment" +
" order by h.user.secondName,h.assignment.type,h.assignment.name")
.setDate(0, started).setDate(1, finished).setInteger(2, department.getId()).list();
for(Object[] row: list){
String name = row[1] + " " + row[2];
if(result.containsKey(name)){
Hour hour = new Hour();
hour.setHour(Integer.parseInt(row[0].toString()));
Assignment assignment = new Assignment();
assignment.setId(Integer.parseInt(row[8].toString()));
assignment.setName(row[3].toString());
User user = new User();
user.setId(Integer.parseInt(row[9].toString()));
user.setFirstName(row[2].toString());
user.setSecondName(row[1].toString());
hour.setUser(user);
hour.setAssignment(assignment);
result.get(name).add(hour);
}else{
List<Hour> hourList = new ArrayList<Hour>();
Hour hour = new Hour();
hour.setHour(Integer.parseInt(row[0].toString()));
User user = new User();
user.setId(Integer.parseInt(row[9].toString()));
user.setFirstName(row[2].toString());
user.setSecondName(row[1].toString());
hour.setUser(user);
Assignment assignment = new Assignment();
assignment.setId(Integer.parseInt(row[8].toString()));
assignment.setName(row[3].toString());
hour.setAssignment(assignment);
hourList.add(hour);
result.put(name, hourList);
}
}
return result;
}
}