/**
   * The method should be invoked before collection of disbursement DTO has been saved within
   * staging database.
   *
   * @param dtos Input collection of DisbursementDTO
   * @return collection of DisbursementDTO processed successfully.
   */
  public Collection<DisbursementDTO> preProcess(Collection<DisbursementDTO> dtos) {
    /*
     * Disbursement State of "Incomplete" and Disbursement
     * Status of "Incomplete Payment" that have not been sent to Payment
     * Processor for processing and a Disbursement Date less than or equal
     * to the Business Date is eligible for processing.
     */

    Collection<DisbursementDTO> validDisbursement = new ArrayList<DisbursementDTO>();
    if (dtos != null && dtos.size() > 0) {
      logger.debug(
          "Process Started. [ClientExportPaymentHelper] Validate disbursement to be exported.");
      Date businessDate =
          MuleServiceFactory.getService(DateService.class)
              .getBusinessDate(1L, BusinessDateType.BUSINESS);

      for (DisbursementDTO dto : dtos) {

        if (DisbursementConstants.DISB_STATE_TYPE_CODE_INCOMPLETE.equalsIgnoreCase(
                dto.getStateCode())
            && DisbursementConstants.DISB_STATUS_TYPE_CODE_INCOMPLETE_PAYMENT.equalsIgnoreCase(
                dto.getStatusCode())
            && (DateUtility.compareDate(dto.getEffectiveDate(), businessDate) <= 0)
            && (dto.getEndDate() == null
                || DateUtility.compareDate(dto.getEndDate(), businessDate) >= 0)) {
          validDisbursement.add(dto);

        } else if (DisbursementConstants.DISB_STATE_TYPE_CODE_OPEN.equalsIgnoreCase(
                dto.getStateCode())
            && DisbursementConstants.DISB_STATUS_TYPE_CODE_PAYMENT_STOPPED_NOT_REISSUED
                .equalsIgnoreCase(dto.getStatusCode())
            && (DateUtility.compareDate(dto.getEffectiveDate(), businessDate) <= 0)
            && (dto.getEndDate() == null
                || DateUtility.compareDate(dto.getEndDate(), businessDate) >= 0)) {
          validDisbursement.add(dto);
        } else if (DisbursementConstants.DISB_STATE_TYPE_CODE_OPEN.equalsIgnoreCase(
                dto.getStateCode())
            && DisbursementConstants.DISB_STATUS_TYPE_CODE_ISSUED_PAYMENT.equalsIgnoreCase(
                dto.getStatusCode())
            && (dto.getDisbursementStatuses().size() == 1)
            && (DateUtility.compareDate(dto.getEffectiveDate(), businessDate) <= 0)
            && (dto.getEndDate() == null
                || DateUtility.compareDate(dto.getEndDate(), businessDate) >= 0)) {
          validDisbursement.add(dto);
        } else if (DisbursementConstants.DISB_STATE_TYPE_CODE_COMPLETE.equalsIgnoreCase(
                dto.getStateCode())
            && DisbursementConstants.DISB_STATUS_TYPE_CODE_PAYMENT_VOIDED_NOT_REISSUED
                .equalsIgnoreCase(dto.getStatusCode())
            && (DateUtility.compareDate(dto.getEffectiveDate(), businessDate) <= 0)
            && (dto.getEndDate() == null
                || DateUtility.compareDate(dto.getEndDate(), businessDate) >= 0)) {
          validDisbursement.add(dto);
        } else {
          logger.debug(
              "[ClientExportPaymentHelper] Criteria Not Met for Disbursement ID = {} ",
              dto.getRecordId());
        }
      }
      // Flush all context to re initialize sequence generator.
      ExportPaymentSequenceGenHelper.flushAllContext();
    }
    return validDisbursement;
  }