public DemandOutcome createDemandOutcome(
      final List<AreaRequirement> outcome, final String projectId)
      throws WifInvalidInputException, WifInvalidConfigException {
    final DemandOutcome newDemandOutcome = new DemandOutcome();
    newDemandOutcome.setLabel("automated-manualdemand");
    LOGGER.debug("creating a new ManualDemandScenario={}", newDemandOutcome.getLabel());
    final WifProject project = projectService.getProject(projectId);
    newDemandOutcome.setProjectId(project.getId());
    for (final AreaRequirement areaRequirement : outcome) {
      // final ManualAreaRequirement manualAreaRequirement = new
      // ManualAreaRequirement();
      // manualAreaRequirement.setAllocationLU(areaRequirement.getAllocationLU());
      // manualAreaRequirement.setRequiredArea(areaRequirement.getRequiredArea());
      // manualAreaRequirement.setProjection(areaRequirement.getProjection());

      areaRequirement.setProjectionLabel(areaRequirement.getProjection().getLabel());

      newDemandOutcome.addAreaRequirenment(areaRequirement);
      LOGGER.info(
          "recreating manually required area for land use  {} in projection "
              + areaRequirement.getProjection().getLabel()
              + " is : {}",
          areaRequirement.getAllocationLU().getLabel(),
          areaRequirement.getRequiredArea());
    }

    final DemandOutcome savedDemandOutcome =
        demandOutcomeDao.persistDemandOutcome(newDemandOutcome);
    LOGGER.debug("returning the ManualDemandScenario with id={}", savedDemandOutcome.getId());
    return savedDemandOutcome;
  }
  /*
   * (non-Javadoc)
   * @see au.org.aurin.wif.svc.report.ReportService#getAllocationAnalysisReport(
   * au.org.aurin.wif.model.allocation.AllocationScenario)
   */
  public AllocationAnalysisReport getAllocationAnalysisReport(
      final AllocationScenario allocationScenario)
      throws WifInvalidInputException, WifInvalidConfigException, ParsingException {
    LOGGER.info("getAllocationAnalysisReport for: {}", allocationScenario.getLabel());
    final AllocationAnalysisReport allocationAnalysisReport = new AllocationAnalysisReport();

    final WifProject project = allocationScenario.getWifProject();
    final AllocationConfig allocationConfig = project.getAllocationConfig();
    final String projectId = allocationScenario.getProjectId();
    allocationAnalysisReport.setReportType(allocationScenario.getDocType());
    allocationAnalysisReport.setLabel(project.getName());
    allocationAnalysisReport.setScenarioLabel(allocationScenario.getDocType());
    allocationAnalysisReport.setProjectId(allocationScenario.getProjectId());

    // Getting land use information
    LOGGER.info("Getting land use information: {}");
    final DemandConfig demandConfig = demandConfigService.getDemandConfig(projectId);
    LOGGER.info("Associated demandConfigId: {}", demandConfig.getId());
    final TreeSet<Projection> projections = new TreeSet<Projection>(new YearComparator());
    projections.addAll(demandConfig.getProjections());
    final Projection current = projections.first();
    LOGGER.info("current year projection: {}", current.getLabel());
    // setting up taking into account current projection year is not a
    // projection by itself,per se,
    final NavigableSet<Projection> projectedSet = projections.tailSet(projections.first(), false);
    final Set<AllocationLU> allocationLandUses = project.getAllocationLandUses();
    for (final AllocationLU allocationLU : allocationLandUses) {
      if (allocationLU.getLabel() == null) {
        LOGGER.warn("Not performing analysis for null label for LU: {}", allocationLU.getId());
        continue;
      }
      for (final Projection projection : projectedSet) {
        LOGGER.info("getAreaByLU for: {}, id {}", allocationLU.getLabel(), allocationLU.getId());
        final String allocationFFName =
            allocationConfig.getAllocationColumnsMap().get(projection.getLabel());

        final Double areaByLU =
            geodataFinder.getAreaByLU(
                project.getSuitabilityConfig().getUnifiedAreaZone(),
                project.getAreaLabel(),
                project.getExistingLUAttributeName(),
                allocationLU.getFeatureFieldName(),
                allocationFFName,
                allocationLU.getAllocationFeatureFieldName());
        final AreaRequirement ar = new AreaRequirement();
        ar.setAllocationLU(allocationLU);
        ar.setRequiredArea(areaByLU);
        ar.setProjection(projection);
        allocationAnalysisReport.getLandUseInformation().add(ar);
      }
    }
    // Getting population and employment information
    LOGGER.info("Getting population and employment information: {}");
    final DemographicTrend demographicTrend =
        demandConfig.getTrendByLabel(
            allocationScenario.getDemandScenario().getDemographicTrendLabel());
    final Set<DemographicData> demographicData = demographicTrend.getDemographicData();
    for (final DemographicData data : demographicData) {
      if (data instanceof ResidentialDemographicData) {
        allocationAnalysisReport.getPopulationInformation().add((ResidentialDemographicData) data);
      } else if (data instanceof EmploymentDemographicData) {
        allocationAnalysisReport.getEmploymentInformation().add((EmploymentDemographicData) data);
      }
    }
    LOGGER.info(
        "Finished allocationAnalysisReport for: {}", allocationAnalysisReport.getProjectId());
    return allocationAnalysisReport;
  }