public void storeAdDcCoop(AdDcCoopBean adcb) throws ApplicationException {
    boolean success = false;
    try {
      //			DBHelper.startTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, false);

      // Get the AdDcCoop entry from the database
      AdDcCoopBean temp = getAdDcCoopByIdAndDivision(adcb.getCoopId(), adcb.getRegionMemberId());

      // If the AdDcCoop was not already in the database ...
      if (temp == null) {
        // Create the AdDcCoop entry in the database
        AdDcCoopManager.createDivisionCoop(
            adcb.getCoopId(),
            adcb.getRegionMemberId(),
            adcb.getInitialAmount(),
            adcb.getBilledAmount(),
            adcb.getEstimatedCases(),
            adcb.getActualCases(),
            adcb.getWorkFlowPhaseId(),
            adcb.getDivisionTaken(),
            adcb.getDivisionRejectReason(),
            adcb.getBillDate(),
            adcb.getBillSign(),
            adcb.getAccountRejectReason(),
            adcb.getAccountingExportWeek(),
            adcb.getAccountingExportPeriod(),
            adcb.getAccountingExportYear());
      } else {
        // Update the AdDcCoop entry
        AdDcCoopManager.updateDivisionCoop(
            adcb.getRegionMemberId(),
            adcb.getInitialAmount(),
            adcb.getBilledAmount(),
            adcb.getEstimatedCases(),
            adcb.getActualCases(),
            adcb.getWorkFlowPhaseId(),
            adcb.getDivisionTaken(),
            adcb.getDivisionRejectReason(),
            adcb.getBillDate(),
            adcb.getBillSign(),
            adcb.getAccountRejectReason(),
            adcb.getCoopId(),
            adcb.getAccountingExportWeek(),
            adcb.getAccountingExportPeriod(),
            adcb.getAccountingExportYear());
      }

      success = true;
    } finally {
      //			DBHelper.finalizeActiveTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, success);
    }
  }
  public void validateCoop(AdDcCoopBean coop) throws ApplicationException {
    if (coop.getDivisionTaken() == 1) {
      if (coop.getDivisionRejectReason() > 0) {
        throw new ApplicationException(
            "A division reject message was specified when accepting the division record.  Please reject the record or remove the reject message.  Coop ID: "
                + coop.getCoopId());
      }
    } else if (coop.getDivisionTaken() == -1) {
      if (coop.getDivisionRejectReason() <= 0) {
        throw new ApplicationException(
            "A reject message must be specified when rejecting the division record.  Coop ID: "
                + coop.getCoopId());
      }
      if (coop.getEstimatedCases() > 0) {
        throw new ApplicationException(
            "A positive estimated case count can not be specified when rejecting the division record.  Coop ID: "
                + coop.getCoopId());
      }
    }

    if (coop.getAccountRejectReason() > 0) {
      if (Utils.hasContent(coop.getBillSign())) {
        throw new ApplicationException(
            "The entry cannot have a billing signature when it is rejected.  Coop ID: "
                + coop.getCoopId());
      } else if (coop.getBillDate() != null) {
        throw new ApplicationException(
            "The entry cannot have a billing date when it is rejected.  Coop ID: "
                + coop.getCoopId());
      }
    }
  }
  /**
   * Validate and update the provided list of AdDcCoopBeans in the database in transactional
   * fashion. If validation on any coop, an ApplicationException is thrown and no data is changed on
   * any entry in the database. If all entries are validated, their data is updated in the database
   * and workflow is performed. If <code>divisionUpdate</code> is <code>true</code>, then workflow
   * is sent a <code>open</code>, <code>reject</code>, or <code>accept</code> depending if the
   * <code>divisionTaken</code> attribute is -1, 1, or 0, respectively. If <code>divisionUpdate
   * </code> is <code>false</code> (i.e. an accounting update), then workflow is send <code>billed
   * </code> (bill date or signature is provided), <code>reject</code> (an accounting reject reason
   * is provided), or <code>open</code> (otherwise). Also, for all accounting updates,
   * #updateDivisionCoopMonies(int) is invoked.
   *
   * @param dcCoops the list of division coops to process
   * @param divisionUpdate indicates if this is an update from the division phase
   * @param username the user submitting the workflow request
   * @throws ApplicationException if a database, validation, or workflow error occurs
   */
  public void updateCoopsWithWorkflow(
      AdDcCoopBean[] dcCoops, boolean divisionUpdate, String username) throws ApplicationException {

    if (dcCoops == null || dcCoops.length == 0) {
      return;
    }

    boolean success = false;
    try {
      //	        DBHelper.startTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, false);
      for (int i = 0; i < dcCoops.length; i++) {

        AdDcCoopBean dcCoop = dcCoops[i];
        if (dcCoop != null) {
          validateCoop(dcCoop);

          String outcome = null;
          if (divisionUpdate) {
            AdCoopBean coop = AdCoopManager.getCoopById(dcCoop.getCoopId());
            if (coop == null) {
              throw new ApplicationException(
                  "Unable to locate coop having id: " + dcCoop.getCoopId());
            }

            if (coop.getType() == ContractsUtils.getCoopIdCaseRate()) {
              int divisionTaken = 0;
              if (dcCoop.getEstimatedCases() > 0) {
                divisionTaken = 1;
              } else if (dcCoop.getEstimatedCases() == 0) {
                divisionTaken = -1;
              }
              dcCoop.setDivisionTaken(divisionTaken);
            }
            outcome =
                dcCoop.getDivisionTaken() == 1
                    ? "accept"
                    : dcCoop.getDivisionTaken() == -1 ? "reject" : "open";
          } else {
            if (username.equals(AdCoopExportCommand.WF_USERID)) outcome = "export";
            else
              outcome =
                  Utils.hasContent(dcCoop.getBillSign()) || dcCoop.getBillDate() != null
                      ? "billed"
                      : dcCoop.getAccountRejectReason() > 0 ? "reject" : "open";
          }
          WorkflowTransactionPhase newPhase =
              ContractsUtils.getWorkflowCommand()
                  .processTransition(
                      dcCoop.getWorkFlowPhaseId(), outcome, username, dcCoop.toString());
          dcCoop.setWorkFlowPhaseId(newPhase.getId());

          this.storeAdDcCoop(dcCoop);
          if (!divisionUpdate) {
            this.updateDivisionCoopMonies(
                dcCoop.getCoopId()); // this is an accounting update, so we will affect the billed
            // amounts.
          }
        }
      }

      success = true;
    } finally {
      //	        DBHelper.finalizeActiveTransaction(NFCCoreVariables.DATASOURCE_WAG_JNDI, success);
    }
  }