/** * TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L. * Copyright (C) 2007 Autentia Real Bussiness Solution S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.autentia.tnt.bean.activity; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.component.UIData; import javax.faces.component.UIInput; import javax.faces.component.html.HtmlInputHidden; import javax.faces.component.html.HtmlInputText; import javax.faces.component.html.HtmlSelectBooleanCheckbox; import javax.faces.component.html.HtmlSelectOneListbox; import javax.faces.component.html.HtmlSelectOneRadio; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.faces.event.ValueChangeEvent; import javax.faces.model.SelectItem; import org.acegisecurity.acls.domain.BasePermission; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.myfaces.custom.fileupload.UploadedFile; import org.apache.myfaces.custom.schedule.ScheduleMouseEvent; import org.apache.myfaces.custom.schedule.model.ScheduleEntry; import org.apache.myfaces.custom.schedule.model.ScheduleModel; import org.apache.myfaces.custom.schedule.model.SimpleScheduleModel; import org.apache.myfaces.custom.schedule.renderer.ScheduleEntryRenderer; import org.hibernate.ObjectNotFoundException; import org.springframework.util.CollectionUtils; import com.autentia.tnt.bean.BaseBean; import com.autentia.tnt.bean.NavigationResults; import com.autentia.tnt.bean.admin.SettingBean; import com.autentia.tnt.businessobject.Activity; import com.autentia.tnt.businessobject.ActivityFile; import com.autentia.tnt.businessobject.Document; import com.autentia.tnt.businessobject.DocumentCategory; import com.autentia.tnt.businessobject.DocumentVersion; import com.autentia.tnt.businessobject.ExternalActivity; import com.autentia.tnt.businessobject.Holiday; import com.autentia.tnt.businessobject.HolidayState; import com.autentia.tnt.businessobject.Organization; import com.autentia.tnt.businessobject.Project; import com.autentia.tnt.businessobject.ProjectRole; import com.autentia.tnt.businessobject.RequestHoliday; import com.autentia.tnt.businessobject.Setting; import com.autentia.tnt.businessobject.User; import com.autentia.tnt.dao.SortCriteria; import com.autentia.tnt.dao.hibernate.ProjectRoleDAO; import com.autentia.tnt.dao.hibernate.UserDAO; import com.autentia.tnt.dao.search.ActivitySearch; import com.autentia.tnt.dao.search.DocumentSearch; import com.autentia.tnt.dao.search.ExternalActivitySearch; import com.autentia.tnt.dao.search.HolidaySearch; import com.autentia.tnt.dao.search.OrganizationSearch; import com.autentia.tnt.dao.search.ProjectRoleSearch; import com.autentia.tnt.dao.search.RequestHolidaySearch; import com.autentia.tnt.jsf.schedule.renderer.BitacoreScheduleEntryRenderer; import com.autentia.tnt.manager.activity.ActivityFileManager; import com.autentia.tnt.manager.activity.ActivityManager; import com.autentia.tnt.manager.activity.ExternalActivityManager; import com.autentia.tnt.manager.admin.ProjectManager; import com.autentia.tnt.manager.admin.ProjectRoleManager; import com.autentia.tnt.manager.admin.SettingManager; import com.autentia.tnt.manager.contacts.OrganizationManager; import com.autentia.tnt.manager.document.DocumentCategoryManager; import com.autentia.tnt.manager.document.DocumentManager; import com.autentia.tnt.manager.holiday.HolidayManager; import com.autentia.tnt.manager.holiday.RequestHolidayManager; import com.autentia.tnt.manager.security.AuthenticationManager; import com.autentia.tnt.manager.security.Permission; import com.autentia.tnt.upload.Uploader; import com.autentia.tnt.upload.UploaderFactory; import com.autentia.tnt.util.DateUtils; import com.autentia.tnt.util.FacesUtils; import com.autentia.tnt.util.FileUtil; import com.autentia.tnt.util.SettingPath; import com.autentia.tnt.util.SpringUtils; /** * UI bean for Activity objects. * * @author stajanov code generator */ public class ActivityBean extends BaseBean { private boolean defaultBillable = false; /** * inner comparator class. comparares activities to order a list for start and duration * * @author german * */ private class compareActivitiesByStartAndDuration implements Comparator<Activity> { Calendar calInst1 = Calendar.getInstance(); Calendar calInst2 = Calendar.getInstance(); public int compare(Activity a1, Activity a2) { calInst1.setTime(a1.getStartDate()); calInst2.setTime(a2.getStartDate()); calInst1.add(Calendar.MINUTE, a1.getDuration()); calInst2.add(Calendar.MINUTE, a2.getDuration()); return (int)(calInst2.getTimeInMillis() - calInst1.getTimeInMillis()); } } /** * inner comparator class. comparares externalActivities to order a list for start and duration * * @author daniel * */ private class compareExternalActivitiesActivitiesByStartAndDuration implements Comparator<ExternalActivity> { Calendar calInst1 = Calendar.getInstance(); Calendar calInst2 = Calendar.getInstance(); public int compare(ExternalActivity a1, ExternalActivity a2) { calInst1.setTime(a1.getEndDate()); calInst2.setTime(a2.getEndDate()); return (int)(calInst2.getTimeInMillis() - calInst1.getTimeInMillis()); } } /** * inner comparator class. comparares two SelectItem objects to order a SelectItem list * in order to use collections.sort in getOrganizations * * */ public class OperacionesComparator implements Comparator{ public int compare(Object arg0,Object arg1) { try { SelectItem p = (SelectItem) arg0; SelectItem q = (SelectItem) arg1; return p.getLabel().compareTo(q.getLabel()); } catch (Exception ex){ return -1; } } } /** Manager */ private static ActivityManager manager = ActivityManager .getDefault(); private static ExternalActivityManager externalActivityManager = ExternalActivityManager .getDefault(); private static ActivityFileManager activityFileManager = ActivityFileManager .getDefault(); /** Serial version field */ private static final long serialVersionUID = 1L; /** Selected date in bitacore window */ private Date selectedDate = new Date(); /** Project DAO * */ private static final ProjectManager projectManager = ProjectManager .getDefault(); /** Organization DAO * */ private static final OrganizationManager organizationManager = OrganizationManager .getDefault(); /** Default DocumentCategory manager */ private static final DocumentCategoryManager dcManager = DocumentCategoryManager .getDefault(); /** Active search object */ private OrganizationSearch organizationSearch = new OrganizationSearch(); /** Selected organization * */ private Organization selectedOrganization = null; private List<Organization> organizations = new ArrayList<Organization>(); /** List of projects */ private List<Project> projects = new ArrayList<Project>(); private static AuthenticationManager authManager = AuthenticationManager .getDefault(); private static HolidayManager holidayManager = HolidayManager .getDefault(); /** Settings manager */ private static final SettingManager settings = SettingManager .getDefault(); /** Role manager */ private static final ProjectRoleManager projectRoleMgr = ProjectRoleManager .getDefault(); /** Selected project */ private Project selectedProject; /** data model */ private SimpleScheduleModel scheduleModel = new SimpleScheduleModel(); /** to reload model */ private boolean reloadModel = true; private String method = null; private final ScheduleEntryRenderer entryRenderer = new BitacoreScheduleEntryRenderer(); private final Calendar cal = Calendar.getInstance(); private static final int NO_EDIT_SELECTED = -1; private static final int EDIT_ACTIVITY = 0; private static final int EDIT_EXTERNAL_ACTIVITY = 1; private int tabsRendered = NO_EDIT_SELECTED; /** Uploaded file object */ private UploadedFile uploadFile; /** Active search object */ private DocumentSearch docSearch = new DocumentSearch(); /** Manager */ private static DocumentManager docManager = DocumentManager.getDefault(); private List<Document> documents; private BitacoreTabChangeListener listener = new BitacoreTabChangeListener(); private int selectedTab; /** * Constructor */ public ActivityBean() { // Only show entries for current user search.setUser(authManager.getCurrentPrincipal().getUser()); } /** * Get date selected in bitacore page * * @return date selected in bitacore page */ public Date getSelectedDate() { return selectedDate; } /** * Set date selected in bitacore page * * @param date * date selected in bitacore page */ public void setSelectedDate(Date date) { if (date != null) { Calendar newCal = Calendar.getInstance(); cal.setTime(selectedDate); newCal.setTime(date); if (cal.get(Calendar.MONTH) != newCal.get(Calendar.MONTH) || cal.get(Calendar.YEAR) != newCal.get(Calendar.YEAR)) { reloadModel = true; } selectedDate = date; scheduleModel.setSelectedDate(selectedDate); scheduleModel.refresh(); } } /** * Get the list of all projects * * @return the list of all projects */ public List<SelectItem> getProjects() { ArrayList<SelectItem> ret = new ArrayList<SelectItem>(); List<Project> refs = projectManager.getAllEntities(null, new SortCriteria("name")); for (Project ref : refs) { ret.add(new SelectItem(ref, ref.getClient().getName() + " - " + ref.getName())); } return ret; } public Project getSelectedProject() { if (selectedProject == null) { if (projects.size() != 0) { selectedProject = projects.get(0); } } return selectedProject; } public List<SelectItem> getRolesBySelectedProject() { ArrayList<SelectItem> ret = new ArrayList<SelectItem>(); ProjectRoleSearch prjRolSearch = new ProjectRoleSearch(); prjRolSearch.setProject(getSelectedProject()); List<ProjectRole> refs = ProjectRoleManager.getDefault().getAllEntities(prjRolSearch, new SortCriteria("name", false)); if (refs != null){ for (ProjectRole ref : refs) { ret.add(new SelectItem(ref, ref.getName())); } // Sólo preseleccionamos el primer ProjectRole del proyecto cuando haya cambiado el // proyecto, por que sino borrariamos y creariamos una situación inconsistente if (this.getRole() != null && this.getRole().getProject() != null && ! this.getRole().getProject().equals(this.getSelectedProject())){ HtmlSelectOneRadio optRole = (HtmlSelectOneRadio) FacesUtils.getComponent("activity").findComponent("tabActivity").findComponent("role"); this.setRole(refs.get(0)); optRole.setValue(this.getRole()); } } return ret; } public void onEditSelected(ActionEvent event) { // setSelectedProject( null ); } /** * Set the selectedOrganization value when the combo value changes * * @param event */ public void onSelectedOrganizationChanged(ValueChangeEvent event) { setSelectedOrganization((Organization) event.getNewValue()); // Project List<Project> projectsByOrganization = ProjectManager.getDefault().getOpenProjectsByOrganization(selectedOrganization); if (projectsByOrganization != null && projectsByOrganization.size() != 0) { this.selectedProject = (Project) projectsByOrganization.get(0); FacesContext.getCurrentInstance().getViewRoot().getAttributes(); } else { this.selectedProject = null; } HtmlSelectOneListbox projects = (HtmlSelectOneListbox) FacesUtils.getComponent("activity").findComponent("tabActivity") .findComponent("projects"); projects.setValue(selectedProject); if (selectedProject!=null) { HtmlSelectBooleanCheckbox billHtml = (HtmlSelectBooleanCheckbox)FacesUtils.getComponent("activity").findComponent("tabActivity").findComponent("billable"); billHtml.setValue(selectedProject.getBillable()); setBillable(selectedProject.getBillable()); HtmlInputHidden hiddenHtml = (HtmlInputHidden)FacesUtils.getComponent("activity").findComponent("tabActivity").findComponent("defaultBillable"); hiddenHtml.setValue(selectedProject.getBillable()); setDefaultBillable(selectedProject.getBillable()); } FacesUtils.renderResponse(); } /** * Set the projectOrganization value when the combo value changes * * @param event */ public void onSelectedProjectChanged(ValueChangeEvent event) { setSelectedProject((Project) event.getNewValue()); if(selectedProject!=null) { HtmlSelectBooleanCheckbox billHtml = (HtmlSelectBooleanCheckbox)FacesUtils.getComponent("activity").findComponent("tabActivity").findComponent("billable"); billHtml.setValue(selectedProject.getBillable()); setBillable(selectedProject.getBillable()); HtmlInputHidden hiddenHtml = (HtmlInputHidden)FacesUtils.getComponent("activity").findComponent("tabActivity").findComponent("defaultBillable"); hiddenHtml.setValue(selectedProject.getBillable()); setDefaultBillable(selectedProject.getBillable()); } FacesUtils.renderResponse(); } /** * Get the list of all projects * * @return the list of all projects */ public List<SelectItem> getProjectsVisiblesBySelectedOrganization() { Organization companySelected = this.getSelectedOrganization(); List<Project> openProjects = ProjectManager.getDefault().getOpenProjectsByOrganization(companySelected); ArrayList<SelectItem> ret = new ArrayList<SelectItem>(); if(selectedProject !=null && selectedProject.isFinished()){ ret.add(new SelectItem(selectedProject, selectedProject.getName() + " (*)")); } if (openProjects == null || openProjects.size() == 0) { projects.clear(); return ret; } Project proj = null; for (Object ref : openProjects) { proj = (Project) ref; projects.add(proj); if (!proj.isFinished() && !proj.getRoles().isEmpty()) { ret.add(new SelectItem(proj, proj.getName())); } } return ret; } /** * @param selectedOrganization * the selectedOrganization to set */ public void setSelectedOrganization(Organization selectedOrganization) { // Organization this.selectedOrganization = selectedOrganization; } public void setSelectedProject(Project project) { // Project this.selectedProject = project; } /** * Get the selectedOrganization value * * @return a Organization selected */ public Organization getSelectedOrganization() { if (selectedOrganization == null) { organizations = organizationManager.getAllEntities(null, new SortCriteria("name")); if (! CollectionUtils.isEmpty(organizations)){ selectedOrganization = organizations.get(0); } } return selectedOrganization; } /** * @return Organizaciones con proyectos abiertos que ademas tengan ROLES creados */ public List<SelectItem> getOrganizations() { ArrayList<SelectItem> ret = new ArrayList<SelectItem>(32); List<Project> projects = projectManager.getDefault().getOpenProjects(new SortCriteria("name")); HashMap<Integer, Organization> companies = new HashMap<Integer, Organization>(32); if (! CollectionUtils.isEmpty(projects)){ for (Project project: projects){ if ( (! project.isFinished()) && (project.getOpen())){ Set <ProjectRole> roles = project.getRoles(); if (! CollectionUtils.isEmpty(roles)){ Organization company = project.getClient(); if (! companies.containsKey(company.getId())){ companies.put(company.getId(), company); ret.add(new SelectItem(company, company.getName())); } } } } } Collections.sort(ret, new OperacionesComparator()); if((this.selectedOrganization == null) && (ret.size() > 0)) { this.setSelectedOrganization((Organization) ret.get(0).getValue()); } return ret; } @Override public String doAfterSave(String result) { /* If user is editing an Activity... */ if (activity != null) { Setting val = settings.get(SettingPath.BITACORE_LAST_BILLABLE, true); SettingManager.setValue(val, activity.isBillable()); settings.save(val); val = settings.get(SettingPath.BITACORE_LAST_ROLEID, true); SettingManager.setValue(val, activity.getRole().getId()); settings.save(val); } return super.doAfterSave(result); } public String doBeforeSaveExternalActivity() { String result = super.doBeforeSave(); // if the user not has a category if (externalActivity.getDocumentCategory() == null || externalActivity.getDocumentCategory().getId() == null) { DocumentCategory padre = dcManager.getDocumentCategoryParent(); // User category DocumentCategory extActDocCategory = new DocumentCategory(); extActDocCategory.setName(externalActivity.getName()); extActDocCategory.setDescription(externalActivity.getName()); extActDocCategory.setPadre(padre); externalActivity.setDocumentCategory(extActDocCategory); } else { // Updates the category name externalActivity.getDocumentCategory().setName(externalActivity.getName()); externalActivity.getDocumentCategory().setDescription(externalActivity.getName()); } return result; } /* activity - generated by stajanov (do not edit/delete) */ /** Logger */ private static final Log log = LogFactory.getLog(ActivityBean.class); // External entities' DAOs /** User DAO * */ private static final UserDAO userDAO = new UserDAO(); /** ProjectRole DAO * */ private static final ProjectRoleDAO roleDAO = new ProjectRoleDAO(); /** Upload service */ private static final Uploader uploader = UploaderFactory .getInstance("externalActivity"); /** Active Activity object */ private Activity activity; /** Active Activity object */ private ExternalActivity externalActivity; /** Active search object */ private ActivitySearch search = new ActivitySearch(); /** Default sort column */ private String sortColumn = "startDate"; /** Default sort order */ private boolean sortAscending = false; private float monthPerformedHours = 0; private static final String EXT_ACT_DOC_VERSION = "1.0"; /** * List activitys. Order depends on Faces parameter sort. * * @return the list of all activitys sorted by requested criterion */ public List<Activity> getAll() { return manager.getAllEntities(search, new SortCriteria(sortColumn, sortAscending)); // return activityDAO.search(search, new SortCriteria(sortColumn, // sortAscending)); } // Getters to list possible values of related entities /** * Get the list of all users * * @return the list of all users */ public List<SelectItem> getUsers() { ArrayList<SelectItem> ret = new ArrayList<SelectItem>(); List<User> refs = userDAO.search(new SortCriteria("name")); for (User ref : refs) { ret.add(new SelectItem(ref, ref.getName())); } return ret; } /** * Get the list of all roles * * @return the list of all roles */ public List<SelectItem> getRoles() { ArrayList<SelectItem> ret = new ArrayList<SelectItem>(); List<ProjectRole> refs = roleDAO.search(new SortCriteria("name")); for (ProjectRole ref : refs) { ret.add(new SelectItem(ref, ref.getName())); } return ret; } // Getters to list possible values of enum fields // Methods to create/remove instances of one-to-many entities (slave // entities) /** * Whether or not create button is available for user * * @return true if user can create objects of type Account */ public boolean isCreateAvailable() { return SpringUtils.isRolePermissionGranted(Permission.Entity_Create(Activity.class)); } /** * Whether or not edit button is available for user * * @return true if user can edit current object */ public boolean isEditAvailable() { return SpringUtils.isAclPermissionGranted(activity, BasePermission.WRITE); } /** * Whether or not delete button is available for user * * @return true if user can delete current object */ public boolean isDeleteAvailable() { return (activity.getId() != null) && SpringUtils.isAclPermissionGranted(activity, BasePermission.DELETE); } /** * Whether or not delete button is available for user * * @return true if user can delete current object */ public boolean isDeleteExternalActivityAvailable() { return (externalActivity.getId() != null) && SpringUtils.isAclPermissionGranted(externalActivity, BasePermission.DELETE); } /** * Go to create page * * @return forward to CREATE page */ public String create() { activity = new Activity(); externalActivity = new ExternalActivity(); selectedOrganization = null; selectedProject = null; organizations.clear(); projects.clear(); cal.setTime(scheduleModel.getSelectedDate()); if (scheduleModel.getMode() == ScheduleModel.MONTH || scheduleModel.getMode() == ScheduleModel.WEEK) { cal.set(Calendar.HOUR_OF_DAY, ((SettingBean)FacesUtils.getBean("settingBean")).getMySettings().getWorkingDayHourStarts()); } activity.setStartDate(cal.getTime()); activity.setDescription(FacesUtils.getMessage("activity.description")); activity.setUser(authManager.getCurrentPrincipal().getUser()); externalActivity.setStartDate(cal.getTime()); externalActivity.setEndDate(cal.getTime()); //it is going to end in the same day externalActivity.setComments(FacesUtils.getMessage("offer.observations")); externalActivity.setOwnerId(authManager.getCurrentPrincipal().getUser().getId()); externalActivity.setDepartmentId(authManager.getCurrentPrincipal().getUser().getDepartmentId()); DocumentCategory padre = dcManager.getDocumentCategoryParent(); // User category DocumentCategory extActDocCategory = new DocumentCategory(); extActDocCategory.setName(externalActivity.getName()); extActDocCategory.setDescription(externalActivity.getName()); extActDocCategory.setPadre(padre); externalActivity.setDocumentCategory(extActDocCategory); // Preselect last selected options Setting val = settings.get(SettingPath.BITACORE_LAST_ROLEID, false); int projectRoleId = SettingManager.getInt(val, -1); Project pr = null; if (projectRoleId != -1) { ProjectRole projectRole; try{ projectRole = projectRoleMgr.getEntityById(projectRoleId); if(!projectRole.getProject().isFinished()) { setRole(projectRole); setSelectedProject(projectRole.getProject()); setSelectedOrganization(getSelectedProject().getClient()); pr=projectRole.getProject(); } }catch(ObjectNotFoundException onfex){ // Caso especial. Si no se localiza el anterior rol, continuamos con la ejecucion. } } if(pr!=null) { setBillable(pr.getBillable()); setDefaultBillable(pr.getBillable()); } else { val = settings.get(SettingPath.BITACORE_LAST_BILLABLE, false); setBillable(SettingManager.getBoolean(val, false)); } if (scheduleModel.getMode() == ScheduleModel.MONTH || scheduleModel.getMode() == ScheduleModel.WEEK) { ActivitySearch searchToday = new ActivitySearch(); ExternalActivitySearch extActivitySearchToday = new ExternalActivitySearch(); Calendar initToday = Calendar.getInstance(); initToday.setTime(scheduleModel.getSelectedDate()); Calendar lastToday = Calendar.getInstance(); lastToday.setTime(scheduleModel.getSelectedDate()); initToday.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY)); initToday.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE)); initToday.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND)); initToday.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND)); lastToday.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY)); lastToday.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE)); lastToday.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND)); lastToday.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND)); searchToday.setStartStartDate(initToday.getTime()); searchToday.setEndStartDate(lastToday.getTime()); extActivitySearchToday.setStartStartDate(initToday.getTime()); extActivitySearchToday.setEndStartDate(lastToday.getTime()); // Try to obtain the last hour in day. searchToday.setUser(authManager.getCurrentPrincipal().getUser()); extActivitySearchToday.setOwner(authManager.getCurrentPrincipal().getUser()); List<Activity> activities = manager.getAllEntities(searchToday, new SortCriteria( sortColumn, sortAscending)); List<ExternalActivity> extActivities = externalActivityManager.getAllEntities(extActivitySearchToday, new SortCriteria(sortColumn, sortAscending)); if (activities.size() > 0 && extActivities.size() <= 0) { //No externalActivities //sort is descendent Collections.sort(activities, new compareActivitiesByStartAndDuration()); activity.setStartDate(activities.get(0).getEndDate()); externalActivity.setStartDate(activities.get(0).getEndDate()); externalActivity.setEndDate(activities.get(0).getEndDate()); } else if (activities.size() <= 0 && extActivities.size() > 0) { //No activities Collections.sort(extActivities, new compareExternalActivitiesActivitiesByStartAndDuration()); activity.setStartDate(extActivities.get(0).getEndDate()); externalActivity.setStartDate(extActivities.get(0).getEndDate()); externalActivity.setEndDate(extActivities.get(0).getEndDate()); } else if (activities.size() > 0 && extActivities.size() > 0) { Collections.sort(activities, new compareActivitiesByStartAndDuration()); Collections.sort(extActivities, new compareExternalActivitiesActivitiesByStartAndDuration()); Date lastActivityEndDate = activities.get(0).getEndDate(); Date lastExtActivityEndDate = extActivities.get(0).getEndDate(); Date startDate = (lastActivityEndDate.compareTo(lastExtActivityEndDate) > 0) ? lastActivityEndDate : lastExtActivityEndDate; activity.setStartDate(startDate); externalActivity.setStartDate(startDate); externalActivity.setEndDate(startDate); } } tabsRendered = NO_EDIT_SELECTED; return NavigationResults.CREATE; } public String createDocument() { Document doc = new Document(); HashSet<DocumentCategory> categories = new HashSet<DocumentCategory>(); categories.add(externalActivity.getDocumentCategory()); doc.setCategories(categories); doc.setOwnerId(externalActivity.getOwnerId()); doc.setDepartmentId(externalActivity.getDepartmentId()); doc.setCreationDate(new Date()); // docVersion.setCreationDate(new Date()); // docVersion.setOwnerId(externalActivity.getOwnerId()); // docVersion.setDepartmentId(externalActivity.getDepartmentId()); // docVersion.setDocument(doc); // docVersion.setVersion(EXT_ACT_DOC_VERSION); // // if (doc.getVersions() == null) { // doc.setVersions(new HashSet<DocumentVersion>()); // } // // doc.getVersions().add(docVersion); documents.add(doc); return null; } /** * Go to edit page * * @return forward to EDIT page */ public String edit() { ScheduleEntry entry = scheduleModel.getSelectedEntry(); String tmpId = entry.getId(); String[] tmpIdParts = tmpId.split("_"); Integer id = Integer.parseInt(tmpIdParts[tmpIdParts.length-1]); // activity = activityDAO.getById(id); if (entry instanceof ActivityScheduleEntry) { activity = manager.getEntityById(id); selectedProject = activity.getRole().getProject(); selectedOrganization = selectedProject.getClient(); setDefaultBillable(selectedProject.getBillable()); tabsRendered = EDIT_ACTIVITY; } else if (entry instanceof ExternalActivityScheduleEntry) { externalActivity = externalActivityManager.getEntityById(id); ArrayList<DocumentCategory> categories = new ArrayList<DocumentCategory>(); categories.add(externalActivity.getDocumentCategory()); docSearch = new DocumentSearch(); docSearch.setCategories(categories); documents = docManager.getAllEntities(docSearch, null); tabsRendered = EDIT_EXTERNAL_ACTIVITY; } else { tabsRendered = NO_EDIT_SELECTED; return NavigationResults.LIST; } return NavigationResults.EDIT; } /** * Save bean and stay on it * * @return forward to list page */ public String save() { doBeforeSave(); if (activity.getId() == null) { manager.insertEntity(activity); } else { manager.updateEntity(activity); } // Calls an after save action String result = doAfterSave(NavigationResults.LIST); // Unselect object activity = null; scheduleModel.setSelectedEntry(null); reloadModel = true; return result; } /** * Delete bean and go back to beans list * * @return forward to LIST page */ public String delete() { // activityDAO.delete(activity); Activity act = manager.getEntityById(activity.getId()); manager.deleteEntity(act); // manager.deleteEntity(activity); act = null; activity = null; scheduleModel.setSelectedEntry(null); reloadModel = true; scheduleModel.refresh(); return NavigationResults.LIST; } public String saveExternalActivity () { doBeforeSaveExternalActivity(); try { String fileName=null; if (uploadFile != null) { fileName = FileUtil.getFileName(uploadFile.getName()); final ActivityFile file = new ActivityFile(); file.setInsertDate(new Date()); file.setUser(authManager.getCurrentPrincipal().getUser()); file.setExternalActivity(externalActivity); file.setFile(fileName); file.setFileMime(uploadFile.getContentType()); externalActivity.getFiles().add(file); } if (externalActivity.getId() == null) { externalActivityManager.insertEntity(externalActivity); } else { externalActivityManager.updateEntity(externalActivity); } if (uploadFile != null) { if (uploader.exists(Integer.toString(externalActivity.getId()), fileName)) { // el fichero ya existe y lo versionamos uploader.version(Integer.toString(externalActivity.getId()), fileName, uploadFile); } else { uploader.store(Integer.toString(externalActivity.getId()), uploadFile); } } // Calls an after save action String result = super.doAfterSave(NavigationResults.LIST); return result; } catch (IOException e) { log.error("save - exception uploading field file", e); FacesUtils.addErrorMessage("file", "error.fileTransfer", e .getMessage()); return null; } } public String deleteExternalActivity() { // activityDAO.delete(activity); ExternalActivity act = externalActivityManager.getEntityById(externalActivity.getId()); externalActivityManager.deleteEntity(act); // manager.deleteEntity(activity); act = null; externalActivity = null; scheduleModel.setSelectedEntry(null); reloadModel = true; scheduleModel.refresh(); return NavigationResults.LIST; } /** * Go back to beans list * * @return forward to LIST page */ public String list() { activity = null; scheduleModel.setSelectedEntry(null); reloadModel = true; scheduleModel.refresh(); return NavigationResults.LIST; } /** * Go to search page * * @return forward to SEARCH page */ public String search() { return NavigationResults.SEARCH; } /** * Check if we have an active object. * * @return true is an object is selected */ public boolean isActivitySelected() { return activity != null; } /** * Check if we have an external activity active object. * * @return true is an object is selected */ public boolean isExternalActivitySelected() { return externalActivity != null; } // Getters and setters to manipulate sorting public boolean isSortAscending() { return sortAscending; } public void setSortAscending(boolean sortAscending) { this.sortAscending = sortAscending; } public String getSortColumn() { return sortColumn; } public void setSortColumn(String sortColumn) { this.sortColumn = sortColumn; } // Getters and setters to handle search public ActivitySearch getSearch() { return search; } public Date getSearchStartStartDate() { return search.getStartStartDate(); } public void setSearchStartStartDate(Date val) { if (val != null) { search.setStartStartDate(val); } else { search.unsetStartStartDate(); } } public boolean isSearchStartStartDateValid() { return search.isStartStartDateSet(); } public void setSearchStartStartDateValid(boolean val) { if (val) { search.setStartStartDate(search.getStartStartDate()); } else { search.unsetStartStartDate(); } } public Date getSearchEndStartDate() { return search.getEndStartDate(); } public void setSearchEndStartDate(Date val) { if (val != null) { search.setEndStartDate(val); } else { search.unsetEndStartDate(); } } public boolean isSearchEndStartDateValid() { return search.isEndStartDateSet(); } public void setSearchEndStartDateValid(boolean val) { if (val) { search.setEndStartDate(search.getEndStartDate()); } else { search.unsetEndStartDate(); } } public Integer getSearchDuration() { return search.getDuration(); } public void setSearchDuration(Integer val) { if (search.isDurationSet()) { search.setDuration(val); } } public boolean isSearchDurationValid() { return search.isDurationSet(); } public void setSearchDurationValid(boolean val) { if (val) { search.setDuration(search.getDuration()); } else { search.unsetDuration(); } } public String getSearchDescription() { return search.getDescription(); } public void setSearchDescription(String val) { if (search.isDescriptionSet()) { search.setDescription(val); } } public boolean isSearchDescriptionValid() { return search.isDescriptionSet(); } public void setSearchDescriptionValid(boolean val) { if (val) { search.setDescription(search.getDescription()); } else { search.unsetDescription(); } } public Boolean getSearchBillable() { return search.getBillable(); } public void setSearchBillable(Boolean val) { if (search.isBillableSet()) { search.setBillable(val); } } public boolean isSearchBillableValid() { return search.isBillableSet(); } public void setSearchBillableValid(boolean val) { if (val) { search.setBillable(search.getBillable()); } else { search.unsetBillable(); } } public User getSearchUser() { return search.getUser(); } public void setSearchUser(User val) { if (search.isUserSet()) { search.setUser(val); } } public boolean isSearchUserValid() { return search.isUserSet(); } public void setSearchUserValid(boolean val) { if (val) { search.setUser(search.getUser()); } else { search.unsetUser(); } } public ProjectRole getSearchRole() { return search.getRole(); } public void setSearchRole(ProjectRole val) { if (search.isRoleSet()) { search.setRole(val); } } public boolean isSearchRoleValid() { return search.isRoleSet(); } public void setSearchRoleValid(boolean val) { if (val) { search.setRole(search.getRole()); } else { search.unsetRole(); } } // Getters and setters to handle uploads // Getters and setters to manipulate active Activity object public java.lang.Integer getId() { return activity.getId(); } public int getStartTimeHour() { cal.clear(); cal.setTime(getStartDate()); return cal.get(Calendar.HOUR_OF_DAY); } public void setStartTimeHour(int startTime) { cal.clear(); cal.setTime(getStartDate()); cal.set(Calendar.HOUR_OF_DAY, startTime); setStartDate(cal.getTime()); } public int getStartTimeMinute() { cal.clear(); cal.setTime(getStartDate()); return cal.get(Calendar.MINUTE); } public void setStartTimeMinute(int startTime) { cal.clear(); cal.setTime(getStartDate()); cal.set(Calendar.MINUTE, startTime); setStartDate(cal.getTime()); } public int getEndTimeHour() { cal.clear(); cal.setTime(getEndDate()); return cal.get(Calendar.HOUR_OF_DAY); } public void setEndTimeHour(int endTime) { cal.clear(); cal.setTime(getEndDate()); cal.set(Calendar.HOUR_OF_DAY, endTime); setEndDate(cal.getTime()); } public int getEndTimeMinute() { cal.clear(); cal.setTime(getEndDate()); return cal.get(Calendar.MINUTE); } public void setEndTimeMinute(int endTime) { cal.clear(); cal.setTime(getEndDate()); cal.set(Calendar.MINUTE, endTime); setEndDate(cal.getTime()); } public int getExternalActivityStartTimeHour() { cal.clear(); cal.setTime(getExternalActivityStartDate()); return cal.get(Calendar.HOUR_OF_DAY); } public void setExternalActivityStartTimeHour(int startTime) { cal.clear(); cal.setTime(getExternalActivityStartDate()); cal.set(Calendar.HOUR_OF_DAY, startTime); setExternalActivityStartDate(cal.getTime()); } public int getExternalActivityStartTimeMinute() { cal.clear(); cal.setTime(getExternalActivityStartDate()); return cal.get(Calendar.MINUTE); } public void setExternalActivityStartTimeMinute(int startTime) { cal.clear(); cal.setTime(getExternalActivityStartDate()); cal.set(Calendar.MINUTE, startTime); setExternalActivityStartDate(cal.getTime()); } public int getExternalActivityEndTimeHour() { cal.clear(); cal.setTime(getExternalActivityEndDate()); return cal.get(Calendar.HOUR_OF_DAY); } public void setExternalActivityEndTimeHour(int endTime) { cal.clear(); cal.setTime(getExternalActivityEndDate()); cal.set(Calendar.HOUR_OF_DAY, endTime); setExternalActivityEndDate(cal.getTime()); } public int getExternalActivityEndTimeMinute() { cal.clear(); cal.setTime(getExternalActivityEndDate()); return cal.get(Calendar.MINUTE); } public void setExternalActivityEndTimeMinute(int endTime) { cal.clear(); cal.setTime(getExternalActivityEndDate()); cal.set(Calendar.MINUTE, endTime); setExternalActivityEndDate(cal.getTime()); } public Date getStartDate() { return activity.getStartDate(); } public void setStartDate(Date startDate) { activity.setStartDate(startDate); } public Date getEndDate() { return activity.getEndDate(); } public void setEndDate(Date endDate) { activity.setEndDate(endDate); } public Date getExternalActivityStartDate() { return externalActivity.getStartDate(); } public void setExternalActivityStartDate(Date startDate) { externalActivity.setStartDate(startDate); } public Date getExternalActivityEndDate() { return externalActivity.getEndDate(); } public void setExternalActivityEndDate(Date endDate) { externalActivity.setEndDate(endDate); } public int getDuration() { return activity.getDuration(); } public void setDuration(int duration) { activity.setDuration(duration); } public String getDescription() { return activity.getDescription(); } public void setDescription(String description) { activity.setDescription(description); } public boolean isBillable() { return activity.isBillable(); } public void setBillable(boolean billable) { activity.setBillable(billable); } public User getUser() { return activity.getUser(); } public void setUser(User user) { activity.setUser(user); } public ProjectRole getRole() { return activity.getRole(); } public void setRole(ProjectRole role) { activity.setRole(role); } /* activity - generated by stajanov (do not edit/delete) */ /** * @return */ public ScheduleModel getScheduleModel() { loadModel(); return scheduleModel; } /** * Load data from persistence tier to model for efficiency purposes only * load a month of data */ /** * */ public void loadModel() { if (reloadModel) { if (log.isTraceEnabled()) { log.trace("loading model from persistence tier"); } scheduleModel = new SimpleScheduleModel(); fillActivities(scheduleModel); fillExternalActivities(scheduleModel); fillHolidays(scheduleModel); scheduleModel.setMode(((SettingBean)FacesUtils.getBean("settingBean")).getMySettings().getMode()); scheduleModel.setSelectedDate(selectedDate); scheduleModel.refresh(); reloadModel = false; } } /** * @param event */ public void activityClicked(ScheduleMouseEvent event) { setSelectedDate(event.getClickedDate()); method = null; switch (event.getEventType()) { case ScheduleMouseEvent.SCHEDULE_BODY_CLICKED: method = "create"; break; case ScheduleMouseEvent.SCHEDULE_ENTRY_CLICKED: method = "edit"; break; case ScheduleMouseEvent.SCHEDULE_HEADER_CLICKED: method = "create"; break; case ScheduleMouseEvent.SCHEDULE_NOTHING_CLICKED: break; default: break; } } /** * @return */ public String actionPerformed() { Class[] types = new Class[0]; Object[] args = new Object[0]; String ret = NavigationResults.LIST; if (method != null) { try { ret = (String) this.getClass().getMethod(method, types).invoke(this, args); } catch (Exception e) { // doesn't ocurrs } } method = null; return ret; } /** * @return */ public ScheduleEntryRenderer getEntryRenderer() { return entryRenderer; } /** * @param event */ public void onSchedlueModeChanged(ValueChangeEvent event) { scheduleModel.setMode(((Integer) event.getNewValue()).intValue()); scheduleModel.refresh(); } /** * @return */ public String editSettings() { return NavigationResults.SETTINGS; } /** * @return */ public float getMonthPerformedHours() { /* we must reload model to obtain data */ reloadModel = true; loadModel(); return monthPerformedHours; } /** * @return */ public float getMonthTotalHours() { ArrayList<Integer> diasContemplados = new ArrayList<Integer>(); cal.setTime(selectedDate); float hoursPerDay = ((SettingBean)FacesUtils.getBean("settingBean")).getMySettings().getWorkingHours(); int weekendsInMonth = 0; int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH); for (int i = 1; i <= daysInMonth; i++) { cal.set(Calendar.DAY_OF_MONTH, i); if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { weekendsInMonth++; diasContemplados.add(i); } } // Restamos d�as de vacaciones aceptadas y dias de fiesta Calendar calMin = Calendar.getInstance(); Calendar calMax = Calendar.getInstance(); Calendar calAux = Calendar.getInstance(); calMin.setTime(selectedDate); calMin.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DAY_OF_MONTH)); calMin.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY)); calMin.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE)); calMin.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND)); calMin.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND)); calMax.setTime(selectedDate); calMax.set(Calendar.DAY_OF_MONTH, cal.getMaximum(Calendar.DAY_OF_MONTH)); calMax.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY)); calMax.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE)); calMax.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND)); calMax.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND)); HolidaySearch monthSearch = new HolidaySearch(); monthSearch.setStartDate(calMin.getTime()); monthSearch.setEndDate(calMax.getTime()); List<Holiday> listaHolidays = holidayManager.getAllEntities(monthSearch, null); int holidays = 0; for (Holiday holiday : listaHolidays) { calAux.setTime(holiday.getDate()); int day = calAux.get(Calendar.DAY_OF_MONTH); if(!diasContemplados.contains(day)) { holidays++; diasContemplados.add(day); } } int requestedHolidays = 0; RequestHolidayManager rhManager = RequestHolidayManager.getDefault(); RequestHolidaySearch rhSearch = new RequestHolidaySearch(); rhSearch.setUserRequest(authManager.getCurrentPrincipal().getUser()); rhSearch.setState(HolidayState.ACCEPT); rhSearch.setStartBeginDate(calMin.getTime()); rhSearch.setEndBeginDate(calMax.getTime()); rhSearch.setStartFinalDate(calMin.getTime()); rhSearch.setEndFinalDate(calMax.getTime()); List<RequestHoliday> listH = rhManager.getAllEntities(rhSearch, null); for (RequestHoliday rH : listH) { Calendar cActual = Calendar.getInstance(); cActual.setTime(rH.getBeginDate()); while (!cActual.getTime().after(rH.getFinalDate())) { int day = cActual.get(Calendar.DAY_OF_MONTH); if(!diasContemplados.contains(day)) { requestedHolidays++; diasContemplados.add(day); } cActual.add(Calendar.DAY_OF_MONTH, 1); } } return (daysInMonth - weekendsInMonth - holidays - requestedHolidays) * hoursPerDay; } public void validateHoursExternalActivity(FacesContext context, UIComponent toValidate, Object value) { validateHoursGeneric(context, toValidate, value, "tabExternalActivity"); } public void validateHours(FacesContext context, UIComponent toValidate, Object value) { validateHoursGeneric(context, toValidate, value, "tabActivity"); } public void validateHoursGeneric(FacesContext context, UIComponent toValidate, Object value, String tabName) { HtmlInputText startTimeHour = (HtmlInputText) FacesUtils.getComponent("activity").findComponent(tabName) .findComponent("startTimeHour"); HtmlInputText startTimeMinute = (HtmlInputText) FacesUtils.getComponent("activity").findComponent(tabName) .findComponent("startTimeMinute"); HtmlInputText endTimeHour = (HtmlInputText) FacesUtils.getComponent("activity").findComponent(tabName) .findComponent("endTimeHour"); HtmlInputText endTimeMinute = (HtmlInputText) FacesUtils.getComponent("activity").findComponent(tabName) .findComponent("endTimeMinute"); HtmlInputText duration = (HtmlInputText) FacesUtils.getComponent("activity").findComponent(tabName) .findComponent("duration"); if (startTimeHour.getSubmittedValue() != null && startTimeMinute.getSubmittedValue() != null && endTimeHour.getSubmittedValue() != null && endTimeMinute.getSubmittedValue() != null) { Date startTime = DateUtils.timeToDate(Integer.valueOf( startTimeHour.getSubmittedValue().toString()).intValue(), Integer.valueOf( startTimeMinute.getSubmittedValue().toString()).intValue()); Date endTime = DateUtils.timeToDate(Integer.valueOf( endTimeHour.getSubmittedValue().toString()).intValue(), Integer.valueOf( endTimeMinute.getSubmittedValue().toString()).intValue()); if (toValidate.equals(startTimeHour) || toValidate.equals(startTimeMinute)) { if (startTime.after(endTime)) { ((UIInput) toValidate).setValid(false); FacesMessage message = new FacesMessage( "La hora de inicio no puede ser posterior a la hora de fin"); context.addMessage(toValidate.getClientId(context), message); } } if (toValidate.equals(endTimeHour) || toValidate.equals(endTimeMinute)) { if (startTime.before(endTime)) { ((UIInput) toValidate).setValid(false); FacesMessage message = new FacesMessage( "La hora de fin no puede ser anterior a la hora inicial"); context.addMessage(toValidate.getClientId(context), message); } } if (toValidate.equals(duration)) { if (Integer.valueOf(duration.getSubmittedValue().toString()).intValue() < 0) { ((UIInput) toValidate).setValid(false); FacesMessage message = new FacesMessage("La duracion no puede ser negativa"); context.addMessage(toValidate.getClientId(context), message); } } } } private void fillHolidays(SimpleScheduleModel model) { Calendar calMin = Calendar.getInstance(); Calendar calMax = Calendar.getInstance(); calMin = getMinimumSearchTime(selectedDate); calMax = getMaximumSearchTime(selectedDate); RequestHolidayManager rhManager = RequestHolidayManager.getDefault(); RequestHolidaySearch rhSearch = new RequestHolidaySearch(); rhSearch.setUserRequest(authManager.getCurrentPrincipal().getUser()); rhSearch.setState(HolidayState.ACCEPT); rhSearch.setStartBeginDate(calMin.getTime()); rhSearch.setEndBeginDate(calMax.getTime()); rhSearch.setStartFinalDate(calMin.getTime()); rhSearch.setEndFinalDate(calMax.getTime()); List<RequestHoliday> listH = rhManager.getAllEntities(rhSearch, null); for (RequestHoliday rH : listH) { Calendar cActual = Calendar.getInstance(); cActual.setTime(rH.getBeginDate()); while (!cActual.getTime().after(rH.getFinalDate())) { if (cActual.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cActual.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { model.setHoliday(cActual.getTime(), FacesUtils .getMessage("activity.acceptedHolidays")); } cActual.add(Calendar.DAY_OF_MONTH, 1); } } HolidaySearch monthSearch = new HolidaySearch(); monthSearch.setStartDate(calMin.getTime()); monthSearch.setEndDate(calMax.getTime()); List<Holiday> listaHolidays = holidayManager.getAllEntities(monthSearch, null); for (Holiday holiday : listaHolidays) { model.setHoliday(holiday.getDate(), holiday.getDescription()); } } private void fillExternalActivities(SimpleScheduleModel model) { Calendar calMin = Calendar.getInstance(); Calendar calMax = Calendar.getInstance(); calMin = getMinimumSearchTime(selectedDate); calMax = getMaximumSearchTime(selectedDate); ExternalActivitySearch search = new ExternalActivitySearch(); search.setStartStartDate(calMin.getTime()); search.setEndStartDate(calMax.getTime()); search.setStartEndDate(calMin.getTime()); search.setEndEndDate(calMax.getTime()); search.setOwner(authManager.getCurrentPrincipal().getUser()); List<ExternalActivity> extActivities = externalActivityManager.getAllEntities(search,new SortCriteria( sortColumn, sortAscending)); for (ExternalActivity extActivity : extActivities) { ExternalActivityScheduleEntry entry = new ExternalActivityScheduleEntry(extActivity); model.addEntry(entry); } } private void fillActivities(SimpleScheduleModel model) { ActivitySearch searchMonth = new ActivitySearch(); Calendar calMin = Calendar.getInstance(); Calendar calMax = Calendar.getInstance(); calMin = getMinimumSearchTime(selectedDate); calMax = getMaximumSearchTime(selectedDate); searchMonth.setStartStartDate(calMin.getTime()); searchMonth.setEndStartDate(calMax.getTime()); searchMonth.setUser(authManager.getCurrentPrincipal().getUser()); /* search data in persistence layer */ List<Activity> activities = manager.getAllEntities(searchMonth, new SortCriteria( sortColumn, sortAscending)); /* * activityDAO.search(searchMonth, new SortCriteria(sortColumn, * sortAscending)); */ monthPerformedHours = 0; /* load data in component */ for (Activity actualActivity : activities) { calMin.setTime(actualActivity.getStartDate()); calMax.setTime(selectedDate); if (calMin.get(Calendar.MONTH) == calMax.get(Calendar.MONTH)) { monthPerformedHours += actualActivity.getDuration(); } ActivityScheduleEntry entry = new ActivityScheduleEntry(actualActivity); scheduleModel.addEntry(entry); } monthPerformedHours /= 60; } private Calendar getMaximumSearchTime(Date date) { Calendar calMax = Calendar.getInstance(); calMax.setTime(date); calMax.set(Calendar.DAY_OF_MONTH, cal.getMaximum(Calendar.DAY_OF_MONTH)); calMax.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY)); calMax.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE)); calMax.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND)); calMax.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND)); if (((SettingBean)FacesUtils.getBean("settingBean")).getMySettings().getLoadExtraDays()) { calMax.add(Calendar.MONTH, 1); } return calMax; } private Calendar getMinimumSearchTime(Date date) { Calendar calMin = Calendar.getInstance(); calMin.setTime(date); calMin.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DAY_OF_MONTH)); calMin.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY)); calMin.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE)); calMin.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND)); calMin.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND)); if (((SettingBean)FacesUtils.getBean("settingBean")).getMySettings().getLoadExtraDays()) { calMin.add(Calendar.MONTH, -1); } return calMin; } public boolean isDefaultBillable() { return defaultBillable; } public void setDefaultBillable(boolean defaultBillable) { this.defaultBillable = defaultBillable; } /** * @return * @see com.autentia.tnt.businessobject.ExternalActivity#getCategory() */ public String getCategory() { return externalActivity.getCategory(); } /** * @return * @see com.autentia.tnt.businessobject.ExternalActivity#getComments() */ public String getComments() { return externalActivity.getComments(); } /** * @return * @see com.autentia.tnt.businessobject.ExternalActivity#getLocation() */ public String getLocation() { return externalActivity.getLocation(); } /** * @return * @see com.autentia.tnt.businessobject.ExternalActivity#getName() */ public String getName() { return externalActivity.getName(); } /** * @return * @see com.autentia.tnt.businessobject.ExternalActivity#getOrganizer() */ public String getOrganizer() { return externalActivity.getOrganizer(); } /** * @param category * @see com.autentia.tnt.businessobject.ExternalActivity#setCategory(java.lang.String) */ public void setCategory(String category) { externalActivity.setCategory(category); } /** * @param comments * @see com.autentia.tnt.businessobject.ExternalActivity#setComments(java.lang.String) */ public void setComments(String comments) { externalActivity.setComments(comments); } /** * @param location * @see com.autentia.tnt.businessobject.ExternalActivity#setLocation(java.lang.String) */ public void setLocation(String location) { externalActivity.setLocation(location); } /** * @param name * @see com.autentia.tnt.businessobject.ExternalActivity#setName(java.lang.String) */ public void setName(String name) { externalActivity.setName(name); } /** * @param organizer * @see com.autentia.tnt.businessobject.ExternalActivity#setOrganizer(java.lang.String) */ public void setOrganizer(String organizer) { externalActivity.setOrganizer(organizer); } /** * retrieves the duration of the external activity, calculated as the difference between start time and end time * @return */ public int getExternalActivityDuration() { GregorianCalendar startCal = new GregorianCalendar(); GregorianCalendar endCal = new GregorianCalendar(); startCal.setTime(getExternalActivityStartDate()); endCal.setTime(getExternalActivityEndDate()); int duration = (int) (endCal.getTimeInMillis() - startCal.getTimeInMillis())/(60*1000); return duration; } /** * sets the end time using the duration (in minutes) of the external activity * @param minutes */ public void setExternalActivityDuration(int minutes) { } public boolean isActivityTabRendered() { return (tabsRendered == NO_EDIT_SELECTED || tabsRendered == EDIT_ACTIVITY); } public boolean isExternalActivityTabRendered() { return (tabsRendered == NO_EDIT_SELECTED || tabsRendered == EDIT_EXTERNAL_ACTIVITY); } public int getSelectedTabIndex() { return tabsRendered == EDIT_EXTERNAL_ACTIVITY ? EDIT_EXTERNAL_ACTIVITY : EDIT_ACTIVITY; } public List<Document> getDocuments() { return documents; } /** * @return the uploadFile */ public UploadedFile getUploadFile() { return uploadFile; } /** * @param uploadFile the uploadFile to set */ public void setUploadFile(UploadedFile uploadFile) { this.uploadFile = uploadFile; } /** * @return * @see com.autentia.tnt.businessobject.ExternalActivity#getFiles() */ public Set<ActivityFile> getFiles() { return externalActivity.getFiles(); } /** * @return the listener */ public BitacoreTabChangeListener getListener() { return listener; } /** * @return * @see com.autentia.tnt.bean.activity.BitacoreTabChangeListener#getSelectedTab() */ public int getSelectedTab() { return selectedTab; } public void setSelectedTab(int selectedTab) { this.selectedTab = selectedTab; } public Integer getExternalActivityId() { return externalActivity.getId(); } public String deleteFile() { UIData table = (UIData) FacesUtils.getComponent("activity:tabExternalActivity:list"); ActivityFile toDelete = (ActivityFile) table.getRowData(); externalActivity.getFiles().remove(toDelete); return null; } public boolean isProjectsRendered(){ boolean has = true; if (this.selectedOrganization == null){ has = false; } else { List<Project> projects = ProjectManager.getDefault().getProjectsByOrganization(selectedOrganization); has = ! ((projects == null) || projects.isEmpty()); } return has; } public boolean isRolesRendered(){ boolean has = true; if (this.selectedOrganization == null){ has = false; } else if (this.selectedProject == null) { has = false; } else { Set<ProjectRole> roles = this.selectedProject.getRoles(); has = ! ((roles == null) || roles.isEmpty()); } return has; } }