Example usage for org.hibernate.criterion DetachedCriteria createCriteria

List of usage examples for org.hibernate.criterion DetachedCriteria createCriteria

Introduction

In this page you can find the example usage for org.hibernate.criterion DetachedCriteria createCriteria.

Prototype

public DetachedCriteria createCriteria(String associationPath) 

Source Link

Document

Creates a nested DetachedCriteria representing the association path.

Usage

From source file:ro.cs.ts.model.dao.impl.DaoActivityImpl.java

License:Open Source License

/**
* Search for activities/*from   w  w w  . j a va 2s .c om*/
* 
* @author Adelina
* 
* @param searchActivityBean
* @param projectIds
* @param isDeleteAction
* @return
* @throws BusinessException 
*/
public List<Activity> getFromSearch(SearchActivityBean searchActivityBean, Set<Integer> projectIds,
        Integer organizationId, boolean isDeleteAction, MessageSource messageSource) throws BusinessException {
    logger.debug("getFromSearch - START ");

    // set search criterion
    DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.activityForListingEntity);
    DetachedCriteria dcCount = DetachedCriteria.forEntityName(IModelConstant.activityForListingEntity);

    UserAuth userAuth = (UserAuth) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    // organization      
    if (searchActivityBean.getOrganizationId() != null) {
        dc.add(Restrictions.eq("organizationId", searchActivityBean.getOrganizationId()));
        dcCount.add(Restrictions.eq("organizationId", searchActivityBean.getOrganizationId()));
    }

    // name      
    if (Tools.getInstance().stringNotEmpty(searchActivityBean.getName())) {
        dc.add(Restrictions.ilike("name", "%".concat(searchActivityBean.getName().concat("%"))));
        dcCount.add(Restrictions.ilike("name", "%".concat(searchActivityBean.getName().concat("%"))));
        logger.debug("name = " + searchActivityBean.getName());
    }

    // project   
    if (searchActivityBean.getProjectId() != null) {
        if (searchActivityBean.getProjectId() != IConstant.NOM_ACTIVITY_SEARCH_ALL
                && searchActivityBean.getProjectId() != IConstant.NOM_ACTIVITY_SEARCH_IN_ORGANIZATION) {
            //set the selected projectId as search criteria               
            dc.createCriteria("projectDetails")
                    .add(Restrictions.eq("projectId", searchActivityBean.getProjectId()));
            dcCount.createCriteria("projectDetails")
                    .add(Restrictions.eq("projectId", searchActivityBean.getProjectId()));
        } else if (searchActivityBean.getProjectId() == IConstant.NOM_ACTIVITY_SEARCH_ALL) {
            if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_ActivityAdvancedSearch())) {
                DetachedCriteria subquery = DetachedCriteria
                        .forEntityName(IModelConstant.activityForListingEntity);
                subquery.createCriteria("projectDetails").add(Restrictions.in("projectId", projectIds));
                subquery.add(Restrictions.disjunction());
                subquery.setProjection(Projections.id());
                dc.add(Expression.or(Subqueries.propertyIn("activityId", subquery),
                        Restrictions.isNull("projectDetails")));
                dcCount.add(Expression.or(Subqueries.propertyIn("activityId", subquery),
                        Restrictions.isNull("projectDetails")));
            }
        } else if (searchActivityBean.getProjectId() == IConstant.NOM_ACTIVITY_SEARCH_IN_ORGANIZATION) {
            dc.add(Restrictions.isNull("projectDetails"));
            dcCount.add(Restrictions.isNull("projectDetails"));
        }
    }

    // Status
    dc.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));
    dcCount.add(Restrictions.ne("status", IConstant.NOM_ACTIVITY_STATUS_DELETED));

    // Billable
    if (searchActivityBean.getBillable() != null) {
        if (searchActivityBean.getBillable().equals(IConstant.NOM_BILLABLE_YES)
                || searchActivityBean.getBillable().equals(IConstant.NOM_BILLABLE_NO)) {
            dc.add(Restrictions.eq("billable", searchActivityBean.getBillable()));
            dcCount.add(Restrictions.eq("billable", searchActivityBean.getBillable()));
        }
    }

    //the results list
    List<Activity> res = null;

    //the order can be done while retrieving the data from the database only if the sort parameter is the activity name or billable;
    //this cannot be done if the results must be ordered by project name
    if (searchActivityBean.getSortParam() != null && !"".equals(searchActivityBean.getSortParam())
            && !"projectName".equals(searchActivityBean.getSortParam())) {
        // check if I have to order the results
        // if I have to, check if I have to order them ascending or descending
        if (searchActivityBean.getSortDirection() == -1) {
            // ascending
            dc.addOrder(Order.asc(searchActivityBean.getSortParam()));
        } else {
            // descending
            dc.addOrder(Order.desc(searchActivityBean.getSortParam()));
        }

        // if the request didn't come from the pagination area, 
        // it means that I have to set the number of results and pages
        if (isDeleteAction || searchActivityBean.getNbrOfResults() == -1) {
            boolean isSearch = false;
            if (searchActivityBean.getNbrOfResults() == -1) {
                isSearch = true;
            }
            // set the count(*) restriction         
            dcCount.setProjection(Projections.countDistinct("activityId"));

            //findByCriteria must be called with firstResult and maxResults parameters; the default findByCriteria(DetachedCriteria criteria) implementation
            //sets firstResult and maxResults to -1, which kills the countDistinct Projection         
            int nbrOfResults = ((Integer) getHibernateTemplate().findByCriteria(dcCount, 0, 0).get(0))
                    .intValue();
            logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
            searchActivityBean.setNbrOfResults(nbrOfResults);

            // get the number of pages
            if (nbrOfResults % searchActivityBean.getResultsPerPage() == 0) {
                searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.getResultsPerPage());
            } else {
                searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.getResultsPerPage() + 1);
            }
            // after an activity is deleted, the same page has to be displayed;
            //only when all the client from last page are deleted, the previous page will be shown 
            if (isDeleteAction && (searchActivityBean.getCurrentPage() > searchActivityBean.getNbrOfPages())) {
                searchActivityBean.setCurrentPage(searchActivityBean.getNbrOfPages());
            } else if (isSearch) {
                searchActivityBean.setCurrentPage(1);
            }
        }

        res = (List<Activity>) getHibernateTemplate().findByCriteria(dc,
                (searchActivityBean.getCurrentPage() - 1) * searchActivityBean.getResultsPerPage(),
                searchActivityBean.getResultsPerPage());
    } else {
        res = (List<Activity>) getHibernateTemplate().findByCriteria(dc);
        // if the request didn't come from the pagination area, 
        // it means that I have to set the number of results and pages
        if (isDeleteAction || searchActivityBean.getNbrOfResults() == -1) {
            boolean isSearch = false;
            if (searchActivityBean.getNbrOfResults() == -1) {
                isSearch = true;
            }
            int nbrOfResults = res.size();
            logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
            searchActivityBean.setNbrOfResults(nbrOfResults);

            // get the number of pages
            if (nbrOfResults % searchActivityBean.getResultsPerPage() == 0) {
                searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.getResultsPerPage());
            } else {
                searchActivityBean.setNbrOfPages(nbrOfResults / searchActivityBean.getResultsPerPage() + 1);
            }
            // after an exchange is deleted, the same page has to be displayed;
            //only when all the exchanges from last page are deleted, the previous page will be shown 
            if (isDeleteAction && (searchActivityBean.getCurrentPage() > searchActivityBean.getNbrOfPages())) {
                searchActivityBean.setCurrentPage(searchActivityBean.getNbrOfPages());
            } else if (isSearch) {
                searchActivityBean.setCurrentPage(1);
            }
        }
    }

    List<Project> projects = new ArrayList<Project>();

    if (projectIds.size() > 0) {
        projects = BLProject.getInstance().getProjectsSimpleByProjectIds(projectIds);
        logger.debug("projects = " + projects);
    }

    // setting the project name 
    for (Activity activity : res) {
        if (activity.getProjectDetails() != null && activity.getProjectDetails().getProjectId() != null) {
            if (projects != null && projects.size() > 0) {
                for (Project project : projects) {
                    if (activity.getProjectDetails().getProjectId().equals(project.getProjectId())) {
                        activity.setProjectName(project.getName());
                        activity.setProjectId(project.getProjectId());
                        activity.setProjectManagerId(project.getManagerId());
                        logger.debug("activity = " + activity);
                        break;
                    }
                }
            }
        } else {
            activity.setProjectId(-1);
            activity.setProjectName(messageSource.getMessage(PROJECT_FROM_ORG, null, null));
        }

        logger.debug("projectName = " + activity.getProjectName());
    }

    List<Activity> activities = new ArrayList<Activity>();
    if (searchActivityBean.getSortParam() != null && "projectName".equals(searchActivityBean.getSortParam())) {
        //sorting the exchanges list
        //------sort the list
        if (searchActivityBean.getSortParam().equals("projectName")) {
            Collections.sort(res, ActivityComparator.getInstance().activityProjectNameComparator());
        }

        //ascending or descending
        if (searchActivityBean.getSortDirection() == IConstant.DESCENDING) {
            Collections.reverse(res);
        }
        long start = (searchActivityBean.getCurrentPage() - 1) * searchActivityBean.getResultsPerPage();
        long end = searchActivityBean.getCurrentPage() * searchActivityBean.getResultsPerPage();

        // go over the entries            
        for (int i = (int) start; i < end; i++) {
            if (i >= res.size()) {
                continue;
            }
            activities.add(res.get(i));
        }
    } else {
        activities = res;
    }

    logger.debug("getFromSearch - END");
    return activities;
}

From source file:ro.cs.ts.model.dao.impl.DaoCostSheetImpl.java

License:Open Source License

/**
 * Searches for cost sheets using the criterion defined in searchCostSheetBean
 * @author Coni/* ww w. j  a v  a2s  .  c om*/
 * @param searchCostSheetBean
 * @param isDeleteAction
 * @return
 * @throws BusinessException 
 * @throws BusinessException
 */
public List<CostSheet> getResultsForSearch(SearchCostSheetBean searchCostSheetBean, boolean isDeleteAction)
        throws BusinessException {
    logger.debug("getResultsForSearch - START");

    UserAuth userAuth = (UserAuth) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.costSheetForListingEntity);
    DetachedCriteria dcCount = DetachedCriteria.forEntityName(IModelConstant.costSheetForListingEntity);

    //COST SHEET ID
    if (searchCostSheetBean.getId() != null) {
        dc.add(Restrictions.eq("costSheetId", searchCostSheetBean.getId()));
        dcCount.add(Restrictions.eq("costSheetId", searchCostSheetBean.getId()));
    }

    //ACTIVITY NAME
    if (searchCostSheetBean.getActivityName() != null && !"".equals(searchCostSheetBean.getActivityName())) {
        dc.add(Restrictions.ilike("activityName",
                "%".concat(searchCostSheetBean.getActivityName().concat("%"))));
        dcCount.add(Restrictions.ilike("activityName",
                "%".concat(searchCostSheetBean.getActivityName().concat("%"))));
    }

    //START DATE
    if (searchCostSheetBean.getStartDate() != null) {
        dc.add(Restrictions.ge("date", searchCostSheetBean.getStartDate()));
        dcCount.add(Restrictions.ge("date", searchCostSheetBean.getStartDate()));
    }

    //END DATE
    if (searchCostSheetBean.getEndDate() != null) {
        dc.add(Restrictions.le("date", searchCostSheetBean.getEndDate()));
        dcCount.add(Restrictions.le("date", searchCostSheetBean.getEndDate()));
    }

    //BILLABLE
    if (searchCostSheetBean.getBillable() != null) {
        if (searchCostSheetBean.getBillable().equals(IConstant.NOM_BILLABLE_YES)
                || searchCostSheetBean.getBillable().equals(IConstant.NOM_BILLABLE_NO)) {
            dc.add(Restrictions.eq("billable", searchCostSheetBean.getBillable()));
            dcCount.add(Restrictions.eq("billable", searchCostSheetBean.getBillable()));
        }
    }

    //ORGANIZATION ID
    if (searchCostSheetBean.getOrganizationId() != null) {
        dc.add(Restrictions.eq("organizationId", searchCostSheetBean.getOrganizationId()));
        dcCount.add(Restrictions.eq("organizationId", searchCostSheetBean.getOrganizationId()));
    }

    //STATUS
    dc.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));
    dcCount.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));

    //COST PRICE MIN
    if (searchCostSheetBean.getCostPriceMin() != null) {
        dc.add(Restrictions.ge("costPrice", searchCostSheetBean.getCostPriceMin()));
        dcCount.add(Restrictions.ge("costPrice", searchCostSheetBean.getCostPriceMin()));
    }

    //COST PRICE MAX
    if (searchCostSheetBean.getCostPriceMax() != null) {
        dc.add(Restrictions.le("costPrice", searchCostSheetBean.getCostPriceMax()));
        dcCount.add(Restrictions.le("costPrice", searchCostSheetBean.getCostPriceMax()));
    }

    //CURRENCY
    if (searchCostSheetBean.getCostPriceCurrencyId() != null
            && !searchCostSheetBean.getCostPriceCurrencyId().equals(-1)) {
        dc.createCriteria("costPriceCurrency")
                .add(Restrictions.eq("currencyId", searchCostSheetBean.getCostPriceCurrencyId()));
        dcCount.createCriteria("costPriceCurrency")
                .add(Restrictions.eq("currencyId", searchCostSheetBean.getCostPriceCurrencyId()));
    }

    List<TeamMember> members = null;
    List<UserSimple> users = null;
    //FIRST NAME AND LAST NAME
    if ((searchCostSheetBean.getFirstName() != null && !"".equals(searchCostSheetBean.getFirstName()))
            || (searchCostSheetBean.getLastName() != null && !"".equals(searchCostSheetBean.getLastName()))) {

        List<Integer> memberIds = new ArrayList<Integer>();
        if (searchCostSheetBean.getProjectId() != IConstant.NOM_COST_SHEET_SEARCH_FOR_ORG) {
            List<TeamMember> teamMembers = BLTeamMember.getInstance().getTeamMemberFromSearch(
                    searchCostSheetBean.getOrganizationId(), searchCostSheetBean.getFirstName(),
                    searchCostSheetBean.getLastName(), false);
            if (teamMembers != null && !teamMembers.isEmpty()) {
                members = teamMembers;
                for (TeamMember teamMember : teamMembers) {
                    memberIds.add(new Integer(teamMember.getMemberId()));
                }
            }
        }

        List<Integer> personIds = new ArrayList<Integer>();
        //search for persons only if the selected option is to search in all or per organization,
        //otherwise only search for team members
        if (searchCostSheetBean.getProjectId() == IConstant.NOM_COST_SHEET_SEARCH_ALL
                || searchCostSheetBean.getProjectId() == IConstant.NOM_COST_SHEET_SEARCH_FOR_ORG) {
            List<UserSimple> persons = BLUser.getInstance().getUserSimpleFromSearch(
                    searchCostSheetBean.getOrganizationId(), searchCostSheetBean.getFirstName(),
                    searchCostSheetBean.getLastName(), true);

            if (persons != null && !persons.isEmpty()) {
                users = persons;
                for (UserSimple person : persons) {
                    personIds.add(person.getUserId());
                }
            }
        }

        if (!memberIds.isEmpty() && !personIds.isEmpty()) {
            List<Integer> costSheetIds = new ArrayList<Integer>();

            DetachedCriteria teamMemberDc = DetachedCriteria
                    .forEntityName(IModelConstant.costSheetWithTeamMemberDetailEntity);
            teamMemberDc.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", memberIds));
            teamMemberDc.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));
            List<CostSheet> resForTeamMembers = (List<CostSheet>) getHibernateTemplate()
                    .findByCriteria(teamMemberDc);
            if (resForTeamMembers != null && !resForTeamMembers.isEmpty()) {
                for (CostSheet cost : resForTeamMembers) {
                    costSheetIds.add(cost.getCostSheetId());
                }
            }
            DetachedCriteria personDc = DetachedCriteria
                    .forEntityName(IModelConstant.costSheetWithPersonDetailEntity);
            personDc.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
            personDc.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));
            List<CostSheet> resForPersons = (List<CostSheet>) getHibernateTemplate().findByCriteria(personDc);
            if (resForPersons != null && !resForPersons.isEmpty()) {
                for (CostSheet cost : resForPersons) {
                    costSheetIds.add(cost.getCostSheetId());
                }
            }

            if (!costSheetIds.isEmpty()) {
                dc.add(Restrictions.in("costSheetId", costSheetIds));
                dcCount.add(Restrictions.in("costSheetId", costSheetIds));
            }
        } else if (!memberIds.isEmpty()) {
            dc.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", memberIds));
            dcCount.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", memberIds));
        } else if (!personIds.isEmpty()) {
            dc.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
            dcCount.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
        } else {
            return new ArrayList<CostSheet>();
        }
    }

    List<Project> projects = null;
    //PROJECT AND TEAM MEMBER
    //if no project is selected, we use a subquery to retrieve a list of cost sheet ids from which we will search for cost sheets
    //using the other search criteria (including first name and last name)
    //if a project is selected, firstName or lastName won't exist as search criteria, only teamMemberId must be taken into account 
    if (searchCostSheetBean.getTeamMemberId() == -1
            && searchCostSheetBean.getProjectId() == IConstant.NOM_COST_SHEET_SEARCH_ALL) { //search in all the cost sheets

        //if the user doesn't have the permission to search in all the cost sheets, the projectId must be 
        //included in the list of ids for the projects in which the user is a team member
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_CostSheetSearchAll())) {

            HashMap<Project, TeamMember> projectsAndTeamMembers = BLProject.getInstance()
                    .getProjectsAndTeamMembersByPerson(userAuth.getPersonId(), true, true);
            if (projectsAndTeamMembers != null && !projectsAndTeamMembers.isEmpty()) {
                projects = new ArrayList<Project>(projectsAndTeamMembers.keySet());
                List<Integer> costSheetIds = new ArrayList<Integer>();
                Iterator it = projectsAndTeamMembers.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry<Project, TeamMember> entry = (Map.Entry<Project, TeamMember>) it.next();
                    //the subquery is used to retrieve the list of cost sheet ids retrieved for the teamMemberId and projectId search criteria;
                    DetachedCriteria subquery = null;
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.costSheetWithProjectAndTeamMemberDetailsEntity);
                    } else {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.costSheetWithProjectDetailsEntity);
                    }
                    subquery.createCriteria("projectDetails")
                            .add(Restrictions.eq("projectId", entry.getKey().getProjectId()));
                    subquery.setProjection(Projections.id());
                    subquery.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));
                    //if the user is the PM for this project, we set a restriction only on projectId,
                    //otherwise the restriction is on teamMemberId
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", entry.getValue().getMemberId()));
                    }
                    List<Integer> costSheetIdsTemp = (List<Integer>) getHibernateTemplate()
                            .findByCriteria(subquery);
                    if (costSheetIdsTemp != null) {
                        for (Integer id : costSheetIdsTemp) {
                            costSheetIds.add(id);
                        }
                    }
                }

                //search for cost sheets entered by the user for the organization (no project selected)
                DetachedCriteria subquery = DetachedCriteria
                        .forEntityName(IModelConstant.costSheetWithPersonDetailEntity);
                subquery.createCriteria("personDetail")
                        .add(Restrictions.eq("personId", userAuth.getPersonId()));
                subquery.setProjection(Projections.id());
                subquery.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));
                List<Integer> costSheetIdsTemp = (List<Integer>) getHibernateTemplate()
                        .findByCriteria(subquery);
                if (costSheetIdsTemp != null) {
                    for (Integer id : costSheetIdsTemp) {
                        costSheetIds.add(id);
                    }
                }

                if (!costSheetIds.isEmpty()) {
                    dc.add(Restrictions.in("costSheetId", costSheetIds));
                    dcCount.add(Restrictions.in("costSheetId", costSheetIds));
                } else {
                    return new ArrayList<CostSheet>();
                }
            }
        }

    } else if (searchCostSheetBean.getTeamMemberId() == -1
            && searchCostSheetBean.getProjectId() == IConstant.NOM_COST_SHEET_SEARCH_FOR_ORG) {
        //if the user doesn't have the permission to search in all the cost sheets per organization, i must set the personId property 
        //to the user correspondent personId
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_CostSheetSearchAll())) {
            dc.createCriteria("personDetail").add(Restrictions.eq("personId", userAuth.getPersonId()));
            dcCount.createCriteria("personDetail").add(Restrictions.eq("personId", userAuth.getPersonId()));
        } else {
            //if the user has the permission to search in all the cost sheets for organization, i must set the condition that the personDetail property
            //mustn't be null
            dc.add(Restrictions.isNotNull("personDetail"));
            dcCount.add(Restrictions.isNotNull("personDetail"));
        }
    } else if (searchCostSheetBean.getTeamMemberId() == -1
            && searchCostSheetBean.getProjectId() == IConstant.NOM_COST_SHEET_SEARCH_IN_ALL_PROJECTS) { //search in the cost sheets for all the projects

        //if the user doesn't have the permission to search in all the cost sheets, the projectId must be 
        //included in the list of ids for the projects in which the user is a team member
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_CostSheetSearchAll())) {
            HashMap<Project, TeamMember> projectsAndTeamMembers = BLProject.getInstance()
                    .getProjectsAndTeamMembersByPerson(userAuth.getPersonId(), true, true);
            if (projectsAndTeamMembers != null && !projectsAndTeamMembers.isEmpty()) {
                projects = new ArrayList<Project>(projectsAndTeamMembers.keySet());
                List<Integer> costSheetIds = new ArrayList<Integer>();
                Iterator it = projectsAndTeamMembers.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry<Project, TeamMember> entry = (Map.Entry<Project, TeamMember>) it.next();
                    //the subquery is used to retrieve the list of cost sheet ids retrieved for the teamMemberId and projectId search criteria;
                    DetachedCriteria subquery = null;
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.costSheetWithProjectAndTeamMemberDetailsEntity);
                    } else {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.costSheetWithProjectDetailsEntity);
                    }
                    subquery.createCriteria("projectDetails")
                            .add(Restrictions.eq("projectId", entry.getKey().getProjectId()));
                    subquery.setProjection(Projections.id());
                    subquery.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));
                    //if the user is the PM for this project, we set a restriction only on projectId,
                    //otherwise the restriction is on teamMemberId
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", entry.getValue().getMemberId()));
                    }
                    List<Integer> costSheetIdsTemp = (List<Integer>) getHibernateTemplate()
                            .findByCriteria(subquery);
                    if (costSheetIdsTemp != null) {
                        for (Integer id : costSheetIdsTemp) {
                            costSheetIds.add(id);
                        }
                    }
                }
                if (!costSheetIds.isEmpty()) {
                    dc.add(Restrictions.in("costSheetId", costSheetIds));
                    dcCount.add(Restrictions.in("costSheetId", costSheetIds));
                } else {
                    return new ArrayList<CostSheet>();
                }
            }
        } else {
            //the cost sheet must be entered for a specific project; cost sheets per organisation are excluded
            dc.add(Restrictions.isNotNull("projectDetails"));
            dcCount.add(Restrictions.isNotNull("projectDetails"));
        }
    } else if (searchCostSheetBean.getTeamMemberId() == -1 && searchCostSheetBean.getProjectId() > 0) { //search in a project
        Project project = BLProject.getInstance().get(searchCostSheetBean.getProjectId(), true);
        if (project != null) {
            projects = new ArrayList<Project>();
            projects.add(project);
            //if the user is not PM for the selected project nor USER_ALL, it will see only its cost sheets
            if (!project.getManagerId().equals(userAuth.getPersonId())
                    && !userAuth.hasAuthority(PermissionConstant.getInstance().getTS_CostSheetSearchAll())) {
                Iterator<TeamMember> it = project.getProjectTeam().getTeamMembers().iterator();
                while (it.hasNext()) {
                    TeamMember member = it.next();
                    if (member.getPersonId() == userAuth.getPersonId()) {
                        dc.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", member.getMemberId()));
                        dcCount.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", member.getMemberId()));
                    }
                }
            }
        }
        //set the selected projectId as search criteria
        dc.createCriteria("projectDetails")
                .add(Restrictions.eq("projectId", searchCostSheetBean.getProjectId()));
        dcCount.createCriteria("projectDetails")
                .add(Restrictions.eq("projectId", searchCostSheetBean.getProjectId()));
    } else if (searchCostSheetBean.getTeamMemberId() != -1 && searchCostSheetBean.getProjectId() > 0) { //search in a project and for a specific teamMemberDetail
        //set the selected projectId and teamMemberId as search criteria
        dc.createCriteria("projectDetails")
                .add(Restrictions.eq("projectId", searchCostSheetBean.getProjectId()));
        dc.createCriteria("teamMemberDetail")
                .add(Restrictions.eq("teamMemberId", searchCostSheetBean.getTeamMemberId()));
        dcCount.createCriteria("projectDetails")
                .add(Restrictions.eq("projectId", searchCostSheetBean.getProjectId()));
        dcCount.createCriteria("teamMemberDetail")
                .add(Restrictions.eq("teamMemberId", searchCostSheetBean.getTeamMemberId()));
    }

    //the results list
    List<CostSheet> res = null;

    //the order can be done while retrieving the data from the database only if the sort parameter is the activity name, costSheetId, date, billable;
    //this cannot be done if the results must be ordered by cost sheet owner name or project name
    if (searchCostSheetBean.getSortParam() != null && !"".equals(searchCostSheetBean.getSortParam())
            && !"costSheetReporterName".equals(searchCostSheetBean.getSortParam())
            && !"projectName".equals(searchCostSheetBean.getSortParam())) {
        // check if I have to order the results
        // if I have to, check if I have to order them ascending or descending
        if (searchCostSheetBean.getSortDirection() == -1) {
            // ascending
            dc.addOrder(Order.asc(searchCostSheetBean.getSortParam()));
        } else {
            // descending
            dc.addOrder(Order.desc(searchCostSheetBean.getSortParam()));
        }

        // if the request didn't come from the pagination area, 
        // it means that I have to set the number of results and pages
        if (isDeleteAction || searchCostSheetBean.getNbrOfResults() == -1) {
            boolean isSearch = false;
            if (searchCostSheetBean.getNbrOfResults() == -1) {
                isSearch = true;
            }
            // set the count(*) restriction         
            dcCount.setProjection(Projections.countDistinct("costSheetId"));

            //findByCriteria must be called with firstResult and maxResults parameters; the default findByCriteria(DetachedCriteria criteria) implementation
            //sets firstResult and maxResults to -1, which kills the countDistinct Projection         
            int nbrOfResults = ((Integer) getHibernateTemplate().findByCriteria(dcCount, 0, 0).get(0))
                    .intValue();
            logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
            searchCostSheetBean.setNbrOfResults(nbrOfResults);

            // get the number of pages
            if (nbrOfResults % searchCostSheetBean.getResultsPerPage() == 0) {
                searchCostSheetBean.setNbrOfPages(nbrOfResults / searchCostSheetBean.getResultsPerPage());
            } else {
                searchCostSheetBean.setNbrOfPages(nbrOfResults / searchCostSheetBean.getResultsPerPage() + 1);
            }
            // after a cost sheet is deleted, the same page has to be displayed;
            //only when all the client from last page are deleted, the previous page will be shown 
            if (isDeleteAction
                    && (searchCostSheetBean.getCurrentPage() > searchCostSheetBean.getNbrOfPages())) {
                searchCostSheetBean.setCurrentPage(searchCostSheetBean.getNbrOfPages());
            } else if (isSearch) {
                searchCostSheetBean.setCurrentPage(1);
            }
        }

        res = (List<CostSheet>) getHibernateTemplate().findByCriteria(dc,
                (searchCostSheetBean.getCurrentPage() - 1) * searchCostSheetBean.getResultsPerPage(),
                searchCostSheetBean.getResultsPerPage());
    }

    //setting the cost sheet reporter name 
    if (res != null && res.size() > 0) {
        if (members == null) {
            HashSet<Integer> teamMemberIds = new HashSet<Integer>();
            for (CostSheet cost : res) {
                if (cost.getTeamMemberDetail() != null) {
                    teamMemberIds.add(new Integer(cost.getTeamMemberDetail().getTeamMemberId()));
                }
            }
            if (teamMemberIds.size() > 0) {
                members = BLTeamMember.getInstance().getTeamMembersByMemberIds(teamMemberIds, false);
            }
        }
        if (users == null) {
            HashSet<Integer> personIds = new HashSet<Integer>();
            for (CostSheet cost : res) {
                if (cost.getPersonDetail() != null) {
                    personIds.add(new Integer(cost.getPersonDetail().getPersonId()));
                }
            }
            if (personIds.size() > 0) {
                String[] ids = new String[personIds.size()];
                int i = 0;
                for (Integer personId : personIds) {
                    ids[i++] = personId.toString();
                }
                users = BLUser.getInstance().getUsersByPersonId(ids);
            }
        }

        if (projects == null) {
            HashSet<Integer> projectIds = new HashSet<Integer>();
            for (CostSheet cost : res) {
                if (cost.getProjectDetails() != null) {
                    projectIds.add(new Integer(cost.getProjectDetails().getProjectId()));
                }
            }
            if (projectIds.size() > 0) {
                projects = BLProject.getInstance().getProjectsSimpleByProjectIds(projectIds);
            }
        }

        for (CostSheet cost : res) {
            if (cost.getTeamMemberDetail() != null && members != null) {
                for (TeamMember member : members) {
                    if (cost.getTeamMemberDetail().getTeamMemberId().equals(member.getMemberId())) {
                        cost.setCostSheetReporterName(
                                member.getFirstName().concat(" ").concat(member.getLastName()));
                        break;
                    }
                }
            } else if (cost.getPersonDetail() != null && users != null) {
                for (UserSimple user : users) {
                    if (cost.getPersonDetail().getPersonId() == user.getUserId()) {
                        cost.setCostSheetReporterName(
                                user.getFirstName().concat(" ").concat(user.getLastName()));
                        break;
                    }
                }
            }

            //setting the project name
            if (cost.getProjectDetails() != null && cost.getProjectDetails().getProjectId() != null
                    && projects != null) {
                for (Project project : projects) {
                    if (cost.getProjectDetails().getProjectId().equals(project.getProjectId())) {
                        cost.setProjectName(project.getName());
                        cost.setProjectManagerId(project.getManagerId());
                        break;
                    }
                }
            }
        }
    }

    logger.debug("getResultsForSearch - END");
    return res;
}

From source file:ro.cs.ts.model.dao.impl.DaoCostSheetImpl.java

License:Open Source License

/**
 * Gets the Project Report cost sheets/*from w ww  .j a v  a 2  s  .  co m*/
 * @author Coni
 * @param getDataCriteria
 * @return
 * @throws WSClientException 
 * @throws IOException 
 * @throws XmlMappingException 
 * @throws BusinessException
 */
public List<CostSheet> getProjectReportCostSheets(TSReportGetDataCriteria getDataCriteria)
        throws XmlMappingException, IOException, WSClientException {
    logger.debug("getProjectReportCostSheets - START");

    DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.costSheetForReportsEntity);

    //PROJECT
    Integer projectId = (Integer) getDataCriteria.getProperties()
            .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_PROJECT_ID);
    if (projectId != null && projectId > 0) {
        dc.createCriteria("projectDetails").add(Restrictions.eq("projectId", projectId));
    }

    //START DATE
    if (getDataCriteria.getProperties().get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_START_DATE) != null) {
        Date startDate = (Date) ((XMLGregorianCalendar) getDataCriteria.getProperties()
                .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_START_DATE)).toGregorianCalendar().getTime();
        if (startDate != null) {
            dc.add(Restrictions.ge("date", startDate));
        }
    }

    //END DATE
    if (getDataCriteria.getProperties().get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_END_DATE) != null) {
        Date endDate = (Date) ((XMLGregorianCalendar) getDataCriteria.getProperties()
                .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_END_DATE)).toGregorianCalendar().getTime();
        if (endDate != null) {
            dc.add(Restrictions.le("date", endDate));
        }
    }

    //BILLABLE
    String billable = (String) getDataCriteria.getProperties()
            .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_BILLABLE);
    if (billable != null) {
        if (billable.equals(IConstant.NOM_BILLABLE_YES.toString())
                || billable.equals(IConstant.NOM_BILLABLE_NO.toString())) {
            dc.add(Restrictions.eq("billable", billable));
        }
    }

    //STATUS
    dc.add(Restrictions.ne("status", IConstant.NOM_COST_SHEET_STATUS_DELETED));

    List<CostSheet> result = getHibernateTemplate().findByCriteria(dc);

    if (result != null) {
        List<WSTeamMember> members = null;

        HashSet<Integer> teamMemberIds = new HashSet<Integer>();
        for (CostSheet cost : result) {
            if (cost.getTeamMemberDetail() != null) {
                teamMemberIds.add(new Integer(cost.getTeamMemberDetail().getTeamMemberId()));
            }
        }
        if (teamMemberIds.size() > 0) {
            members = CMWebServiceClient.getInstance().getTeamMembersByMemberIds(teamMemberIds, false);
        }

        for (CostSheet cost : result) {
            if (members != null && !members.isEmpty()) {
                for (WSTeamMember member : members) {
                    if (cost.getTeamMemberDetail().getTeamMemberId().equals(member.getMemberId())) {
                        cost.setCostSheetReporterName(
                                member.getFirstName().concat(" ").concat(member.getLastName()));
                    }
                }
            }
        }
    }

    logger.debug("getProjectReportCostSheets - END");

    return result;
}

From source file:ro.cs.ts.model.dao.impl.DaoExchangeImpl.java

License:Open Source License

/**
 * Searches for exchanges using the criterion defined in searchExchangeBean
 * @author Coni/*  w w  w.j  av a 2 s.  co  m*/
 * @param searchCostSheetBean
 * @param isDeleteAction
 * @return
 * @throws BusinessException 
 * 
 */
public List<Exchange> getExchangeBeanFromSearch(SearchExchangeBean searchExchangeBean, boolean isDeleteAction)
        throws BusinessException {
    logger.debug("getExchangeBeanFromSearch - START");
    DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.exchangeForListingEntity);
    UserAuth userAuth = (UserAuth) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    //PROJECT
    List<Project> projects = null;
    if (searchExchangeBean.getProjectId() != null
            && searchExchangeBean.getProjectId().equals(new Integer(IConstant.NOM_EXCHANGE_SEARCH_ALL))) { //search in all
        //get the user available projects
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_ExchangeSearchAll())) {
            //if the user is USER_ALL, i will search for exchanges registered for its organization or for its organization's projects; hence
            //only the organizationId restriction it is required; otherwise i will search only for exchanges registered only for the projects
            //to whom the user is PM

            projects = BLProject.getInstance().getProjectsByManager(userAuth.getPersonId(), true, true);

            if (projects != null && !projects.isEmpty()) {
                List<Integer> projectIds = new ArrayList<Integer>();
                for (Project project : projects) {
                    projectIds.add(project.getProjectId());
                }
                dc.createCriteria("projectDetail").add(Restrictions.in("projectId", projectIds));
            } else {
                // if the user it is not PM for at least one project, no results must be displayed
                return new ArrayList<Exchange>();
            }
        }
    }
    if (searchExchangeBean.getProjectId() != null
            && searchExchangeBean.getProjectId().equals(new Integer(IConstant.NOM_EXCHANGE_SEARCH_FOR_ORG))) { //exchanges from organization
        //if the user isn't USER_ALL, i won't show any exchanges; otherwise the projectId must be null
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_ExchangeSearchAll())) {
            return new ArrayList<Exchange>();
        } else {
            dc.add(Restrictions.isNull("projectDetail"));
        }
    } else if (searchExchangeBean.getProjectId() != null && searchExchangeBean.getProjectId() > 0) {
        dc.createCriteria("projectDetail").add(Restrictions.eq("projectId", searchExchangeBean.getProjectId()));
    }

    //FIRST CURRENCY
    if (searchExchangeBean.getFirstCurrencyId() != null
            && !searchExchangeBean.getFirstCurrencyId().equals(-1)) {
        dc.createCriteria("firstCurrency")
                .add(Restrictions.eq("currencyId", searchExchangeBean.getFirstCurrencyId()));
    }

    //SECOND CURRENCY
    if (searchExchangeBean.getSecondCurrencyId() != null
            && !searchExchangeBean.getSecondCurrencyId().equals(-1)) {
        dc.createCriteria("secondCurrency")
                .add(Restrictions.eq("currencyId", searchExchangeBean.getSecondCurrencyId()));
    }

    //STATUS
    dc.add(Restrictions.ne("status", IConstant.NOM_EXCHANGE_STATUS_DELETED));

    //ORGANIZATIONID
    if (searchExchangeBean.getOrganizationId() != null) {
        dc.add(Restrictions.eq("organizationId", searchExchangeBean.getOrganizationId()));
    }

    List<Exchange> res = (List<Exchange>) getHibernateTemplate().findByCriteria(dc);

    // if the request didn't come from the pagination area, 
    // it means that I have to set the number of results and pages
    if (isDeleteAction || searchExchangeBean.getNbrOfResults() == -1) {
        boolean isSearch = false;
        if (searchExchangeBean.getNbrOfResults() == -1) {
            isSearch = true;
        }
        int nbrOfResults = res.size();
        logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
        searchExchangeBean.setNbrOfResults(nbrOfResults);

        // get the number of pages
        if (nbrOfResults % searchExchangeBean.getResultsPerPage() == 0) {
            searchExchangeBean.setNbrOfPages(nbrOfResults / searchExchangeBean.getResultsPerPage());
        } else {
            searchExchangeBean.setNbrOfPages(nbrOfResults / searchExchangeBean.getResultsPerPage() + 1);
        }
        // after an exchange is deleted, the same page has to be displayed;
        //only when all the exchanges from last page are deleted, the previous page will be shown 
        if (isDeleteAction && (searchExchangeBean.getCurrentPage() > searchExchangeBean.getNbrOfPages())) {
            searchExchangeBean.setCurrentPage(searchExchangeBean.getNbrOfPages());
        } else if (isSearch) {
            searchExchangeBean.setCurrentPage(1);
        }
    }

    //the returned list of exchanges
    List<Exchange> exchanges = new ArrayList<Exchange>();

    if (res != null && !res.isEmpty()) {
        if (projects == null) {
            HashSet<Integer> projectIds = new HashSet<Integer>();
            for (Exchange exchange : res) {
                if (exchange.getProjectDetail() != null) {
                    projectIds.add(new Integer(exchange.getProjectDetail().getProjectId()));
                }
            }
            if (projectIds.size() > 0) {
                projects = BLProject.getInstance().getProjectsSimpleByProjectIds(projectIds);
            }
        }

        for (Exchange exchange : res) {
            //setting the project name
            if (exchange.getProjectDetail() != null && exchange.getProjectDetail().getProjectId() != null
                    && projects != null) {
                for (Project project : projects) {
                    if (exchange.getProjectDetail().getProjectId().equals(project.getProjectId())) {
                        exchange.setProjectName(project.getName());
                        break;
                    }
                }
            }
        }

        //sorting the exchanges list
        //------sort the list
        if (searchExchangeBean.getSortParam().equals("projectName")) {

            List<Exchange> exchangesForProject = new ArrayList<Exchange>();
            List<Exchange> exchangesForOrg = new ArrayList<Exchange>();
            for (Exchange exchange : res) {
                if (exchange.getProjectDetail() != null && exchange.getProjectDetail().getProjectId() != null) {
                    exchangesForProject.add(exchange);
                } else {
                    exchangesForOrg.add(exchange);
                }
            }
            Collections.sort(exchangesForProject,
                    ExchangeComparator.getInstance().exchangeProjectNameComparator());
            exchangesForOrg.addAll(exchangesForProject);
            res = exchangesForOrg;
        }

        //ascending or descending
        if (searchExchangeBean.getSortDirection() == IConstant.DESCENDING) {
            Collections.reverse(res);
        }

        long start = (searchExchangeBean.getCurrentPage() - 1) * searchExchangeBean.getResultsPerPage();
        long end = searchExchangeBean.getCurrentPage() * searchExchangeBean.getResultsPerPage();

        // go over the entries            
        for (int i = (int) start; i < end; i++) {
            if (i >= res.size()) {
                continue;
            }
            exchanges.add(res.get(i));
        }
    }
    logger.debug("getExchangeBeanFromSearch - END");
    return exchanges;
}

From source file:ro.cs.ts.model.dao.impl.DaoRecordImpl.java

License:Open Source License

/**
 * Searches for records using the criterion defined in searchRecordBean
 * @author Coni/*  ww  w.  j  a  v  a 2s  .  co m*/
 * @param searchClientBean
 * @param isDeleteAction
 * @return
 * @throws WSClientException 
 * @throws IOException 
 * @throws XmlMappingException 
 * @throws BusinessException 
 */
public List<Record> getResultsForSearch(SearchRecordBean searchRecordBean, boolean isDeleteAction)
        throws XmlMappingException, IOException, WSClientException, BusinessException {
    logger.debug("getResultsForSearch - START");

    UserAuth userAuth = (UserAuth) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

    DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.recordForListingEntity);
    DetachedCriteria dcCount = DetachedCriteria.forEntityName(IModelConstant.recordForListingEntity);

    //RECORD ID
    if (searchRecordBean.getId() != null) {
        dc.add(Restrictions.eq("recordId", searchRecordBean.getId()));
        dcCount.add(Restrictions.eq("recordId", searchRecordBean.getId()));
    }

    //ACTIVITY
    if (searchRecordBean.getActivityId() != -1) {
        dc.createCriteria("activity").add(Restrictions.eq("activityId", searchRecordBean.getActivityId()));
        dcCount.createCriteria("activity").add(Restrictions.eq("activityId", searchRecordBean.getActivityId()));
    }

    //START DATE
    if (searchRecordBean.getStartDate() != null) {
        //the search must retrieve: all the records for activities that started and haven't ended before the selected startDate 
        //and records for activities that will begin after the selected startDate; the conditions are applied for work hours and over time
        dc.add(Restrictions.or(
                Restrictions.or(Restrictions.ge("startTime", searchRecordBean.getStartDate()),
                        Restrictions.and(Restrictions.le("startTime", searchRecordBean.getStartDate()),
                                Restrictions.ge("endTime", searchRecordBean.getStartDate()))),
                Restrictions.or(Restrictions.ge("overTimeStartTime", searchRecordBean.getStartDate()),
                        Restrictions.and(Restrictions.le("overTimeStartTime", searchRecordBean.getStartDate()),
                                Restrictions.ge("overTimeEndTime", searchRecordBean.getStartDate())))));
        dcCount.add(
                Restrictions.or(
                        Restrictions.or(Restrictions.ge("startTime", searchRecordBean.getStartDate()),
                                Restrictions.and(
                                        Restrictions.le("startTime", searchRecordBean.getStartDate()),
                                        Restrictions.ge("endTime", searchRecordBean.getStartDate()))),
                        Restrictions.or(Restrictions.ge("overTimeStartTime", searchRecordBean.getStartDate()),
                                Restrictions.and(
                                        Restrictions.le("overTimeStartTime", searchRecordBean.getStartDate()),
                                        Restrictions.ge("overTimeEndTime", searchRecordBean.getStartDate())))));
    }

    //END DATE
    if (searchRecordBean.getEndDate() != null) {
        //the search must retrieve: all the records for activities that started before the selected endDate, no matter they are ended or not;
        //; the conditions are applied for work hours and over time
        dc.add(Restrictions.or(Restrictions.le("startTime", searchRecordBean.getEndDate()),
                Restrictions.le("overTimeStartTime", searchRecordBean.getEndDate())));
        dcCount.add(Restrictions.or(Restrictions.le("startTime", searchRecordBean.getEndDate()),
                Restrictions.le("overTimeStartTime", searchRecordBean.getEndDate())));
    }

    //BILLABLE
    if (searchRecordBean.getBillable() != null) {
        if (searchRecordBean.getBillable().equals(IConstant.NOM_BILLABLE_YES)
                || searchRecordBean.getBillable().equals(IConstant.NOM_BILLABLE_NO)) {
            dc.add(Restrictions.or(Restrictions.eq("billable", searchRecordBean.getBillable()),
                    Restrictions.eq("overTimeBillable", searchRecordBean.getBillable())));
            dcCount.add(Restrictions.or(Restrictions.eq("billable", searchRecordBean.getBillable()),
                    Restrictions.eq("overTimeBillable", searchRecordBean.getBillable())));
        }
    }

    //ORGANIZATION ID
    if (searchRecordBean.getOrganizationId() != null) {
        dc.add(Restrictions.eq("organizationId", searchRecordBean.getOrganizationId()));
        dcCount.add(Restrictions.eq("organizationId", searchRecordBean.getOrganizationId()));
    }

    //STATUS
    dc.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
    dcCount.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));

    List<TeamMember> members = null;
    List<UserSimple> users = null;
    //FIRST NAME AND LAST NAME
    if ((searchRecordBean.getFirstName() != null && !"".equals(searchRecordBean.getFirstName()))
            || (searchRecordBean.getLastName() != null && !"".equals(searchRecordBean.getLastName()))) {

        List<Integer> memberIds = new ArrayList<Integer>();
        if (searchRecordBean.getProjectId() != IConstant.NOM_RECORD_SEARCH_FOR_ORG) {
            List<TeamMember> teamMembers = BLTeamMember.getInstance().getTeamMemberFromSearch(
                    searchRecordBean.getOrganizationId(), searchRecordBean.getFirstName(),
                    searchRecordBean.getLastName(), false);
            if (teamMembers != null && !teamMembers.isEmpty()) {
                members = teamMembers;
                for (TeamMember teamMember : teamMembers) {
                    memberIds.add(new Integer(teamMember.getMemberId()));
                }
            }
        }

        //search for persons only if the selected option is to search in all or per organization,
        //otherwise only search for team members
        List<Integer> personIds = new ArrayList<Integer>();
        if (searchRecordBean.getProjectId() == IConstant.NOM_RECORD_SEARCH_ALL
                || searchRecordBean.getProjectId() == IConstant.NOM_RECORD_SEARCH_FOR_ORG) {
            List<UserSimple> persons = BLUser.getInstance().getUserSimpleFromSearch(
                    searchRecordBean.getOrganizationId(), searchRecordBean.getFirstName(),
                    searchRecordBean.getLastName(), true);
            if (persons != null && !persons.isEmpty()) {
                users = persons;
                for (UserSimple person : persons) {
                    personIds.add(person.getUserId());
                }
            }
        }

        if (!memberIds.isEmpty() && !personIds.isEmpty()) {
            List<Integer> recordIds = new ArrayList<Integer>();

            DetachedCriteria teamMemberDc = DetachedCriteria
                    .forEntityName(IModelConstant.recordWithTeamMemberDetailEntity);
            teamMemberDc.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", memberIds));
            teamMemberDc.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
            List<Record> resForTeamMembers = (List<Record>) getHibernateTemplate().findByCriteria(teamMemberDc);
            if (resForTeamMembers != null && !resForTeamMembers.isEmpty()) {
                for (Record rec : resForTeamMembers) {
                    recordIds.add(rec.getRecordId());
                }
            }
            DetachedCriteria personDc = DetachedCriteria
                    .forEntityName(IModelConstant.recordWithPersonDetailEntity);
            personDc.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
            personDc.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
            List<Record> resForPersons = (List<Record>) getHibernateTemplate().findByCriteria(personDc);
            if (resForPersons != null && !resForPersons.isEmpty()) {
                for (Record rec : resForPersons) {
                    recordIds.add(rec.getRecordId());
                }
            }

            if (!recordIds.isEmpty()) {
                dc.add(Restrictions.in("recordId", recordIds));
                dcCount.add(Restrictions.in("recordId", recordIds));
            }
        } else if (!memberIds.isEmpty()) {
            dc.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", memberIds));
            dcCount.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", memberIds));
        } else if (!personIds.isEmpty()) {
            dc.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
            dcCount.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
        } else {
            return new ArrayList<Record>();
        }
    }

    List<Project> projects = null;
    //PROJECT AND TEAM MEMBER
    //if no project is selected, we use a subquery to retrieve a list of record ids from which we will search for records
    //using the other search criteria (including first name and last name)
    //if a project is selected, firstName or lastName won't exist as search criteria, only teamMemberId must be taken into account 
    if (searchRecordBean.getTeamMemberId() == -1
            && searchRecordBean.getProjectId() == IConstant.NOM_RECORD_SEARCH_ALL) { //search in all the records

        //if the user doesn't have the permission to search in all the records, the projectId must be 
        //included in the list of ids for the projects in which the user is a team member
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_RecordSearchAll())) {

            HashMap<Project, TeamMember> projectsAndTeamMembers = BLProject.getInstance()
                    .getProjectsAndTeamMembersByPerson(userAuth.getPersonId(), true, true);
            if (projectsAndTeamMembers != null && !projectsAndTeamMembers.isEmpty()) {
                projects = new ArrayList<Project>(projectsAndTeamMembers.keySet());
                List<Integer> recordIds = new ArrayList<Integer>();
                Iterator it = projectsAndTeamMembers.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry<Project, TeamMember> entry = (Map.Entry<Project, TeamMember>) it.next();
                    //the subquery is used to retrieve the list of records ids retrieved for the teamMemberId and projectId search criteria;
                    DetachedCriteria subquery = null;
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.recordWithProjectAndTeamMemberDetailsEntity);
                    } else {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.recordWithProjectDetailsEntity);
                    }
                    subquery.createCriteria("projectDetails")
                            .add(Restrictions.eq("projectId", entry.getKey().getProjectId()));
                    subquery.setProjection(Projections.id());
                    //if the user is the PM for this project, we set a restriction only on projectId,
                    //otherwise the restriction is on teamMemberId
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", entry.getValue().getMemberId()));
                    }
                    subquery.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
                    List<Integer> recordIdsTemp = (List<Integer>) getHibernateTemplate()
                            .findByCriteria(subquery);
                    if (recordIdsTemp != null) {
                        for (Integer id : recordIdsTemp) {
                            recordIds.add(id);
                        }
                    }
                }

                //search for records entered by the user for the organization (no project selected)
                DetachedCriteria subquery = DetachedCriteria
                        .forEntityName(IModelConstant.recordWithPersonDetailEntity);
                subquery.createCriteria("personDetail")
                        .add(Restrictions.eq("personId", userAuth.getPersonId()));
                subquery.setProjection(Projections.id());
                subquery.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
                List<Integer> recordIdsTemp = (List<Integer>) getHibernateTemplate().findByCriteria(subquery);
                if (recordIdsTemp != null) {
                    for (Integer id : recordIdsTemp) {
                        recordIds.add(id);
                    }
                }

                if (!recordIds.isEmpty()) {
                    dc.add(Restrictions.in("recordId", recordIds));
                    dcCount.add(Restrictions.in("recordId", recordIds));
                } else {
                    return new ArrayList<Record>();
                }
            }
        }

    } else if (searchRecordBean.getTeamMemberId() == -1
            && searchRecordBean.getProjectId() == IConstant.NOM_RECORD_SEARCH_FOR_ORG) {
        //if the user doesn't have the permission to search in all the records per organization, i must set the personId property 
        //to the user correspondent personId
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_RecordSearchAll())) {
            dc.createCriteria("personDetail").add(Restrictions.eq("personId", userAuth.getPersonId()));
            dcCount.createCriteria("personDetail").add(Restrictions.eq("personId", userAuth.getPersonId()));
        } else {
            //if the user has the permission to search in all the records for organization, i must set the condition that the personDetail property
            //mustn't be null
            dc.add(Restrictions.isNotNull("personDetail"));
            dcCount.add(Restrictions.isNotNull("personDetail"));
        }
    } else if (searchRecordBean.getTeamMemberId() == -1
            && searchRecordBean.getProjectId() == IConstant.NOM_RECORD_SEARCH_IN_ALL_PROJECTS) { //search in the records for all the projects

        //if the user doesn't have the permission to search in all the records, the projectId must be 
        //included in the list of ids for the projects in which the user is a team member
        if (!userAuth.hasAuthority(PermissionConstant.getInstance().getTS_RecordSearchAll())) {
            HashMap<Project, TeamMember> projectsAndTeamMembers = BLProject.getInstance()
                    .getProjectsAndTeamMembersByPerson(userAuth.getPersonId(), true, true);
            if (projectsAndTeamMembers != null && !projectsAndTeamMembers.isEmpty()) {
                projects = new ArrayList<Project>(projectsAndTeamMembers.keySet());
                List<Integer> recordIds = new ArrayList<Integer>();
                Iterator it = projectsAndTeamMembers.entrySet().iterator();
                while (it.hasNext()) {
                    Map.Entry<Project, TeamMember> entry = (Map.Entry<Project, TeamMember>) it.next();
                    //the subquery is used to retrieve the list of records ids retrieved for the teamMemberId and projectId search criteria;
                    DetachedCriteria subquery = null;
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.recordWithProjectAndTeamMemberDetailsEntity);
                    } else {
                        subquery = DetachedCriteria
                                .forEntityName(IModelConstant.recordWithProjectDetailsEntity);
                    }
                    subquery.createCriteria("projectDetails")
                            .add(Restrictions.eq("projectId", entry.getKey().getProjectId()));
                    subquery.setProjection(Projections.id());
                    //if the user is the PM for this project, we set a restriction only on projectId,
                    //otherwise the restriction is on teamMemberId
                    if (!entry.getKey().getManagerId().equals(userAuth.getPersonId())) {
                        subquery.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", entry.getValue().getMemberId()));
                    }
                    subquery.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
                    List<Integer> recordIdsTemp = (List<Integer>) getHibernateTemplate()
                            .findByCriteria(subquery);
                    if (recordIdsTemp != null) {
                        for (Integer id : recordIdsTemp) {
                            recordIds.add(id);
                        }
                    }
                }

                if (!recordIds.isEmpty()) {
                    dc.add(Restrictions.in("recordId", recordIds));
                    dcCount.add(Restrictions.in("recordId", recordIds));
                } else {
                    return new ArrayList<Record>();
                }
            }
        } else {
            //the record must be entered for a specific project; records per organisation are excluded
            dc.add(Restrictions.isNotNull("projectDetails"));
            dcCount.add(Restrictions.isNotNull("projectDetails"));
        }
    } else if (searchRecordBean.getTeamMemberId() == -1 && searchRecordBean.getProjectId() > 0) { //search in a project
        Project project = BLProject.getInstance().get(searchRecordBean.getProjectId(), false);
        if (project != null) {
            projects = new ArrayList<Project>();
            projects.add(project);
            //if the user is not PM for the selected project nor USER_ALL, it will see only its records
            if (!project.getManagerId().equals(userAuth.getPersonId())
                    && !userAuth.hasAuthority(PermissionConstant.getInstance().getTS_RecordSearchAll())) {
                Iterator<TeamMember> it = project.getProjectTeam().getTeamMembers().iterator();
                while (it.hasNext()) {
                    TeamMember member = it.next();
                    if (member.getPersonId() == userAuth.getPersonId()) {
                        dc.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", member.getMemberId()));
                        dcCount.createCriteria("teamMemberDetail")
                                .add(Restrictions.eq("teamMemberId", member.getMemberId()));
                    }
                }
            }
        }
        //set the selected projectId as search criteria
        dc.createCriteria("projectDetails").add(Restrictions.eq("projectId", searchRecordBean.getProjectId()));
        dcCount.createCriteria("projectDetails")
                .add(Restrictions.eq("projectId", searchRecordBean.getProjectId()));

    } else if (searchRecordBean.getTeamMemberId() != -1 && searchRecordBean.getProjectId() > 0) { //search in a project and for a specific teamMemberDetail
        //set the selected projectId and teamMemberId as search criteria
        dc.createCriteria("projectDetails").add(Restrictions.eq("projectId", searchRecordBean.getProjectId()));
        dc.createCriteria("teamMemberDetail")
                .add(Restrictions.eq("teamMemberId", searchRecordBean.getTeamMemberId()));
        dcCount.createCriteria("projectDetails")
                .add(Restrictions.eq("projectId", searchRecordBean.getProjectId()));
        dcCount.createCriteria("teamMemberDetail")
                .add(Restrictions.eq("teamMemberId", searchRecordBean.getTeamMemberId()));
    }

    //the results list
    List<Record> res = null;

    //the order can be done while retrieving the data from the database only if the sort parameter is the activity name or the recordId;
    //this cannot be done if the results must be ordered by record owner name, project name or isBillable
    if (searchRecordBean.getSortParam() != null && ("activityName".equals(searchRecordBean.getSortParam())
            || "recordId".equals(searchRecordBean.getSortParam()))) {
        // check if I have to order the results
        if ("activityName".equals(searchRecordBean.getSortParam())) {
            // if I have to, check if I have to order them ascending or descending
            if (searchRecordBean.getSortDirection() == -1) {
                // ascending
                dc.createCriteria("activity").addOrder(Order.asc("name"));
            } else {
                // descending
                dc.createCriteria("activity").addOrder(Order.desc("name"));
            }
        } else if ("recordId".equals(searchRecordBean.getSortParam())) {
            if (searchRecordBean.getSortDirection() == -1) {
                // ascending
                dc.addOrder(Order.asc("recordId"));
            } else {
                // descending
                dc.addOrder(Order.desc("recordId"));
            }
        }

        // if the request didn't come from the pagination area, 
        // it means that I have to set the number of results and pages
        if (isDeleteAction || searchRecordBean.getNbrOfResults() == -1) {
            boolean isSearch = false;
            if (searchRecordBean.getNbrOfResults() == -1) {
                isSearch = true;
            }
            // set the count(*) restriction         
            dcCount.setProjection(Projections.countDistinct("recordId"));

            //findByCriteria must be called with firstResult and maxResults parameters; the default findByCriteria(DetachedCriteria criteria) implementation
            //sets firstResult and maxResults to -1, which kills the countDistinct Projection         
            int nbrOfResults = ((Integer) getHibernateTemplate().findByCriteria(dcCount, 0, 0).get(0))
                    .intValue();
            logger.debug("search results: ".concat(String.valueOf(nbrOfResults)));
            searchRecordBean.setNbrOfResults(nbrOfResults);

            // get the number of pages
            if (nbrOfResults % searchRecordBean.getResultsPerPage() == 0) {
                searchRecordBean.setNbrOfPages(nbrOfResults / searchRecordBean.getResultsPerPage());
            } else {
                searchRecordBean.setNbrOfPages(nbrOfResults / searchRecordBean.getResultsPerPage() + 1);
            }
            // after a record is deleted, the same page has to be displayed;
            //only when all the client from last page are deleted, the previous page will be shown 
            if (isDeleteAction && (searchRecordBean.getCurrentPage() > searchRecordBean.getNbrOfPages())) {
                searchRecordBean.setCurrentPage(searchRecordBean.getNbrOfPages());
            } else if (isSearch) {
                searchRecordBean.setCurrentPage(1);
            }
        }

        res = (List<Record>) getHibernateTemplate().findByCriteria(dc,
                (searchRecordBean.getCurrentPage() - 1) * searchRecordBean.getResultsPerPage(),
                searchRecordBean.getResultsPerPage());
    }

    //setting the record owner name 
    if (res != null && res.size() > 0) {
        if (members == null) {
            HashSet<Integer> teamMemberIds = new HashSet<Integer>();
            for (Record record : res) {
                if (record.getTeamMemberDetail() != null) {
                    teamMemberIds.add(new Integer(record.getTeamMemberDetail().getTeamMemberId()));
                }
            }
            if (teamMemberIds.size() > 0) {
                members = BLTeamMember.getInstance().getTeamMembersByMemberIds(teamMemberIds, false);
            }
        }
        if (users == null) {
            HashSet<Integer> personIds = new HashSet<Integer>();
            for (Record record : res) {
                if (record.getPersonDetail() != null) {
                    personIds.add(new Integer(record.getPersonDetail().getPersonId()));
                }
            }
            if (personIds.size() > 0) {
                String[] ids = new String[personIds.size()];
                int i = 0;
                for (Integer personId : personIds) {
                    ids[i++] = personId.toString();
                }
                users = BLUser.getInstance().getUsersByPersonId(ids);
            }
        }

        if (projects == null) {
            HashSet<Integer> projectIds = new HashSet<Integer>();
            for (Record record : res) {
                if (record.getProjectDetails() != null) {
                    projectIds.add(new Integer(record.getProjectDetails().getProjectId()));
                }
            }
            if (projectIds.size() > 0) {
                projects = BLProject.getInstance().getProjectsSimpleByProjectIds(projectIds);
            }
        }

        for (Record record : res) {
            if (record.getTeamMemberDetail() != null && members != null) {
                for (TeamMember member : members) {
                    if (record.getTeamMemberDetail().getTeamMemberId().equals(member.getMemberId())) {
                        record.setRecordOwnerName(
                                member.getFirstName().concat(" ").concat(member.getLastName()));
                        break;
                    }
                }
            } else if (record.getPersonDetail() != null && users != null) {
                for (UserSimple user : users) {
                    if (record.getPersonDetail().getPersonId() == user.getUserId()) {
                        record.setRecordOwnerName(user.getFirstName().concat(" ").concat(user.getLastName()));
                        break;
                    }
                }
            }

            //setting the project name
            if (record.getProjectDetails() != null && record.getProjectDetails().getProjectId() != null) {
                if (projects != null) {
                    for (Project project : projects) {
                        if (record.getProjectDetails().getProjectId().equals(project.getProjectId())) {
                            record.setProjectName(project.getName());
                            record.setProjectManagerId(project.getManagerId());
                            break;
                        }
                    }
                }
            }
            record.setIsBillable();
        }
    }

    logger.debug("getResultsForSearch - END");
    return res;
}

From source file:ro.cs.ts.model.dao.impl.DaoRecordImpl.java

License:Open Source License

/**
 * Gets the Project Report records//from  w  w w . j  av a  2  s.  com
 * @author Coni
 * @param getDataCriteria
 * @return
 * @throws WSClientException 
 * @throws IOException 
 * @throws XmlMappingException 
 * @throws BusinessException
 */
public List<Record> getProjectReportRecords(TSReportGetDataCriteria getDataCriteria)
        throws XmlMappingException, IOException, WSClientException {
    logger.debug("getProjectReportRecords - START");

    DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.recordForReportsEntity);

    //the prices can be computed per activity or per resource
    Integer priceComputeType = (Integer) getDataCriteria.getProperties()
            .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_RECORD_PRICE_COMPUTE_TYPE);

    //PROJECT
    Integer projectId = (Integer) getDataCriteria.getProperties()
            .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_PROJECT_ID);
    if (projectId != null && projectId > 0) {
        dc.createCriteria("projectDetails").add(Restrictions.eq("projectId", projectId));
    }

    //START DATE
    if (getDataCriteria.getProperties().get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_START_DATE) != null) {
        Date startDate = (Date) ((XMLGregorianCalendar) getDataCriteria.getProperties()
                .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_START_DATE)).toGregorianCalendar().getTime();
        if (startDate != null) {
            //the search must retrieve: all the records for activities that started and haven't ended before the selected startDate 
            //and records for activities that will begin after the selected startDate; the conditions are applied for work hours and over time
            dc.add(Restrictions.or(
                    Restrictions.or(Restrictions.ge("startTime", startDate),
                            Restrictions.and(Restrictions.le("startTime", startDate),
                                    Restrictions.ge("endTime", startDate))),
                    Restrictions.or(Restrictions.ge("overTimeStartTime", startDate),
                            Restrictions.and(Restrictions.le("overTimeStartTime", startDate),
                                    Restrictions.ge("overTimeEndTime", startDate)))));
        }
    }

    //END DATE
    if (getDataCriteria.getProperties().get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_END_DATE) != null) {
        Date endDate = (Date) ((XMLGregorianCalendar) getDataCriteria.getProperties()
                .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_END_DATE)).toGregorianCalendar().getTime();
        if (endDate != null) {
            //the search must retrieve: all the records for activities that started before the selected endDate, no matter they are ended or not;
            //; the conditions are applied for work hours and over time
            dc.add(Restrictions.or(Restrictions.le("startTime", endDate),
                    Restrictions.le("overTimeStartTime", endDate)));
        }
    }

    //BILLABLE
    //if the prices must be computed per activities, the billable search criteria it is applied to the record activity billable property
    String billable = (String) getDataCriteria.getProperties()
            .get(IConstant.TS_PROJECT_REPORT_SEARCH_CRITERIA_BILLABLE);
    if (billable != null) {
        if (billable.equals(IConstant.NOM_BILLABLE_YES.toString())
                || billable.equals(IConstant.NOM_BILLABLE_NO.toString())) {
            if (priceComputeType.equals(IConstant.NOM_RECORD_PRICES_COMPUTE_TYPE_FOR_RESOURCE)) {
                dc.add(Restrictions.or(Restrictions.eq("billable", billable),
                        Restrictions.eq("overTimeBillable", billable)));
            } else if (priceComputeType.equals(IConstant.NOM_RECORD_PRICES_COMPUTE_TYPE_FOR_ACTIVITY)) {
                dc.createCriteria("activity").add(Restrictions.eq("billable", billable));
            }
        }
    }

    //STATUS
    dc.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));

    List<Record> result = getHibernateTemplate().findByCriteria(dc);

    if (result != null) {
        List<WSTeamMember> members = null;

        HashSet<Integer> teamMemberIds = new HashSet<Integer>();
        for (Record record : result) {
            if (record.getTeamMemberDetail() != null) {
                teamMemberIds.add(new Integer(record.getTeamMemberDetail().getTeamMemberId()));
            }
        }
        if (teamMemberIds.size() > 0) {
            members = CMWebServiceClient.getInstance().getTeamMembersByMemberIds(teamMemberIds, false);
        }

        for (Record record : result) {
            if (members != null && !members.isEmpty()) {
                for (WSTeamMember member : members) {
                    if (record.getTeamMemberDetail().getTeamMemberId().equals(member.getMemberId())) {
                        record.setRecordOwnerName(
                                member.getFirstName().concat(" ").concat(member.getLastName()));
                    }
                }
            }
            //if the prices must be computed per activities, i must set the records billable and overTimeBillable properties depending on their corresponding activity 
            //billable property value
            if (priceComputeType.equals(IConstant.NOM_RECORD_PRICES_COMPUTE_TYPE_FOR_ACTIVITY)) {
                if (record.getTime() != null && !record.getTime().equals("")) {
                    record.setBillable(record.getActivity().getBillable());
                } else {
                    record.setBillable(null);
                }
                if (record.getOverTimeTime() != null && !record.getOverTimeTime().equals("")) {
                    record.setOverTimeBillable(record.getActivity().getBillable());
                } else {
                    record.setOverTimeBillable(null);
                }
            }
        }
    }

    logger.debug("getProjectReportRecords - END");
    return result;
}

From source file:ro.cs.ts.model.dao.impl.DaoRecordImpl.java

License:Open Source License

/**
 * Gets the Time Sheet Report records//  w ww. jav a2  s .c o m
 * @author Coni
 * @param getDataCriteria
 * @return
 * @throws WSClientException 
 * @throws IOException 
 * @throws XmlMappingException 
 * @throws BusinessException
 */
public List<Record> getTimeSheetReportRecords(TSReportGetDataCriteria getDataCriteria)
        throws XmlMappingException, IOException, WSClientException {
    logger.debug("getTimeSheetReportRecords - START");

    DetachedCriteria dc = DetachedCriteria.forEntityName(IModelConstant.recordForReportsEntity);

    //the prices can be computed per activity or per resource
    Integer priceComputeType = (Integer) getDataCriteria.getProperties()
            .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_RECORD_PRICE_COMPUTE_TYPE);

    //TEAM MEMBER ID AND PERSON ID
    List<Integer> teamMemberIds = null;
    String teamMemberIdsAsString = (String) getDataCriteria.getProperties()
            .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_TEAM_MEMBER_IDS);
    if (teamMemberIdsAsString != null) {
        teamMemberIds = (List<Integer>) Arrays
                .asList(Tools.getInstance().castStringToIntegerArray(teamMemberIdsAsString.split(",")));
    }
    List<Integer> personIds = null;
    String personIdsAsString = (String) getDataCriteria.getProperties()
            .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_PERSON_IDS);
    if (personIdsAsString != null) {
        personIds = (List<Integer>) Arrays
                .asList(Tools.getInstance().castStringToIntegerArray(personIdsAsString.split(",")));
    }

    if (teamMemberIds != null && !teamMemberIds.isEmpty() && personIds != null && !personIds.isEmpty()) {
        List<Integer> recordIds = new ArrayList<Integer>();

        DetachedCriteria teamMemberDc = DetachedCriteria
                .forEntityName(IModelConstant.recordWithTeamMemberDetailEntity);
        teamMemberDc.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", teamMemberIds));
        teamMemberDc.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
        teamMemberDc.setProjection(Projections.id());
        List<Integer> resForTeamMembers = (List<Integer>) getHibernateTemplate().findByCriteria(teamMemberDc);
        recordIds.addAll(resForTeamMembers);

        DetachedCriteria personDc = DetachedCriteria.forEntityName(IModelConstant.recordWithPersonDetailEntity);
        personDc.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
        personDc.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));
        personDc.setProjection(Projections.id());
        List<Integer> resForPersons = (List<Integer>) getHibernateTemplate().findByCriteria(personDc);
        recordIds.addAll(resForPersons);

        if (!recordIds.isEmpty()) {
            dc.add(Restrictions.in("recordId", recordIds));
        }
    } else if (teamMemberIds != null && !teamMemberIds.isEmpty()) {
        dc.createCriteria("teamMemberDetail").add(Restrictions.in("teamMemberId", teamMemberIds));
    } else if (personIds != null && !personIds.isEmpty()) {
        dc.createCriteria("personDetail").add(Restrictions.in("personId", personIds));
    }

    //START DATE
    if (getDataCriteria.getProperties()
            .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_START_DATE) != null) {
        Date startDate = (Date) ((XMLGregorianCalendar) getDataCriteria.getProperties()
                .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_START_DATE)).toGregorianCalendar()
                        .getTime();
        if (startDate != null) {
            //the search must retrieve: all the records for activities that started and haven't ended before the selected startDate 
            //and records for activities that will begin after the selected startDate; the conditions are applied for work hours and over time
            dc.add(Restrictions.or(
                    Restrictions.or(Restrictions.ge("startTime", startDate),
                            Restrictions.and(Restrictions.le("startTime", startDate),
                                    Restrictions.ge("endTime", startDate))),
                    Restrictions.or(Restrictions.ge("overTimeStartTime", startDate),
                            Restrictions.and(Restrictions.le("overTimeStartTime", startDate),
                                    Restrictions.ge("overTimeEndTime", startDate)))));
        }
    }

    //END DATE
    if (getDataCriteria.getProperties().get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_END_DATE) != null) {
        Date endDate = (Date) ((XMLGregorianCalendar) getDataCriteria.getProperties()
                .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_END_DATE)).toGregorianCalendar().getTime();
        if (endDate != null) {
            //the search must retrieve: all the records for activities that started before the selected endDate, no matter they are ended or not;
            //; the conditions are applied for work hours and over time
            dc.add(Restrictions.or(Restrictions.le("startTime", endDate),
                    Restrictions.le("overTimeStartTime", endDate)));
        }
    }

    //BILLABLE
    //if the prices must be computed per activities, the billable search criteria it is applied to the record activity billable property
    String billable = (String) getDataCriteria.getProperties()
            .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_BILLABLE);
    if (billable != null) {
        if (billable.equals(IConstant.NOM_BILLABLE_YES.toString())
                || billable.equals(IConstant.NOM_BILLABLE_NO.toString())) {
            if (priceComputeType.equals(IConstant.NOM_RECORD_PRICES_COMPUTE_TYPE_FOR_RESOURCE)) {
                dc.add(Restrictions.or(Restrictions.eq("billable", billable),
                        Restrictions.eq("overTimeBillable", billable)));
            } else if (priceComputeType.equals(IConstant.NOM_RECORD_PRICES_COMPUTE_TYPE_FOR_ACTIVITY)) {
                dc.createCriteria("activity").add(Restrictions.eq("billable", billable));
            }
        }
    }

    //ORGANIZATION ID
    Integer organizationId = (Integer) getDataCriteria.getProperties()
            .get(IConstant.TS_TIME_SHEET_REPORT_SEARCH_CRITERIA_ORGANIZATION_ID);
    if (organizationId != null) {
        dc.add(Restrictions.eq("organizationId", organizationId));
    }

    //STATUS
    dc.add(Restrictions.ne("status", IConstant.NOM_RECORD_STATUS_DELETED));

    List<Record> res = getHibernateTemplate().findByCriteria(dc);

    if (res != null) {
        List<WSTeamMember> members = null;
        List<UserSimple> users = null;
        List<WSProject> projects = null;

        HashSet<Integer> memberIds = new HashSet<Integer>();
        for (Record record : res) {
            if (record.getTeamMemberDetail() != null) {
                memberIds.add(new Integer(record.getTeamMemberDetail().getTeamMemberId()));
            }
        }
        if (memberIds.size() > 0) {
            members = CMWebServiceClient.getInstance().getTeamMembersByMemberIds(memberIds, false);
        }

        HashSet<Integer> userIds = new HashSet<Integer>();
        for (Record record : res) {
            if (record.getPersonDetail() != null) {
                userIds.add(new Integer(record.getPersonDetail().getPersonId()));
            }
        }
        if (userIds.size() > 0) {
            String[] ids = new String[userIds.size()];
            int i = 0;
            for (Integer userId : userIds) {
                ids[i++] = userId.toString();
            }
            users = OMWebServiceClient.getInstance().getUsersSimpleByPersonId(ids).getUsers();
        }

        HashSet<Integer> projectIds = new HashSet<Integer>();
        for (Record record : res) {
            if (record.getProjectDetails() != null) {
                projectIds.add(new Integer(record.getProjectDetails().getProjectId()));
            }
        }
        if (projectIds.size() > 0) {
            projects = CMWebServiceClient.getInstance().getProjectsSimpleByProjectIds(projectIds);
        }

        for (Record record : res) {
            if (record.getTeamMemberDetail() != null && members != null) {
                for (WSTeamMember member : members) {
                    if (record.getTeamMemberDetail().getTeamMemberId().equals(member.getMemberId())) {
                        record.setRecordOwnerName(
                                member.getFirstName().concat(" ").concat(member.getLastName()));
                        break;
                    }
                }
            } else if (record.getPersonDetail() != null && users != null) {
                for (UserSimple user : users) {
                    if (record.getPersonDetail().getPersonId() == user.getUserId()) {
                        record.setRecordOwnerName(user.getFirstName().concat(" ").concat(user.getLastName()));
                        break;
                    }
                }
            }

            //setting the project name
            if (record.getProjectDetails() != null && record.getProjectDetails().getProjectId() != null) {
                if (projects != null) {
                    for (WSProject project : projects) {
                        if (record.getProjectDetails().getProjectId().equals(project.getProjectId())) {
                            record.setProjectName(project.getName());
                            break;
                        }
                    }
                }
            }
            //if the prices must be computed per activities, i must set the records billable and overTimeBillable properties depending on their corresponding activity 
            //billable property value
            if (priceComputeType.equals(IConstant.NOM_RECORD_PRICES_COMPUTE_TYPE_FOR_ACTIVITY)) {
                if (record.getTime() != null && !record.getTime().equals("")) {
                    record.setBillable(record.getActivity().getBillable());
                } else {
                    record.setBillable(null);
                }
                if (record.getOverTimeTime() != null && !record.getOverTimeTime().equals("")) {
                    record.setOverTimeBillable(record.getActivity().getBillable());
                } else {
                    record.setOverTimeBillable(null);
                }
            }
        }
    }

    logger.debug("getTimeSheetReportRecords - END");
    return res;
}

From source file:sernet.verinice.bpm.gsm.GsmProcessParameterCreater.java

License:Open Source License

private List<ExecutionImpl> searchProcessByVariable(String key, String value) {
    DetachedCriteria executionCrit = DetachedCriteria.forClass(ExecutionImpl.class);
    DetachedCriteria variableCrit = executionCrit.createCriteria("variables");
    variableCrit.add(Restrictions.eq("key", key));
    variableCrit.add(Restrictions.eq("string", value));
    return getJbpmExecutionDao().findByCriteria(executionCrit);
}

From source file:sernet.verinice.bpm.ProcessServiceGeneric.java

License:Open Source License

public List<ExecutionImpl> findExecutionForElement(String key, String uuid) {
    String processDefinitionId = findProcessDefinitionId(key);
    if (LOG.isDebugEnabled()) {
        LOG.debug("Latest processDefinitionId: " + processDefinitionId);
    }/*from w w w . ja va  2s  .  co  m*/
    DetachedCriteria executionCrit = DetachedCriteria.forClass(ExecutionImpl.class);
    executionCrit.add(Restrictions.eq("processDefinitionId", processDefinitionId));
    DetachedCriteria variableCrit = executionCrit.createCriteria("variables");
    variableCrit.add(Restrictions.eq("key", IGenericProcess.VAR_UUID));
    variableCrit.add(Restrictions.eq("string", uuid));
    return getJbpmExecutionDao().findByCriteria(executionCrit);
}

From source file:sernet.verinice.bpm.ProcessServiceIsa.java

License:Open Source License

@Override
public List<ExecutionImpl> findControlExecution(final String uuidControl) {
    DetachedCriteria executionCrit = DetachedCriteria.forClass(ExecutionImpl.class);
    String processDefinitionId = findProcessDefinitionId(IControlExecutionProcess.KEY);
    if (LOG.isDebugEnabled()) {
        LOG.debug("Latest processDefinitionId: " + processDefinitionId);
    }/* w  ww .  jav a 2s. co m*/
    executionCrit.add(Restrictions.eq("processDefinitionId", processDefinitionId));
    DetachedCriteria variableCrit = executionCrit.createCriteria("variables");
    variableCrit.add(Restrictions.eq("key", IGenericProcess.VAR_UUID));
    variableCrit.add(Restrictions.eq("string", uuidControl));
    return getJbpmExecutionDao().findByCriteria(executionCrit);
}