/**
* 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.util.*;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.*;
import org.apache.commons.logging.*;
import com.autentia.tnt.bean.*;
import com.autentia.tnt.businessobject.*;
import com.autentia.tnt.dao.*;
import com.autentia.tnt.dao.search.*;
import com.autentia.tnt.manager.activity.ObjectiveManager;
import com.autentia.tnt.manager.admin.ProjectManager;
import com.autentia.tnt.manager.admin.SettingManager;
import com.autentia.tnt.manager.admin.UserManager;
import com.autentia.tnt.manager.contacts.OrganizationManager;
import com.autentia.tnt.manager.security.AuthenticationManager;
import com.autentia.tnt.manager.security.Permission;
import com.autentia.tnt.upload.*;
import com.autentia.tnt.util.*;
import org.acegisecurity.acls.domain.BasePermission;
/**
* UI bean for Objective objects.
* @author stajanov code generator
*/
public class ObjectiveBean extends BaseBean
{
/** Serial version field */
private static final long serialVersionUID = -1L;
/** Number of child objectives that will be created when propagating a past objective */
private int childObjectivesCount = ConfigurationUtil.getDefault().getChildObjectivesCount();
private final static AuthenticationManager authMgr = AuthenticationManager.getDefault();
private final static ObjectiveManager objectiveMgr = ObjectiveManager.getDefault();
/** Organization DAO **/
private static final OrganizationManager organizationManager = OrganizationManager.getDefault();
/** Settings manager */
private static final SettingManager settings = SettingManager.getDefault();
/** Active search object */
private OrganizationSearch organizationSearch = new OrganizationSearch();
/** Selected organization * */
private Organization selectedOrganization = null;
/** List of organizations */
private List<Organization> organizations = new ArrayList<Organization>();
private int userSelected = ALL_USERS;
public static int ALL_USERS = -1;
public void onSelectedUserChanged(ValueChangeEvent event) {
UIComponent comp1 = FacesUtils.getComponent("objectives:listThisWeek");
HtmlDataTable tabla1 = (HtmlDataTable) comp1;
tabla1.setFirst(0);
UIComponent comp2 = FacesUtils.getComponent("objectives:listPastNotCompleted");
HtmlDataTable tabla2 = (HtmlDataTable) comp2;
tabla2.setFirst(0);
}
public List<SelectItem> getFiltrableUsers(){
List<User> refs = new ArrayList<User>();
ObjectiveSearch search = new ObjectiveSearch();
List<Objective> objetivos = manager.getAllEntities(search, null);
UserManager userManager = UserManager.getDefault();
UserSearch userSearch = new UserSearch();
userSearch.setActive(true);
int sizeMaxUser = userManager.getAllEntities(userSearch, null).size();
for(Objective obj: objetivos) {
User us = obj.getUser();
if(us.isActive() && !refs.contains(us)) {
refs.add(us);
}
if(refs.size()>=sizeMaxUser)
break;
}
Collections.sort(refs, new UserComparator());
ArrayList<SelectItem> ret = new ArrayList<SelectItem>();
ret.add(new SelectItem(Integer.valueOf(ALL_USERS),"--"));
for( User ref : refs ){
ret.add( new SelectItem( ref.getId(), ref.getName() ) );
}
return ret;
}
public boolean isFiltrableUser() {
return getFiltrableUsers().size()>2;
}
/**
* Mark a listed objective as completed.
* @return forward to current page (null)
*/
public String complete()
{
Integer id = Integer.parseInt( FacesUtils.getRequestParameter(ROW_ID) );
objective = objectiveMgr.getEntityById(id);
objective.setState(ObjectiveState.FINISHED);
objectiveMgr.updateEntity(objective);
return null;
}
/**
* Show propagation screen for a non-completed objective.
* @return forward to propagation page
*/
public String propagate()
{
Integer id = Integer.parseInt( FacesUtils.getRequestParameter(ROW_ID) );
objective = objectiveMgr.getEntityById(id);
return NavigationResults.PROPAGATE;
}
/**
* Confirm propagation action for a non-completed objective.
* @return forward to list page
*/
public String confirmPropagate()
{
// TODO: aƱadir campo padre del objetivo para trazabilidad de los objetivos propagados
// Set objective as expired and update it
objective.setState( ObjectiveState.EXPIRED );
objectiveMgr.updateEntity(objective);
// Create child objectives
for( int i=0 ; i<childObjectivesCount ; i++ )
{
Objective child = new Objective();
child.setEndDate(calculateEndDate());
child.setStartDate(new Date());
child.setProject(objective.getProject());
child.setUser(objective.getUser());
child.setName(FacesUtils.formatMessage("msg.pendingObjective",i+1,objective.getName()));
child.setState(ObjectiveState.PENDING);
objectiveMgr.insertEntity(child);
}
return NavigationResults.LIST;
}
public List<Objective> getPastNotCompleted(boolean filterUser) {
// Search objectives
ObjectiveSearch search = new ObjectiveSearch();
Date fechaPlusOne = null;
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DATE, -1);
search.setEndEndDate(cal.getTime());
search.setState(ObjectiveState.PENDING);
if(userSelected!=ALL_USERS && filterUser) {
search.setUser(UserManager.getDefault().getEntityById(userSelected));
}
return objectiveMgr.getAllEntities( search, new SortCriteria(sortColumn,sortAscending) );
}
/**
* List past non-complete objectives sorted by name.
* @return the list of objectives
*/
public List<Objective> getPastNotCompleted()
{
return getPastNotCompleted(true);
}
public List<Objective> getCurrent(boolean filterUser)
{
// Calculate future friday
// Search objectives
ObjectiveSearch s = new ObjectiveSearch();
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DATE, -1);
s.setStartEndDate(cal.getTime());
if(userSelected!=ALL_USERS && filterUser) {
s.setUser(UserManager.getDefault().getEntityById(userSelected));
}
return objectiveMgr.getAllEntities( s, new SortCriteria(sortColumn,sortAscending) );
}
/**
* List objectives for this week. Order depends on Faces parameter sort.
* @return the list of objectives sorted by requested criterion
*/
public List<Objective> getCurrent()
{
return getCurrent(true);
}
/**
* Get number of child objectives to be created
* @return number of child objectives to be created
*/
public int getChildObjectivesCount()
{
return childObjectivesCount;
}
/**
* Set number of child objectives to be created
* @param childObjectivesCount number of child objectives to be created
*/
public void setChildObjectivesCount( int childObjectivesCount )
{
this.childObjectivesCount = childObjectivesCount;
}
/**
* Get possible values for childObjectivesCount to be shown in a combo box.
* @return list of possible values for childObjectivesCount
*/
public List<SelectItem> getChildObjectivesCounts()
{
List<SelectItem> ret = new ArrayList<SelectItem>();
int i;
for( i=ConfigurationUtil.getDefault().getMinChildObjectivesCount() ;
i<=ConfigurationUtil.getDefault().getMaxChildObjectivesCount() ;
i++ )
{
ret.add( new SelectItem( i, Integer.toString(i) ) );
}
return ret;
}
/**
* Calculate objective end date: the end date is the nearest future friday
* starting today.
* @return the end date based on today's date
*/
private Date calculateEndDate()
{
return moveToFriday( new Date(), true );
}
/**
* Move a date to one of its surrounding fridays.
* @param d the reference date
* @param inFuture whether to move to future/previous friday
* @return the requested friday
*/
private Date moveToFriday( Date d, boolean inFuture )
{
Calendar cal = Calendar.getInstance();
cal.setTime(d);
switch( cal.get(Calendar.DAY_OF_WEEK) )
{
case Calendar.MONDAY:
cal.add( Calendar.DAY_OF_WEEK, inFuture ? 4 : -3 );
break;
case Calendar.TUESDAY:
cal.add( Calendar.DAY_OF_WEEK, inFuture ? 3 : -4 );
break;
case Calendar.WEDNESDAY:
cal.add( Calendar.DAY_OF_WEEK, inFuture ? 2 : -5 );
break;
case Calendar.THURSDAY:
cal.add( Calendar.DAY_OF_WEEK, inFuture ? 1 : -6 );
break;
case Calendar.FRIDAY:
cal.add( Calendar.DAY_OF_WEEK, inFuture ? 0 : -7 );
break;
case Calendar.SATURDAY:
cal.add( Calendar.DAY_OF_WEEK, inFuture ? 6 : -1 );
break;
case Calendar.SUNDAY:
cal.add( Calendar.DAY_OF_WEEK, inFuture ? 5 : -2 );
break;
}
return cal.getTime();
}
@Override
public String doAfterSave( String result )
{
Setting val = settings.get(SettingPath.OBJECTIVE_LAST_PROJECTID, true);
SettingManager.setValue(val, objective.getProject().getId());
settings.save(val);
return super.doAfterSave( result );
}
/* objective - generated by stajanov (do not edit/delete) */
/** Logger */
private static final Log log = LogFactory.getLog(ObjectiveBean.class);
/** Active search object */
private ObjectiveSearch search = new ObjectiveSearch();
/** Manager */
private static ObjectiveManager manager = ObjectiveManager.getDefault();
/** Upload service */
private static final Uploader uploader = UploaderFactory.getInstance("objective");
/** Active Objective object */
private Objective objective;
/** Default sort column */
private String sortColumn = "name";
/** Default sort order */
private boolean sortAscending = true;
/**
* List objectives. Order depends on Faces parameter sort.
* @return the list of all objectives sorted by requested criterion
*/
public List<Objective> getAll(){
return manager.getAllEntities(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(){
List<User> refs = UserManager.getDefault().getAllEntities( null, new SortCriteria("name") );
ArrayList<SelectItem> ret = new ArrayList<SelectItem>();
for( User ref : refs ){
ret.add( new SelectItem( ref, ref.getName() ) );
}
return ret;
}
/**
* Get the list of all projects
* @return the list of all projects
*/
public List<SelectItem> getProjects(){
List<Project> refs = ProjectManager.getDefault().getAllEntities( null, new SortCriteria("name") );
ArrayList<SelectItem> ret = new ArrayList<SelectItem>();
for( Project ref : refs ){
ret.add( new SelectItem( ref, ref.getName() ) );
}
return ret;
}
// Getters to list possible values of enum fields
public String getStateFormatted(){
if(this.getState()!=null) {
return FacesUtils.formatMessage("ObjectiveState."+this.getState().name());
} else {
return "";
}
}
/**
* Get the list of all State values
* @return the list of all State values
*/
public List<SelectItem> getStates(){
ArrayList<SelectItem> ret = new ArrayList<SelectItem>();
ObjectiveState[] vals = ObjectiveState.values();
for( ObjectiveState val : vals ){
ret.add( new SelectItem( val, FacesUtils.formatMessage("ObjectiveState."+val.name()) ) );
}
return ret;
}
// 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 Objective
*/
public boolean isCreateAvailable()
{
return SpringUtils.isRolePermissionGranted(Permission.Entity_Create(Objective.class));
}
/**
* Whether or not edit button is available for user
* @return true if user can edit current object
*/
public boolean isEditAvailable()
{
return SpringUtils.isAclPermissionGranted(objective,BasePermission.WRITE);
}
/**
* Whether or not delete button is available for user
* @return true if user can delete current object
*/
public boolean isDeleteAvailable()
{
return (objective.getId()!=null) &&
SpringUtils.isAclPermissionGranted(objective,BasePermission.DELETE);
}
/**
* Go to create page
* @return forward to CREATE page
*/
public String create(){
sortColumn = "name";
objective = new Objective();
objective.setStartDate( new Date() );
objective.setEndDate( calculateEndDate() );
objective.setUser( authMgr.getCurrentPrincipal().getUser() );
objective.setState( ObjectiveState.PENDING );
// Preselect last selected options\n\
int projectId = SettingManager.getInt(settings.get( SettingPath.OBJECTIVE_LAST_PROJECTID, false ), -1);
if( projectId!=-1 )
{
Project project = ProjectManager.getDefault().getEntityById(projectId);
setSelectedOrganization(project.getClient());
objective.setProject(project);
}
return NavigationResults.CREATE;
}
/**
* Go to detail page
* @return forward to DETAIL page
*/
public String detail(){
sortColumn = "name";
Integer id = Integer.parseInt( FacesUtils.getRequestParameter(ROW_ID) );
objective = manager.getEntityById(id);
return SpringUtils.isAclPermissionGranted( objective, BasePermission.WRITE )
? NavigationResults.EDIT
: NavigationResults.DETAIL;
}
/**
* Save bean and stay on it
* @return forward to list page
*/
public String save(){
doBeforeSave();
if( objective.getId()==null ){
manager.insertEntity(objective);
} else {
manager.updateEntity(objective);
}
// Calls an after save action
String result = doAfterSave(NavigationResults.LIST);
// Unselect object
objective = null;
return result;
}
/**
* Delete bean and go back to beans list
* @return forward to LIST page
*/
public String delete(){
manager.deleteEntity(objective);
objective = null;
return NavigationResults.LIST;
}
/**
* Go back to beans list
* @return forward to LIST page
*/
public String list(){
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 isObjectiveSelected(){
return objective!=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 ObjectiveSearch getSearch(){
return search;
}
public ObjectiveState getSearchState(){
return search.getState();
}
public void setSearchState( ObjectiveState val ){
if( search.isStateSet() ) {
search.setState( val );
}
}
public boolean isSearchStateValid(){
return search.isStateSet();
}
public void setSearchStateValid( boolean val ){
if( val ){
search.setState( search.getState() );
} else {
search.unsetState();
}
}
public String getSearchName(){
return search.getName();
}
public void setSearchName( String val ){
if( search.isNameSet() ) {
search.setName( val );
}
}
public boolean isSearchNameValid(){
return search.isNameSet();
}
public void setSearchNameValid( boolean val ){
if( val ){
search.setName( search.getName() );
} else {
search.unsetName();
}
}
public String getSearchLog(){
return search.getLog();
}
public void setSearchLog( String val ){
if( search.isLogSet() ) {
search.setLog( val );
}
}
public boolean isSearchLogValid(){
return search.isLogSet();
}
public void setSearchLogValid( boolean val ){
if( val ){
search.setLog( search.getLog() );
} else {
search.unsetLog();
}
}
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 Date getSearchStartEndDate(){
return search.getStartEndDate();
}
public void setSearchStartEndDate( Date val ){
if( val!=null ){
search.setStartEndDate( val );
} else {
search.unsetStartEndDate();
}
}
public boolean isSearchStartEndDateValid(){
return search.isStartEndDateSet();
}
public void setSearchStartEndDateValid( boolean val ){
if( val ){
search.setStartEndDate( search.getStartEndDate() );
} else {
search.unsetStartEndDate();
}
}
public Date getSearchEndEndDate(){
return search.getEndEndDate();
}
public void setSearchEndEndDate( Date val ){
if( val!=null ){
search.setEndEndDate( val );
} else {
search.unsetEndEndDate();
}
}
public boolean isSearchEndEndDateValid(){
return search.isEndEndDateSet();
}
public void setSearchEndEndDateValid( boolean val ){
if( val ){
search.setEndEndDate( search.getEndEndDate() );
} else {
search.unsetEndEndDate();
}
}
public Integer getSearchDepartmentId(){
return search.getDepartmentId();
}
public void setSearchDepartmentId( Integer val ){
if( search.isDepartmentIdSet() ) {
search.setDepartmentId( val );
}
}
public boolean isSearchDepartmentIdValid(){
return search.isDepartmentIdSet();
}
public void setSearchDepartmentIdValid( boolean val ){
if( val ){
search.setDepartmentId( search.getDepartmentId() );
} else {
search.unsetDepartmentId();
}
}
public Date getSearchStartInsertDate(){
return search.getStartInsertDate();
}
public void setSearchStartInsertDate( Date val ){
if( val!=null ){
search.setStartInsertDate( val );
} else {
search.unsetStartInsertDate();
}
}
public boolean isSearchStartInsertDateValid(){
return search.isStartInsertDateSet();
}
public void setSearchStartInsertDateValid( boolean val ){
if( val ){
search.setStartInsertDate( search.getStartInsertDate() );
} else {
search.unsetStartInsertDate();
}
}
public Date getSearchEndInsertDate(){
return search.getEndInsertDate();
}
public void setSearchEndInsertDate( Date val ){
if( val!=null ){
search.setEndInsertDate( val );
} else {
search.unsetEndInsertDate();
}
}
public boolean isSearchEndInsertDateValid(){
return search.isEndInsertDateSet();
}
public void setSearchEndInsertDateValid( boolean val ){
if( val ){
search.setEndInsertDate( search.getEndInsertDate() );
} else {
search.unsetEndInsertDate();
}
}
public Date getSearchStartUpdateDate(){
return search.getStartUpdateDate();
}
public void setSearchStartUpdateDate( Date val ){
if( val!=null ){
search.setStartUpdateDate( val );
} else {
search.unsetStartUpdateDate();
}
}
public boolean isSearchStartUpdateDateValid(){
return search.isStartUpdateDateSet();
}
public void setSearchStartUpdateDateValid( boolean val ){
if( val ){
search.setStartUpdateDate( search.getStartUpdateDate() );
} else {
search.unsetStartUpdateDate();
}
}
public Date getSearchEndUpdateDate(){
return search.getEndUpdateDate();
}
public void setSearchEndUpdateDate( Date val ){
if( val!=null ){
search.setEndUpdateDate( val );
} else {
search.unsetEndUpdateDate();
}
}
public boolean isSearchEndUpdateDateValid(){
return search.isEndUpdateDateSet();
}
public void setSearchEndUpdateDateValid( boolean val ){
if( val ){
search.setEndUpdateDate( search.getEndUpdateDate() );
} else {
search.unsetEndUpdateDate();
}
}
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 Project getSearchProject(){
return search.getProject();
}
public void setSearchProject( Project val ){
if( search.isProjectSet() ) {
search.setProject( val );
}
}
public boolean isSearchProjectValid(){
return search.isProjectSet();
}
public void setSearchProjectValid( boolean val ){
if( val ){
search.setProject( search.getProject() );
} else {
search.unsetProject();
}
}
// Getters and setters to handle uploads
// Getters and setters to manipulate active Objective object
public java.lang.Integer getId() {
return objective.getId();
}
public ObjectiveState getState() {
return objective.getState();
}
public void setState( ObjectiveState state ) {
objective.setState( state );
}
public String getName() {
return objective.getName();
}
public void setName( String name ) {
objective.setName( name );
}
public String getLog() {
return objective.getLog();
}
public void setLog( String log ) {
objective.setLog( log );
}
public Date getStartDate() {
return objective.getStartDate();
}
public void setStartDate( Date startDate ) {
objective.setStartDate( startDate );
}
public Date getEndDate() {
return objective.getEndDate();
}
public void setEndDate( Date endDate ) {
objective.setEndDate( endDate );
}
public Integer getDepartmentId() {
return objective.getDepartmentId();
}
public void setDepartmentId( Integer departmentId ) {
objective.setDepartmentId( departmentId );
}
public Date getInsertDate() {
return objective.getInsertDate();
}
public void setInsertDate( Date insertDate ) {
objective.setInsertDate( insertDate );
}
public Date getUpdateDate() {
return objective.getUpdateDate();
}
public void setUpdateDate( Date updateDate ) {
objective.setUpdateDate( updateDate );
}
public User getUser() {
return objective.getUser();
}
public void setUser( User user ) {
objective.setUser( user );
}
public Project getProject() {
return objective.getProject();
}
public void setProject( Project project ) {
objective.setProject( project );
}
/* objective - generated by stajanov (do not edit/delete) */
/**
* Get the list of all organizations
*
* @return the list of all organizations
*/
public List<SelectItem> getOrganizations()
{
ArrayList<SelectItem> ret = new ArrayList<SelectItem>();
organizations = organizationManager.getAllEntities(organizationSearch, new SortCriteria(sortColumn, sortAscending));
for (Organization ref : organizations)
{
ret.add(new SelectItem(ref, ref.getName()));
}
return ret;
}
/**
* Set the selectedOrganization value when the combo value changes
* @param event
*/
public void onSelectedOrganizationChanged(ValueChangeEvent event)
{
setSelectedOrganization((Organization) event.getNewValue());
FacesUtils.renderResponse();
}
/**
* Get the list of all projects
* @return the list of all projects
*/
public List<SelectItem> getProjectsOpenBySelectedOrganization()
{
List<Project> refs = ProjectManager.getDefault().getProjectsByOrganization(selectedOrganization);
ArrayList<SelectItem> ret = new ArrayList<SelectItem>();
for (Object ref : refs)
{
Project proy = (Project) ref;
if (!proy.isFinished())
{
ret.add(new SelectItem(proy, proy.getName()));
}
}
return ret;
}
/**
* Get the selectedOrganization value
* @return a Organization selected
*/
public Organization getSelectedOrganization()
{
if (objective != null && objective.getProject() != null)
{
selectedOrganization = objective.getProject().getClient();
return selectedOrganization;
}
else
{
selectedOrganization = organizations.get(0);
}
return selectedOrganization;
}
/**
* @param selectedOrganization the selectedOrganization to set
*/
public void setSelectedOrganization(Organization selectedOrganization)
{
this.selectedOrganization = selectedOrganization;
}
public int getUserSelected() {
return userSelected;
}
public void setUserSelected(int userSelected) {
this.userSelected = userSelected;
}
}