/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.apps.project.service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.joda.time.DateTimeConstants;
import org.joda.time.LocalDate;
import com.axelor.apps.base.db.Team;
import com.axelor.apps.base.service.administration.GeneralService;
import com.axelor.apps.project.db.ProjectPlanning;
import com.axelor.apps.project.db.ProjectPlanningLine;
import com.axelor.apps.project.db.ProjectTask;
import com.axelor.apps.project.db.repo.ProjectPlanningLineRepository;
import com.axelor.apps.project.db.repo.ProjectPlanningRepository;
import com.axelor.apps.project.db.repo.ProjectTaskRepository;
import com.axelor.apps.project.exception.IExceptionMessage;
import com.axelor.auth.AuthUtils;
import com.axelor.auth.db.User;
import com.axelor.exception.AxelorException;
import com.axelor.exception.db.IException;
import com.axelor.i18n.I18n;
import com.axelor.inject.Beans;
import com.axelor.rpc.ActionRequest;
import com.axelor.rpc.ActionResponse;
import com.google.inject.Inject;
import com.google.inject.persist.Transactional;
public class ProjectPlanningService {
@Inject
protected ProjectPlanningLineRepository projectPlanningLineRepository;
@Inject
protected GeneralService generalService;
@Inject
protected ProjectPlanningRepository projectPlanningRepo;
@Transactional
public ProjectPlanning createPlanning(int year, int week) throws AxelorException{
ProjectPlanning planning = new ProjectPlanning();
planning.setYear(year);
planning.setWeek(week);
projectPlanningRepo.save(planning);
return planning;
}
public static String getNameForColumns(int year, int week, int day){
LocalDate date = new LocalDate().withYear(year).withWeekOfWeekyear(week).withDayOfWeek(1);
LocalDate newDate = date.plusDays(day - 1);
return " " + Integer.toString(newDate.getDayOfMonth())+"/"+Integer.toString(newDate.getMonthOfYear());
}
@Transactional
public List<ProjectPlanningLine> populateMyPlanning(ProjectPlanning planning, User user) throws AxelorException{
List<ProjectPlanningLine> planningLineList = new ArrayList<ProjectPlanningLine>();
String query = "self.assignedTo = ?1 OR ?1 MEMBER OF self.membersUserSet";
List<ProjectTask> projectTaskList = Beans.get(ProjectTaskRepository.class).all().filter(query, user).fetch();
if(projectTaskList == null || projectTaskList.isEmpty()){
throw new AxelorException(String.format(I18n.get(IExceptionMessage.PROJECT_PLANNING_NO_TASK)), IException.CONFIGURATION_ERROR);
}
for (ProjectTask projectTask : projectTaskList) {
ProjectPlanningLine projectPlanningLine = null;
projectPlanningLine = projectPlanningLineRepository.all().filter("self.user = ?1 AND self.projectTask = ?2 AND self.year = ?3 AND self.week = ?4", user, projectTask, planning.getYear(), planning.getWeek()).fetchOne();
if(projectPlanningLine == null){
projectPlanningLine = new ProjectPlanningLine();
projectPlanningLine.setUser(user);
projectPlanningLine.setProjectTask(projectTask);
projectPlanningLine.setYear(planning.getYear());
projectPlanningLine.setWeek(planning.getWeek());
projectPlanningLineRepository.save(projectPlanningLine);
}
planningLineList.add(projectPlanningLine);
}
return planningLineList;
}
@Transactional
public List<ProjectPlanningLine> populateMyTeamPlanning(ProjectPlanning planning, Team team) throws AxelorException{
List<ProjectPlanningLine> planningLineList = new ArrayList<ProjectPlanningLine>();
List<ProjectTask> projectTaskList = null;
Set<User> userList = team.getUserSet();
for (User user : userList) {
String query = "self.assignedTo = ?1 OR ?1 MEMBER OF self.membersUserSet";
projectTaskList = Beans.get(ProjectTaskRepository.class).all().filter(query, user).fetch();
if(projectTaskList != null && !projectTaskList.isEmpty()){
for (ProjectTask projectTask : projectTaskList) {
ProjectPlanningLine projectPlanningLine = null;
projectPlanningLine = projectPlanningLineRepository.all().filter("self.user = ?1 AND self.projectTask = ?2 AND self.year = ?3 AND self.week = ?4", user, projectTask, planning.getYear(), planning.getWeek()).fetchOne();
if(projectPlanningLine == null){
projectPlanningLine = new ProjectPlanningLine();
projectPlanningLine.setUser(user);
projectPlanningLine.setProjectTask(projectTask);
projectPlanningLine.setYear(planning.getYear());
projectPlanningLine.setWeek(planning.getWeek());
projectPlanningLineRepository.save(projectPlanningLine);
}
planningLineList.add(projectPlanningLine);
}
}
}
if(planningLineList.isEmpty()){
throw new AxelorException(String.format(I18n.get(IExceptionMessage.PROJECT_PLANNING_NO_TASK_TEAM)), IException.CONFIGURATION_ERROR);
}
return planningLineList;
}
public LocalDate getFromDate(){
LocalDate todayDate = generalService.getTodayDate();
return new LocalDate(todayDate.getYear(), todayDate.getMonthOfYear(), todayDate.dayOfMonth().getMinimumValue());
}
public LocalDate getToDate(){
LocalDate todayDate = generalService.getTodayDate();
return new LocalDate(todayDate.getYear(), todayDate.getMonthOfYear(), todayDate.dayOfMonth().getMaximumValue());
}
public void getTasksForUser(ActionRequest request, ActionResponse response){
List<Map<String,String>> dataList = new ArrayList<Map<String,String>>();
try{
LocalDate todayDate = Beans.get(GeneralService.class).getTodayDate();
List<ProjectPlanningLine> linesList = Beans.get(ProjectPlanningLineRepository.class).all().
filter("self.user.id = ?1 AND self.year >= ?2 AND self.week >= ?3",
AuthUtils.getUser().getId(), todayDate.getYear(), todayDate.getWeekOfWeekyear()).fetch();
for (ProjectPlanningLine line : linesList) {
if(line.getMonday().compareTo(BigDecimal.ZERO) != 0){
LocalDate date = new LocalDate().withYear(line.getYear()).withWeekOfWeekyear(line.getWeek()).withDayOfWeek(DateTimeConstants.MONDAY);
if(date.isAfter(todayDate) || date.isEqual(todayDate)){
Map<String, String> map = new HashMap<String,String>();
map.put("taskId", line.getProjectTask().getId().toString());
map.put("name", line.getProjectTask().getFullName());
if(line.getProjectTask().getProject() != null){
map.put("projectName", line.getProjectTask().getProject().getFullName());
}
else{
map.put("projectName", "");
}
map.put("date", date.toString());
map.put("duration", line.getMonday().toString());
dataList.add(map);
}
}
if(line.getTuesday().compareTo(BigDecimal.ZERO) != 0){
LocalDate date = new LocalDate().withYear(line.getYear()).withWeekOfWeekyear(line.getWeek()).withDayOfWeek(DateTimeConstants.TUESDAY);
if(date.isAfter(todayDate) || date.isEqual(todayDate)){
Map<String, String> map = new HashMap<String,String>();
map.put("taskId", line.getProjectTask().getId().toString());
map.put("name", line.getProjectTask().getFullName());
if(line.getProjectTask().getProject() != null){
map.put("projectName", line.getProjectTask().getProject().getFullName());
}
else{
map.put("projectName", "");
}
map.put("date", date.toString());
map.put("duration", line.getTuesday().toString());
dataList.add(map);
}
}
if(line.getWednesday().compareTo(BigDecimal.ZERO) != 0){
LocalDate date = new LocalDate().withYear(line.getYear()).withWeekOfWeekyear(line.getWeek()).withDayOfWeek(DateTimeConstants.WEDNESDAY);
if(date.isAfter(todayDate) || date.isEqual(todayDate)){
Map<String, String> map = new HashMap<String,String>();
map.put("taskId", line.getProjectTask().getId().toString());
map.put("name", line.getProjectTask().getFullName());
if(line.getProjectTask().getProject() != null){
map.put("projectName", line.getProjectTask().getProject().getFullName());
}
else{
map.put("projectName", "");
}
map.put("date", date.toString());
map.put("duration", line.getWednesday().toString());
dataList.add(map);
}
}
if(line.getThursday().compareTo(BigDecimal.ZERO) != 0){
LocalDate date = new LocalDate().withYear(line.getYear()).withWeekOfWeekyear(line.getWeek()).withDayOfWeek(DateTimeConstants.THURSDAY);
if(date.isAfter(todayDate) || date.isEqual(todayDate)){
Map<String, String> map = new HashMap<String,String>();
map.put("taskId", line.getProjectTask().getId().toString());
map.put("name", line.getProjectTask().getFullName());
if(line.getProjectTask().getProject() != null){
map.put("projectName", line.getProjectTask().getProject().getFullName());
}
else{
map.put("projectName", "");
}
map.put("date", date.toString());
map.put("duration", line.getThursday().toString());
dataList.add(map);
}
}
if(line.getFriday().compareTo(BigDecimal.ZERO) != 0){
LocalDate date = new LocalDate().withYear(line.getYear()).withWeekOfWeekyear(line.getWeek()).withDayOfWeek(DateTimeConstants.FRIDAY);
if(date.isAfter(todayDate) || date.isEqual(todayDate)){
Map<String, String> map = new HashMap<String,String>();
map.put("taskId", line.getProjectTask().getId().toString());
map.put("name", line.getProjectTask().getFullName());
if(line.getProjectTask().getProject() != null){
map.put("projectName", line.getProjectTask().getProject().getFullName());
}
else{
map.put("projectName", "");
}
map.put("date", date.toString());
map.put("duration", line.getFriday().toString());
dataList.add(map);
}
}
if(line.getSaturday().compareTo(BigDecimal.ZERO) != 0){
LocalDate date = new LocalDate().withYear(line.getYear()).withWeekOfWeekyear(line.getWeek()).withDayOfWeek(DateTimeConstants.SATURDAY);
if(date.isAfter(todayDate) || date.isEqual(todayDate)){
Map<String, String> map = new HashMap<String,String>();
map.put("taskId", line.getProjectTask().getId().toString());
map.put("name", line.getProjectTask().getFullName());
if(line.getProjectTask().getProject() != null){
map.put("projectName", line.getProjectTask().getProject().getFullName());
}
else{
map.put("projectName", "");
}
map.put("date", date.toString());
map.put("duration", line.getSaturday().toString());
dataList.add(map);
}
}
if(line.getSunday().compareTo(BigDecimal.ZERO) != 0){
LocalDate date = new LocalDate().withYear(line.getYear()).withWeekOfWeekyear(line.getWeek()).withDayOfWeek(DateTimeConstants.SUNDAY);
if(date.isAfter(todayDate) || date.isEqual(todayDate)){
Map<String, String> map = new HashMap<String,String>();
map.put("taskId", line.getProjectTask().getId().toString());
map.put("name", line.getProjectTask().getFullName());
if(line.getProjectTask().getProject() != null){
map.put("projectName", line.getProjectTask().getProject().getFullName());
}
else{
map.put("projectName", "");
}
map.put("date", date.toString());
map.put("duration", line.getSunday().toString());
dataList.add(map);
}
}
}
response.setData(dataList);
}
catch(Exception e){
response.setStatus(-1);
response.setError(e.getMessage());
}
}
}