Extract case action links into a separate function to facilitate refactoring
authorMatthew Wire (MJW Consulting) <mjw@mjwconsult.co.uk>
Fri, 8 Mar 2019 12:05:57 +0000 (12:05 +0000)
committerMatthew Wire (MJW Consulting) <mjw@mjwconsult.co.uk>
Sun, 10 Mar 2019 10:31:07 +0000 (10:31 +0000)
CRM/Case/BAO/Case.php

index fb84b9ce3546ea7ce24985d3a304b20a44dfaf6c..09e2cb6fe09c2df886234085ba0f757e6bfd9335 100644 (file)
@@ -1062,48 +1062,22 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
 
     $activityTypes = CRM_Case_PseudoConstant::caseActivityType(FALSE, TRUE);
 
-    $url = CRM_Utils_System::url("civicrm/case/activity",
-      "reset=1&cid={$contactID}&caseid={$caseID}", FALSE, NULL, FALSE
-    );
-
-    $contextUrl = '';
-    if ($context == 'fulltext') {
-      $contextUrl = "&context={$context}";
-    }
-    $editUrl = "{$url}&action=update{$contextUrl}";
-    $deleteUrl = "{$url}&action=delete{$contextUrl}";
-    $restoreUrl = "{$url}&action=renew{$contextUrl}";
-    $viewTitle = ts('View activity');
-
-    $emailActivityTypeIDs = array(
-      'Email' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Email'),
-      'Inbound Email' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Inbound Email'),
-    );
-
-    $caseDeleted = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $caseID, 'is_deleted');
-
     $compStatusValues = array_keys(
       CRM_Activity_BAO_Activity::getStatusesByType(CRM_Activity_BAO_Activity::COMPLETED) +
       CRM_Activity_BAO_Activity::getStatusesByType(CRM_Activity_BAO_Activity::CANCELLED)
     );
 
     if (!$userID) {
-      $session = CRM_Core_Session::singleton();
-      $userID = $session->get('userID');
+      $userID = CRM_Core_Session::getLoggedInContactID();
     }
 
-    $caseActivities = array();
+    $caseActivities = [];
 
     while ($dao->fetch()) {
       $caseActivityId = $dao->id;
 
-      $allowView = self::checkPermission($caseActivityId, 'view', $dao->activity_type_id, $userID);
-      $allowEdit = self::checkPermission($caseActivityId, 'edit', $dao->activity_type_id, $userID);
-      $allowDelete = self::checkPermission($caseActivityId, 'delete', $dao->activity_type_id, $userID);
-
-      //do not have sufficient permission
-      //to access given case activity record.
-      if (!$allowView && !$allowEdit && !$allowDelete) {
+      //Do we have permission to access given case activity record.
+      if (!self::checkPermission($caseActivityId, 'view', $dao->activity_type_id, $userID)) {
         continue;
       }
 
@@ -1176,46 +1150,8 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
       // Activity Status Label for Case activities list
       $caseActivities[$caseActivityId]['status_id'] = CRM_Core_PseudoConstant::getLabel('CRM_Activity_BAO_Activity', 'activity_status_id', $dao->status);
 
-      // FIXME: Why are we not using CRM_Core_Action for these links? This is too much manual work and likely to get out-of-sync with core markup.
-      $url = "";
-      $css = 'class="action-item crm-hover-button"';
-      if ($allowView) {
-        $viewUrl = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $caseActivityId));
-        $url = '<a ' . str_replace('action-item', 'action-item medium-pop-up', $css) . 'href="' . $viewUrl . '" title="' . $viewTitle . '">' . ts('View') . '</a>';
-      }
-      $additionalUrl = "&id={$caseActivityId}";
-      if (!$dao->deleted) {
-        //hide edit link of activity type email.CRM-4530.
-        if (!in_array($dao->type, $emailActivityTypeIDs)) {
-          //hide Edit link if activity type is NOT editable (special case activities).CRM-5871
-          if ($allowEdit) {
-            $url .= '<a ' . $css . ' href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> ';
-          }
-        }
-        if ($allowDelete) {
-          $url .= ' <a ' . str_replace('action-item', 'action-item small-popup', $css) . ' href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>';
-        }
-      }
-      elseif (!$caseDeleted) {
-        $url = ' <a ' . $css . ' href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>';
-        $caseActivities[$caseActivityId]['status_id'] = $caseActivities[$caseActivityId]['status_id'] . '<br /> (deleted)';
-      }
-
-      //check for operations.
-      if (self::checkPermission($caseActivityId, 'Move To Case', $dao->activity_type_id)) {
-        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'move\',' . $caseActivityId . ', ' . $caseID . ', this ); return false;">' . ts('Move To Case') . '</a> ';
-      }
-      if (self::checkPermission($caseActivityId, 'Copy To Case', $dao->activity_type_id)) {
-        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'copy\',' . $caseActivityId . ',' . $caseID . ', this ); return false;">' . ts('Copy To Case') . '</a> ';
-      }
-      // if there are file attachments we will return how many and, if only one, add a link to it
-      if (!empty($dao->attachment_ids)) {
-        $attachmentIDs = array_unique(explode(',', $dao->attachment_ids));
-        $caseActivities[$caseActivityId]['no_attachments'] = count($attachmentIDs);
-        $url .= implode(' ', CRM_Core_BAO_File::paperIconAttachment('civicrm_activity', $caseActivityId));
-      }
-
-      $caseActivities[$caseActivityId]['links'] = $url;
+      $caseActivities[$caseActivityId]
+        = self::addCaseActivityLinks($caseID, $contactID, $userID, $context, $dao, $caseActivities[$caseActivityId]);
     }
 
     $caseActivitiesDT = array();
@@ -1226,6 +1162,83 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
     return $caseActivitiesDT;
   }
 
+  /**
+   * FIXME: This is a transitional function to facilitate a refactor of this to use CRM_Core_Action and actionLinks
+   * Add the set of "actionLinks" to the case activity
+   *
+   * @param int $caseID
+   * @param int $contactID
+   * @param int $userID
+   * @param string $context
+   * @param \CRM_Core_DAO $dao
+   * @param array $caseActivity
+   *
+   * @return array caseActivity
+   */
+  public static function addCaseActivityLinks($caseID, $contactID, $userID, $context, $dao, $caseActivity) {
+    // FIXME: Why are we not using CRM_Core_Action for these links? This is too much manual work and likely to get out-of-sync with core markup.
+    $caseActivityId = $dao->id;
+    $allowView = self::checkPermission($caseActivityId, 'view', $dao->activity_type_id, $userID);
+    $allowEdit = self::checkPermission($caseActivityId, 'edit', $dao->activity_type_id, $userID);
+    $allowDelete = self::checkPermission($caseActivityId, 'delete', $dao->activity_type_id, $userID);
+    $emailActivityTypeIDs = [
+      'Email' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Email'),
+      'Inbound Email' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Inbound Email'),
+    ];
+    $url = CRM_Utils_System::url("civicrm/case/activity",
+      "reset=1&cid={$contactID}&caseid={$caseID}", FALSE, NULL, FALSE
+    );
+    $contextUrl = '';
+    if ($context == 'fulltext') {
+      $contextUrl = "&context={$context}";
+    }
+    $editUrl = "{$url}&action=update{$contextUrl}";
+    $deleteUrl = "{$url}&action=delete{$contextUrl}";
+    $restoreUrl = "{$url}&action=renew{$contextUrl}";
+    $viewTitle = ts('View activity');
+    $caseDeleted = CRM_Core_DAO::getFieldValue('CRM_Case_DAO_Case', $caseID, 'is_deleted');
+
+    $url = "";
+    $css = 'class="action-item crm-hover-button"';
+    if ($allowView) {
+      $viewUrl = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $caseActivityId));
+      $url = '<a ' . str_replace('action-item', 'action-item medium-pop-up', $css) . 'href="' . $viewUrl . '" title="' . $viewTitle . '">' . ts('View') . '</a>';
+    }
+    $additionalUrl = "&id={$caseActivityId}";
+    if (!$dao->deleted) {
+      //hide edit link of activity type email.CRM-4530.
+      if (!in_array($dao->type, $emailActivityTypeIDs)) {
+        //hide Edit link if activity type is NOT editable (special case activities).CRM-5871
+        if ($allowEdit) {
+          $url .= '<a ' . $css . ' href="' . $editUrl . $additionalUrl . '">' . ts('Edit') . '</a> ';
+        }
+      }
+      if ($allowDelete) {
+        $url .= ' <a ' . str_replace('action-item', 'action-item small-popup', $css) . ' href="' . $deleteUrl . $additionalUrl . '">' . ts('Delete') . '</a>';
+      }
+    }
+    elseif (!$caseDeleted) {
+      $url = ' <a ' . $css . ' href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>';
+      $caseActivity['status_id'] = $caseActivity['status_id'] . '<br /> (deleted)';
+    }
+
+    //check for operations.
+    if (self::checkPermission($caseActivityId, 'Move To Case', $dao->activity_type_id)) {
+      $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'move\',' . $caseActivityId . ', ' . $caseID . ', this ); return false;">' . ts('Move To Case') . '</a> ';
+    }
+    if (self::checkPermission($caseActivityId, 'Copy To Case', $dao->activity_type_id)) {
+      $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'copy\',' . $caseActivityId . ',' . $caseID . ', this ); return false;">' . ts('Copy To Case') . '</a> ';
+    }
+    // if there are file attachments we will return how many and, if only one, add a link to it
+    if (!empty($dao->attachment_ids)) {
+      $attachmentIDs = array_unique(explode(',', $dao->attachment_ids));
+      $caseActivity['no_attachments'] = count($attachmentIDs);
+      $url .= implode(' ', CRM_Core_BAO_File::paperIconAttachment('civicrm_activity', $caseActivityId));
+    }
+    $caseActivity['links'] = $url;
+    return $caseActivity;
+  }
+
   /**
    * Helper function to generate a formatted contact link/name for display in the Case activities tab
    *