You are here

private function WebformCivicrmPostProcess::processMemberships in Webform CiviCRM Integration 8.5

Process memberships for a contact Called during webform submission

id

Parameters

int $c:

1 call to WebformCivicrmPostProcess::processMemberships()
WebformCivicrmPostProcess::preSave in src/WebformCivicrmPostProcess.php
Process webform submission when it is about to be saved. Called by the following hook:

File

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

Class

WebformCivicrmPostProcess

Namespace

Drupal\webform_civicrm

Code

private function processMemberships($c, $cid) {
  static $types;
  $utils = \Drupal::service('webform_civicrm.utils');
  if (!isset($types)) {
    $types = $utils
      ->wf_crm_apivalues('membership_type', 'get');
  }
  $existing = $this
    ->findMemberships($cid);
  foreach (wf_crm_aval($this->data, "membership:{$c}:membership", []) as $n => $params) {
    $membershipStatus = "";
    $membershipEndDate = "";
    $is_active = FALSE;
    if (empty($params['membership_type_id'])) {
      continue;
    }
    if (empty($params['status_id'])) {
      $params['status_override_end_date'] = '';
    }

    // Search for existing membership to renew - must belong to same domain and organization
    // But not necessarily the same membership type to allow for upsell
    if (!empty($params['num_terms'])) {
      $type = $types[$params['membership_type_id']];
      foreach ($existing as $mem) {
        $existing_type = $types[$mem['membership_type_id']];
        if ($type['domain_id'] == $existing_type['domain_id'] && $type['member_of_contact_id'] == $existing_type['member_of_contact_id']) {
          $params['id'] = $mem['id'];

          // If we have an exact match, look no further
          if ($mem['membership_type_id'] == $params['membership_type_id']) {
            $is_active = $mem['is_active'];
            $membershipStatus = $mem['status'];
            $membershipEndDate = $mem['end_date'];
            break;
          }
        }
      }
    }
    if (empty($params['id'])) {
      if (isset($this->data['contact'][$c]['contact'][1]['source'])) {
        $params['source'] = $this->data['contact'][$c]['contact'][1]['source'];
      }
      else {
        $params['source'] = $this->settings['new_contact_source'];
      }
    }

    // Automatic status
    if (empty($params['status_id'])) {
      unset($params['status_id']);

      // Pending payment status
      if ($this->contributionIsIncomplete && $this
        ->getMembershipTypeField($params['membership_type_id'], 'minimum_fee')) {
        if ($is_active == FALSE) {
          $params['status_id'] = 'Pending';
        }
        else {
          $params['status_id'] = $membershipStatus;
          $params['end_date'] = $membershipEndDate;
        }
      }
    }
    else {
      $params['is_override'] = 1;
    }
    $params['contact_id'] = $cid;

    // The api won't let us manually set status without this weird param
    $params['skipStatusCal'] = !empty($params['status_id']);
    if (isset($this->ent['contribution_recur'][1]['id'])) {
      $params['contribution_recur_id'] = $this->ent['contribution_recur'][1]['id'];
    }
    $result = $utils
      ->wf_civicrm_api('membership', 'create', $params);
    if (!empty($result['id'])) {

      // Issue #2516924 If existing membership create renewal activity
      if (!empty($params['id'])) {
        $membership = $result['values'][$result['id']];
        $actParams = [
          'source_contact_id' => $cid,
          'activity_type_id' => 'Membership Renewal',
          'target_id' => $cid,
          'source_record_id' => $result['id'],
        ];
        $memType = $utils
          ->wf_civicrm_api('MembershipType', 'getsingle', [
          'id' => $membership['membership_type_id'],
        ]);
        $memStatus = $utils
          ->wf_civicrm_api('MembershipStatus', 'getsingle', [
          'id' => $membership['status_id'],
        ]);
        $actParams['subject'] = ts("%1 - Status: %2", [
          1 => $memType['name'],
          2 => $memStatus['label'],
        ]);
        $utils
          ->wf_civicrm_api('Activity', 'create', $actParams);
      }
      foreach ($this->line_items as &$item) {
        if ($item['element'] == "civicrm_{$c}_membership_{$n}") {
          $item['membership_id'] = $result['id'];
          break;
        }
      }
    }
  }
}