public DatePeriodJobReport(
      Department reportingDepartment,
      List<JobSubCategory> jobSubCategories,
      List<Sector> sectors,
      List<JobReportItem> jobReportItems,
      DatePeriod datePeriods[]) {

    this.reportingDepartment = reportingDepartment;
    this.datePeriods = datePeriods;
    this.reportPeriod = BusinessEntityUtils.getMonthAndYearString(datePeriods[0].getEndDate());
    this.reportColumnData = new HashMap<Object, List>();
    this.jobReportItems = new HashMap<String, JobReportItem>();

    if (jobSubCategories != null) {
      initSubCategoriesReport(jobSubCategories);
    } else if (sectors != null) {
      initSectorsReport(sectors);
    } else if (jobReportItems != null) {
      initJobQuantitiesAndServicesReport(jobReportItems);
    }
  }
  public Object getReportItemValue(
      JobReportItem item,
      DatePeriod datePeriod,
      List<DatePeriodJobReportColumnData> reportColumnData) {

    Double value = 0.0;

    if (item.getName().equals("Jobs received in period")) {

      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (BusinessEntityUtils.isDateWithinPeriod(
            datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
            datePeriod.getStartDate(),
            datePeriod.getEndDate())) {
          value = value + 1.0;
        }
      }
      return value;
    }

    if (item.getName().equals("Earning jobs received in period")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (BusinessEntityUtils.isDateWithinPeriod(
            datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
            datePeriod.getStartDate(),
            datePeriod.getEndDate())) {
          if (datePeriodJobReportColumnData.getJobSubCategory().getIsEarning()) {
            value = value + 1.0;
          }
        }
      }
      return value;
    }

    if (item.getName().equals("Non-earning jobs received in period")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (BusinessEntityUtils.isDateWithinPeriod(
            datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
            datePeriod.getStartDate(),
            datePeriod.getEndDate())) {
          if (!datePeriodJobReportColumnData.getJobSubCategory().getIsEarning()) {
            value = value + 1.0;
          }
        }
      }
      return value;
    }

    if (item.getName().equals("Earning jobs received and completed in period")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (BusinessEntityUtils.isDateWithinPeriod(
            datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
            datePeriod.getStartDate(),
            datePeriod.getEndDate())) {
          if (datePeriodJobReportColumnData.getJobSubCategory().getIsEarning()) {
            if (datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion()
                != null) {
              if (BusinessEntityUtils.isDateWithinPeriod(
                  datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion(),
                  datePeriod.getStartDate(),
                  datePeriod.getEndDate())) {
                value = value + 1.0;
              }
            }
          }
        }
      }
      return value;
    }

    if (item.getName().equals("Earning jobs received and unfinished in period")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (BusinessEntityUtils.isDateWithinPeriod(
            datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
            datePeriod.getStartDate(),
            datePeriod.getEndDate())) {
          if (datePeriodJobReportColumnData.getJobSubCategory().getIsEarning()) {
            if (datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion()
                != null) {
              if (!BusinessEntityUtils.isDateWithinPeriod(
                  datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion(),
                  datePeriod.getStartDate(),
                  datePeriod.getEndDate())) {
                value = value + 1.0;
              }
            } else {
              value = value + 1.0;
            }
          }
        }
      }
      return value;
    }

    if (item.getName().equals("Jobs completed in period")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion() != null) {
          if (BusinessEntityUtils.isDateWithinPeriod(
              datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion(),
              datePeriod.getStartDate(),
              datePeriod.getEndDate())) {
            value = value + 1.0;
          }
        }
      }
      return value;
    }

    if (item.getName().equals("Earning jobs completed on time")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (datePeriodJobReportColumnData.getJobSubCategory().getIsEarning()) {
          if (datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion()
              != null) {
            if (BusinessEntityUtils.isDateWithinPeriod(
                datePeriodJobReportColumnData.getJobStatusAndTracking().getDateOfCompletion(),
                datePeriod.getStartDate(),
                datePeriod.getEndDate())) {
              if (datePeriodJobReportColumnData
                      .getJobStatusAndTracking()
                      .getExpectedDateOfCompletion()
                  != null) {
                if (datePeriodJobReportColumnData
                        .getJobStatusAndTracking()
                        .getDateOfCompletion()
                        .compareTo(
                            datePeriodJobReportColumnData
                                .getJobStatusAndTracking()
                                .getExpectedDateOfCompletion())
                    <= 0) {
                  value = value + 1.0;
                }
              }
            }
          }
        }
      }

      // saved for use in calculating cotif
      earningJobsCompletedOnTime = value;
      return value;
    }

    if (item.getName().equals("Earning jobs scheduled for completion in period")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (datePeriodJobReportColumnData.getJobSubCategory().getIsEarning()) {
          if (datePeriodJobReportColumnData.getJobStatusAndTracking().getExpectedDateOfCompletion()
              != null) {
            if (BusinessEntityUtils.isDateWithinPeriod(
                datePeriodJobReportColumnData
                    .getJobStatusAndTracking()
                    .getExpectedDateOfCompletion(),
                datePeriod.getStartDate(),
                datePeriod.getEndDate())) {
              value = value + 1.0;
            }
          }
        }
      }

      // saved for use in calculating cotif
      earningJobsScheduledForCompletionInPeriod = value;
      return value;
    }

    if (item.getName().equals("COTIF (%)")) {
      if (earningJobsScheduledForCompletionInPeriod != 0.0) {
        value = (earningJobsCompletedOnTime / earningJobsScheduledForCompletionInPeriod) * 100.0;
      } else {
        value = 0.0;
      }

      return value;
    }

    if (item.getName().equals("New clients served in period")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (datePeriodJobReportColumnData.getNewClient() != null) {
          if (datePeriodJobReportColumnData.getNewClient()) {
            if (BusinessEntityUtils.isDateWithinPeriod(
                datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
                datePeriod.getStartDate(),
                datePeriod.getEndDate())) {
              value = value + 1.0;
            }
          }
        }
      }
      return value;
    }

    if (item.getName().equals("Earnings from new clients")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (datePeriodJobReportColumnData.getNewClient() != null) {
          if (datePeriodJobReportColumnData.getNewClient()) {
            if (BusinessEntityUtils.isDateWithinPeriod(
                datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
                datePeriod.getStartDate(),
                datePeriod.getEndDate())) {

              if (datePeriodJobReportColumnData.getJobCostingAndPayment().getFinalCost() != null) {
                value =
                    value + datePeriodJobReportColumnData.getJobCostingAndPayment().getFinalCost();
              }
            }
          }
        }
      }
      return value;
    }

    if (item.getName().equals("Samples received")) {
      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        if (datePeriodJobReportColumnData.getJobSubCategory().getIsEarning()) {
          if (BusinessEntityUtils.isDateWithinPeriod(
              datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
              datePeriod.getStartDate(),
              datePeriod.getEndDate())) {
            value = value + datePeriodJobReportColumnData.getNumberOfSamples();
          }
        }
      }

      return value;
    }

    if (item.getName().equals("Clients served in period")) {
      HashSet<String> clients = new HashSet<String>();

      for (DatePeriodJobReportColumnData datePeriodJobReportColumnData : reportColumnData) {
        // collect clients
        if (datePeriodJobReportColumnData.getClient() != null) {
          // filter based on date eg. date submitted/job completed
          if (BusinessEntityUtils.isDateWithinPeriod(
              datePeriodJobReportColumnData.getJobStatusAndTracking().getDateSubmitted(),
              datePeriod.getStartDate(),
              datePeriod.getEndDate())) {
            clients.add(datePeriodJobReportColumnData.getClient().getName());
          }
        }
      }

      value = Double.parseDouble("" + clients.size());

      return value;
    }

    return value;
  }