package org.joget.directory.dao; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.joget.commons.spring.model.AbstractSpringDao; import org.joget.commons.util.LogUtil; import org.joget.directory.model.Department; import org.joget.directory.model.Employment; import org.joget.directory.model.EmploymentReportTo; import org.joget.directory.model.Grade; import org.joget.directory.model.Organization; import org.joget.directory.model.User; public class EmploymentDaoImpl extends AbstractSpringDao implements EmploymentDao { private EmploymentReportToDao employmentReportToDao; private UserDao userDao; private OrganizationDao organizationDao; private DepartmentDao departmentDao; private GradeDao gradeDao; public GradeDao getGradeDao() { return gradeDao; } public void setGradeDao(GradeDao gradeDao) { this.gradeDao = gradeDao; } public OrganizationDao getOrganizationDao() { return organizationDao; } public void setOrganizationDao(OrganizationDao organizationDao) { this.organizationDao = organizationDao; } public EmploymentReportToDao getEmploymentReportToDao() { return employmentReportToDao; } public void setEmploymentReportToDao(EmploymentReportToDao employmentReportToDao) { this.employmentReportToDao = employmentReportToDao; } public DepartmentDao getDepartmentDao() { return departmentDao; } public void setDepartmentDao(DepartmentDao departmentDao) { this.departmentDao = departmentDao; } public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public Boolean addEmployment(Employment employment) { try { User user = employment.getUser(); if (user != null) { employment.setHods(new HashSet()); Set<Employment> employments = new HashSet<Employment>(); employments.add(employment); user.setEmployments(employments); } save("Employment", employment); return true; } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Add Employment Error!"); return false; } } public Boolean updateEmployment(Employment employment) { try { merge("Employment", employment); return true; } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Update Employment Error!"); return false; } } public Boolean deleteEmployment(String id) { try { Employment employment = getEmployment(id); if (employment != null) { // clear department HOD Department dept = employment.getDepartment(); if (dept != null) { Employment hod = dept.getHod(); if (hod != null && id.equals(hod.getId())) { dept.setHod(null); departmentDao.updateDepartment(dept); } } // clear employment employment.setOrganization(null); employment.setDepartment(null); employment.setGrade(null); employment.setUser(null); employment.getHods().clear(); if (employment.getSubordinates() != null) { for (EmploymentReportTo r : (Set<EmploymentReportTo>) employment.getSubordinates()) { employmentReportToDao.deleteEmploymentReportTo(r.getId()); } } if (employment.getEmploymentReportTo() != null) { employmentReportToDao.deleteEmploymentReportTo(employment.getEmploymentReportTo().getId()); } delete("Employment", employment); } return true; } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Delete Employment Error!"); return false; } } public Employment getEmployment(String id) { try { return (Employment) find("Employment", id); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Employment Error!"); return null; } } public Collection<Employment> findEmployments(String condition, Object[] params, String sort, Boolean desc, Integer start, Integer rows) { try { return find("Employment", condition, params, sort, desc, start, rows); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Find Employments Error!"); } return null; } public Long countEmployments(String condition, Object[] params) { try { return count("Employment", condition, params); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Count Employments Error!"); } return 0L; } public Collection<Employment> getEmployments(String filterString, String organizationId, String departmentId, String gradeId, String sort, Boolean desc, Integer start, Integer rows) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.employeeCode like ? or e.role like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); if (organizationId != null) { condition += " and e.organization.id = ?"; param.add(organizationId); } if (departmentId != null) { condition += " and e.department.id = ?"; param.add(departmentId); } if (gradeId != null) { condition += " and e.grade.id = ?"; param.add(gradeId); } return find("Employment", condition, param.toArray(), sort, desc, start, rows); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Employments Error!"); } return null; } public Long getTotalEmployments(String filterString, String organizationId, String departmentId, String gradeId) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.employeeCode like ? or e.role like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); if (organizationId != null) { condition += " and e.organization.id = ?"; param.add(organizationId); } if (departmentId != null) { condition += " and e.department.id = ?"; param.add(departmentId); } if (gradeId != null) { condition += " and e.grade.id = ?"; param.add(gradeId); } return count("Employment", condition, param.toArray()); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Total Employments Error!"); } return 0L; } public Boolean assignUserAsDepartmentHOD(String userId, String departmentId) { try { User user = userDao.getUserById(userId); Department department = departmentDao.getDepartment(departmentId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && department != null) { Employment employment = (Employment) user.getEmployments().iterator().next(); employment.getHods().clear(); employment.getHods().add(department); saveOrUpdate("Employment", employment); department.setHod(employment); departmentDao.updateDepartment(department); return true; } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Assign User As Department Hod Error!"); } return false; } public Boolean unassignUserAsDepartmentHOD(String userId, String departmentId) { try { User user = userDao.getUserById(userId); Department department = departmentDao.getDepartment(departmentId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (department != null && employment.getHods().contains(department)) { employment.getHods().clear(); saveOrUpdate("Employment", employment); department.setHod(null); departmentDao.updateDepartment(department); return true; } } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Unassign User As Department Hod Error!"); } return false; } public Boolean assignUserReportTo(String userId, String reportToUserId) { try { User user = userDao.getUserById(userId); User reportToUser = userDao.getUserById(reportToUserId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && reportToUser != null && reportToUser.getEmployments() != null && reportToUser.getEmployments().size() > 0) { Employment employment = (Employment) user.getEmployments().iterator().next(); Employment reportToEmployment = (Employment) reportToUser.getEmployments().iterator().next(); if (employment.getEmploymentReportTo() != null) { //delete current report to employmentReportToDao.deleteEmploymentReportTo(employment.getEmploymentReportTo().getId()); } EmploymentReportTo employmentReportTo = new EmploymentReportTo(); employmentReportTo.setSubordinate(employment); employmentReportTo.setReportTo(reportToEmployment); employmentReportToDao.addEmploymentReportTo(employmentReportTo); return true; } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Assign User Report To Error!"); } return false; } public Boolean unassignUserReportTo(String userId) { try { User user = userDao.getUserById(userId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (employment.getEmploymentReportTo() != null) { return employmentReportToDao.deleteEmploymentReportTo(employment.getEmploymentReportTo().getId()); } } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Unassign User Report To Error!"); } return false; } public Boolean assignUserToOrganization(String userId, String organizationId) { try { User user = userDao.getUserById(userId); Organization organization = organizationDao.getOrganization(organizationId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && organization != null) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (!organization.getId().equals(employment.getOrganizationId())) { if (employment.getHods() != null && !employment.getHods().isEmpty() && employment.getDepartment() != null) { Department orgDepartment = employment.getDepartment(); orgDepartment.setHod(null); departmentDao.updateDepartment(orgDepartment); } employment.setOrganizationId(organization.getId()); employment.setDepartmentId(null); employment.setGradeId(null); employment.getHods().clear(); saveOrUpdate("Employment", employment); } return true; } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Assign User To Organization Error!"); } return false; } public Boolean unassignUserFromOrganization(String userId, String organizationId) { try { User user = userDao.getUserById(userId); Organization organization = organizationDao.getOrganization(organizationId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && organization != null) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (organization.getId().equals(employment.getOrganizationId())) { if (employment.getHods() != null && !employment.getHods().isEmpty() && employment.getDepartment() != null) { Department orgDepartment = employment.getDepartment(); orgDepartment.setHod(null); departmentDao.updateDepartment(orgDepartment); } employment.setOrganizationId(null); employment.setDepartmentId(null); employment.setGradeId(null); employment.getHods().clear(); saveOrUpdate("Employment", employment); return true; } } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Unassign User From Organization Error!"); } return false; } public Boolean assignUserToDepartment(String userId, String departmentId) { try { User user = userDao.getUserById(userId); Department department = departmentDao.getDepartment(departmentId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && department != null) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (!department.getId().equals(employment.getDepartmentId())) { if (employment.getHods() != null && !employment.getHods().isEmpty() && employment.getDepartment() != null) { Department orgDepartment = employment.getDepartment(); orgDepartment.setHod(null); departmentDao.updateDepartment(orgDepartment); } employment.setOrganizationId(department.getOrganization().getId()); employment.setDepartmentId(department.getId()); employment.getHods().clear(); saveOrUpdate("Employment", employment); } return true; } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Assign User To Department Error!"); } return false; } public Boolean unassignUserFromDepartment(String userId, String departmentId) { try { User user = userDao.getUserById(userId); Department department = departmentDao.getDepartment(departmentId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && department != null) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (department.getId().equals(employment.getDepartmentId())) { if (employment.getHods() != null && !employment.getHods().isEmpty() && employment.getDepartment() != null) { Department orgDepartment = employment.getDepartment(); orgDepartment.setHod(null); departmentDao.updateDepartment(orgDepartment); } employment.setDepartmentId(null); employment.getHods().clear(); saveOrUpdate("Employment", employment); return true; } } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Unassign User from Department Error!"); } return false; } public Boolean assignUserToGrade(String userId, String gradeId) { try { User user = userDao.getUserById(userId); Grade grade = gradeDao.getGrade(gradeId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && grade != null) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (!grade.getId().equals(employment.getGradeId())) { employment.setGradeId(grade.getId()); saveOrUpdate("Employment", employment); } return true; } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Assign User To Grade Error!"); } return false; } public Boolean unassignUserFromGrade(String userId, String gradeId) { try { User user = userDao.getUserById(userId); Grade grade = gradeDao.getGrade(gradeId); //get only 1st employment if (user != null && user.getEmployments() != null && user.getEmployments().size() > 0 && grade != null) { Employment employment = (Employment) user.getEmployments().iterator().next(); if (grade.getId().equals(employment.getGradeId())) { employment.setGradeId(null); saveOrUpdate("Employment", employment); return true; } } } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "UnAssign User from Grade Error!"); } return false; } public Collection<Employment> getEmploymentsNoHaveOrganization(String filterString, String sort, Boolean desc, Integer start, Integer rows) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.user.email like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); condition += " and (e.organizationId is null or e.organizationId = '')"; return find("Employment", condition, param.toArray(), sort, desc, start, rows); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Users No Have Organization Error!"); } return null; } public Long getTotalEmploymentsNoHaveOrganization(String filterString) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.user.email like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); condition += " and (e.organizationId is null or e.organizationId = '')"; return count("Employment", condition, param.toArray()); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Total Employments No Have Organization Error!"); } return 0L; } public Collection<Employment> getEmploymentsNotInDepartment(String filterString, String organizationId, String departmentId, String sort, Boolean desc, Integer start, Integer rows) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.user.email like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); condition += " and (e.organizationId = ? or e.organizationId is null) and (e.departmentId <> ? or e.departmentId is null or e.departmentId = '')"; param.add(organizationId); param.add(departmentId); return find("Employment", condition, param.toArray(), sort, desc, start, rows); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Employments Not In Department Error!"); } return null; } public Long getTotalEmploymentsNotInDepartment(String filterString, String organizationId, String departmentId) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.user.email like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); condition += " and (e.organizationId = ? or e.organizationId is null) and (e.departmentId <> ? or e.departmentId is null or e.departmentId = '')"; param.add(organizationId); param.add(departmentId); return count("Employment", condition, param.toArray()); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Total Employments Not In Department Error!"); } return 0L; } public Collection<Employment> getEmploymentsNotInGrade(String filterString, String organizationId, String gradeId, String sort, Boolean desc, Integer start, Integer rows) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.user.email like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); condition += " and e.organizationId = ? and (e.gradeId <> ? or e.gradeId is null or e.gradeId = '')"; param.add(organizationId); param.add(gradeId); return find("Employment", condition, param.toArray(), sort, desc, start, rows); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Employments Not In Grade Error!"); } return null; } public Long getTotalEmploymentsNotInGrade(String filterString, String organizationId, String gradeId) { try { if (filterString == null) { filterString = ""; } Collection param = new ArrayList(); String condition = "where (e.user.username like ? or e.user.firstName like ? or e.user.lastName like ? or e.user.email like ?)"; param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); param.add("%" + filterString + "%"); condition += " and e.organizationId = ? and (e.gradeId <> ? or e.gradeId is null or e.gradeId = '')"; param.add(organizationId); param.add(gradeId); return count("Employment", condition, param.toArray()); } catch (Exception e) { LogUtil.error(EmploymentDaoImpl.class.getName(), e, "Get Total Employments Not In Grade Error!"); } return 0L; } }