CRM-20830 - Improve handling of overdue activities
[civicrm-core.git] / CRM / Activity / BAO / Activity.php
index 9784aff36342340ac8cd38877873a3d0862b9190..5f859b3c5d6820cca66e3a3c2a73b39e49134e0f 100644 (file)
@@ -1234,7 +1234,21 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
       "civicrm_activity.is_test= 0",
     );
 
-    if ($input['context'] != 'activity') {
+    if (isset($input['activity_date_relative']) ||
+        (!empty($input['activity_date_low']) || !empty($input['activity_date_high']))
+    ) {
+      list($from, $to) = CRM_Utils_Date::getFromTo(
+        CRM_Utils_Array::value('activity_date_relative', $input, 0),
+        CRM_Utils_Array::value('activity_date_low', $input),
+        CRM_Utils_Array::value('activity_date_high', $input)
+      );
+      $commonClauses[] = sprintf('civicrm_activity.activity_date_time BETWEEN "%s" AND "%s" ', $from, $to);
+    }
+
+    if (!empty($input['activity_status_id'])) {
+      $commonClauses[] = sprintf("civicrm_activity.status_id IN (%s)", $input['activity_status_id']);
+    }
+    elseif ($input['context'] != 'activity') {
       $commonClauses[] = "civicrm_activity.status_id = 1";
     }
 
@@ -2107,6 +2121,7 @@ WHERE      activity.id IN ($activityIds)";
     $id = CRM_Core_Session::getLoggedInContactID();
     if ($id) {
       $activityParams['source_contact_id'] = $id;
+      $activityParams['target_contact_id'][] = $activity->contact_id;
     }
 
     // CRM-14945
@@ -2115,7 +2130,7 @@ WHERE      activity.id IN ($activityIds)";
     }
     //CRM-4027
     if ($targetContactID) {
-      $activityParams['target_contact_id'] = $targetContactID;
+      $activityParams['target_contact_id'][] = $targetContactID;
     }
     // @todo - use api - remove lots of wrangling above. Remove deprecated fatal & let form layer
     // deal with any exceptions.
@@ -2139,6 +2154,10 @@ WHERE      activity.id IN ($activityIds)";
         $membershipType = CRM_Member_PseudoConstant::membershipType($entityObj->membership_type_id);
         $subject = $membershipType ? $membershipType : ts('Membership');
 
+        if (is_array($subject)) {
+          $subject = implode(", ", $subject);
+        }
+
         if (!CRM_Utils_System::isNull($entityObj->source)) {
           $subject .= " - {$entityObj->source}";
         }
@@ -2417,6 +2436,51 @@ AND cl.modified_id  = c.id
     return $result;
   }
 
+  /**
+   * Return list of activity statuses that are considered "completed".
+   *
+   * Note: activity status options use the "grouping" field to distinguish complete from incomplete statuses.
+   *
+   * @return array
+   */
+  public static function getCompletedStatuses() {
+    if (!isset(Civi::$statics[__CLASS__][__FUNCTION__])) {
+      $statuses = civicrm_api3('OptionValue', 'get', array(
+        'option_group_id' => "activity_status",
+        'filter' => 1,
+        'return' => array('value'),
+        'sequential' => 1,
+        'options' => array('limit' => 0),
+      ));
+      Civi::$statics[__CLASS__][__FUNCTION__] = CRM_Utils_Array::collect('value', $statuses['values']);
+    }
+    return Civi::$statics[__CLASS__][__FUNCTION__];
+  }
+
+  /**
+   * Check if status_id is completed.
+   *
+   * Note: activity status options use the "grouping" field to distinguish complete from incomplete statuses.
+   *
+   * @param int $statusId
+   *
+   * @return bool
+   */
+  public static function isCompleted($statusId) {
+    return in_array($statusId, self::getCompletedStatuses());
+  }
+
+  /**
+   * Check if activity is overdue.
+   *
+   * @param array $activity
+   *
+   * @return bool
+   */
+  public static function isOverdue($activity) {
+    return !self::isCompleted($activity['status_id']) && CRM_Utils_Date::overdue($activity['activity_date_time']);
+  }
+
   /**
    * Get the exportable fields for Activities.
    *
@@ -2783,9 +2847,7 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
         $activity['DT_RowId'] = $activityId;
         // Add class to this row if overdue.
         $activity['DT_RowClass'] = "crm-entity status-id-{$values['status_id']}";
-        if (CRM_Utils_Date::overdue(CRM_Utils_Array::value('activity_date_time', $values))
-          && CRM_Utils_Array::value('status_id', $values) == 1
-        ) {
+        if (self::isOverdue($values)) {
           $activity['DT_RowClass'] .= ' status-overdue';
         }
         else {