public static ProjectDTO updateProject(ProjectDTO inputDTO) {
    validateProject(inputDTO);

    // Generate a TmpProject from the input
    TmpProject tmpProject = ProjectManager.generateTmpProject(inputDTO);
    tmpProject.setProjectId(Integer.parseInt(inputDTO.getProjectId()));
    tmpProject.setDateUpdated(new Date());

    // Update the client
    tmpProjectDAO.update(tmpProject);

    // Return the resulting VO
    return ProjectManager.generateProjectDTO(tmpProject);
  }
  public static ProjectDTO addProject(ProjectDTO inputDTO) {
    validateProject(inputDTO);

    // Generate a PathClient from the input
    TmpProject tmpProject = ProjectManager.generateTmpProject(inputDTO);

    // Set Export fields
    tmpProject.setDateCreated(new Date());
    tmpProject.setDateUpdated(new Date());

    // Save the client to allow secondary object generation
    tmpProjectDAO.save(tmpProject);
    inputDTO.setProjectId(tmpProject.getProjectId().toString());

    // Return the resulting VO
    return ProjectManager.generateProjectDTO(tmpProject);
  }
  public static TmpProject generateTmpProject(ProjectDTO inputDTO) {
    TmpProject tmpProject = new TmpProject();

    tmpProject.setProjectName(inputDTO.getProjectName());

    // Universal Data Standard: Project Type (2014, 2.4)
    tmpProject.setContinuumProject(inputDTO.getContinuumProject().getCode());
    tmpProject.setProjectType(inputDTO.getProjectType().getCode());
    tmpProject.setResidentialAffiliation(inputDTO.getResidentialAffiliation().getCode());
    tmpProject.setResProjectId(Integer.parseInt(inputDTO.getResProjectId()));

    // Universal Data Standard: Project Type (2014, 2.5)
    tmpProject.setTrackingMethod(inputDTO.getTrackingMethod().getCode());

    // Universal Data Standard: Target Population (2014 2.9)
    tmpProject.setTargetPopulation(inputDTO.getTargetPopulation().getCode());

    // Export Standard Fields
    tmpProject.setDateCreated(inputDTO.getDateCreated());
    tmpProject.setDateUpdated(inputDTO.getDateUpdated());

    return tmpProject;
  }
  public static ProjectDTO generateProjectDTO(TmpProject tmpProject) {
    Integer projectId = tmpProject.getProjectId();

    ProjectDTO projectDTO = new ProjectDTO();
    projectDTO.setProjectId(tmpProject.getProjectId().toString());

    // Universal Data Standard: Project Identifiers (2014, 2.2)
    projectDTO.setProjectName(tmpProject.getProjectName());

    // Universal Data Standard: Project CoC (2014, 2.3)
    projectDTO.setProjectCoCs(CoCManager.getCoCsByProjectId(projectId.toString()));

    // Universal Data Standard: Project Type (2014, 2.4)
    projectDTO.setContinuumProject(YesNo.valueByCode(tmpProject.getContinuumProject()));
    projectDTO.setProjectType(ProjectType.valueByCode(tmpProject.getProjectType()));
    projectDTO.setResidentialAffiliation(YesNo.valueByCode(tmpProject.getResidentialAffiliation()));
    projectDTO.setResProjectId(tmpProject.getResProjectId().toString());

    // Universal Data Standard: Project Type (2014, 2.5)
    projectDTO.setTrackingMethod(ProjectTrackingMethod.valueByCode(tmpProject.getTrackingMethod()));

    // Universal Data Standard: Funders (2014, 2.6)
    projectDTO.setFunders(FunderManager.getFundersByProjectId(projectId.toString()));

    // Universal Data Standard: Target Population (2014 2.9)
    projectDTO.setTargetPopulation(
        ProjectTargetPopulation.valueByCode(tmpProject.getTargetPopulation()));

    // Export Standard Fields
    projectDTO.setDateCreated(tmpProject.getDateCreated());
    projectDTO.setDateUpdated(tmpProject.getDateUpdated());

    return projectDTO;
  }
  public static boolean validateProject(ProjectDTO inputDTO) {

    // Universal Data Standard: Project Type (2014, 2.4)
    if (inputDTO.getContinuumProject() == YesNo.ERR_UNKNOWN)
      throw new InvalidParameterException(
          "HUD 2.4.1 continuumProject", "continuumProject is set to an unknown code");
    if (inputDTO.getProjectType() == ProjectType.ERR_UNKNOWN)
      throw new InvalidParameterException(
          "HUD 2.4.2 projectType", "projectType is set to an unknown code");
    if (inputDTO.getResidentialAffiliation() == YesNo.ERR_UNKNOWN)
      throw new InvalidParameterException(
          "HUD 2.4.3 residentialAffiliation", "residentialAffiliation is set to an unknown code");

    if (inputDTO.getContinuumProject() != YesNo.YES && inputDTO.getProjectType() == null)
      throw new InvalidParameterException(
          "HUD 2.4.2 projectType", "projectType may only be null if continuumProject is 1");

    if (inputDTO.getProjectType() != ProjectType.SERVICES_ONLY
        && inputDTO.getResidentialAffiliation() != null)
      throw new InvalidParameterException(
          "HUD 2.4.3 residentialAffiliation",
          "residentialAffiliation must be null if projectType is not 6");

    // Universal Data Standard: Project Type (2014, 2.5)
    if (inputDTO.getTrackingMethod() == ProjectTrackingMethod.ERR_UNKNOWN)
      throw new InvalidParameterException(
          "HUD 2.5.1 trackingMethod", "trackingMethod is set to an unknown code");

    if (inputDTO.getProjectType() != ProjectType.EMERGENCY_SHELTER
        && inputDTO.getTrackingMethod() != null)
      throw new InvalidParameterException(
          "HUD 2.5.1 trackingMethod", "trackingMethod must be null if projectType is not 1");

    // Universal Data Standard: Target Population (2014 2.9)
    if (inputDTO.getTargetPopulation() == ProjectTargetPopulation.ERR_UNKNOWN)
      throw new InvalidParameterException(
          "HUD 2.9.1 targetPopulation", "targetPopulation is set to an unknown code");

    return true;
  }