niobi-8.x-2.0-alpha4/modules/niobi_form/modules/niobi_app/src/Utilities/NiobiAppPromoteUtilities.php

modules/niobi_form/modules/niobi_app/src/Utilities/NiobiAppPromoteUtilities.php
<?php

namespace Drupal\niobi_app\Utilities;

use Drupal\niobi_app\Controller\NiobiAppController;
use Drupal\niobi_app\Entity\NiobiApplicationInterface;
use Drupal\niobi_app\Entity\NiobiApplication;
use Drupal\niobi_message\Plugin\task\Bundle\NotificationTask;
use Drupal\task\Entity\Task;

class NiobiAppPromoteUtilities {

  /**
   * @param NiobiApplication $application
   * @return bool
   */
  public static function applicationReadyToSubmit(NiobiApplication $application) {
    $stage = $application->getCurrentApplicationStage();
    $stage_forms = $stage->getAllForms();
    $subs = $application->getAllSubmissionsbyWebform();

    // First, the application form must exist, and be completed.
    if (!NiobiAppPromoteUtilities::applicationCompleteStatus($application, $stage, $stage_forms, $subs)) {
      return FALSE;
    }

    // Now we check required addenda
    if (!NiobiAppPromoteUtilities::applicationRequiredAddendaCompleteStatus($application, $stage, $stage_forms, $subs)) {
      return FALSE;
    }

    // Finally, check the support letters.
    if (!NiobiAppPromoteUtilities::applicationSupportLetterCompleteStatus($application, $stage, $stage_forms, $subs)) {
      return FALSE;
    }

    // We are in fact complete. Return TRUE.
    return TRUE;
  }

  /**
   * @param $application
   * @param $stage
   * @param $stage_forms
   * @param $subs
   * @return bool
   */
  public static function applicationCompleteStatus ($application, $stage, $stage_forms, $subs) {
    if (!empty($stage_forms['application']) && empty($subs['application'])) {
      return FALSE;
    }
    // Next, check the application submission is not a draft.
    elseif(!empty($stage_forms['application']) && !empty($subs['application'])) {
      $app_form = array_shift($stage_forms['application']);
      foreach ($subs['application'] as $sub_form => $sub_list) {
        if($app_form->getWebform()->id() === $sub_form) {
          // There should only be one application submission.
          $sub = array_shift($sub_list);
          if ($sub->isDraft()) {
            return FALSE;
          }
        }
      }
    }
    // We are in fact complete. Return TRUE.
    return TRUE;
  }

  /**
   * @param $application
   * @param $stage
   * @param $stage_forms
   * @param $subs
   * @return bool
   */
  public static function applicationRequiredAddendaCompleteStatus ($application, $stage, $stage_forms, $subs) {
    if(!empty($stage_forms['required_addenda']) && empty($subs['application'])) {
      return FALSE;
    }
    elseif(!empty($stage_forms['required_addenda']) && !empty($subs['application'])) {
      foreach($stage_forms['required_addenda'] as $addenda_form) {
        $addenda_form_id = $addenda_form->getWebform()->id();
        // A required form is missing a submission.
        if (!isset($subs['application'][$addenda_form_id])) {
          return FALSE;
        }
        else {
          $sub = array_shift($subs['application'][$addenda_form_id]);
          if ($sub->isDraft()) {
            return FALSE;
          }
        }
      }
    }
    // We are in fact complete. Return TRUE.
    return TRUE;
  }

  /**
   * @param $application
   * @param $stage
   * @param $stage_forms
   * @param $subs
   * @return int
   */
  public static function applicationSupportLetterCompleteCount ($application, $stage, $stage_forms, $subs) {
    if(!empty($stage_forms['support']) && !empty($subs['application'])) {
      foreach($stage_forms['support'] as $support_form) {
        if ($support_form) {
          $support_form_id = $support_form->getWebform()->id();
          // A required form is missing a submission.
          if (isset($subs['application'][$support_form_id])) {
            $count = 0;
            $info = $stage->getSupportLetterInformation();
            if ($info['form']) {
              $count = 0;
              if (isset($subs['application'][$support_form_id])) {
                foreach ($subs['application'][$support_form_id] as $item) {
                  if (!$item->isDraft()) {
                    $count += 1;
                  }
                }
              }
            }
            return $count;
          }
        }
      }
    }
    // We have a condition that prevents counting, so return zero.
    return 0;
  }

  /**
   * @param $application
   * @param $stage
   * @param $stage_forms
   * @param $subs
   * @return bool
   */
  public static function applicationSupportLetterCompleteStatus ($application, $stage, $stage_forms, $subs) {
    if(!empty($stage_forms['support']) && empty($subs['application'])) {
      return FALSE;
    }
    elseif(!empty($stage_forms['support']) && !empty($subs['application'])) {
      foreach($stage_forms['support'] as $support_form) {
        if ($support_form) {
          $support_form_id = $support_form->getWebform()->id();
          // A required form is missing a submission.
          if (!isset($subs['application'][$support_form_id])) {
            return FALSE;
          }
          else {
            $count = 0;
            $info = $stage->getSupportLetterInformation();
            if ($info['form']) {
              $count_req = !empty($info['count']) ? $info['count'] : 1;
              $count = NiobiAppPromoteUtilities::applicationSupportLetterCompleteCount($application, $stage, $stage_forms, $subs);
            }
            if ($count < $count_req) {
              return FALSE;
            }
          }
        }
      }
    }
    // We are in fact complete. Return TRUE.
    return TRUE;
  }

  /**
   * @param NiobiApplicationInterface $niobi_application
   * @throws \Drupal\Core\Entity\EntityStorageException
   */
  public static function submitApplication(NiobiApplicationInterface $niobi_application) {
    $niobi_application = NiobiApplication::load($niobi_application->id());
    $stage = $niobi_application->getCurrentApplicationStage();

    // Run any trigger tasks
    $query = \Drupal::entityQuery('task');
    $query->condition('type', 'niobi_notification_task');
    $query->condition('field_trigger_type', 'niobi_app_submit_application');
    $query->condition('status', 'active');
    $result = $query->execute();

    $tasks = Task::loadMultiple($result);

    foreach ($tasks as $task) {
      NotificationTask::triggerTask($task);
    }

    // Run review/decision logic.
    /* @var $stage \Drupal\niobi_app\Entity\NiobiApplicationWorkflowStage */
    $review_forms = $stage->getReviewForms(TRUE);

    if (!empty($review_forms)) {
      // Run auto-assignment
      NiobiAppController::runAutoAssignment($niobi_application);

      // Set as "in review" .
      $niobi_application->set('field_application_status', 'review');
      $niobi_application->save();
    }
    else {
      NiobiAppPromoteUtilities::moveToDecision($niobi_application);
    }
  }

  public static function moveToDecision(NiobiApplicationInterface $niobi_application) {
    $application = NiobiApplication::load($niobi_application->id());
    $stage = $application->getCurrentApplicationStage();
    /* @var $stage \Drupal\niobi_app\Entity\NiobiApplicationWorkflowStage */
    $auto_decision = $stage->getAutoDecision();
    if ($auto_decision) {
      $auto_decision['class']::autoDecision($application);
    }
    else {
      $application->set('field_application_status', 'decision')->save();
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc