/*******************************************************************************
* 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.Date;
import java.util.List;
import org.opensheet.client.services.StatService;
import org.opensheet.server.dao.AssignmentDAO;
import org.opensheet.server.dao.DepartmentDAO;
import org.opensheet.server.dao.StatDAO;
import org.opensheet.server.dao.TimelineDAO;
import org.opensheet.server.dao.UserDAO;
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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@Service("StatService")
public class StatServiceImpl extends RemoteServiceServlet implements StatService{
@Autowired private StatDAO statDAO;
@Autowired private AssignmentDAO assignmentDAO;
@Autowired private DepartmentDAO departmentDAO;
@Autowired private TimelineDAO timelineDAO;
@Autowired private UserDAO userDAO;
private static final long serialVersionUID = 1L;
@Override
public List<Number> getAssignemntStatByYear(int year,int assignemntId) {
return statDAO.getAssignmentSumByMonthByYear(year, assignemntId);
}
@Override
public List<Number> getAssignemntDepartmentStatByYear(int year, int assignemntId, int departmentId) {
return statDAO.getAssignmentDepartmentSumByMonthByYear(year, assignemntId, departmentId);
}
@Override
public BaseModel getAssignmentQuickDetails(int assignemntId) {
Assignment assignment = assignmentDAO.getAssignmentById(assignemntId);
return statDAO.getAssignmentQuickDetails(assignment);
}
@Override
public List<BaseModel> getAssignemntStatByPeriod(Date start, Date end, int assignemntId)
{
return statDAO.getAssignmentStatByPeriod(start, end, assignemntId);
}
@Override
public List<BaseModel> getAssignemntHoursInternalExternalRatesSummThisYear(int assignmentId) {
return statDAO.getAssignmentHoursInternalExternalRatesSummThisYear(assignmentId);
}
@Override
public List<BaseModel> getAssignmentHoursMonthThisYear(int assignmentId) {
return statDAO.getAssignmentHoursMonthThisYear(assignmentId);
}
/**@param assignmentId set assignment, 9999999 - for every assignment
* @param branch
* @param type
*
*
*/
@Override
public List<BaseModel> getHourReportByUserByPeriodByAssignmentByBranch(Integer assignmentId,Integer branch,Integer type,Date start,Date end) {
return statDAO.getHourReportByUserByPeriodByAssignmentByTypeByBranch(assignmentId,branch, type, start, end);
}
@Override
public BaseModel getAssignmentDepartmentDetail(int assignmentId,int departmentId) {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
Department department = departmentDAO.getDepartmentById(departmentId);
BaseModel answer = new BaseModel();
answer.set("name", assignment.getName());
answer.set("owner", assignment.getOwner().getFullName());
AssignmentDepartmentTimeline timeline = timelineDAO.getAssignmentDepartmentTimeline(assignment, department);
if(timeline == null){
answer.set("timeline", 0);
}else{
answer.set("timeline", timeline.getHour());
}
Calendar starting = Calendar.getInstance();
starting.set(Calendar.HOUR_OF_DAY, 0);
starting.set(Calendar.MINUTE, 0);
starting.set(Calendar.DATE, 1);
Calendar ending = Calendar.getInstance();
ending.set(Calendar.DATE, ending.getActualMaximum(Calendar.DAY_OF_MONTH));
ending.set(Calendar.HOUR_OF_DAY, 23);
ending.set(Calendar.MINUTE, 59);
Integer intratesum = statDAO.getInternalRateSumByAssignmentAndByDepartment(assignment, department);
Integer intratesumMonth = statDAO.getInternalRateSumByAssignmentAndByDepartmentOnPeriod(assignment, department, starting, ending);
Integer extraratesum = statDAO.getExternalRateSumByAssignmentAndByDepartment(assignment, department);
Integer extratesumMonth = statDAO.getExternalRateSumByAssignmentAndByDepartmentOnPeriod(assignment, department, starting, ending);
Integer sum = statDAO.getAssignmentDepartmentSum(assignmentId, departmentId);
answer.set("sum", sum);
answer.set("intratesum", intratesum);
answer.set("intratesumMonth", intratesumMonth);
answer.set("extraratesum", extraratesum);
answer.set("extratesumMonth", extratesumMonth);
Integer sumMonth = statDAO.getHourSumByAssignmentAndByDepartmentOnPeriod(assignment, department, starting, ending);
answer.set("sum_month", sumMonth);
return answer;
}
/**MOVE TO TIMELINE
*
*
*/
@Override
@Transactional
public BaseModel getAssignmentDepartmentUserDetail(int assignmentId,
int departmentId, int userId) {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
User user = userDAO.getUser(userId);
Calendar starting = Calendar.getInstance();
starting.set(Calendar.HOUR_OF_DAY, 0);
starting.set(Calendar.MINUTE, 0);
starting.set(Calendar.DATE, 1);
Calendar ending = Calendar.getInstance();
ending.set(Calendar.DATE, ending.getActualMaximum(Calendar.DAY_OF_MONTH));
ending.set(Calendar.HOUR_OF_DAY, 23);
ending.set(Calendar.MINUTE, 59);
AssignmentUserDetail timeline = timelineDAO.getAssignmentUserDetail(assignment, user);
BaseModel answer = new BaseModel();
Integer sum = statDAO.getHourSumByAssignmentAndByUser(assignment, user);
Integer sumMonth = statDAO.getHourSumByAssignmentAndByUserOnPeriod(assignment, user, starting, ending);
answer.set("sum", sum );
answer.set("sum_month", sumMonth);
answer.set("intra_rate", user.getUserRate().getInternalRate());
if(timeline != null){
answer.set("timeline", timeline.getTimeline());
answer.set("extra_rate", timeline.getRate());
}else{
answer.set("timeline", 0);
answer.set("extra_rate",0);
}
return answer;
}
/**for department user/assignment grid
*
*/
@Override
@Transactional
public List<BaseModel> getUsersByDepartmentAndByAssignmentWithStats(
Integer departmentId, Integer assignmentId) {
Assignment assignment = assignmentDAO.getAssignmentById(assignmentId);
Department department = departmentDAO.getDepartmentById(departmentId);
List<User> users = departmentDAO.getUserByAssignmentAndByDepartment(assignment, department);
List<BaseModel> result = new ArrayList<BaseModel>(users.size());
for(User u: users){
BaseModel bm = new BaseModel();
bm.set("name", u.getFullName());
bm.set("id", u.getId());
AssignmentUserDetail timeline = timelineDAO.getAssignmentUserDetail(assignment, u);
Integer sum = statDAO.getHourSumByAssignmentAndByUser(assignment, u);
bm.set("sum", sum );
bm.set("internalrate", u.getUserRate().getInternalRate());
if(timeline != null){
bm.set("timeline", timeline.getTimeline());
bm.set("externalrate", timeline.getRate());
}else{
bm.set("timeline", 0);
bm.set("externalrate",0);
}
result.add(bm);
}
return result;
}
}