You are here

private function WebformCivicrmPostProcess::processActivities in Webform CiviCRM Integration 8.5

Save activity data

1 call to WebformCivicrmPostProcess::processActivities()
WebformCivicrmPostProcess::postSave in src/WebformCivicrmPostProcess.php
Process webform submission after it is has been saved. Called by the following hooks:

File

src/WebformCivicrmPostProcess.php, line 1477
Front-end form validation and post-processing.

Class

WebformCivicrmPostProcess

Namespace

Drupal\webform_civicrm

Code

private function processActivities() {
  $utils = \Drupal::service('webform_civicrm.utils');
  $activities = wf_crm_aval($this->data, 'activity', []);
  foreach ($activities as $n => $data) {
    if (is_array($data)) {
      $params = $data['activity'][1];

      // Create mode
      if (empty($this->ent['activity'][$n]['id'])) {

        // Skip if no activity type
        if (empty($params['activity_type_id'])) {
          continue;
        }

        // Automatic status based on whether activity_date_time is in the future
        if (empty($params['status_id'])) {
          $params['status_id'] = strtotime(wf_crm_aval($params, 'activity_date_time', 'now')) > time() ? 'Scheduled' : 'Completed';
        }

        // Automatic source_contact_id - default to current user or contact 1
        if (empty($data['activity'][1]['source_contact_id'])) {
          if (\Drupal::currentUser()
            ->isAuthenticated()) {
            $params['source_contact_id'] = $utils
              ->wf_crm_user_cid();
          }
          elseif (!empty($this->ent['contact'][1]['id'])) {
            $params['source_contact_id'] = $this->ent['contact'][1]['id'];
          }
        }

        // Format details as html
        $this
          ->formatSubmissionDetails($params, $n);
      }
      else {
        $params['id'] = $this->ent['activity'][$n]['id'];

        // Update details when user has selected he wants to update the details
        if (!empty($data['details']['update_existing'])) {

          // Format details as html
          $this
            ->formatSubmissionDetails($params, $n);
        }
      }

      // Allow "automatic" values to pass-thru if empty
      foreach ($params as $field => $value) {
        if ((isset($this->all_fields["activity_{$field}"]['empty_option']) || isset($this->all_fields["activity_{$field}"]['exposed_empty_option'])) && !$value) {
          unset($params[$field]);
        }
      }

      // Handle survey data
      if (!empty($params['survey_id'])) {
        $params['source_record_id'] = $params['survey_id'];

        // Set default subject
        if (empty($params['id']) && empty($params['subject'])) {
          $survey = $utils
            ->wf_civicrm_api('survey', 'getsingle', [
            'id' => $params['survey_id'],
            'return' => 'title',
          ]);
          $params['subject'] = wf_crm_aval($survey, 'title', '');
        }
      }

      // File on case
      if (!empty($data['case_type_id'])) {

        // Webform case
        if ($data['case_type_id'][0] === '#') {
          $case_num = substr($data['case_type_id'], 1);
          if (!empty($this->ent['case'][$case_num]['id'])) {
            $params['case_id'] = $this->ent['case'][$case_num]['id'];
          }
        }
        else {
          $case_contact = $this->ent['contact'][$data['case_contact_id']]['id'];
          if ($case_contact) {

            // Proceed only if this activity is not already filed on a case
            if (empty($params['id']) || !$utils
              ->wf_crm_apivalues('case', 'get', [
              'activity_id' => $params['id'],
            ])) {
              $case = $this
                ->findCaseForContact($case_contact, [
                'status_id' => $data['case_status_id'],
                'case_type_id' => $data['case_type_id'],
              ]);
              if ($case) {
                $params['case_id'] = $case['id'];
              }
            }
          }
        }
      }
      $activity = $utils
        ->wf_civicrm_api('activity', 'create', $params);

      // Final processing if save was successful
      if (!empty($activity['id'])) {

        // handle activity tags
        $this
          ->handleEntityTags('activity', $activity['id'], $n, $params);

        // Store id
        $this->ent['activity'][$n]['id'] = $activity['id'];

        // Save attachments
        if (isset($data['activityupload'])) {
          $this
            ->processAttachments('activity', $n, $activity['id'], empty($params['id']));
        }
        if (!empty($params['assignee_contact_id'])) {
          if ($utils
            ->wf_crm_get_civi_setting('activity_assignee_notification')) {

            // Send email to assignees. TODO: Move to CiviCRM API?
            $assignees = $utils
              ->wf_crm_apivalues('contact', 'get', [
              'id' => [
                'IN' => (array) $params['assignee_contact_id'],
              ],
            ]);
            $mail = [];
            foreach ($assignees as $assignee) {
              if (!empty($assignee['email'])) {
                $mail[$assignee['email']] = $assignee;
              }
            }
            if ($mail) {

              // Include attachments while sending a copy of activity.
              $attachments = \CRM_Core_BAO_File::getEntityFile('civicrm_activity', $activity['id']);
              \CRM_Case_BAO_Case::sendActivityCopy(NULL, $activity['id'], $mail, $attachments, NULL);
            }
          }
        }
      }
    }
  }
}